Zookeeper安装
Zookeeper的搭建方式
Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。
1.单机模式:Zookeeper只运行在一台服务器上,适合测试环境;
2.伪集群模式:就是在一台物理机上运行多个Zookeeper 实例。
3.集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble)。
Zookeeper通过复制来实现高可用性,只要集合体中半数以上的机器处于可用状态,它就能够保证服务继续。为什么一定要超过半数呢?这跟Zookeeper的复制策略有关:zookeeper确保对znode 树的每一个修改都会被复制到集合体中超过半数的机器上。
一、Zookeeper的单机模式搭建
(1)解压:tar -zxvf zookeeper-3.4.5.tar.gz
(2)配置文件:在conf目录以修改zoo_sample.cfg为zoo.cfg。
(3)配置环境变量:为了今后操作方便,我们需要对Zookeeper的环境变量进行配置,方法如下在/etc/profile文件中加入如下内容:
export ZOOKEEPER_HOME=/usr/local/zk
export PATH=.ZOOKEEPER_HOME/bin:JAVA_HOME/bin: PATH
(4)启动ZooKeeper的Server:zkServer.sh start;关闭ZooKeeper的Server:zkServer.sh stop
二、Zookeeper的伪集群模式搭建
Zookeeper不但可以在单机上运行单机模式Zookeeper,而且可以在单机模拟集群模式 Zookeeper的运行,也就是将不同节点运行在同一台机器。
(1)解压:tar -zxvf zookeeper-3.4.5.tar.gz -C zk
(2)依次在zk目录下新建,data0,data1,data2,log0,log1,log2
(3)进入conf目录下依次新建zoo1.cnf/zoo2.cnf/zoo3.cnf,修改内容如下:
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/zk/data0(每个配置文件不同)
dataLogDir=/opt/zk/log0(每个配置文件不同)
clientPort=2181(每个配置文件不同)
server.0=10.20.151.34:2887:7770
server.1=10.20.151.34:2888:7771
server.2=10.20.151.34:2889:7772
参数:
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 实例通信端口号不能一样,所以要给它们分配不同的端口号。
由于是在单机上搭建,所以每个server的clientPort需要不一样的值,如下这个对应关系:server.0-2181,server.1->2182,server.2->2183
(4)在集群模式下,需要通过myid来确定是哪一个server,上面配置的zoo.cfg中有一个值dataDir,在其指定的路径下新建一个文件myid,该文件中只需要写入相应的A值,如在server.0,该值就应该是0
[root@mo ~]# echo "1" >> /opt/zk/data0/myid
[root@mo ~]# echo "2" >> /opt/zk/data1/myid
[root@mo ~]# echo "3" >> /opt/zk/data2/myid
(5)启动
在集群为分布式下,我们只有一台机器,按时要运行三个Zookeeper实例。此时,如果在使用单机模式的启动命令是行不通的。此时,只要通过下面三条命令就能运行前面所配置的Zookeeper服务。如下所示:
zkServer.sh start zoo1.conf
zkServer.sh start zoo2.conf
zkServer.sh start zoo3.conf
在运行完第一条指令之后,会出现一些错误异常,产生异常信息的原因是由于Zookeeper服务的每个实例都拥有全局配置信息,他们在启动的时候会随时随地的进行Leader选举操作。此时,第一个启动的Zookeeper需要和另外两个Zookeeper实例进行通信。但是,另外两个Zookeeper实例还没有启动起来,因此就产生了这样的异样信息。
我们直接将其忽略即可,待把图中“2号”和“3号”Zookeeper实例启动起来之后,相应的异常信息自然会消失。此时,可以通过下面三条命令,来查询。
zkServer.sh status zoo1.conf
zkServer.sh status zoo2.conf
zkServer.sh status zoo3.conf
(6)连接Zookeeper
集群连接,连接集群中的任意一台服务器即可。
[root@mo zookeeper-3.4.6]#./bin/zkCli.sh -server 192.168.200.128:2181
注意事项
在一台机器上部署了3个server,需要注意的是在集群为分布式模式下我们使用的每个配置文档模拟一台机器,也就是说单台机器及上运行多个Zookeeper实例。但是,必须保证每个配置文档的各个端口号不能冲突,除了clientPort不同之外,dataDir也不同。另外,还要在dataDir所对应的目录中创建myid文件来指定对应的Zookeeper服务器实例。
(1)clientPort端口:如果在1台机器上部署多个server,那么每台机器都要不同的clientPort,比如 server1是2181,server2是2182,server3是2183,
(2)dataDir和dataLogDir:dataDir和dataLogDir也需要区分下,将数据文件和日志文件分开存放,同时每个server的这两变量所对应的路径都是不同的。
(3)server.X和myid: server.X这个数字就是对应,data/myid中的数字。在3个server的myid文件中分别写入了0,1,2,那么每个server中的zoo.cfg都配 server.0 server.2,server.3就行了。因为在同一台机器上,后面连着的2个端口,3个server都不要一样,否则端口冲突。