Zookeeper集群

Posted 永旗狍子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zookeeper集群相关的知识,希望对你有一定的参考价值。

目录

Zookeeper集群架构图

Zookeeper集群中节点的角色

Zookeeper数据同步

Zookeeper选举

搭建Zookeeper集群

Java连接Zookeeper集群


Zookeeper集群架构图

Zookeeper集群中节点的角色

  • Leader(Master):事务请求的唯一处理者,也可以处理读请求。

  • Follower(Slave):可以直接处理客户端的读请求,并向客户端响应;但其不会处理事务请求,其只会将客户端事务请求转发给Leader来处理,同步 Leader 中的事务处理结果;Leader 选举过程的参与者,具有选举权与被选举权。(就好像正式工)

  • Observer(Slave):可以理解为不参与 Leader 选举的 Follower,在 Leader 选举过程中没有选举权与被选举权;同时,对于 Leader 的提案没有表决权。用于协助 Follower 处理更多的客户端读请求。Observer 的增加,会提高集群读请求处理的吞吐量,但不会增加事务请求的通过压力,不会增加 Leader 选举的压力。(就好像临时工)

Zookeeper数据同步

ZooKeeper 集群的所有机器通过一个 Leader来完成写服务(也可以完成读)。Follower只提供读服务,不能提供写服务。

  1. 如果有机器要对节点做更新,这个机器先告诉Leader。

  2. Leader收到后请求后广播给所有的节点进行写操作,每个角色都在自己的机器中写。

  3. 每个机器写完后都给Leader汇报是否写入成功

  4. 如果有一半的机器写成功了Leader就下发第二个指令

  5. 提交事务,以广播的形式发出。

Zookeeper选举

  • 每一个Zookeeper服务都会被分配一个全局唯一的myid,··是一个数字。

  • Zookeeper在执行写数据时,每一个节点都有一个自己的FIFO的队列。保证写每一个数据的时候,顺序是不会乱的,Zookeeper还会给每一个数据分配一个全局唯一的zxid,数据越新zxid就越大。

  • 选举Leader:

    • 选举出zxid最大的节点作为Leader。

    • 在zxid相同的节点中,选举出一个myid最大的节点,作为Leader。

搭建Zookeeper集群

1、2181:对cline端提供服务

2、3888:选举leader使用

3、2888:集群内机器通讯使用(Leader监听此端口)

version: "3.1"
services:
  zk1:
    image: zookeeper
    restart: always
    container_name: zk1
    ports:
      - 2181:2181
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
  zk2:
    image: zookeeper
    restart: always
    container_name: zk2
    ports:
      - 2182:2181
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181
  zk3:
    image: zookeeper
    restart: always
    container_name: zk3
    ports:
      - 2183:2181
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=zk1:2888:3888;2181 server.2=zk2:2888:3888;2181 server.3=zk3:2888:3888;2181

查看节点状态 zkServer.sh status

Java连接Zookeeper集群

@Configuration
public class ZookeeperConfig {

    @Bean
    public  CuratorFramework curatorFramework() {

        CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder();

        builder.connectString(1111.com:2181,1111.com:2182,1111.com:2183);// 连接zk的ip和端口

        // 超时时间是3s,重试的次数是2次
        builder.retryPolicy(new ExponentialBackoffRetry(3000,2));

        // 构建操作ZK的客户但
        CuratorFramework curatorFramework = builder.build();

        // 必须要调用启动方法才能使用
        curatorFramework.start();

        return curatorFramework;
    }

}
  @Autowired
    private CuratorFramework zkClient;
    @Test
    void testCreateNode() throws Exception {
        zkClient.create().forPath("/java-node-2","java连接zk集群".getBytes("utf-8"));

        byte[] bytes = zkClient.getData().forPath("/java-node-2");
        System.out.println("data:"+new String(bytes,0,bytes.length,"utf-8"));

        System.out.println("节点创建成功。。。");
    }

 leader是随机生成的

以上是关于Zookeeper集群的主要内容,如果未能解决你的问题,请参考以下文章

ZooKeeper伪分布集群安装及使用 RMI+ZooKeeper实现远程调用框架

ZooKeeper 集群启动脚本分析

zookeeper集群配置

使用java代码对zookeeper集群中的solrCloud数据进行CURD

集群启用Kerberos后对Zookeeper的Znode操作异常分析

Zookeeper -- Zookeeper 集群搭建 集群角色说明