判断zk是否挂掉_Zookeeper入门学习第一天,zk集群简单介绍

3d6a0f94fbb6dba7dafefaa44d4f7981.png

一、Zookeeper集群搭建及基本使用

1.centOs虚拟机三台 ,集群最好是奇数台容灾性好一些,由于允许不过半节点宕机,例五台可以挂掉两台,四台可以挂掉一台。简单说就是过半可用。

2.Zookeeper官方 http://zookeeper.apache.org/

二、zk安装

1.Wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.5/zookeeper-3.4.5.tar.gz

2. tar -xvzf zookeeper-3.4.5.tar.gz

目录为/opt/bigdata/zookeeper-3.4.5

3.在/etc/profile 里配置:

JAVA_HOME ZOOKEEPER_HOME PATH

4.创建data目录和myid

创建data目录:$ZOOKEEPER/data,即/opt/bigdata/zookeeper-3.4.5/data

创建myid: /opt/bigdata/zookeeper-3.4.5/data/myid

myid存server的id,可以是1,2,3…,必须唯一

三、zk配置

创建文件 $ZOOKEEPER/conf/zoo.cfg

修改zoo.cfg,增加如下:

dataDir=/opt/bigdata/zookeeper-3.4.5/data

clientPort=2181

initLimit=10

syncLimit=5

tickTime=2000

server.1=master:2888:3888

server.2=slave1:2888:3888

server.3=slave2:2888:3888

其中server.myid代表组成整个服务的机器,当服务启动时,会在数据目录下查找这个文件myid,这个文件中存有服务器的号码。

四、启动

zkServer.sh start 启动 三台顺序分别启动后第二台为leader其他为follower代表成功(选举机制)

zkServer.sh status 查看状态

zkServer.sh status 停止

Master/slave 架构

Leader选举,Leader负责整个集群Client消息接收,分发给每个Flower。

Client操作:

在任一台机器上

zkCli.sh -server master:2181

五、zk的优点

简单易用,能够很好的解决分布式框架在运行中出现的协调问题。例如master主备切换、节点的上下线感知。

六、zk的HA方案

话不多说,上图

5c26d124dcea75c4fbbbc8b70e161c39.png

1.在我们配置HA高可用之后,HA会给我们产生zkfc(基于zookeeper实现的failover controller)进程,启动后,两个zkfc都会往zk集群中注册(此时还不知道哪个namenode为active)

2.我们根据zkfc的注册顺序,即谁先注册成功谁成为active节点。

3.这时active的zkfc会在zk集群中生成一个临时节点,而standby的zkfc监听着这个临时节点

假如因为网络故障zk集群和active namenode连接不上则监听器会将监听到的事件通知给standby的zkfc,standby的zkfc触发监听的回调

1)首先判断active的namenode是否真的和zk集群断开了连接

2)宕机的namenode则降级为standby namenode

3)监听到事件的standby namenode成为新的active namenode。

需要注意的是,当active namenode宕机的时候,standby namenode收到切换的请求时,不是立即切换的,首先会做两件事。

1.通过SSH远程指令,杀掉active namenode 的进程,但是如果不仅仅是namenode挂了,而是整个机器挂了,那发送的指令就不会有反应,也不会有反馈信息。

2.那么如果SSH没有响应,则帮用户调用一个用户所指定的脚本,脚本运行成功,则切换状态

七、监听器原理

1)首先要有一个 main()线程

2)在 main 线程中创建 Zookeeper 客户端,这时就会创建两个线程,一个负责网络连接

通信(connet),一个负责监听(listener)。

3)通过 connect 线程将注册的监听事件发送给 Zookeeper。

4)在 Zookeeper 的注册监听器列表中将注册的监听事件添加到列表中。

5)Zookeeper 监听到有数据或路径变化,就会将这个消息发送给 listener 线程。

6)listener 线程内部调用了 process()方法。