-
分布式:可以简单的理解为任务拆分和节点分工;
分布式是解决高可用,高并发的。集群解决的是高可用。集群式从物理上进行定义,而分布式是一种工作方式;
例如:一个工作任务需要10个小时(单个节点);
分布式:10台机器,任务只需要1个小时就能完成;
集群:10台机器,任务还是10个小时;
-
分布式的协作难点:
对于设计的分布式系统,所出现的问题也会有很多;
- 如何保证节点的高可用(节点故障);
- 如何保证数据的一致性;
- 通讯异常时如何处理;
- 网络分区;等等.....
而这些问题Zk都有对应的解决办法;
-
Zookeeper简介
分布式协作。zookeeper是google的chubby项目开源实现。最早是hadoop的子项目。
小米米聊、淘宝Taokeeper其实类zookeeper。
Kafka使用zookeeper。消息发布订阅,其中zk就是用于检测节点崩溃。实现主题的发现,并且保持主题的生产和消费状态。
Hbase三段查找,Root-Region=》Meta Region=》Region(Table)。hbase的元数据信息放在HBase。HMaster挂掉,马上 要节点恢复。
Hadoop。NameNode(SecondaryNameNode),HA Hadoop。一般情况下一个简单的hadoop集群,只有一个NameNode,如果NameNode挂掉,hadoop集群不可用。HA Haoop里面就要用到zk。
-
Zookeeper解决哪些问题
1. Master节点管理
解决的问题:Master高可用(主机挂掉以后,谁来负责工作),保证唯一;
2. 配置文件管理
解决的问题:统一把配置文件存放在Zookeeper,由Zookeeper统一发放
3. 发布和订阅
发布者(producer)讲数据发布到zk节点上,供订阅者(consumer)动态获取
4. 分布式锁
分布式环境访问统一个资源,由第三方配锁实现。
解决的问题:由zk统一进行协调,保证数据的一致性。
5.集群的管理
Worker集群监控。
-
Zookeeper安装配置
1. 下载
$ wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
2. 解压
$ tar xvzf zookeeper-3.4.9.tar.gz
$ mv ./zookeeper-3.4.9 /usr/local/
- 修改配置文件
${ZOOKEEPER_HOME}/conf/zoo_sample.cfg
(伪分布式)
dataDir指定当前服务器数据存放的路径(目录)
clientPort 指定当前服务器服务器的端口
server.1/server.2/server.3 指定服务器的集群情况(有几台服务器,master是服务器地址)
myid必须手动建立且指定在zk数据目录,也就是dataDir指定的路径(不管真分布还是伪分布都需要指定)
$ echo 1 >> /home/zookeeper/zk1/myid
$ echo 2 >> /home/zookeeper/zk2/myid
$ echo 3 >> /home/zookeeper/zk3/myid
Zookeeper伪分布式部署(server zookeeper只有一份)
/conf/zoo1.cfg zoo2.cfg zoo3.cfg
zoo1.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk1(这个目录可以自行指定)
clientPort=2181
server.1=master:2888(通讯端口):3888(选举端口)
server.2=master:2889:3889
server.3=master:2890:3890
zoo2.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk2
clientPort=2182
server.1=master:2888:3888
server.2=master:2889:3889
server.3=master:2890:3890
zoo3.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk3
clientPort=2183
server.1=master:2888:3888
server.2=master:2889:3889
server.3=master:2890:3890
Zookeeper真分布部署在master、slave1、slave2 三台不同的服务器上
注意:服务器之间的通信是否正常;防火墙是否关闭等等;
server1..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server2..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
server3..../conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/home/hadoop/tmp/zookeeper/zk
clientPort=2181
server.1=master:2888:3888
server.2=slave1:2888:3888
server.3=slave2:2888:3888
-
Zookeeper及其APi的使用
- 伪分布式:
停止Zookeeper
$ zkServer.sh stop /usr/local/zookeeper-3.4.6/conf/zoo1.cfg
$ zkServer.sh stop /usr/local/zookeeper-3.4.6/conf/zoo2.cfg
$ zkServer.sh stop /usr/local/zookeeper-3.4.6/conf/zoo3.cfg
启动Zookeeper
$ zkServer.sh start /usr/local/zookeeper-3.4.6/conf/zoo1.cfg
$ zkServer.sh start /usr/local/zookeeper-3.4.6/conf/zoo2.cfg
$ zkServer.sh start /usr/local/zookeeper-3.4.6/conf/zoo3.cfg
查看zookeeper状态
$ zkServer.sh status /usr/local/zookeeper-3.4.6/conf/zoo1.cfg
$ zkServer.sh status /usr/local/zookeeper-3.4.6/conf/zoo2.cfg
$ zkServer.sh status /usr/local/zookeeper-3.4.6/conf/zoo3.cfg
- 真分布式(其中一个ZK的启动):
zk的相关命令.
启动ZK服务: sh zkServer.sh start
查看ZK服务状态: sh zkServer.sh status
停止ZK服务: sh zkServer.sh stop
重启ZK服务: sh zkServer.sh restart
1.启动zk真分布中的3个Zk;
2.查看后的zk状态(mode:表示是状态,follower表示的是从;leader表示的是主);
zk2为主:如图
zk1和zk3为从:如图
3.查看主Zk进程并杀死进程:(主zk2的进程,查询并杀死进程)
查询进程主ZK2
杀死进程主ZK2
查看主ZK2的状态已经停止
查看zk1和zk3的状态时,zk3变成了leader