ZooKeeper是一个分布式的协调服务
ZooKeeper是用来保证数据在集群间的事务性一致
1. 集群分布式锁
2. 集群统一命名服务
3. 分布式协调服务
1. Leader:
接受所有Follower的提案请求并统一协调发起提案的投票,负责与所有的Follower进行内部的数据交换
2. Follower:
直接为客户端服务并参与提案的投票,同时与Leader进行数据交换
3. Observer:
直接为客户端服务但并不参与提案的投票,同时也与Leader进行数据交换
1. 假设集群中拥有n台可投票(非obsever)服务器,那么leader必须得到n/2+1台服务器投票才可以竞选为leader。l
2.如果 leader 死亡,从新选举 leader
3.如果死亡的机器数量达到一半,集群挂起
4.observer 不计算在投票总设备数量里面
– leader 所有写相关操作,接收客户端的
– follower 读操作与响应leader提议
– observer Observer接收客户端请求,并把写请求转发给leader,但是leader不会要求Obserber参加投票
客户端提交一个请求,若是读请求,则由每台Server直接响应。如果是写请求,就转发给leader,由leader发起提案。然后由所有的fllower进行投票,leader对投票进行收集,当票数过半。就向所有的fllower和observer发送一个通知消息,最后当Client所连接的Server接收到来自leader的请求之后直接响应用户请求。
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.3 kafka 角色
– producer:生产者,负责发布消息
– consumer:消费者,负责读取处理消息
– topic:消息的类别
– Parition:每个Topic包含一个或多个Partition.
– Broker:Kafka集群包含一个或多个服务器
– Kafka通过Zookeeper管理集群配置,选举leader
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
– NameNode 是 HDFS 的核心配置,HDFS 又是Hadoop 的核心组件,NameNode 在 Hadoop 集群
中至关重要,NameNode机器宕机,将导致集群不可用,如果NameNode 数据丢失将导致整个集群的数据
丢失,而 NameNode 的数据的更新又比较频繁,实现 NameNode 高可用是很有必要的
– 官方提供了两种解决方案
– HDFS with NFS
– HDFS with 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】
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
6. 配置 hdfs-site.xml
7. yarn-site.xml 配置文件
#-----------------------------------------------------#
初始化启动集群
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