1、ZooKeeper是一個分布式的,開放源碼的分布式應用程序協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等。
2、ZooKeeper的目標就是封裝好復雜易出錯的關鍵服務,將簡單易用的接口和性能高效、功能穩定的系統提供給用戶。
3、ZooKeeper包含一個簡單的原語集,提供Java和C的接口。
4、ZooKeeper代碼版本中,提供了分布式獨享鎖、選舉、隊列的接口,代碼在zookeeper-3.4.3\src\recipes。其中分布鎖和隊列有Java和C兩個版本,選舉只有Java版本。
1、選舉Leader。
2、同步數據。
3、選舉Leader過程中算法有很多,但要達到的選舉標准是一致的。
4、Leader要具有最高的zxid。
5、集群中大多數的機器得到響應並follow選出的Leader。
官網:https://zookeeper.apache.org/
大家可以去官網下載自己需要的版本,例如我需要安裝的是3.4.6版本:
Zookeeper的運行需要Java環境,所以需要首先安裝JDK,JDK的安裝可以參考:
http://blog.csdn.net/u011204847/article/details/51002072
把下載的壓縮包拷貝到想要安裝的目錄,然後解壓:
[root@master01 software]# tar -xzf zookeeper-3.4.6.tar.gz
解壓之後文件目錄:
加入環境變量:
vi /etc/profile
export ZOOKEEPER_HOME=/usr/local/software/zookeeper-3.4.6 export PATH=.:$PATH:$ZOOKEEPER_HOME/bin
使環境變量生效:
source /etc/profile
在zookeeper目錄下創建目錄data:
[root@master01 software]# cd zookeeper-3.4.6 [root@master01 zookeeper-3.4.6]# mkdir data
然後到zookeeper / conf 目錄下,修改zoo_sample.cfg名稱為zoo.cfg
然後修改配置文件zoo.cfg:
vi zoo.cfg //單機只需要修改dataDir為之前創建的data目錄即可
配置好後就可以啟動了:
切換到Zookeeper的bin目錄下,然後
./zkServer.sh start //開啟Zookeeper
其他命令:
./zkServer.sh stop //關閉Zookeeper ./zkServer.sh status //查看Zookeeper狀態 ./zkCli.sh //打開Zookeeper客戶端
這裡我使用三台主機進行Zookeeper的分布式配置。
1、首先,我們在之前配置的單機基礎上繼續修改配置文件:
2、在之前的配置文件末尾添加如下內容:
server.0=master01:2888:3888 //master01為你的主機名,前面的0代表的是給這台主機配的ID server.1=slave01:2888:3888 //同理slave01也是主機名,可以使用IP server.2=slave02:2888:3888
3、然後在我們之前建立的data文件中使用命令:
echo 0 myid //在data目錄建立myid文件,並寫入0(與上面的配置中server.0中的0對應)
4、將這台主機配置好的Zookeeper整個目錄都拷貝到另外兩台主機的相同路徑下,並在那兩台上修改myid為1和2。
5、修改另外兩台主機/etc/profile文件,使得它們的Zookeeper環境配置和第一台主機一樣
6、在每台主機上面開啟Zookeeper後,查看狀態
開啟三台主機中Zookeeper後,查看狀態會發現有一個leader以及兩個follower,此時我們的Zookeeper分布式環境以及搭建好了
注意:
1、上面我可以使用類似 ssh slave01命令直接登錄到slave01和slave02主機是因為我在三台主機之間做了免密碼登錄。
2、在配置文件和命令中可以直接使用主機名是因為我做了IP和主機名的映射。
3、我們可以在登錄到另一台主機後,直接使用zkServer.sh腳本是因為我們之前配置了Zookeeper環境並使之生效。
在安裝好Zookeeper分布式環境後,一般情況下需要登錄到每台主機上面去啟動Zookeeper,比較繁瑣,所以我們可以寫一個shell腳本來啟動和關閉這個Zookeeper集群。
在寫腳本之前我們需要先解決一個問題,如果我們直接使用腳本操作去啟動另外的主機上面Zookeeper,會發現啟動不成功。這涉及到登錄shell和非登錄shell的問題。關於Shell腳本和登錄/非登錄shell可以參考:http://blog.csdn.net/u011204847/article/details/51184883
這裡我直接寫解決方法:
方法一:
修改Zookeeper / bin 目錄下的zkEnv.sh,在圖示位置或者文件開頭添加你的JDK路徑。
方法二:把profile的配置信息echo到.bashrc中 echo 'source /etc/profile' >> ~/.bashrc
方法三:腳本代碼中添加”source /etc/profile;”,例如:ssh $i "source /etc/profile;/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh start"
Shell啟動腳本示例:
#!/bin/bash for i in master01 slave01 slave02 do ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh start" done
腳本執行示例:
Shell停止腳本示例:
#!/bin/bash for i in master01 slave01 slave02 do ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh stop" done
腳本執行示例:
Pom依賴:
org.apache.curator curator-framework2.8.0
代碼示例:
@Test //測試類:測試Zookeeper連接 public void test13() throws Exception{ //指定zookeeper集群的地址 String connectString = "192.168.33.130:2181,192.168.33.131:2181,192.168.33.132:2181"; //1000 :代表是重試時間間隔 3:表示是重試次數 ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3); //使用curator創建一個zk鏈接 CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy); //啟動連接 client.start(); InetAddress localHost = InetAddress.getLocalHost(); String ip = localHost.getHostAddress(); client.create() .creatingParentsIfNeeded() //如果父節點不存在,這創建 .withMode(CreateMode.EPHEMERAL) //創建節點類型為臨時節點 .withACL(Ids.OPEN_ACL_UNSAFE) .forPath("/Spider/"+ip); }
打印結果:
注意:
由於建立的是臨時節點,所以默認40秒後,這個值會消失。臨時節點的這個特性可以用於監控一些程序的運行狀態。