天天看點

zookeeper叢集、kafka叢集、Hadoop高可用一、zookeeper叢集二、ZK 叢集的安裝配置三、kafka 叢集搭建四、hadoop 高可用

一、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的請求之後直接響應使用者請求。

zookeeper叢集、kafka叢集、Hadoop高可用一、zookeeper叢集二、ZK 叢集的安裝配置三、kafka 叢集搭建四、hadoop 高可用

二、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 叢集結構

zookeeper叢集、kafka叢集、Hadoop高可用一、zookeeper叢集二、ZK 叢集的安裝配置三、kafka 叢集搭建四、hadoop 高可用

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

zookeeper叢集、kafka叢集、Hadoop高可用一、zookeeper叢集二、ZK 叢集的安裝配置三、kafka 叢集搭建四、hadoop 高可用

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高可用架構

zookeeper叢集、kafka叢集、Hadoop高可用一、zookeeper叢集二、ZK 叢集的安裝配置三、kafka 叢集搭建四、hadoop 高可用

4.3 系統規劃

zookeeper叢集、kafka叢集、Hadoop高可用一、zookeeper叢集二、ZK 叢集的安裝配置三、kafka 叢集搭建四、hadoop 高可用

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