单服务器Docker部署zookeeper集群

  1. 首先安装Docker Desktop

官网:Docker Desktop: The #1 Containerization Tool for Developers | Docker

  1. 安装ubuntu镜像

    docker pull ubuntu

  2. zookeeper的运行需要java的支持,因此需要先在环境中安装jdk

sql 复制代码
apt-get update
apt-get install -y openjdk-8-jdk
  1. 作为集群,那么网络是需要互通的,而Docker容器默认并不具有一个可在宿主机网络上直接访问的IP地址。因此Dokcer可以使用一个自己的网络来让容器之间能够互相通信。
arduino 复制代码
docker network create mynetwork    #mynetwork换成自定义名称
  1. 运行容器,三台服务器的端口需要绑定不同。因为这是在一台服务器上进行三台 集群部署:
yaml 复制代码
docker run -it --network=mynetwork -p 2181:2181 -p 2888:2888 -p 3888:3888 --name ubuntu1 ubuntu
docker run -it --network=mynetwork -p 2182:2181 -p 2889:2888 -p 3889:3888 --name ubuntu2 ubuntu
docker run -it --network=mynetwork -p 2183:2181 -p 2890:2888 -p 3890:3888 --name ubuntu3 ubuntu
  1. 在bin和conf的同级目录下创建一个数据文件夹,并在数据文件夹中创建一个名为myid的文件。填入全局唯一的序号:

在每一台服务器中这个id都要不一样

  1. 修改每一台zookeeper服务器的配置文件,文件在解压后的conf中的zoo.cfg文件中。修改配置如下:
ini 复制代码
tickTime=2000
dataDir=/var/zookeeper/  #修改为自己的数据文件夹,可以在conf同级目录创建一个data文件夹,填入地址
clientPort=2181
initLimit=5
syncLimit=2
server.1=localhost:2888:3888 #这里填三台集群的映射端口。如果有多台就写多台。
server.2=localhost:2889:3889 # localhost要替换成网络中具体的地址
server.3=localhost:2890:3890

这个配置告诉ZooKeeper去寻找运行在'localhost:2888:3888','localhost:2889:3889'和'localhost:2890:3890'的其他ZooKeeper实例。

注意:

  • 在ZooKeeper集群配置中,server.X然后是它们的主机名字(server.X=hostname:port:port)。X是服务器的标识符,这个标识符在每个ZooKeeper实例中myid文件中设置的那个序号。
  • 创建的网络中具体的地址查询如下:
yaml 复制代码
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ubuntu1
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ubuntu2
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' ubuntu3

因此修改过的配置文件应该为(如果你重新启动容器,这个地址可能是会变化的!!!! ):

ini 复制代码
tickTime=2000
dataDir=/opt/module/zookeeper-3.5.7/zkData
clientPort=2181
initLimit=10
syncLimit=5
server.1=172.18.0.4:2888:3888
server.2=172.18.0.3:2889:3889
server.3=172.18.0.2:2890:3890
  1. zookeeper要超过半数的服务器启动才会启动,因此对于三台服务器,需要在其中两台中在bin目录下运行:
bash 复制代码
./zkServer.sh start  # 启动命令

即可选举出Leader和Follower。

bash 复制代码
./zkServer.sh stop  #停止命令
./zkServer.sh status # 查看状态
  1. 通过java访问:
  • maven的配置:
xml 复制代码
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.5.7</version>
</dependency>
  • 创建连接:
java 复制代码
ZooKeeper zk =  new ZooKeeper(connectString, sessionTime, new Watcher() {
        public void process(WatchedEvent watchedEvent) {
            try {
                getServerList();
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            } catch (KeeperException e) {
                throw new RuntimeException(e);
            }
        }
    });
}

其中connectString就是三台服务器的连接地址、sessionTime是超时时间,配置如下:

ini 复制代码
private String connectString="localhost:2181,localhost:2182,localhost:2183";
private int sessionTime=2000;

其中的Watcher是监听的机制,需要重写process方法。因为每次监听都是一次性的,通过重写Watcher中的process方法能够实现实时监听,下面的例子就是不断监听servers下的节点变化:

ini 复制代码
private void getServerList() throws InterruptedException, KeeperException {
  List<String> children = zooKeeper.getChildren("/servers", true);
  ArrayList<String> servers = new ArrayList<String>();
  for (String child : children) {
      byte[] data = zooKeeper.getData("/servers/" + child, false, null);
      servers.add(new String(data));
  }
  //打印
  System.out.println(servers);
}
相关推荐
程序猿DD2 小时前
OctaFuse Gateway 2.15.0:MCP 聚合、向量 Embeddings 与官方目录同步
后端·agent
余槐i4 小时前
PostgreSQL 函数索引报错 must be immutable:3种绕法与代价
数据库·后端·sql·postgresql·性能优化
需要8265 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
凤山老林6 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
伯恩bourne7 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
张彦峰ZYF7 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
pride.li8 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
upala8 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna8 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
码事漫谈8 小时前
因为太想讨好你,所以AI会骗你
后端