对于伪集群的安装就是把原来安装的zookeeper的配置进行相应修改即可,要几个就修该几个!!!
伪集群在实际开发中并没有什么用,伪集群是在一台服务器上的,但是在实际开发中是每台服务器上都有一个zookeeper服务器这样才能保证当一台服务器垮掉之后,还能进行正常的访问。这里只是模拟一下实际开发的场景,真集群就是把localhost改成新的服务器地址即可
注意:只要用到端口访问,都要把防火墙关闭,否则外部无法访问本机相应的端口
//查看防火墙状态
systemctl status firewalld
//关闭状态
systemctl stop firewalld
- 创建一个文件夹里面放不同的zookeeper
- 在这个文件夹下创建三个文件夹,每个文件夹相当于一个端口
- 进入到zk2190下 创建一个data文件夹
- 到原先已经安装好的zookeeper下的conf文件夹下(具体安装在我的博客中有,这里只是伪集群的安装)复制之前zoo.cfg到zk2190
- 修改zk2190下的zoo.cfg
- 接下来就是按原来的步骤去修改zk2191和zk2192,重复步骤太麻烦,因为它们都和zk2190基本上是一样的,所以只需复制就行,简单的改一下里面的相关配置即可
- 回到zk2190下,在data中创建myid,并修改
- 回到zk2190修改zoo.cfg
- 重复之前的修改,分别对zk2191和zk2192进行修改
拓展:真集群中只需要把localhost换成不同的ip地址即可,剩下的步骤和本文一样
zk2192的修改重复上述步骤
- 开始启动zookeeper服务(这里还是在之前安装的单机版zookeeper下启动,本文只是创建了几个不同的zookeeper启动环境,这里就相当于有三个zookeeper服务)
- 启动zk2190
[root@localhost ~]# ./apache-zookeeper-3.6.2-bin/bin/zkServer.sh start zks/zk2190/zoo.cfg
# 后面跟的就是具体要启动的zookeeper服务
再分别启动zk2191和zk2192
- 查看zookeeper状态
[root@localhost ~]# ps -ef|grep zookeeper
- 查看zk2190的信息
- 查看zk2191的信息
- 查看zk2192的信息
完成了一主二从的集群效果
根据zookeeper选举原理可以推断出2191会成为leader
主服务器可以进行写操作和读操作
从服务器只能进行读操作,当有写操作请求发送到该服务器上时,从服务器会把请求转发给主服务器进行写操作,主服务器写操作完毕,会同步到从服务器
zookeeper是满足CP原则,要求数据必须一致,在同步期间可能会存在阻塞
验证一些集群
#连接到2190服务器客户端 使用-server后指定要连接服务器的地址及端口
./apache-zookeeper-3.6.2-bin/bin/zkCli.sh -server localhost:2190
操作来验证对一个从服务器进行了写操作,看是否其它的服务器被同步了
zk2190是从机(这里之所以能查看到choage这个节点是因为后面的结论)
zk2191是主机
zk2192是从机
结论:对从机创建了一个节点(写操作)但是从机只能进行读操作,这时从机会把写操作交给主机,然后主机处理完,在同步到不同的从机上
- 假如zk2190从机垮了,那么是不会有什么影响的,zk2191还是主机,zk2192还是从机
- 假如zk2191主机垮了,那么肯定是有影响的,集群会重新选一个leader,因为会比较myid的值,所以新的leader应该是3号服务器zk2192
具体验证操作
zookeeper的Java客户端程序
常见的客户端
- zookeeper自带的客户端不方便不推荐使用
- zkclient之前使用的较多,但是又与后期维护复杂,以及dubbo等都遗弃了该客户端所以也不推荐使用
- curator客户端 dubbo2.7之后全都升级使用curator,包括es(elaticsSearch)都使用curator 推荐使用
curator客户端的简单举例
其实就是利用java程序对zookeeper服务器进行操作
之前的redis也可以用Java程序对其操作,不管是什么服务,它基本上都有对应的java客户端
导入依赖时要注意:不要去导入主包,因为它只是一个包。要导入从包,那么maven会把从包依赖的主包也导进去。
pom.xml导入依赖
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>
下面的依赖也是可以的,它是从包,会自动把上面一个主包导进去
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
测试程序
package com;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class test {
public static void main(String[] args) throws Exception {
//定义重试策略:在连接zookeeper时可能第一次没有连接成功,在休眠1秒钟后,继续重试,可以重试次数是2次,重试2次仍然失败,退出
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,2);
//创建连接zookeeper的客户端代理
CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("192.168.98.133:2190",retryPolicy);
//启动客户端连接
curatorFramework.start();
//在zookeeper服务器上创建一个结点和给该节点赋值,
//"123456".getBytes()把字符串转为字节型数组
curatorFramework.create().forPath("/chaoge2021","123456".getBytes());
//关闭客户端连接
curatorFramework.close();
}
}