zookeeper集群、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的请求之后直接响应用户请求。

二、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

   
        fs.defaultFS
        hdfs://nsdcluster
   

   
        hadoop.tmp.dir
        /var/hadoop
   

   
        ha.zookeeper.quorum
        node1:2181,node2:2181,node3:2181
   

   
        hadoop.proxyuser.nsd1804.groups
        *
   

   
        hadoop.proxyuser.nsd1804.hosts
        *
   

6. 配置 hdfs-site.xml

   
        dfs.replication
        2
   

   
        dfs.nameservices
        nsdcluster
   

   
        dfs.ha.namenodes.nsdcluster
        nn1,nn2
   

   
        dfs.namenode.rpc-address.nsdcluster.nn1
        nn01:8020
   

   
        dfs.namenode.rpc-address.nsdcluster.nn2
        nn02:8020
   

   
        dfs.namenode.http-address.nsdcluster.nn1
        nn01:50070
   

   
        dfs.namenode.http-address.nsdcluster.nn2
        nn02:50070
   

   
        dfs.namenode.shared.edits.dir
        qjournal://node1:8485;node2:8485;node3:8485/nsdcluster
   

   
        dfs.journalnode.edits.dir
        /var/hadoop/journal
   

   
        dfs.client.failover.proxy.provider.nsdcluster
        org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider
   

   
        dfs.ha.fencing.methods
        sshfence
   

   
        dfs.ha.fencing.ssh.private-key-files
        /root/.ssh/id_rsa
   

   
        dfs.ha.automatic-failover.enabled
        true
   

7. yarn-site.xml 配置文件


   
        yarn.nodemanager.aux-services
        mapreduce_shuffle
   

   
        yarn.resourcemanager.ha.enabled
        true
   
 
   
        yarn.resourcemanager.ha.rm-ids
        rm1,rm2
   

   
        yarn.resourcemanager.recovery.enabled
        true
   

   
        yarn.resourcemanager.store.class
        org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore
   

   
        yarn.resourcemanager.zk-address
        node1:2181,node2:2181,node3:2181
   

   
        yarn.resourcemanager.cluster-id
        yarn-ha
   

   
        yarn.resourcemanager.hostname.rm1
        nn01
   

   
        yarn.resourcemanager.hostname.rm2
        nn02
   

#-----------------------------------------------------#
初始化启动集群
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

你可能感兴趣的:(#,集群)