去年年底,團隊內部成員分享了這篇google論文,初讀了下,發現其有蠻多有意思的東西,就想把他翻譯下來,但是翻譯了一小部分,明顯感覺如果這樣的翻譯發出去,很可能誤人子弟,所以改成了概要式的博文,這篇文章會將原論文最核心的幾個部分做不完全的翻譯和個人理解,如有不解或者錯誤的地方,請查看原論文,并希望能夠指正,謝謝.
正文
Megastore是谷歌一個內部的存儲系統,它的底層數據存儲依賴Bigtable,也就是基于NoSql實現的,但是和傳統的NoSql不同的是,它實現了類似RDBMS的數據模型(便捷性),同時提供數據的強一致性解決方案(同一個datacenter,基于MVCC的事務實現),并且將數據進行細顆粒度的分區(這里的分區是指在同一個datacenter,所有datacenter都有相同的分區數據),然后將數據更新在機房間進行同步復制(這個保證所有datacenter中的數據一致).
...
中文翻譯地址: http://wenku.baidu.com/view/a465cc260722192e4536f671.html#
原文地址: http://wenku.baidu.com/view/2ddeb1afdd3383c4bb4cd2bb.html
zookeeper介紹
zookeeper是一個為分布式應用提供一致性服務的軟件,它是開源的Hadoop項目中的一個子項目,并且根據google發表的<The Chubby lock service for loosely-coupled distributed systems>論文來實現的,接下來我們首先來安裝使用下這個軟件,然后再來探索下其中比較重要一致性算法。
zookeeper安裝和使用
zookeeper的安裝基本上可以按照 http://hadoop.apache.org/zookeeper/docs/current/ zookeeperStarted.html 這個頁面上的步驟完成安裝,這里主要介紹下部署一個集群的步驟,因為這個官方頁面似乎講得并不是非常詳細(Running Replicated Zookeeper)。
由于手頭機器不足,所以在一臺機器上部署了3個server,如果你手頭也比較緊,也可以這么做。那么我建了3個文件夾,如下
server1 server2 server3
然后每個文件夾里面解壓一個zookeeper的下載包,并且還建了幾個文件夾,總體結構如下,最后那個是下載過來壓縮包的解壓文件
data dataLog logs zookeeper-3.3.2
那么首先進入data目錄,創建一個myid的文件,里面寫入一個數字,比如我這個是server1,那么就寫一個1,server2對應myid文件就寫入2,server3對應myid文件就寫個3
然后進入zookeeper-3.3.2/conf目錄,那么如果是剛下過來,會有3個文件,configuration.xml, log4j.properties,zoo_sample.cfg,這3個文件我們首先要做的就是在這個目錄創建一個zoo.cfg的配置文件,當然你可以把zoo_sample.cfg文件改成zoo.cfg,配置的內容如下所示:
tickTime=2000
initLimit=5
syncLimit=2
dataDir=xxxx/zookeeper/server1/data
dataLogDir=xxx/zookeeper/server1/dataLog
clientPort=2181
server.1=127.0.0.1:2888:3888
server.2=127.0.0.1:2889:3889
server.3=127.0.0.1:2890:3890
標紅的幾個配置應該官網講得很清楚了,只是需要注意的是clientPort這個端口如果你是在1臺機器上部署多個server,那么每臺機器都要不同的clientPort,比如我server1是2181,server2是2182,server3是2183,dataDir和dataLogDir也需要區分下。
最后幾行唯一需要注意的地方就是 server.X 這個數字就是對應 data/myid中的數字。你在3個server的myid文件中分別寫入了1,2,3,那么每個server中的zoo.cfg都配server.1,server.2,server.3就OK了。因為在同一臺機器上,后面連著的2個端口3個server都不要一樣,否則端口沖突,其中第一個端口用來集群成員的信息交換,第二個端口是在leader掛掉時專門用來進行選舉leader所用。
進入zookeeper-3.3.2/bin 目錄中,./zkServer.sh start啟動一個server,這時會報大量錯誤?其實沒什么關系,因為現在集群只起了1臺server,zookeeper服務器端起來會根據zoo.cfg的服務器列表發起選舉leader的請求,因為連不上其他機器而報錯,那么當我們起第二個zookeeper實例后,leader將會被選出,從而一致性服務開始可以使用,這是因為3臺機器只要有2臺可用就可以選出leader并且對外提供服務(2n+1臺機器,可以容n臺機器掛掉)。
接下來就可以使用了,我們可以先通過 zookeeper自帶的客戶端交互程序來簡單感受下zookeeper到底做一些什么事情。進入zookeeper-3.3.2/bin(3個server中任意一個)下,./zkCli.sh –server 127.0.0.1:2182,我連的是開著2182端口的機器。
那么,首先我們隨便打個命令,因為zookeeper不認識,他會給出命令的help,如下圖
ls(查看當前節點數據),
ls2(查看當前節點數據并能看到更新次數等數據) ,
create(創建一個節點) ,
get(得到一個節點,包含數據和更新次數等數據),
set(修改節點)
delete(刪除一個節點)
通過上述命令實踐,我們可以發現,zookeeper使用了一個類似文件系統的樹結構,數據可以掛在某個節點上,可以對這個節點進行刪改。另外我們還發現,當改動一個節點的時候,集群中活著的機器都會更新到一致的數據。
zookeeper的數據模型
在簡單使用了zookeeper之后,我們發現其數據模型有些像操作系統的文件結構,結構如下圖所示
(1) 每個節點在zookeeper中叫做znode,并且其有一個唯一的路徑標識,如/SERVER2節點的標識就為/APP3/SERVER2
(2) Znode可以有子znode,并且znode里可以存數據,但是EPHEMERAL類型的節點不能有子節點
(3) Znode中的數據可以有多個版本,比如某一個路徑下存有多個數據版本,那么查詢這個路徑下的數據就需要帶上版本。
(4) znode 可以是臨時節點,一旦創建這個 znode 的客戶端與服務器失去聯系,這個 znode 也將自動刪除,Zookeeper 的客戶端和服務器通信采用長連接方式,每個客戶端和 服務器通過心跳來保持連接,這個連接狀態稱為 session,如果 znode 是臨時節點,這個 session 失效,znode 也就刪除了
(5) znode 的目錄名可以自動編號,如 App1 已經存在,再創建的話,將會自動命名為 App2
(6) znode 可以被監控,包括這個目錄節點中存儲的數據的修改,子節點目錄的變化等,一旦變化可以通知設置監控的客戶端,這個功能是zookeeper對于應用最重要的特性,通過這個特性可以實現的功能包括配置的集中管理,集群管理,分布式鎖等等。
我們初步使用了一下zookeeper并且嘗試著描述了幾種應用場景的具體實現思路,接下來的文章,我們會嘗試著去探究一下zookeeper的高可用性與leaderElection算法。
參考:http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/