Zokeeper安装
分布式
- 任务拆分
- 节点分工
分布式协作中的难点
如果让你设计一个分布式系统,你预见到什么问题?
- 保证节点高可用(节点故障)
- 数据的一致性
- 通讯异常
- 网络分区
.......
Zookeeper简介
分布式协作。zookeeper是google的chubby项目开源实现。最早是hadoop的子项目。
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解决哪些问题
- Master节点管理
解决的问题:Master高可用(挂掉以后,谁来负责工作),保证唯一。
- 配置文件管理
解决的问题:统一把配置文件存放zk,由ZK统一分发。
- 发布与订阅
发布者(producer)讲数据发布到zk节点上,供订阅者(consumer)动态获取
- 分布式锁
分布式环境访问统一个资源,由第三方配锁实现。
解决的问题:由zk统一进行协调,保证数据的一致性。
- 集群的管理
Worker集群监控。
Zookeeper安装配置
- 下载
$ wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
- 解压
$ 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 指定服务器的集群情况(有几台服务器)
myid必须手动建立且指定在zk数据目录,也就是dataDir指定的路径(不管真分布还是伪分布都需要指定)
$ echo 1 >> /home/hadoop/tmp/zookeeper/zk1/myid
$ echo 2 >> /home/hadoop/tmp/zookeeper/zk2/myid
$ echo 3 >> /home/hadoop/tmp/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