一、zookeeper叢集
1.1 zookeeper概述
1.1.1 什麼是zookeeper
ZooKeeper是一個分布式的協調服務
1.1.2 ZooKeeper能幹什麼
ZooKeeper是用來保證資料在叢集間的事務性一緻
1.1.3 zookeeper 應用場景
1. 叢集分布式鎖
2. 叢集統一命名服務
3. 分布式協調服務
1.2 zookeeper 角色與特性
1. Leader:
接受所有Follower的提案請求并統一協調發起提案的投票,負責與所有的Follower進行内部的資料交換
2. Follower:
直接為用戶端服務并參與提案的投票,同時與Leader進行資料交換
3. Observer:
直接為用戶端服務但并不參與提案的投票,同時也與Leader進行資料交換
1.3 zookeeper 選舉原則
1. 假設叢集中擁有n台可投票(非obsever)伺服器,那麼leader必須得到n/2+1台伺服器投票才可以競選為leader。l
2.如果 leader 死亡,從新選舉 leader
3.如果死亡的機器數量達到一半,叢集挂起
4.observer 不計算在投票總裝置數量裡面
1.4 zookeeper 可伸縮擴充性原理
– leader 所有寫相關操作,接收用戶端的
– follower 讀操作與響應leader提議
– observer Observer接收用戶端請求,并把寫請求轉發給leader,但是leader不會要求Obserber參加投票
用戶端送出一個請求,若是讀請求,則由每台Server直接響應。如果是寫請求,就轉發給leader,由leader發起提案。然後由所有的fllower進行投票,leader對投票進行收集,當票數過半。就向所有的fllower和observer發送一個通知消息,最後當Client所連接配接的Server接收到來自leader的請求之後直接響應使用者請求。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CXzkERNhXUE5kMNpHW4Z0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2LcRHelR3LcJzLctmch1mclRXY39TO4EDNxQjM0EjMwkDM4EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
二、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
三、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
四、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