Zookeeper学习笔记:Zookeeper–分布式框架
标签(空格分隔): Zookeeper
一、什么是Zookeeper
Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:同步配置管理、选举、分布式锁、分组和命名、分布式应用配置项的管理等。本文将从使用者角度详细介绍 Zookeeper 的安装和配置文件中各个配置项的意义,以及分析 Zookeeper 的典型的应用场景(配置文件的管理、集群管理、同步锁、Leader 选举、队列管理等)。
二、Zookeeper的安装
- 下载Zookeeper的安装包
解压安装
[root@mo ~]# tar -zxf zookeeper-3.4.6.tar.gz -C /usr/
修改配置文件
单机版修改为:[root@mo conf]# cp zoo_sample.cfg zoo.cfg [root@mo conf]# vi zoo.cfg tickTime=2000 dataDir=/root/data/zookeeper clientPort=2181
参数说明:
tickTime:基本事件单元,以毫秒为单位。它用来指示心跳,最小的Session过期时间为两倍的tickTime。 dataDir:存储内存中数据快照的位置,如果不设置参数,更新事务日志将被存储在默认位置。 clientPort:监听客户端连接的端口 使用单机模式时,这种配置方式下没有Zookeeper副本,所以如果Zookeeper服务器出现故障,Zookeeper服务器会将会停止。
集群配置:
Zookeeper 不仅可以单机提供服务,同时也支持多机组成集群来提供服务。实际上 Zookeeper 还支持另外一种伪集群的方式,也就是可以在一台物理机上运行多个 Zookeeper 实例,下面将介绍集群模式的安装和配置。集群中的每台机器的conf/zoo.cfg配置文件设置为【zoo为自己修改的名称】:
tickTime=2000 dataDir=/root/data/zookeeper //存放数据路径 clientPort=2181 //端口号 initLimit=5 syncLimit=2 server.1=zoo1:2887:3887 //server.【id】=【主机名】:【与主机通讯端口】:【选举端口】 server.2=zoo2:2888:3888 server.3=zoo3:2889:3889
参数: initLimit:这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接 Zookeeper 服务器的客 户端,而是 Zookeeper服务器集群中连接到Leader的Follower服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超 过10 个心跳的时间(也就是tickTime)长度后Zookeeper服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。 总的时间长度就是 5*2000=10 秒。 syncLimit:这个配置项标识LeaderFollower之间发送消息,请求和应答时间长度,最长不能超过多少个 tickTime 的时间长度,总的时间长度就是 2*2000=4 秒。 server.A=B:C:D:其中 A 是一个数字,表示这个是第几号服务器;B 是这个服务器的 ip 地址;C 表示的是这个服务 器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出 一个新的Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给它们分配不同的端口号。
修改主机名称详情见【附录】 修改配置如:
//zoo1.cnf tickTime=2000 dataDir=/root/data/zookeeper1 clientPort=2181 initLimit=5 syncLimit=2 server.1=motui:2887:3887 server.2=motui:2888:3888 server.3=motui:2889:3889 //zoo2.cnf tickTime=2000 dataDir=/root/data/zookeeper2 clientPort=2182 initLimit=5 syncLimit=2 server.1=motui:2887:3887 server.2=motui:2888:3888 server.3=motui:2889:3889
具体解释: “server.id=host:port:port”:指出不同的Zookeeper的服务器的自身标示,作为集群中的一部分机器应该知道集群中的其他机器。用户可以从“server.id=host:port:port”中读取相关信息。 在DataDir目录下创建一个名为myid的文件,这个文件仅仅含有一行内容,指定自身的id值。比如服务器的id为1,就在这个文件中写1,第一个port是保证和主机通信,第二个port是做选举的。 启动Zookeeper的集群:./bin/zkServer.sh start zoo1.cfg 连接集群:./bin/zkCli -server 127.0.0.1:2181
需要在每台机器的DataDir目录下创建一个名为myid的文件,文件中只有对应自己的ID。
[root@mo ~]# echo "1" >> /root/data/zookeeper1/myid [root@mo ~]# echo