Servicio de coordinación distribuido de ZooKeeper (clasificación de nodos, monitoreo de eventos, integración de Java)

prefacio

ZooKeeperes un servicio de coordinación de aplicaciones distribuidas de código abierto, Googleuna Chubbyimplementación de código abierto de Hadoopy Hbaseun componente importante de . Es un software que proporciona servicios consistentes para aplicaciones distribuidas, entre sus funciones se encuentran: mantenimiento de configuración, servicio de nombres de dominio, sincronización distribuida, servicio de grupos, etc.

inicio de instalación

Instalación: cargue el paquete de instalación de zk en el directorio /opt, cambie al directorio /opt y ejecute los siguientes comandos

# 解压
tar -zxvf zookeeper-3.7.0-bin.tar.gz
# 重命名
mv apache-zookeeper-3.7.0-bin/ zookeeper
# 打开zookeeper根目录
cd /opt/zookeeper
# 创建一个数据目录,备用
mkdir data
# 打开zk的配置目录
cd /opt/zookeeper/conf
# copy配置文件,zk启动时会加载zoo.cfg文件
cp zoo_sample.cfg zoo.cfg
# 编辑配置文件
vim zoo.cfg
# 修改dataDir参数为之前创建的数据目录:/opt/zookeeper/data
# 切换到bin目录
cd /opt/zookeeper/bin
# 启动 
./zkServer.sh start
./zkServer.sh status # 查看启动状态
./zkServer.sh stop # 停止
./zkServer.sh restart # 重启
./zkCli.sh # 查看zk客户端

De la siguiente manera, el inicio es exitoso:

inserte la descripción de la imagen aquí

Conceptos relacionados

Zookeeper proporciona un espacio de nombres de nodos de varios niveles (los nodos se denominan znodes), cada nodo está representado por una ruta separada por una barra inclinada (/) y cada nodo tiene un nodo principal (excepto el nodo raíz), que es muy similar a File sistema. Y cada nodo es único.

Hay cuatro tipos de nodos znode:

  • PERSISTENTE : Nodo permanente. Después de que el cliente se desconecte de zookeeper, el nodo aún existe
  • EFÍMERO : Nodos efímeros. Después de que el cliente se desconecte de zookeeper, el nodo se elimina
  • PERSISTENT_SEQUENTIAL : nodo permanente, serialización. Después de que el cliente se desconecte de zookeeper, el nodo aún existe, pero Zookeeper numera secuencialmente el nombre del nodo
  • EPHEMERAL_SEQUENTIAL : Nodos efímeros, serialización. Después de que el cliente se desconecta de zookeeper, el nodo se elimina, pero Zookeeper numera secuencialmente el nombre del nodo

nodo de operación

Cree estos cuatro nodos:

[zk: localhost:2181(CONNECTED) 0] create /aa test  # 创建持久化节点
Created /aa
[zk: localhost:2181(CONNECTED) 1] create -s /bb test  # 创建持久序列化节点
Created /bb0000000001
[zk: localhost:2181(CONNECTED) 2] create -e /cc test  # 创建临时节点
Created /cc
[zk: localhost:2181(CONNECTED) 3] create -e -s /dd test  # 创建临时序列化节点
Created /dd0000000003
[zk: localhost:2181(CONNECTED) 4] ls /   # 查看某个节点下的子节点
[aa, bb0000000001, cc, dd0000000003, zookeeper]
[zk: localhost:2181(CONNECTED) 5] stat /  # 查看某个节点的状态
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x5
cversion = 3
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 5
[zk: localhost:2181(CONNECTED) 6] get /aa  # 查看某个节点的内容
test
[zk: localhost:2181(CONNECTED) 11] delete /aa  # 删除某个节点
[zk: localhost:2181(CONNECTED) 7] ls /  # 再次查看
[bb0000000001, cc, dd0000000003, zookeeper]

detector de eventos

Al leer datos, podemos configurar el monitoreo de eventos en el nodo al mismo tiempo. Cuando los datos del nodo o la estructura cambien, zookeeper notificará al cliente. Actualmente zookeeper monitorea los siguientes cuatro eventos para los nodos:

  1. Creación de nodos: stat -w /xx

    Cuando se crea el nodo /xx: NodeCreated

  2. Eliminación de nodos: stat -w /xx

    Cuando se elimina el nodo /xx: NodeDeleted

  3. Modificación de datos de nodo: get -w /xx

    Cuando los datos del nodo /xx cambian: NodeDataChanged

  4. Cambio de nodo secundario: ls -w /xx

    Cuando se crea o elimina un nodo secundario del nodo /xx: NodeChildChanged

cliente java

ZooKeeperHay java: clientes nativos ZkClient, y Curatormarcos (similar a redisson, hay muchos paquetes funcionales).

  1. Introducir dependencias
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.7.0</version>
</dependency>
  1. API comunes y sus métodos
public class ZkTest {
    
    

    public static void main(String[] args) throws KeeperException, InterruptedException {
    
    

        // 获取zookeeper链接
        CountDownLatch countDownLatch = new CountDownLatch(1);
        ZooKeeper zooKeeper = null;
        try {
    
    
            zooKeeper = new ZooKeeper("172.16.116.100:2181", 30000, new Watcher() {
    
    
                @Override
                public void process(WatchedEvent event) {
    
    
                    if (Event.KeeperState.SyncConnected.equals(event.getState()) 
                            && Event.EventType.None.equals(event.getType())) {
    
    
                        System.out.println("获取链接成功。。。。。。" + event);
                        countDownLatch.countDown();
                    }
                }
            });

            countDownLatch.await();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }

        // 创建一个节点,1-节点路径 2-节点内容 3-节点的访问权限 4-节点类型
        // OPEN_ACL_UNSAFE:任何人可以操作该节点
        // CREATOR_ALL_ACL:创建者拥有所有访问权限
        // READ_ACL_UNSAFE: 任何人都可以读取该节点
        // zooKeeper.create("/zktest/aa", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        zooKeeper.create("/test", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        // zooKeeper.create("/zktest/cc", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
        // zooKeeper.create("/zktest/dd", "haha~~".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);

        // 判断节点是否存在
        Stat stat = zooKeeper.exists("/test", true);
        if (stat != null){
    
    
            System.out.println("当前节点存在!" + stat.getVersion());
        } else {
    
    
            System.out.println("当前节点不存在!");
        }

        // 判断节点是否存在,同时添加监听
        zooKeeper.exists("/test", event -> {
    
    
        });

        // 获取一个节点的数据
        byte[] data = zooKeeper.getData("/zktest/ss0000000001", false, null);
        System.out.println(new String(data));

        // 查询一个节点的所有子节点
        List<String> children = zooKeeper.getChildren("/test", false);
        System.out.println(children);

        // 更新
        zooKeeper.setData("/test", "wawa...".getBytes(), stat.getVersion());

        // 删除一个节点
        //zooKeeper.delete("/test", -1);

        if (zooKeeper != null){
    
    
            zooKeeper.close();
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/weixin_43847283/article/details/128522950
Recomendado
Clasificación