單機搭建zookeeper偽叢集
一:簡介
分散式應用程式可以基於Zookeeper實現例如配置管理、資料釋出/訂閱、負載均衡、命名服務、協調通知、叢集管理、Master選舉、分散式鎖、分散式佇列等功能。
###Zookeeper中重要的概念:
資料節點:
Zookeeper儲存資料是以樹形結構儲存的,類似linux的目錄,最上層是“/”也就是根節點,可以在根節點上建立子節點,在子節點上再建立子節點。在Zookeeper中每個節點被稱為一個Znode,每個Znode包含:節點名稱、節點值、值的長度、節點建立時間、節點修改時間、版本號、子節點數量等屬性,可以建立節點,修改節點,刪除節點等操作。
Watcher(事件監聽器)
事件監聽是Zookeeper中非常重要的一個特性,用來監聽節點的操作,當對節點做了操作(例如建立節點、修改節點、刪除節點等)就會觸發節點上的監聽,當監聽到節點發生了變化就可以做一些相應的處理操作。該
機制是ZooKeeper實現分散式協調服務的重要特性。
叢集角色
- Leader : 主節點,就是我們平時所說的master節點,用於提供讀寫服務
- Follower: 從節點,就是我們平時所說的slaver節點,提供讀服務、leader選舉等
- Observer: 從節點,一種特殊的Follower, 提供讀服務, 不參與leader的選舉
ZAB協議
https://blog.csdn.net/junchenbb0430/article/details/77583955
Paxos 演算法
https://baike.baidu.com/item/Paxos 演算法/10688635?fr=aladdin
簡介相關文章:https://www.jianshu.com/p/8bf3b7ce3eaa
二:單機搭建zookeeper叢集
所謂單機搭建zookeeper叢集其實就是在一臺機器上啟動多個zookeeper,在啟動每個zookeeper時分別使用不同的配置檔案zoo.cfg來啟動,每個配置檔案使用不同的配置引數(clientPort埠號、dataDir資料目錄、dataLogDir資料日誌目錄)在同一臺機器上啟動多次。
1. 配置多個zoo.cfg配置檔案
zoo.cfg預設在/usr/local/etc/zookeeper路徑下(不同的作業系統路徑不一樣,這裡用的是mac的路徑),在這個路徑下建立zoo1.cfg、zoo2.cfg、zoo3.cfg三個配置檔案。
zoo1.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# 資料目錄
dataDir=/usr/local/var/run/zookeeper/zk1/data
dataLogDir=/usr/local/var/run/zookeeper/zk1/logs
# the port at which the clients will connect
# 埠號
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
zoo2.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/var/run/zookeeper/zk2/data
dataLogDir=/usr/local/var/run/zookeeper/zk2/logs
# the port at which the clients will connect
clientPort=2182
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
zoo3.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/usr/local/var/run/zookeeper/zk3/data
dataLogDir=/usr/local/var/run/zookeeper/zk3/logs
# the port at which the clients will connect
clientPort=2183
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=localhost:2287:3387
server.2=localhost:2288:3388
server.3=localhost:2289:3389
- tickTime: 基本事件單元,以毫秒為單位。這個時間是作為zookeeper伺服器之間或客戶端與伺服器間維持心跳的時間。也就是每隔tickTime時間就會發送一個心跳
- dataDir: 儲存記憶體中資料庫快照的位置,就是zookeeper儲存資料的目錄,預設情況下,zookeeper將資料的日誌問也儲存在這個目錄裡
- clientPort: 客戶端連線zookeeper伺服器的埠,預設是2181,zookeeper會監聽這個埠,接收客戶端的訪問請求
- initLimit: 這個配置項是用來配置zookeeper接收客戶端初始化連線能忍受多少個心跳時間間隔數。當已經超過10個心跳的時間(tickTime)長度後,zookeeper伺服器還沒有接收到客戶端的返回資訊,那麼表明這個客戶端連線失敗。總的時間長度就是 10*2000 = 20 秒
- syncLimit: 這個配置項標識Leader和Follower之間傳送訊息,請求和應答的長度,最長不能超過多少個tickTime的時間長度,總的時間長度就是 5 * 2000 = 10秒
- server.myid=IP:Port1:Port2, myid是伺服器的編號,一個正整數,一般是0、1、2、3等待,port1表示的是伺服器與叢集中的Leader伺服器交換資訊的埠,一般用2288,Port2表示的是萬一叢集中的Leader伺服器宕機了,需要一個埠來重新進行宣講,選出一個新的Leader,一般用3388
2. 建立data目錄和logs目錄
建立/usr/local/var/run/zookeeper/zk1/data/myid檔案
1
建立/usr/local/var/run/zookeeper/zk2/data/myid檔案
2
建立/usr/local/var/run/zookeeper/zk3/data/myid檔案
3
在zk1、zk2、zk3下建立一個logs目錄
三:分別啟動3個zookeeper
# 啟動3個zookeeper服務
zkServer start /usr/local/etc/zookeeper/zoo1.cfg
zkServer start /usr/local/etc/zookeeper/zoo2.cfg
zkServer start /usr/local/etc/zookeeper/zoo3.cfg
# 檢視每個zookeeper對應的角色
zkServer status /usr/local/etc/zookeeper/zoo1.cfg
zkServer status /usr/local/etc/zookeeper/zoo2.cfg
zkServer status /usr/local/etc/zookeeper/zoo3.cfg
# 停止zookeeper服務
zkServer stop /usr/local/etc/zookeeper/zoo1.cfg
四:ZooKeeper命令列
# 連線伺服器 zkCli -server IP:PORT
zkCli -server 127.0.0.1:2181
# 幫助命令
help
# 獲取根節點列表,預設會有一個zookeeper節點,節點列表就像linux目錄一樣,根節點為/
ls /
# 建立znode並關聯值, create /節點名稱 “值”
create /myZnode "my znode"
# 獲取znode
get /myZnode
# 修改znode
set /myZnode "my znode value string"
# 刪除單個znode
delete /myZnode
# 遞迴刪除(刪除myZnode的子節點和myZnode節點)
rmr /myZnode
IDEA Zookeeper外掛
五:命令
ZooKeeper 支援某些特定的四字命令字母與其的互動。它們大多是查詢命令,用來獲取 ZooKeeper 服務的當前狀態及相關資訊。使用者在可以通過 telnet 或 nc 向 ZooKeeper 提交相應的命令。
ZooKeeper 四字命令 |
功能描述 |
conf |
輸出相關服務配置的詳細資訊。 |
cons |
列出所有連線到伺服器的客戶端的完全的連線 / 會話的詳細資訊。包括“接受 / 傳送”的包數量、會話 id 、操作延遲、最後的操作執行等等資訊。 |
dump |
列出未經處理的會話和臨時節點。 |
envi |
輸出關於服務環境的詳細資訊(區別於 conf 命令)。 |
reqs |
列出未經處理的請求 |
ruok |
測試服務是否處於正確狀態。如果確實如此,那麼服務返回“imok ”,否則不做任何相應。 |
stat |
輸出關於效能和連線的客戶端的列表。 |
wchs |
列出伺服器 watch 的詳細資訊。 |
wchc |
通過 session 列出伺服器 watch 的詳細資訊,它的輸出是一個與watch 相關的會話的列表。 |
wchp |
通過路徑列出伺服器 watch 的詳細資訊。它輸出一個與 session相關的路徑。 |