大數據運維3--zookeeper和kafaka的簡單使用

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
 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章