因为这里zookeeper的集群部署都会2n+1台
Dubbo建议使用Zookeeper作为服务的注册中心。
Zookeeper集群中只要有过半的节点是正常的情况下,那么整个集群对外就是可用的。正是基于这个特性,要将ZK集群的节点数量要为奇数(2n+1:如3、5、7个节点)较为合适。
zookeeper的介绍:
zookeeper是一个分布式的开源框架,它能很好的管理集群,而且提供协调分布式应用的基本服务。
它向外部应用暴露一组通用服务——分布式同步(Distributed Synchronization)、命名服务(Naming Service)、集群维护(Group Maintenance)等,简化分布式应用协调及其管理的难度,提供高性能的分布式服务。
zookeeper本身可以以standalone模式(单节点状态)安装运行,不过它的长处在于通过分布式zookeeper集群(一个leader,多个follower),基于一定的策略来保证zookeeper集群的稳定性和可用性,从而实现分布式应用的可靠性。
zookeeper 集群角色介绍:
zookeeper集群中主要有两个角色:leader和follower。
领导者(leader),用于负责进行投票的发起和决议,更新系统状态。
学习者(learner),包括跟随者(follower)和观察者(observer)。
其中follower用于接受客户端请求并想客户端返回结果,在选主过程中参与投票。
而observer可以接受客户端连接,将写请求转发给leader,但observer不参加投票过程,只同步leader的状态,observer的目的是为了扩展系统,提高读取速度。
zookeeper解决节点个数的选择:
一个zookeeper集群需要运行几个zookeeper节点呢?
你可以运行一个zookeeper节点,但那就不是集群了。如果要运行zookeeper集群的话,最好部署3,5,7个zookeeper节点。本次实验我们是以3个节点进行的。
zookeeper节点部署的越多,服务的可靠性也就越高。当然建议最好是部署奇数个,偶数个不是不可以。但是zookeeper集群是以宕机个数过半才会让整个集群宕机的,所以奇数个集群更佳。
你需要给每个zookeeper 1G左右的内存,如果可能的话,最好有独立的磁盘,因为独立磁盘可以确保zookeeper是高性能的。如果你的集群负载很重,不要把zookeeper和RegionServer运行在同一台机器上面,就像DataNodes和TaskTrackers一样。
ZooKeeper与Dubbo服务集群架构图
这里我们首先选择三台机器
10.19.42.53
10.19.190.32
10.19.165.206
1、修改操作系统的/etc/hosts文件,添加IP与主机名映射:
添加下面三个解析:
10.19.42.53 zk-00110.19.190.32 zk-00210.19.165.206 zk-003
2.这里我们下载zookeeper的压缩包(这里我的jdk的环境是1.8)
cd /data/tools
上传压缩包zookeeper-3.4.9.tar.gz
tar -xf zookeeper-3.4.9.tar.gz
这里可以做一个软连接
ln -sv zookeeper-3.4.9 zookeeper
cd zookeeper
mkdir /data/zookeeper/{data,logs} -p
cp conf/zoo_sample.cfg conf/zoo.cfg
vim conf/zoo.cfg
其他三个节点修改一下相应的地方即可
参数说明:
tickTime=2000
tickTime这个时间是作为Zookeeper服务器之间或客户端与服务器之间维持心跳的时间间隔,也就是每个tickTime时间就会发送一个心跳。
initLimit=10
initLimit这个配置项是用来配置Zookeeper接受客户端(这里所说的客户端不是用户连接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到Leader的Follower 服务器)初始化连接时最长能忍受多少个心跳时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后 Zookeeper 服务器还没有收到客户端的返回信息,那么表明这个客户端连接失败。总的时间长度就是 10*2000=20 秒。
syncLimit=5
syncLimit这个配置项标识Leader与Follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。
dataDir=/home/wusc/zookeeper/node-01/data
dataDir顾名思义就是Zookeeper保存数据的目录,默认情况下Zookeeper将写数据的日志文件也保存在这个目录里。
clientPort=2181
clientPort这个端口就是客户端(应用程序)连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求。
server.A=B:C:D中的A是一个数字,表示这个是第几号服务器,B是这个服务器的IP地址,C第一个端口用来集群成员的信息交换,表示这个服务器与集群中的leader服务器交换信息的端口,D是在leader挂掉时专门用来进行选举leader所用的端口。
vim /data/zookeeper/zk1/data/myid
1
其他节点的值分别是2,3
添加如下防火墙规则
##### zookeeperiptablse -A INPUT -m state --state NEW -m tcp -p tcp --dport 2081 -j ACCEPTiptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 2888 -j ACCEPTiptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3888 -j ACCEPT
重启防火墙:
# service iptables restart
增加zookeeper环境变量
编辑文件 /etc/profile,添加如下:
export ZOOKEEPER_HOME=/data/tools/zookeeperexport PATH=$ZOOKEEPER_HOME/bin:$PATH
source /etc/profile
增加zookeeper的启动脚本
cd /etc/rc.d/init.d
touch zookeeper && chmod +x zookeeper
vim zookeeper
#!/bin/bash
case in
start) su root /data/tools/zookeeper/bin/zkServer.sh start;;
stop) su root /data/tools/zookeeper/bin/zkServer.sh stop;;
status) su root /data/tools/zookeeper/bin/zkServer.sh status;;
restart) su root /data/tools/zookeeper/bin/zkServer.shrestart;;
*) echo "requirestart|stop|status|restart" ;;
esac
// 添加到开机启动 chkconfig zookeeper on chkconfig --add zookeeper
// 启动或停止 service zookeeper start | stop | restart
这里我们可以查看一下我们的zookeeper服务端口,就是我们上面定义的那个
这里我们启动第一台的时候会报错,接着把接下来的两台服务器起来之后才不会报错,我们可以看一下三台服务器的status.我们会看到有一台服务器的状态是leader,其余两台的状态是follower
如果我们这里是单台的zookeeper的话,我们查看到的状态是standalone,这里我们在搭建zookeeper集群的时候一定要停止已经启动的zookeeper,
// 添加到开机启动 chkconfig zookeeper on chkconfig --add zookeeper
// 启动或停止 service zookeeper start | stop | restart
这里我们可以查看一下我们的zookeeper服务端口,就是我们上面定义的那个
这里我们启动第一台的时候会报错,接着把接下来的两台服务器起来之后才不会报错,我们可以看一下三台服务器的status.我们会看到有一台服务器的状态是leader,其余两台的状态是follower
如果我们这里是单台的zookeeper的话,我们查看到的状态是standalone,这里我们在搭建zookeeper集群的时候一定要停止已经启动的zookeeper,
这里有一点要注意的是。我们配置hosts的时候
[wwwad@zk3 ~]$ cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6127.0.0.1 zk310.19.118.88 zk110.19.106.84 zk210.19.171.44 zk3
这个我把127.0.0.1的解析到了zk3,而且还是放在10.19.171.44 zk3之前,我怎么起都是报错的。这里我们需要把127.0.0.1的解析去掉,或者放在最后