今天是平安夜,先祝大家平安夜快乐。这篇文章我们来谈谈 Zookeeper Linux 集群。
为什么要集群呢?因为一台服务不够。集群是为了系统扩容,系统稳定。一台服务挂了,没关系,我还有其他的服务。集群虽然可以带来很多好处,例如高可用性,高并发,高流量,但是也有它的缺点。因为是多台服务器,所以怎么去保证每台服务器上的数据一致以及事务就成了问题。不过 Zookeeper 帮我们解决了这些问题,关于一致性和事务我们以后再详细讨论,足以写多篇随笔了。
上一篇随笔是写独立服务,也就是单台服务器提供服务。Zookeeper 目录是 /usr/local/src/zookeeper/zookeeper-3.4.6。我们现在要集群,所以需要至少 3 个 Zookeeper 注册中心。先来看看我的 3 个注册中心目录,/usr/local/src/zookeeper/zookeeper-3.4.9、/usr/local/src/zookeeper/zookeeper-3.4.9.slave、/usr/local/src/zookeeper/zookeeper-3.4.6。首先保证每个注册中心可以单独正常服务,其实集群和单体的区别在于配置,单体配置很简单,集群配置则必须包含其他注册中心信息。
先来看看 /usr/local/src/zookeeper/zookeeper-3.4.6 配置文件:
重点看看最后,server.1=127.0.0.1:2881:3881、server.2=127.0.0.1:2882:3882、server.3=127.0.0.1:2883:3883。由于服务器原因,我的 3 个注册中心都放在了同一台服务器。server.1、server.2、server.3 则表示 3 个不同的注册中心服务名称。1、2、3 则表示 3 个注册中心的标识码。
规则 server.N=IP:A:B,N 表示标识码也就是编码,IP 表示服务地址,A 表示LF通信端口,也就是与 Leader 通信端口,B 表示选举端口。既然是集群,那么需要有一个领导,其他的都是随从。谁来做领导,这就需要选举,所以需要 B 端口。有了领导,需要和领导通信就需要专门通信端口,也就是 A。至于为什么不把 A 和 B 设置成同一个端口,我个人认为如果设置成一个端口,端口出现问题的话,那就既不能和领导通信,也不能选举。这就极有可能使整个集群不可用,虽然你有 N 台服务器,但是根据选举过半原则就很有可能选不出领导。
因为我是放在同一台服务器,所有可以看到,server.1、server.2、server.3 的 A 和 B 端口都不一样。如果是放在不同的服务器,例如 server.1=192.168.0.1:2881:3881、server.2=192.168.0.2:2881:3881、server.3=192.168.0.3:2881:3881,那么 A 和 B 端口可以一样。
继续上面的话题,server.1、server.2、server.3,怎么知道 /usr/local/src/zookeeper/zookeeper-3.4.6 是哪一台服务呢?可以看到 dataDir=/usr/local/src/zookeeper/zookeeper-3.4.6/data,在 data 目录下面我们要生成一个叫 myid 的文件,里面就保存了服务表示码,也就是编码。
这里面是 1,server.1 就是 /usr/local/src/zookeeper/zookeeper-3.4.6 的服务,127.0.0.1:2881:3881,通信端口 2881,选举端口 3881。
其他两个 /usr/local/src/zookeeper/zookeeper-3.4.9、/usr/local/src/zookeeper/zookeeper-3.4.9.slave,也是一样的。
我们启动所有的注册中心,然后 jps 看看。
最后我们要记得把,2181、2182、2183 端口加入防火墙规则,像上一篇文章中讲的,-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2181 -j ACCEPT。重启防火墙。
好了,我们来试试集群是否成功。首先注册 Dubbo 服务到集群,然后通过 Dubbo 客户端随机调用,看看提供服务的注册中心是否不同。
先来看看 Dubbo 服务注册:
<dubbo:application name="demo-provider"/>
<dubbo:registry id="test" group="test" protocol="zookeeper" address="192.168.0.106:2181,192.168.0.106:2182,192.168.0.106:2183" />
<dubbo:protocol name="dubbo" port="20881"/>
<dubbo:service interface="www.test.com.dubbo.xml.IUser" ref="userService" version="0.0.1"/>
<bean id="userService" class="www.test.com.dubbo.xml.UserImpl"/>
Dubbo 客户端订阅:
<dubbo:application name="demo-consumer"/>
<dubbo:registry protocol="zookeeper" id="test" group="test" address="192.168.0.106:2181,192.168.0.106:2182,192.168.0.106:2183"/>
<dubbo:reference id="userService" interface="www.test.com.dubbo.xml.IUser" version="0.0.1"/>
先来看看 Dubbo 服务是否注册成功。
没错,dubbo%3A%2F%2F192.168.0.102%3A20881%2Fwww.test.com.dubbo.xml.IUser,这就是 Dubbo 服务提供者地址。
我们来随机获取服务,看看是哪个注册中心提供服务。
第一次获取
第二次获取
第三次获取
OK,Linux 集群就到这里,谢谢大家观看,希望有所帮助!