zookeeper是分布式程序。作用是分布式協調服務。有奇數臺,有半數以上節點存活就能夠提供服務。
zookeeper是分布式場景里的第三方,主要功能是保管數據,提供監聽,要求具有非常高的可靠性。
- 管理用戶提交的數據
- 為用戶程序提供節點的監聽服務
zookeeper集群的角色有:follower,leader。其內部有自動投票選舉機制(paxos,zab算法)。選舉了leader之后,更新數據時,數據先寫入leader,再由leader讓follower更新并保持一致。
zookeeper不適合用到數據更新頻繁,要求很嚴格的地方。集群大的時候數據更新保持一致耗時較長。
zookeeper安裝配置
需要配置的是:myid,服務器
- 安裝zookeeper
sftp 上傳zookeeper
tar -zxvf zoo^^^
rm -rf xxx
rm -rf *.xml *.txt * docs src *.asc *.md5 *.sha1 dist-maven
cd conf
cp zoo_sample.cfg zoo.cfg
datadir = /root/zkdata
server.1=mini1:2888:3888
server.2=mini2:2888:3888
server.3=mini3:2888:3888
mkdir /root/zkdata
echo 1 > myid
scp -r(拷文件夾) /apps/zookeeper root@mini2: /apps
(scp -r zookeeper-3.4.5 hadoop@mini2:$PWD)
bin/zkServer.sh start
啟動zookeeper
bin/zkServer.sh status
,自動投票選出leader,follower
當我再一次安裝zookeeper集群的時候,查看status時報錯:
……
Error contacting service. It is probably not running.
使用zkServer.sh start-foreground,看到錯誤信息如下:
java.net.ConnectException: 拒絕連接
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectOne(QuorumCnxManager.java:354)
at org.apache.zookeeper.server.quorum.QuorumCnxManager.connectAll(QuorumCnxManager.java:388)
at org.apache.zookeeper.server.quorum.FastLeaderElection.lookForLeader(FastLeaderElection.java:765)
at org.apache.zookeeper.server.quorum.QuorumPeer.run(QuorumPeer.java:716)
在網上看了一些方法,很久都沒有解決問題,后來修改zoo.cfg中的配置:
server.1=0.0.0.0:2888:3888
server.2=mini2:2888:3888
server.3=mini3:2888:3888
把每一臺的自己的主機名改為0.0.0.0
問題解決,賊奇怪……
jps,kill -9 1698
,查看,殺死進程
前面是服務端,我們接下來啟動命令行客戶端:
bin/zkCli.sh
connect mini2:2181
quit
- zookeeper數據結構:
其擁有樹狀的數據結構,每個節點叫znode(分為ephemeral,persistent)
Znode有四種形式的目錄節點(默認是persistent):- PERSISTENT
- PERSISTENT_SEQUENTIAL(持久序列/test0000000019 )
- EPHEMERAL
- EPHEMERAL_SEQUENTIAL
create [-s -e] /app-emphemeral 8888
寫數據
get path [watch] 讀數據
set 更新
watch 監聽
ssh mini2 "source /etc/profile;/root/apps/zookeeper-3.4.5 /bin/zkServer.sh start"
- zookeeper自啟動腳本
echo "start zkServer"
for i in 1,2,3
do
ssh mini$i "source /etc/profile;/apps/zookeeper-3.4.5/bin/zkServer.sh start"
done
(mkdir /root/bin,vi zkstart.sh)
chmod +x
echo $path
環境變量下默認就有用戶主目錄下的bin,所以無論在哪里都可以zkstart.sh