1、系统环境
2、导入JDK和Zookeeper包
1)、使用SecureCRT工具打开SFTP连接,直接拖拽,到当前用户文件夹下,然后使用mv命令(mv 文件 目标文件夹)移动到自定义路径下
2)、使用tar -zxvf 包名,解压JDK和Zookeeper
3、配置java环境变量,vi /etc/profile,编辑完成保存后,使用source /etc/profile使环境变量生效,java -version命令验证
4、在zookeeper目录下的conf目录下,新建zoo.cfg文件并配置如下(zoo.cfg文件是Zookeeper默认配置文件,其配置案例在zoo_samples.cfg中)
tickTime:服务器与服务器之间或服务器与客户端之间心跳间隔
dataDir:Zookeeper保存数据的目录,默认情况下,Zookeeper将写数据的日志文件也保存在这;如果目录不存在启动时候会自动创建
clientPort:客户端连接Zookeeper服务器的端口,Zookeeper会监听这个端口,接收客户端的访问请求
5、启动Zookeeper,在bin文件夹下调用zkServer.sh start命令,start后面如果不指定配置文件路径,默认使用con/zoo.cfg
查看服务状态,./zkServer.sh status
6、客户端连接服务端,bin/zkCli.sh -server 127.0.0.1:2181
7、增删改查命令使用,进入客户端后通过help可查看所有命令使用方法
1)、ls 查看znode节点
2)、create 创建znode节点,节点后面必须赋值,否则不会创建成功
3)、get 获取节点值
4)、set 修改节点值
5)、创建/test子节点,注意获取/test值时,cversion由0变为1
6)、delete 删除节点
如果有子节点,父节点不能删除,需要先删除子节点再删除父节点
7)、quit 退出客户端操作界面
8、停掉Zookeeper服务
二、Zookeeper集群模式搭建(3台,最好奇数台,根据Leader选举算法Paxos协议,半数原则)
zk1对应IP:192.168.7.128
zk2对应IP:192.168.7.216
zk3对应IP:192.168.7.217
1、每台服务器上搭建基础环境,参照单击模式搭建
2、在Zookeeper保存数据的文件路径下创建myid文件,并写入server对应值(如果保存数据文件路径不存在自己创建),各台机器执行如下命令
zk1中命令:echo "1">myid;zk2中命令:echo "2">myid;zk3中命令:echo "3">myid
最终如下
3、配置各台及其conf/zoo.cfg文件如下
initLimit:Zookeeper集群中,连接到Leader的Follower服务初始化连接时最长限制时间多少个心跳间隔,如上配置5,表示5*2000=10秒,10秒内没有连接上表示Follower连接失败
syncLimit:Leader和Follower之间发送消息,请求和应答最长心跳间隔数,如上2*2000=4秒
server.x(x表示上面配置的1,2,3),x就是各台服务器中写入myid文件的数
IP:2888:3888 IP就是各服务器IP,2888是这个服务器与集群中的Leader进行信息交换的端口,3888是表示万一集群中的Leader服务器挂掉,需要一个端口来重新进行选举,选出一个新Leader,也就是这个3888端口是用来执行选举Leader时候用
4、启动各台Zookeeper服务 bin/zkServer.sh start ,都启动成功后,bin/zkServer.sh status查看服务器状态
起初查看状态报错如下,后来想到是防火墙的问题,就执行 systemctl stop firewalld 关闭即可
查看防火墙并关闭
各台服务器 bin/zkServer.sh restart 命令重启Zookeeper服务,查看状态
zk1服务器如下,注意Mode:leader,即此服务器为集群Leader(Leader选举有算法,并非第一个就是Leader)
zk2服务器如下,注意Mode:
zk3服务器和zk2服务器一样,Mode都是follower
5、测试集群,随便一个服务器上增删改节点,另一个服务器上也会一致性变化(可自行验证)
6、如果Leader服务器挂掉,会选出另一台Leader服务器,3台服务器最多可挂掉一台,超过一台挂掉Zookeeper就不可用了
三、ZooKeeper JavaAPI使用,直接上代码,看注释
package com.hjp.zookeeper; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.ZooKeeper; import java.io.IOException; import java.util.concurrent.CountDownLatch; public class ConnectionWatcher implements Watcher { private static final int SESSION_TIMEOUT = 5000; protected ZooKeeper zk; private CountDownLatch connectedSignal = new CountDownLatch(1); public void connect(String hosts) throws IOException, InterruptedException { //第一个参数是Zookeeper服务主机地址,可指定端口号,默认为2181;第二个参数以毫秒为单位的会话超时参数; // 第三个参数是一个Watcher对象的实例。Watcher对象接收来自于Zookeeper的回调,以获得各种事件通知, // 本例中CreateGroup是一个Watcher对象,因此参数为this zk = new ZooKeeper(hosts, SESSION_TIMEOUT, this); //当一个ZooKeeper的实例被创建时,会启动一个线程连接到Zookeeper服务。 // 由于对构造函数的调用是立即返回的,因此在使用新建的Zookeeper对象之前一定要等待其与Zookeeper服务之间的连接建立成功。 // 使用CountDownLatch使当前线程等待,直到Zookeeper对象准备就绪 connectedSignal.await(); } public void process(WatchedEvent watchedEvent) { //客户端与ZK建立连接后,Watcher的process方法会被调用,参数是表示该连接的事件, // 连接成功后调用CountDownLatch的countDown方法,计数器减为0,释放线程锁,zk对象可用 if (watchedEvent.getState() == Event.KeeperState.SyncConnected) { connectedSignal.countDown(); } } public void close() throws InterruptedException { zk.close(); } }