zookeeper集群、kafka集群、Hadoop高可用
一、zookeeper集群1.1 zookeeper概述1.1.1 什么是zookeeperZooKeeper是一个分布式的协调服务1.1.2 ZooKeeper能干什么ZooKeeper是用来保证数据在集群间的事务性一致1.1.3 zookeeper 应用场景1. 集群分布式锁2. 集群统一命名服务3. 分布式协调服务1.2 zookeeper 角色与特性...
一、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的请求之后直接响应用户请求。
二、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
更多推荐
所有评论(0)