docker篇-(docker-compose安装zookeeper集群,并使用nginx实现负载均衡)

查找镜像

docker search zookeeper

拉取镜像

这里我去zookeeper官网查看,稳定版本为3.6.2版本,因此这里拉取3.6.2版本的镜像

docker pull zookeeper:3.6.2

编写docker-compose.yml文件

version: '3'
services:
  zkui:
    image: maauso/zkui
    container_name: zkui
    labels:
    - "traefik.enable=true"
    - "traefik.http.routers.zkui.rule=Host(`www.zookeeper.com.cn`)"
    - "traefik.http.services.zkui.loadbalancer.server.scheme=http"
    - "traefik.http.services.zkui.loadbalancer.server.port=9090"
    - "traefik.http.routers.zkui.entrypoints=web"
    environment:
      ZKLIST: "10.100.10.21:2181,10.100.20.21:2181,10.100.30.21:2181"
    networks:
    - zookeeper
    #ports: #如果不使用traefik,则关闭这里的注释,通过ip访问即可
    #- 9090:9090
    depends_on:
    - zk1
    - zk2
    - zk3
  zk1:
    image: zookeeper:3.6.2
    restart: always
    container_name: zk1
    hostname: zk1
    volumes:
      - ./zookeeper/zk1/data:/data
      - ./zookeeper/zk1/datalog:/datalog
    environment:
      TZ: Asia/Shanghai
      JVMFLAGS: "-Xmx256m -Xms256m -Duser.timezone=Asia/Shanghai"
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
    networks:
      zookeeper:
        ipv4_address: 10.100.10.21
  zk2:
    image: zookeeper:3.6.2
    restart: always
    container_name: zk2
    hostname: zk2
    volumes:
      - ./zookeeper/zk2/data:/data
      - ./zookeeper/zk2/datalog:/datalog
    environment:
      TZ: Asia/Shanghai
      JVMFLAGS: "-Xmx256m -Xms256m -Duser.timezone=Asia/Shanghai"
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
    networks:
      zookeeper:
        ipv4_address: 10.100.20.21
  zk3:
    image: zookeeper:3.6.2
    restart: always
    container_name: zk3
    hostname: zk3
    volumes:
      - ./zookeeper/zk3/data:/data
      - ./zookeeper/zk3/datalog:/datalog
    environment:
      TZ: Asia/Shanghai
      JVMFLAGS: "-Xmx256m -Xms256m -Duser.timezone=Asia/Shanghai"
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
    networks:
      zookeeper:
        ipv4_address: 10.100.30.21 #固定ip
networks:
  zookeeper:
    #driver: bridge
    #ipam:
      #driver: default
      #config:
      #- subnet: 10.100.0.0/16 如果不使用traefik,则关掉这里的注释,将traefik相关的东西注释即可
    external:
      name: traefik_traefik #使用traefik那张网卡

这里使用了traefik作为网关
博客地址: docker篇-(docker-compose安装web网关traefik)

执行docker-compose.yml

docker-compose up -d

配置域名映射

在这里插入图片描述

浏览器访问 www.zookeeper.com.cn

进入需要登录,用户名 admin 密码 manager
在这里插入图片描述
就可以实现查看zookeeper集群里面的数据并且操作了
在这里插入图片描述

配置负载均衡

因为zookeeper集群节点过多,不可能每次部署项目的时候都去填写这些节点,同时,如果这些节点宕机了,重启之后如果ip产生了变化怎么办,不利于维护,所以这里使用负载均衡的方式,在zookeeper和业务中间加上一个代理,让业务只需要关心这个代理的ip,而不需要去管zk集群

1.修改docker-compose.yml文件
添加nginx作为负载均衡的服务器

version: '3'
services:
  zkui:
    image: maauso/zkui
    container_name: zkui
    labels:
    - "traefik.enable=true"
    - "traefik.http.routers.zkui.rule=Host(`www.zookeeper.com.cn`)"
    - "traefik.http.services.zkui.loadbalancer.server.scheme=http"
    - "traefik.http.services.zkui.loadbalancer.server.port=9090"
    - "traefik.http.routers.zkui.entrypoints=web"
    #- "traefik.http.routers.zkui.tls=true"
    #- "traefik.http.routers.zkui.middlewares=ssl@docker"
    environment:
      ZKLIST: "10.100.100.100:2181"
    networks:
    - zookeeper
    #ports: #如果不使用traefik,则关闭这里的注释,通过ip访问即可
    #- 9090:9090
    depends_on:
    - lb-nginx
  lb-nginx:
    image: nginx:alpine
    container_name: lb-nginx
    ports:
    - 2181:2181
    volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf #挂载修改过后的主配置文件
    - ./conf.d/stream:/opt/nginx/stream/conf.d #挂载负载均衡的stream配置文件
    - ./conf.d/http:/etc/nginx/conf.d #挂载默认的http配置文件,可有可无,这里实际上不会用到
    networks:
     zookeeper:
       ipv4_address: "10.100.100.100"
    depends_on:
    - zk1
    - zk2
    - zk3
  zk1:
    image: zookeeper:3.6.2
    restart: always
    container_name: zk1
    hostname: zk1
    volumes:
      - ./zookeeper/zk1/data:/data
      - ./zookeeper/zk1/datalog:/datalog
    environment:
      ZOO_MY_ID: 1
      ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
    networks:
      zookeeper:
        ipv4_address: 10.100.10.21
  zk2:
    image: zookeeper:3.6.2
    restart: always
    container_name: zk2
    hostname: zk2
    volumes:
      - ./zookeeper/zk2/data:/data
      - ./zookeeper/zk2/datalog:/datalog
    environment:
      ZOO_MY_ID: 2
      ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
    networks:
      zookeeper:
        ipv4_address: 10.100.20.21
  zk3:
    image: zookeeper:3.6.2
    restart: always
    container_name: zk3
    hostname: zk3
    volumes:
      - ./zookeeper/zk3/data:/data
      - ./zookeeper/zk3/datalog:/datalog
    environment:
      ZOO_MY_ID: 3
      ZOO_SERVERS: server.1=10.100.10.21:2888:3888;2181 server.2=10.100.20.21:2888:3888;2181 server.3=10.100.30.21:2888:3888;2181
    networks:
      zookeeper:
        ipv4_address: 10.100.30.21
networks:
  zookeeper:
    #driver: bridge
    #ipam:
      #driver: default
      #config:
      #- subnet: 10.100.0.0/16 如果不使用traefik,则关掉这里的注释,将traefik相关的东西注释即可
    external:
      name: traefik_traefik

2.因为nginx要支持tcp代理,需要配置stream模块,所以我们对nginx.conf配置文件进行修改

user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

# 添加stream模块,实现tcp反向代理
stream {
    include /opt/nginx/stream/conf.d/*.conf; #加载 /opt/nginx/stream/conf.d目录下面的所有配置文件
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

3.编写zk负载均衡的配置文件zk-lb.conf

proxy_timeout 30m;
upstream zk {
  server 10.100.10.21:2181 weight=1;
  server 10.100.20.21:2181 weight=1;
  server 10.100.30.21:2181 weight=1;
}
server {
  listen  0.0.0.0:2181;
  proxy_pass zk;
}

4.目录结构如下图
在这里插入图片描述
5.执行docker-compose.yml

docker-compose up -d

6.通过浏览器访问
可以看到,这是nginx负载均衡的ip节点
在这里插入图片描述
7.通过代码测试
测试数据已经查找到了
在这里插入图片描述
8.通过浏览器查看数据已经写入成功了
在这里插入图片描述
9.进入zk集群的所有节点数据,可以看到数据以及同步到所有节点了

节点1
在这里插入图片描述
在这里插入图片描述

节点2
在这里插入图片描述
在这里插入图片描述

节点3
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值