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