開源分布式Key/Value數(shù)據(jù)庫
今天,介紹一個(gè)分布式數(shù)據(jù)庫——https://github.com/hoorayman/popple。
Popple是一個(gè)基于Raft協(xié)議的分布式鍵值數(shù)據(jù)庫,采用Golang編寫。它具有高性能、高可用性和數(shù)據(jù)一致性等特點(diǎn)。Popple的日志采用了mmap順序?qū)懭敕绞?,支持事?wù),并且代碼清晰簡單,易于維護(hù)。
Raft協(xié)議是一種分布式一致性協(xié)議,它將集群中的所有節(jié)點(diǎn)分為三類:Leader、Follower和Candidate。Leader節(jié)點(diǎn)負(fù)責(zé)接收客戶端請求并將其復(fù)制到所有Follower節(jié)點(diǎn)。當(dāng)Leader節(jié)點(diǎn)失效時(shí),通過選舉機(jī)制選出新的Leader節(jié)點(diǎn)。Popple采用Raft協(xié)議來實(shí)現(xiàn)數(shù)據(jù)的復(fù)制和一致性。
Popple的數(shù)據(jù)存儲(chǔ)采用了鍵值對的方式,其中鍵和值都是字符串類型。在Popple中,每個(gè)節(jié)點(diǎn)都可以讀取和寫入數(shù)據(jù),如果數(shù)據(jù)寫入到了非Leader節(jié)點(diǎn),則該節(jié)點(diǎn)將數(shù)據(jù)轉(zhuǎn)發(fā)給Leader節(jié)點(diǎn),Leader節(jié)點(diǎn)將該數(shù)據(jù)寫入自己的日志中,并將數(shù)據(jù)復(fù)制到其他Follower節(jié)點(diǎn)。因此,Popple實(shí)現(xiàn)了高可用性和數(shù)據(jù)一致性。
Popple的日志采用了mmap順序?qū)懭敕绞剑@種方式可以顯著提高寫入性能。Popple的日志文件分為兩部分:索引和數(shù)據(jù)。索引用于記錄數(shù)據(jù)在日志文件中的位置,數(shù)據(jù)用于記錄寫入的具體內(nèi)容。當(dāng)Popple啟動(dòng)時(shí),它會(huì)加載最后一個(gè)日志文件,并從中恢復(fù)出當(dāng)前的狀態(tài)。當(dāng)有新的數(shù)據(jù)需要寫入時(shí),Popple會(huì)將數(shù)據(jù)追加到日志文件的末尾,并更新索引。Popple支持事務(wù),事務(wù)是指一組操作被當(dāng)作一個(gè)整體進(jìn)行提交或回滾。在Popple中,事務(wù)的實(shí)現(xiàn)基于Raft協(xié)議和日志,每個(gè)事務(wù)都會(huì)被記錄到日志中,并且只有當(dāng)該事務(wù)被復(fù)制到大多數(shù)節(jié)點(diǎn)后才會(huì)被提交。
總的來說,Popple是一個(gè)高性能、高可用性、具有數(shù)據(jù)一致性的分布式鍵值數(shù)據(jù)庫,它采用了Raft協(xié)議來實(shí)現(xiàn)數(shù)據(jù)的復(fù)制和一致性,采用mmap順序?qū)懭敕绞絹硖岣邔懭胄阅?,支持事?wù),并且代碼清晰簡單,易于維護(hù)。