標籤:
Zookeeper分布式安裝配置
Zookeeper介紹概述
1、ZooKeeper是一個分布式的,開放源碼的分布式應用程式協調服務,是Google的Chubby一個開源的實現,是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟體,提供的功能包括:配置維護、網域名稱服務 (DNS)、分布式同步、組服務等。
2、ZooKeeper的目標就是封裝好複雜易出錯的關鍵服務,將簡單易用的介面和效能高效、功能穩定的系統提供給使用者。
3、ZooKeeper包含一個簡單的原語集,提供Java和C的介面。
4、ZooKeeper代碼版本中,提供了分布式獨享鎖、選舉、隊列的介面,代碼在zookeeper-3.4.3\src\recipes。其中分布鎖和隊列有Java和C兩個版本,選舉只有Java版本。
ZooKeeper的基本運轉流程:
1、選舉Leader。
2、同步資料。
3、選舉Leader過程中演算法有很多,但要達到的選舉標準是一致的。
4、Leader要具有最高的zxid。
5、叢集中大多數的機器得到響應並follow選出的Leader。
Zookeeper下載與安裝 下載
官網:https://zookeeper.apache.org/
大家可以去官網下載自己需要的版本,例如我需要安裝的是3.4.6版本:
安裝
Zookeeper的運行需要Java環境,所以需要首先安裝JDK,JDK的安裝可以參考:
http://blog.csdn.net/u011204847/article/details/51002072
把下載的壓縮包拷貝到想要安裝的目錄,然後解壓:
[[email protected] software]# tar -xzf zookeeper-3.4.6.tar.gz
解壓之後檔案目錄:
加入環境變數:
vi /etc/profile
export ZOOKEEPER_HOME=/usr/local/software/zookeeper-3.4.6export PATH=.:$PATH:$ZOOKEEPER_HOME/bin
使環境變數生效:
source /etc/profile
Zookeeper配置
單機配置
在zookeeper目錄下建立目錄data:
[[email protected] software]# cd zookeeper-3.4.6[[email protected] 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代表的是給這台主機配的IDserver.1=slave01:2888:3888 //同理slave01也是主機名稱,可以使用IPserver.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/bashfor i in master01 slave01 slave02do ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh start"done
指令碼執行樣本:
Shell停止指令碼樣本:
#!/bin/bashfor i in master01 slave01 slave02do ssh $i "/usr/local/software/zookeeper-3.4.6/bin/zkServer.sh stop"done
指令碼執行樣本:
Java代碼操作Zookeeper樣本
Pom依賴:
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.8.0</version></dependency>
程式碼範例:
@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秒後,這個值會消失。臨時節點的這個特性可以用於監控一些程式的運行狀態。
Zookeeper分布式安裝配置