美文网首页
Zookeeper客户端使用与集群特性

Zookeeper客户端使用与集群特性

作者: 逍遥白亦 | 来源:发表于2020-12-17 18:46 被阅读0次

1. Zookeeper Java客户端

zookeeper 官方的客户端没有和服务端代码分离,他们为同一个jar 文件,所以我们直接引入 zookeeper的maven即可, 这里版本请保持与服务端版本一致,不然会有很多兼容性的问题

1.1 项目构建

创建项目,pom文件为

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>ZookeeperStudy</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <properties>
        <java.version>1.8</java.version>
    </properties>


        <dependencies>
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.5.8</version>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
            </dependency>
        </dependencies>


</project>

1.2 创建客户端实例


import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import java.util.concurrent.CountDownLatch;

public class ZookeeperClientTest {

    private static final String ZK_ADDRESS = "192.168.1.2:2181";

    private final static Integer  SESSION_TIMEOUT=30*1000;

    private static ZooKeeper zooKeeper=null;

    private static final String ZK_NODE = "/test-node";

    private static CountDownLatch countDownLatch = new CountDownLatch(1);

    public static void main(String[] args) throws Exception {
        zooKeeper=new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if (event.getType()== Event.EventType.None
                        && event.getState() == Event.KeeperState.SyncConnected){
                    System.out.println("连接已建立");
                    countDownLatch.countDown();
                }
            }
        });
        countDownLatch.await();
    }

}

1.3 创建Zookeeper实例的方法:

ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, ZKClientC onfig) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean c anBeReadOnly, HostProvider) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean c anBeReadOnly, HostProvider, ZKClientConfig) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean c anBeReadOnly) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean c anBeReadOnly, ZKClientConfig) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long, byt e[]) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long, byt e[], boolean, HostProvider) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long, byt e[], boolean, HostProvider, ZKClientConfig) 
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, long, by te[], boolean)

参数含义:

  • connectString:ZooKeeper服务器列表,由英文逗号分开的host:port字符串组成, 每一个都代表一台ZooKeeper机器,如, host1:port1,host2:port2,host3:port3。另外,也可以在connectString中设 置客户端连接上ZooKeeper后的根目录,方法是在host:port字符串之后添加上这个根目录,例 如,host1:port1,host2:port2,host3:port3/zk-base,这样就指定了该客户端连 接上ZooKeeper服务器之后,所有对ZooKeeper的操作,都会基于这个根目录。例如,客户端对/sub-node 的操作,最终创建 /zk-node/sub-node, 这个目录也叫Chroot,即客户端隔离命名空间。
  • sessionTimeout:会话的超时时间,是一个以“毫秒”为单位的整型值。在ZooKeeper中有会话的概念,在一个会话周期内,ZooKeeper客户端和服务器之间会通过心跳 检测机制来维持会话的有效性,一旦在sessionTimeout时间内没有进行有效 的心跳检测,会话就会失效。
  • watcher:ZooKeeper允许 客户端在构造方法中传入一个接口 watcher (org.apache. zookeeper. Watcher)的实现类对象来作为默认的 Watcher事件通知处理器。当然,该参 数可以设置为null 以表明不需要设置默认的 Watcher处理器。
  • canBeReadOnly:这是一个boolean类型的参数,用于标识当前会话是否支持“read-only(只 读)”模式。默认情况下,在ZooKeeper集群中,一个机器如果和集群中过半 及以上机器失去了网络连接,那么这个机器将不再处理客户端请求(包括读写请 求)。但是在某些使用场景下,当ZooKeeper服务器发生此类故障的时候,我 们还是希望ZooKeeper服务器能够提供读服务(当然写服务肯定无法提供)—— 这就是 ZooKeeper的“read-only”模式。
  • sessionId和sessionPasswd:分别代表会话ID和会话秘钥。这两个参数能够唯一确定一个会话,同时客户 端使用这两个参数可以实现客户端会话复用,从而达到恢复会话的效果。具体 使用方法是,第一次连接上ZooKeeper服务器时,通过调用ZooKeeper对象 实例的以下两个接口,即可获得当前会话的ID和秘钥: long getSessionId(); byte[]getSessionPasswd( ); 荻取到这两个参数值之后,就可以在下次创建ZooKeeper对象实例的时候传 入构造方法了

1.4 同步创建节点

public void createTest() throws KeeperException, InterruptedException { 
    String path = zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_A CL_UNSAFE, CreateMode.PERSISTENT); 
    log.info("created path: {}",path);
}    

1.5 异步创建节点:

 @Test 
 public void createAsycTest() throws InterruptedException { 
    zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, 
    CreateMode.PERSISTENT, 
        (rc, path, ctx, name) ‐> log.info("rc {},path {},ctx {},name {}",rc,path,ctx,name),"context"); 
    TimeUnit.SECONDS.sleep(Integer.MAX_VALUE); 
 }

1.6 修改节点数据

 @Test 
 public void setTest() throws KeeperException, InterruptedException {
    Stat stat = new Stat(); 
    byte[] data = zooKeeper.getData(ZK_NODE, false, stat); 
    log.info("修改前: {}",new String(data)); 
    zooKeeper.setData(ZK_NODE, "changed!".getBytes(), stat.getVersion()); byte[] dataAfter = zooKeeper.getData(ZK_NODE, false, stat); 
    log.info("修改后: {}",new String(dataAfter)); 
}

2. Zookeeper集群&不停机动态扩容/缩容

2.1 角色

Zookeeper 集群模式一共有三种类型的角色

  • Leader: 处理所有的事务请求(写请求),可以处理读请求,集群中只能有一个Leader
  • Follower:只能处理读请求,同时作为Leader的候选节点,即如果Leader宕机,Follower节点 要参与到新的Leader选举中,有可能成为新的Leader节点。
  • Observer:只能处理读请求。不能参与选举。

2.2 搭建

本例搭建的是伪集群模式,即一台机器上启动四个zookeeper实例组成集群,真正的集群模式无 非就是实例IP地址不同,搭建方法没有区别。

  • 修改配置文件zoo-1.cfg,原配置文件里有的,修改成下面的值,没有的则加上。
# vim conf/zoo‐1.cfg 
dataDir=/usr/local/data/zookeeper‐1 
clientPort=2181 
server.1=127.0.0.1:2001:3001:participant// participant 可以不用写,默认就是part icipant 
server.2=127.0.0.1:2002:3002:participant 
server.3=127.0.0.1:2003:3003:participant 
server.4=127.0.0.1:2004:3004:observer
- tickTime:用于配置Zookeeper中最小时间单位的长度,很多运行时的时间间隔都是 使用tickTime的倍数来表示的。
- initLimit:该参数用于配置Leader服务器等待Follower启动,并完成数据同步的时 间。Follower服务器再启动过程中,会与Leader建立连接并完成数据的同步,从而确定自 己对外提供服务的起始状态。Leader服务器允许Follower再initLimit 时间内完成这个工 作。
- syncLimit:Leader 与Follower心跳检测的最大延时时间 
- dataDir:顾名思义就是 Zookeeper 保存数据的目录,默认情况下,Zookeeper 将 写数据的日志文件也保存在这个目录里。
- clientPort:这个端口就是客户端连接 Zookeeper 服务器的端口,Zookeeper 会监 听这个端口,接受客户端的访问请求。 
- server.A=B:C:D:E 其中 A 是一个数字,表示这个是第几号服务器;B 是这个服 务器的 ip 地址;C 表示的是这个服务器与集群中的 Leader 服务器交换信息的端口;D 表示的是万一集群中的 Leader 服务器挂了,需要一个端口来重新进行选举,选出一个新 的 Leader,而这个端口就是用来执行选举时服务器相互通信的端口。如果是伪集群的配 置方式,由于 B 都是一样,所以不同的 Zookeeper 实例通信端口号不能一样,所以要给 它们分配不同的端口号。如果需要通过添加不参与集群选举以及事务请求的过半机制的 Observer节点,可以在E的位置,添加observer标识。
  • 再从zoo-1.cfg复制三个配置文件zoo-2.cfg,zoo-3.cfg和zoo-4.cfg,只需修改 dataDir和clientPort不同即可
cp conf/zoo1.cfg conf/zoo2.cfg 
cp conf/zoo1.cfg conf/zoo3.cfg 
cp conf/zoo1.cfg conf/zoo4.cfg 
vim conf/zoo2.cfg 
dataDir=/usr/local/data/zookeeper2 
clientPort=2182
vim conf/zoo3.cfg 
dataDir=/usr/local/data/zookeeper3 
clientPort=2183 
vim conf/zoo4.cfg 
dataDir=/usr/loca
  • 标识Server ID:创建四个文件夹/usr/local/data/zookeeper-1,/usr/local/data/zookeeper- 2,/usr/local/data/zookeeper-3,/usr/local/data/zookeeper-4,在每个目录中创建文件 myid 文件,写入当前实例的server id,即1,2,3,4
cd /usr/local/data/zookeeper‐1 
vim myid 
1 
cd /usr/local/data/zookeeper‐2 
vim myid 
2 
cd /usr/local/data/zookeeper‐3 
vim myid 
3 
cd /usr/local/data/zookeeper‐4 
vim myid 
4
  • 启动三个zookeeper实例
bin/zkServer.sh start conf/zoo1.cfg 
bin/zkServer.sh start conf/zoo2.cfg 
bin/zkServer.sh start conf/zoo3.cfg
  • 检测集群状态,也可以直接用命令 zkServer.sh status conf/zoo1.cfg 进行每台服务的状态查询
bin/zkCli.sh ‐server ip1:port1,ip2:port2,ip3:port3

可以通过查看/zookeeper/config节点数据来查看集群配置。

相关文章

网友评论

      本文标题:Zookeeper客户端使用与集群特性

      本文链接:https://www.haomeiwen.com/subject/tcazgktx.html