zookeeper集羣、kafka集羣、Hadoop高可用

1、zookeeper集羣

1.1 zookeeper概述

1.1.1 什麼是zookeeper

ZooKeeper是一個分佈式的協調服務java

1.1.2 ZooKeeper能幹什麼

ZooKeeper是用來保證數據在集羣間的事務性一致node

1.1.3 zookeeper 應用場景

1. 集羣分佈式鎖
2. 集羣統一命名服務
3. 分佈式協調服務apache

1.2 zookeeper 角色與特性

1. Leader:
 接受全部Follower的提案請求並統一協調發起提案的投票,負責與全部的Follower進行內部的數據交換
2. Follower:
 直接爲客戶端服務並參與提案的投票,同時與Leader進行數據交換
3. Observer:
 直接爲客戶端服務但並不參與提案的投票,同時也與Leader進行數據交換bootstrap

1.3 zookeeper 選舉原則

1. 假設集羣中擁有n臺可投票(非obsever)服務器,那麼leader必須獲得n/2+1臺服務器投票才能夠競選爲leader。lapi

2.若是 leader 死亡,重新選舉 leaderbash

3.若是死亡的機器數量達到一半,集羣掛起服務器

4.observer 不計算在投票總設備數量裏面架構

1.4 zookeeper 可伸縮擴展性原理

– leader 全部寫相關操做,接收客戶端的
– follower 讀操做與響應leader提議
– observer  Observer接收客戶端請求,並把寫請求轉發給leader,可是leader不會要求Obserber參加投票ssh

客戶端提交一個請求,如果讀請求,則由每臺Server直接響應。若是是寫請求,就轉發給leader,由leader發起提案。而後由全部的fllower進行投票,leader對投票進行收集,當票數過半。就向全部的fllower和observer發送一個通知消息,最後當Client所鏈接的Server接收到來自leader的請求以後直接響應用戶請求。異步

2、ZK 集羣的安裝配置

1 配置 /etc/hosts ,全部集羣主機能夠相互 ping 通
2 安裝 java-1.8.0-openjdk-devel
3 zookeeper 解壓拷貝到 /usr/local/zookeeper
4 配置文件更名,並在最後添加配置
mv zoo_sample.cfg  zoo.cfg
zoo.cfg 最後添加配置
server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=nn01:2888:3888:observer
5 拷貝 /usr/local/zookeeper 到其餘集羣主機
6 建立 mkdir /tmp/zookeeper
ALL: 7 建立 myid 文件,id 必須與配置文件裏主機名對應的 server.(id) 一致 echo 1 >
/tmp/zookeeper/myid
8 啓動服務,單啓動一臺沒法查看狀態,須要啓動所有集羣之後才能查看狀態
/usr/local/zookeeper/bin/zkServer.sh start
9 查看狀態
/usr/local/zookeeper/bin/zkServer.sh status

利用 api 查看狀態的腳本
#!/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

3、kafka 集羣搭建

3.1 什麼是kafka

 Kafka是一個分佈式的消息系統

3.2 爲何要使用kafka

– 解耦、冗餘、提升擴展性、緩衝
– 保證順序,靈活,削峯填谷
– 異步通訊

3.3 kafka 角色
– producer:生產者,負責發佈消息
– consumer:消費者,負責讀取處理消息
– topic:消息的類別
– Parition:每一個Topic包含一個或多個Partition.
– Broker:Kafka集羣包含一個或多個服務器

– Kafka經過Zookeeper管理集羣配置,選舉leader

3.4 集羣結構

3.5  kafka集羣的安裝配置

kafka 集 羣 的 安 裝 配 置 是 依 賴 zookeeper 的 , 搭 建kafka 集羣以前,首先要建立好一個可用 zookeeper集羣

1 下載解壓 kafka 壓縮包
2 把 kafka 拷貝到 /usr/local/kafka 下面
3 修改配置文件 /usr/local/kafka/config/server.properties
broker.id=11                                                                             //每臺服務器的broker.id都不能相同
zookeeper.connect=node1:2181,node2:2181,node3:2181      //集羣地址,不用都列出,寫一部分便可
4 拷貝 kafka 到其餘主機,並修改 broker.id ,不能重複
5 啓動 kafka 集羣

/usr/local/kafka/bin/kafka-server-start.sh -daemon
/usr/local/kafka/config/server.properties

6. 驗證集羣  【生產者發送的消息會被消費者獲取】
建立一個 topic
./bin/kafka-topics.sh --create --partitions 1 --replication-factor 1 --zookeeper node3:2181 --topic nsd1804
生產者
./bin/kafka-console-producer.sh --broker-list node2:9092 --topic nsd1804
消費者
./bin/kafka-console-consumer.sh --bootstrap-server node1:9092 --topic nsd1804

4、hadoop 高可用

4.1 爲何 NameNode 須要高可用

– NameNode 是 HDFS 的核心配置,HDFS 又是Hadoop 的核心組件,NameNode 在 Hadoop 集羣
中相當重要,NameNode機器宕機,將致使集羣不可用,若是NameNode 數據丟失將致使整個集羣的數據
丟失,而 NameNode 的數據的更新又比較頻繁,實現 NameNode 高可用是頗有必要的

4.2 NameNode高可用方案

– 官方提供了兩種解決方案
– HDFS with NFS
– HDFS with QJM

4.2 NameNode(QJM)高可用原理

4.2.1 NameNode 高可用方案 (QJM)

– 爲了解決 NameNode 單點故障問題,Hadoop 給出了 HDFS 的高可用HA方案:HDFS 一般由兩個
NameNode組成,一個處於 active 狀態,另外一個處於standby 狀態。Active NameNode對外提供服務,比
如處理來自客戶端的 RPC 請求,而 StandbyNameNode 則不對外提供服務,僅同步 Active  NameNode
的狀態,以便可以在它失效時切換

–  爲了讓Standby Node與Active Node保持同步,這兩個Node都與一組稱爲JNS的互相獨立的迚程保持通訊
(Journal Nodes),當Active Node上更新了namespace,它將記錄修改日誌發送給JNS的多數派。Standby nodes

將會從JNS中讀取這些edits,並持續關注它們對日誌的變動。Standby Node將日誌變動應用在本身的namespace中,
當failover發生時,Standby將會在提高本身爲Active以前,確保可以從JNS中讀取全部的edits,即在failover發生以前Standy持有的
namespace應該與Active保持徹底同步

–  Hadoop高可用集羣中只能有一個ActiveNameNode,不然將會致使集羣操做的混亂,那麼兩
個NameNode將會分別有兩種不一樣的數據狀態,可能會致使數據丟失,或者狀態異常,這種狀況
一般稱爲腦裂【腦裂:三節點通信阻斷,即集羣中不一樣的Datanode 看到了不一樣的Active NameNodes】

4.2.2 NameNode高可用架構

4.3 系統規劃

4.4 Hapdoop高可用詳細配置

1. ALL: 配置 /etc/hosts
192.168.1.10    nn01
192.168.1.20    nn02
192.168.1.11    node1
192.168.1.12    node2
192.168.1.13    node3
2. ALL: 除了 zookeeper 其餘 hadoop ,kafka 服務所有中止

~] # ./sbin/stop-all.sh
3. ALL: 初始化 hdfs 集羣,刪除 /var/hadoop/*

~ ] # rm -rf /var/hadoop/*
4. NN2: 關閉 ssh key 驗證,部署公鑰私鑰

StrictHostKeyChecking no
scp nn01:/root/.ssh/id_rsa /root/.ssh/
scp nn01:/root/.ssh/authorized_keys /root/.ssh/

5. NN1: 配置 core-site.xml
<configuration>
    <property>
        <name>fs.defaultFS</name>
        <value>hdfs://nsdcluster</value>
    </property>
    <property>
        <name>hadoop.tmp.dir</name>
        <value>/var/hadoop</value>
    </property>
    <property>
        <name>ha.zookeeper.quorum</name>
        <value>node1:2181,node2:2181,node3:2181</value>
    </property>
    <property>
        <name>hadoop.proxyuser.nsd1804.groups</name>
        <value>*</value>
    </property>
    <property>
        <name>hadoop.proxyuser.nsd1804.hosts</name>
        <value>*</value>
    </property>
</configuration>

6. 配置 hdfs-site.xml
<configuration>
    <property>
        <name>dfs.replication</name>
        <value>2</value>
    </property>
    <property>
        <name>dfs.nameservices</name>
        <value>nsdcluster</value>
    </property>
    <property>
        <name>dfs.ha.namenodes.nsdcluster</name>
        <value>nn1,nn2</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.nsdcluster.nn1</name>
        <value>nn01:8020</value>
    </property>
    <property>
        <name>dfs.namenode.rpc-address.nsdcluster.nn2</name>
        <value>nn02:8020</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.nsdcluster.nn1</name>
        <value>nn01:50070</value>
    </property>
    <property>
        <name>dfs.namenode.http-address.nsdcluster.nn2</name>
        <value>nn02:50070</value>
    </property>
    <property>
        <name>dfs.namenode.shared.edits.dir</name>
        <value>qjournal://node1:8485;node2:8485;node3:8485/nsdcluster</value>
    </property>
    <property>
        <name>dfs.journalnode.edits.dir</name>
        <value>/var/hadoop/journal</value>
    </property>
    <property>
        <name>dfs.client.failover.proxy.provider.nsdcluster</name>
        <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
    </property>
    <property>
        <name>dfs.ha.fencing.methods</name>
        <value>sshfence</value>
    </property>
    <property>
        <name>dfs.ha.fencing.ssh.private-key-files</name>
        <value>/root/.ssh/id_rsa</value>
    </property>
    <property>
        <name>dfs.ha.automatic-failover.enabled</name>
        <value>true</value>
    </property>
</configuration>

7. yarn-site.xml 配置文件
<configuration>

<!-- Site specific YARN configuration properties -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <property>
        <name>yarn.resourcemanager.ha.enabled</name>
        <value>true</value>
    </property> 
    <property>
        <name>yarn.resourcemanager.ha.rm-ids</name>
        <value>rm1,rm2</value>
    </property>
    <property>
        <name>yarn.resourcemanager.recovery.enabled</name>
        <value>true</value>
    </property>
    <property>
        <name>yarn.resourcemanager.store.class</name>
        <value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
    </property>
    <property>
        <name>yarn.resourcemanager.zk-address</name>
        <value>node1:2181,node2:2181,node3:2181</value>
    </property>
    <property>
        <name>yarn.resourcemanager.cluster-id</name>
        <value>yarn-ha</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm1</name>
        <value>nn01</value>
    </property>
    <property>
        <name>yarn.resourcemanager.hostname.rm2</name>
        <value>nn02</value>
    </property>
</configuration>

#-----------------------------------------------------#
初始化啓動集羣
ALL: 全部機器
nodeX: node1    node2    node3
NN1: nn01
NN2: nn02
#-----------------------------------------------------#
8. ALL:  同步配置到全部集羣機器

9. NN1: 初始化ZK集羣  ./bin/hdfs zkfc -formatZK

10. nodeX:  啓動 journalnode 服務 
        ./sbin/hadoop-daemon.sh start journalnode

11. NN1: 格式化  ./bin/hdfs  namenode  -format

12. NN2: 數據同步到本地 /var/hadoop/dfs

13. NN1: 初始化 JNS
        ./bin/hdfs namenode -initializeSharedEdits

14. nodeX: 中止 journalnode 服務
        ./sbin/hadoop-daemon.sh stop journalnode

#-----------------------------------------------------#
15. 啓動集羣
NN1: ./sbin/start-all.sh
NN2: ./sbin/yarn-daemon.sh start resourcemanager

16. 查看集羣狀態
./bin/hdfs haadmin -getServiceState nn1  
./bin/hdfs haadmin -getServiceState nn2
./bin/yarn rmadmin -getServiceState rm1
./bin/yarn rmadmin -getServiceState rm2

./bin/hdfs dfsadmin -report
./bin/yarn  node  -list

17. 訪問集羣:
./bin/hadoop  fs -ls  /
./bin/hadoop  fs -mkdir hdfs://nsdcluster/input

18. 驗證高可用,關閉 active namenode
./sbin/hadoop-daemon.sh stop namenode
./sbin/yarn-daemon.sh stop resourcemanager

19. 恢復節點 ./sbin/hadoop-daemon.sh stop namenode ./sbin/yarn-daemon.sh stop resourcemanager

相關文章
相關標籤/搜索
每日一句
    每一个你不满意的现在,都有一个你没有努力的曾经。