单服务器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);
}
相关推荐
candyTong2 小时前
Claude Code Agent Teams:多 Agent 协作的生命周期与实现机制
后端·架构
IT_陈寒6 小时前
为什么你应该学习JavaScript?
前端·人工智能·后端
淇奥77 小时前
【MyBatis-Plus】MyBatis-Plus 学习笔记
后端
_code_bear_7 小时前
OpenSpec CLI 与 OPSX 工作流说明
前端·后端·架构
用户8356290780517 小时前
使用 Python 在 PowerPoint 中添加并控制音频播放
后端·python
用户8356290780517 小时前
使用 Python 在 PowerPoint 中生成并自定义饼图与环形图
后端·python
念何架构之路7 小时前
Go语言常见并发模式
开发语言·后端·golang
Cosolar8 小时前
大模型应用开发面试 • 第4期|A2A、复杂挑战与具身智能
人工智能·后端·面试
迷渡8 小时前
聊一聊 Bun 用 Rust 重写这件事
开发语言·后端·rust
王中阳Go8 小时前
秒杀、分库分表、全链路追踪:一个电商微服务的架构全拆解
后端·go