Zookeeper概述
是一個開源的分佈式應用程序協調服務,它是用來保證數據在集羣間的事物一致性的
舉例,比如A公司和B公司達成某個協議,A公司需要到B公司取對應的文件過程,這個過程叫通信的過程.計算機中的程序比較多,會出現資源爭搶,這個時候會發生死鎖,這時整個資源會出現運轉不了.這個時候,如果有個交警,指揮資源的流動,這個時候就不會出現死鎖.如下圖,如果在單機上,資源XY可以打包一起,當需要訪問的時候,需要到C中拿到對應的令牌,所有的需要訪問X,Y的資源需要在訪問令牌纔可以訪問到XY資源.如果在集羣中,XY沒有辦法打包,這個時候,就需要zookeeper在其中協調資源.
Zookeeper應用場景:集羣分佈式鎖,集羣統一命名服務,分佈式協調服務
Zookeeper角色與特性
Leader:接受所有Follower的提案請求並統一協調發起提案的投票,負責與所有的Follower進行內部數據交換
Follower:直接爲客戶端服務並參與提案的投票,同時與Leader進行數據交換
Observer:直接爲客戶端服務但不參與提案的投票,同時也與Leader進行數據交換
這裏的投票機制的Follower相當於議員,Observer相當於平民,這樣區分是爲了不能投票涉及太多的人員導致性能下降
Zookeeper角色與選舉
服務在啓動的時候是沒有角色的(LOOKING),角色是通過選舉產生的,選舉產生一個Leader,剩下的是Follower
選舉Leader原則
集羣中超過半數集羣投票選擇Leader,假如集羣中擁有n臺服務器,那麼Leader必須得到n/2+1臺服務器的投票
如果Leader死亡,重新選舉Leader,如果死亡的機器數量達到一半,則集羣掛掉,如果無法得到足夠的投票數量,就重新發起投票,如果參與投票的機器不足n/2+1,則集羣停止工作.如果Follower死亡過多,剩餘機器不足n/2+1,則集羣也會停止工作.Observer不計算在投票總設備數量裏面.
Zookeeper原理與設計
Leader所有寫相關操作,Follower讀操作與響應Leader提議,在Observer出現以前,Zookeeper的伸縮性由Follower來實現,我們可以通過添加;Follower節點的數量來保證Zookeeper服務的讀性能,但是隨着Follower節點數量的增加,Zookeeper服務的寫性能受到了影響.客戶段提供一個請求,若是讀請求,則由每臺Server的本地副本數據庫直接響應,若是寫請求,需要通過一致性協議Zab來處理,
Zab協議規定:來自Client的所有寫請求都要轉發到ZK服務中唯一的Leader,由Leader根據該請求發起一個Proposal.然後其他的Server對該Proposa進行vote.之後Leader對Vote進行收集,當Vote數量過半時Leader會向所有的Server發送一個通知消息,最後當Client所連接的Server收到該消息時,會把該操作更新到內存中並對Client的寫請求做出迴應.
Zookeeper在上述協議中實際扮演了兩個職能.一方面從客戶端接受連接與操作請求,另一方面對操作結果進行投票.這兩個職能在Zookeeper集羣擴展的時候彼此制約,從Zab協議對寫請求的處理過程中可以發現,增加Follower的數量,則增加了協議投票過程的壓力.因爲Leader節點必須等待集羣中過半Server響應投票.是節點的增加使得部分計算機運行較慢,從而拖慢整個整個投票過程的可能性也隨之提高.隨着集羣變大,寫操作也會隨之下降.所有.不得不在增加Client數量的期望和希望我們保持較好吞吐量的期間進行權衡.要打破這一耦合關係.引入了不參與投票的服務器Objserver.Observer可以接受客戶端的連接,並將寫請求轉發給Leader節點.但是Leader節點不會要求Observer參與投票,Observe的擴展,給Zookeeper的可伸縮性帶來了全新的景象,加入很多Observer節點.無須擔心嚴重影響寫吞吐量,但並非是無懈可擊,因爲協議中的通知階段,仍然與服務器的數量呈線性關係.但是這裏的串行開銷非常低,因此,可以認爲在通知服務器階段的開銷不會成爲瓶頸.Observer提升讀性能的可伸縮性,Observer提供了廣域網能力.
zookeeper的安裝
[root@nn01 ~]# tar zxf zookeeper-3.4.13.tar.gz #解壓zookeeper的包
[root@nn01 ~]# ls
Desktop hadoop-2.7.7.tar.gz zookeeper-3.4.13 zookeeper-3.4.13.tar.gz
[root@nn01 ~]# mv zookeeper-3.4.13 /usr/local/zookeeper #將zookeeper的包移交到/usr/local/zookeeper
[root@nn01 ~]# cd /usr/local/zookeeper/conf/
[root@nn01 conf]# cp zoo_sample.cfg zoo.cfg
[root@nn01 conf]# vim zoo.cfg #添加對應的角色節點
12 dataDir=/tmp/zookeeper #可以更改數據目錄存儲數據,之後需要創建出來
29 server.1=node1:2888:3888
30 server.2=node2:2888:3888
31 server.3=node3:2888:3888
32 server.4=nn01:2888:3888:observer #fallower不需要指定,但是Observer需要指定
[root@nn01 conf]# mkdir /tmp/zookeeper #創建文件
[root@nn01 conf]# echo 4 > /tmp/zookeeper/myid #指定id,這個是對應zoo.cfg的id
[root@nn01 conf]# cat /tmp/zookeeper/myid
4
[root@nn01 conf]# /usr/local/zookeeper/bin/zkServer.sh
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Usage: /usr/local/zookeeper/bin/zkServer.sh {start|start-foreground|stop|restart|status|upgrade|print-cmd}
[root@nn01 conf]# /usr/local/zookeeper/bin/zkServer.sh start #開啓zookeeper
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@nn01 conf]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Error contacting service. It is probably not running.
[root@nn01 conf]# jps #QuorumPeerMain出現就是zookeeper開啓的標示
20596 NameNode
24581 QuorumPeerMain
24629 Jps
20790 SecondaryNameNode
其他的節點也需要配置
[root@nn01 conf]# for i in node{1..3}; do scp -r /usr/local/zookeeper/ $i:/usr/local/zookeeper/; done
[root@node1 ~]# mkdir /tmp/zookeeper
[root@node1 ~]# echo 1 > /tmp/zookeeper/myid
[root@node1 ~]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@node1 ~]# jps
5856 DataNode
6934 QuorumPeerMain
6952 Jps
[root@node2 ~]# mkdir /tmp/zookeeper
[root@node2 ~]# echo 2 > /tmp/zookeeper/myid
[root@node2 ~]# /usr/local/zookeeper/bin/zkServer.sh start
-bash: /usr/local/zookeeper/bin/zkServer.sh: 沒有那個文件或目錄
[root@node2 ~]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@node2 ~]# jps
7249 QuorumPeerMain
7276 Jps
6142 DataNode
[root@node3 ~]# mkdir /tmp/zookeeper
[root@node3 ~]# echo 3 > /tmp/zookeeper/myid
[root@node3 ~]# /usr/local/zookeeper/bin/zkServer.sh start
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
[root@node3 ~]# jps
6693 Jps
5563 DataNode
6668 QuorumPeerMain
驗證集羣中的狀態
[root@nn01 conf]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: observer
[root@node3 ~]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@node2 ~]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
[root@node1 ~]# /usr/local/zookeeper/bin/zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
使用zookeeper的命令
--可以查看整個集羣中的狀態信息和使用zabbix實現監控都可以,這些命令可以去官網查看
[root@nn01 ~]# socat TCP:node2:2181 - #查看node2節點的conf
conf
clientPort=2181
dataDir=/tmp/zookeeper/version-2
dataLogDir=/tmp/zookeeper/version-2
tickTime=2000
maxClientCnxns=60
minSessionTimeout=4000
maxSessionTimeout=40000
serverId=2
initLimit=10
syncLimit=5
electionAlg=3
electionPort=3888
quorumPort=2888
peerType=0
[root@nn01 ~]# socat TCP:node2:2181 - #多少客戶端連接
mntr
zk_version 3.4.13-2d71af4dbe22557fda74f9a9b4309b15a7487f03, built on 06/29/2018 04:05 GMT
zk_avg_latency 0
zk_max_latency 0
zk_min_latency 0
zk_packets_received 4
zk_packets_sent 3
zk_num_alive_connections 1
zk_outstanding_requests 0
zk_server_state leader
zk_znode_count 4
zk_watch_count 0
zk_ephemerals_count 0
zk_approximate_data_size 27
zk_open_file_descriptor_count 36
zk_max_file_descriptor_count 4096
zk_fsync_threshold_exceed_count 0
zk_followers 3
zk_synced_followers 2
zk_pending_syncs 0
zk_last_proposal_size -1
zk_max_proposal_size -1
zk_min_proposal_size -1
[root@node1 conf]# cat api.sh
#!/bin/bash
function getstatus(){
exec 9<>/dev/tcp/$1/2181 2>/dev/null
echo stat >&9
MODE=$(cat <&9 |grep -Po "(?<=Mode:).*")
exec 9<&-
echo ${MODE:-NULL}
}
for i in node{1..3} nn01;do
echo -ne "${i}\t"
getstatus ${i}
done
[root@node1 conf]# chmod 755 api.sh
[root@node1 conf]# ./api.sh
node1 follower
node2 leader
node3 follower
nn01 observer
kafaka消息隊列
kafka是由LinkeIn開發的一個分佈式的消息系統,Kafaka是使用Scala編寫,Kafaka是消息中間件
kafaka的用途:解耦,冗餘,提高擴展性,緩衝,保證順序,靈活,削峯填谷,異步通信
生產環境用途:客戶端訪問web服務器的時候,將大量的比如訂單數據,存入kafka中,這個時候的訂單數據就相當於生產者一樣,其他的數據庫中間件從kafka中讀取,相當於消費者一樣,數據的中間件將數據讀取處理之後,在分發給數據庫進行數據交換,在一定的程度上減輕了數據庫的讀寫壓力.
kafaka角色與集羣結構
producer:生產者,負責發佈消息
consumer:消費者,負責讀取處理消息
topic:消息的類別
Parition:每個Topic包含一個或多個Partition
Broker:kafka集羣包含一個或多個服務器
kafka通過Zookeeper管理集羣配置,選舉Leader
kafka集羣安裝與配置
kafka集羣的安裝配置依賴Zookeeper,搭建kafka集羣之前,請先創建好一個課用的Zookeeper集羣,
安裝OPenJDK運行環境,
同步kafka拷貝到所有集羣主機
修改配置文件
啓動與驗證
[root@node1 ~]# tar -xaf kafka_2.12-2.1.0.tgz
[root@node1 ~]# mv kafka_2.12-2.1.0 /usr/local/kafka
[root@node1 ~]# cd /usr/local/kafka/config/ #轉到對應的目錄中
[root@node1 config]# vim server.properties #更改kafka的配置文件
21 broker.id=21 #id需要配置不一樣的
123 zookeeper.connect=node1:2181,node2:2181,node3:2181
[root@node1 config]# for i in node{1..3}; do scp -r /usr/local/kafka $i:/usr/local/; done #將kafka拷貝到其他的節點,更改配置
[root@node2 ~]# vim /usr/local/kafka/config/server.properties
21 broker.id=22
[root@node3 ~]# vim /usr/local/kafka/config/server.properties
21 broker.id=23
啓動kafka需要在三臺上同時配置
[root@node1 ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties #開啓kafka
[root@node1 ~]# jps #Kafka出現標示的kafka開啓
5856 DataNode
7460 Kafka
7493 Jps
6934 QuorumPeerMain
[root@node2 ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@node2 ~]# jps
7249 QuorumPeerMain
7802 Jps
7740 Kafka
6142 DataNode
[root@node3 ~]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@node3 ~]# jps
7249 Jps
7187 Kafka
5563 DataNode
6668 QuorumPeerMain
測試
[root@node1 ~]# /usr/local/kafka/bin/kafka-topics.sh --create --partitions 2 --replication-factor 2 --zookeeper localhost:2181 --topic zhy #創建topic
Created topic "zhy".
[root@node1 ~]# /usr/local/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic zhy #創建kafka的生產者
[root@node3 ~]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic zhy #查看kafka同步
zhuhaiyandexiaoxi
zheg1