KeepAlived+ha-proxy+rabbitmq

mirror 镜像队列,是保证 rabbitMQ 数据的高可靠性解决方案,主要就是实现数据的同步,一般来讲是 2 - 3 个节点实现数据同步。对于 100% 数据可靠性解决方案,一般是采用 3 个节点。 在这里插入图片描述
用 KeepAlived 做 HA-Proxy 的高可用,然后有 3 个节点的 MQ 服务,消息发送到主节点上,主节点通过 mirror 队列把数据同步到其他的 MQ 节点,来实现其高可靠。

构建rabbitmq

docker pull rabbitmq:3.9.11-management-alpine

#/www/biny/docker-compose/rabbitmq.yaml
version: "3.6" # 确定docker-composer文件的版本
services:
  # 代表就是一组服务 - 简单来说一组容器
  # server
  rabbitmq_server_175_10:
    # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: rabbitmq:3.9.11-management-alpine # 指定容器的镜像文件
    ports:
      # 配置容器与宿主机的端口
      - "15610:15672"
      - "5610:5672"
    networks:
      ## 引入外部预先定义的网段
      rabbitmq:
        ipv4_address: 175.22.1.10 #设置ip地址
    hostname: rabbitmq_server_175_10
    volumes:
      - "/www/biny/rabbitmq/10:/var/lib/rabbitmq"
    container_name: rabbitmq_server_175_10 # 这是容器的名称
    # command:
  rabbitmq_server_175_11:
    # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: rabbitmq:3.9.11-management-alpine # 指定容器的镜像文件
    ports:
      # 配置容器与宿主机的端口
      - "15611:15672"
      - "5611:5672"
    networks:
      ## 引入外部预先定义的网段
      rabbitmq:
        ipv4_address: 175.22.1.11 #设置ip地址
    hostname: rabbitmq_server_175_11
    volumes:
      - "/www/biny/rabbitmq/11:/var/lib/rabbitmq"
    container_name: rabbitmq_server_175_11 # 这是容器的名称
  rabbitmq_server_175_12:
    # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: rabbitmq:3.9.11-management-alpine # 指定容器的镜像文件
    ports:
      # 配置容器与宿主机的端口
      - "15612:15672"
      - "5612:5672"
    networks:
      ## 引入外部预先定义的网段
      rabbitmq:
        ipv4_address: 175.22.1.12 #设置ip地址
    hostname: rabbitmq_server_175_12
    volumes:
      - "/www/biny/rabbitmq/12:/var/lib/rabbitmq"
    container_name: rabbitmq_server_175_12 # 这是容器的名称
# 设置网络模块
networks:
  # 自定义网络
  rabbitmq:
    driver: bridge
    ipam:
      #定义网段
      config:
        - subnet: "175.22.1.0/24"

docker-compose -f rabbitmq.yaml up -d
默认账号密码:guest
在这里插入图片描述
docker exec -it rabbitmq_server_175_10 bash # 进入一台rabbitmq容器
cat /root/.erlang.cookie # 查看cookie并保存
将cookie替换到所有rabbitmq容器的.erlang.cookie文件中
如遇到权限问题,直接进入容器中编辑cookie文件,保持3个文件一致
在这里插入图片描述
执行 sh init_rabbitmq.sh
访问:http://127.0.0.1:15610/在这里插入图片描述

构建ha-proxy

docker pull haproxy:1.7-apline

# ha-proxy.yaml
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
  # server
  haproxy_server_176_10: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: haproxy:1.7-alpine # 指定容器的镜像文件
    ports: # 配置容器与宿主机的端口
      - "8110:8100" # web监听端口
      - "5710:5600" # 反向代理 mq 的端口
    networks: ## 引入外部预先定义的网段
       haproxy:
         ipv4_address: 176.22.1.10   #设置ip地址
    privileged: true # 让程序在root下运行
    volumes:
      - "/www/biny/haproxy:/haproxy"
      - "/www/biny/haproxy/keepalived/10:/keepalived"
    container_name: haproxy_server_176_10 # 这是容器的名称
    command: haproxy -f /haproxy/haproxy.cfg
  haproxy_server_176_11: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: haproxy:1.7-alpine # 指定容器的镜像文件
    ports: # 配置容器与宿主机的端口
      - "8111:8100"
      - "5711:5600"
    networks: ## 引入外部预先定义的网段
       haproxy:
         ipv4_address: 176.22.1.11   #设置ip地址
    privileged: true
    volumes:
      - "/www/biny/haproxy:/haproxy"
      - "/www/biny/haproxy/keepalived/11:/keepalived"
    container_name: haproxy_server_176_11 # 这是容器的名称
    command: haproxy -f /haproxy/haproxy.cfg
# 设置网络模块
networks:
  # 自定义网络
  haproxy:
    driver: bridge
    ipam: #定义网段
      config:
        - subnet: "176.22.1.0/24"

docker-compose -f ha-proxy.yaml up -d
在这里插入图片描述

ha-proxy容器中安装keepalived

ha-proxy-Dockerfile重新构建安装好keepalived的haproxy容器
docker build -t haproxy .

FROM haproxy:2.3-dev3-alpine
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
  && apk add keepalived

docker-compose -f ha-proxy.yaml down
修改ha-proxy.yaml文件,启用新容器
docker-compose -f ha-proxy.yaml up -d
添加虚拟ip
docker exec -it haproxy_server_176_10 sh
keepalived -f /keepalived/keepalived.conf
ip a
在这里插入图片描述
docker exec -it haproxy_server_176_11 sh
keepalived -f /keepalived/keepalived.conf
ip a
ifconfig eth0:0 176.22.1.100 netmask 255.255.255.0 up

nginx反向代理

增加nginx反向代理指向keepalived虚拟ip—haproxy—rabbitmq

# ha-proxy.yaml
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
  # server
  haproxy_server_176_10: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: haproxy # 指定容器的镜像文件
    ports: # 配置容器与宿主机的端口
      - "8110:8100" # web监听端口
      - "5710:5600" # 反向代理 mq 的端口
    networks: ## 引入外部预先定义的网段
       haproxy:
         ipv4_address: 176.22.1.10   #设置ip地址
    privileged: true # 让程序在root下运行
    volumes:
      - "/www/biny/haproxy:/haproxy"
      - "/www/biny/haproxy/keepalived/10:/keepalived"
    container_name: haproxy_server_176_10 # 这是容器的名称
    command: haproxy -f /haproxy/haproxy.cfg
  haproxy_server_176_11: # 这个表示服务的名称,课自定义; 注意不是容器名称
    image: haproxy # 指定容器的镜像文件
    ports: # 配置容器与宿主机的端口
      - "8111:8100"
      - "5711:5600"
    networks: ## 引入外部预先定义的网段
       haproxy:
         ipv4_address: 176.22.1.11   #设置ip地址
    privileged: true
    volumes:
      - "/www/biny/haproxy:/haproxy"
      - "/www/biny/haproxy/keepalived/11:/keepalived"
    container_name: haproxy_server_176_11 # 这是容器的名称
    command: haproxy -f /haproxy/haproxy.cfg
  nginx_haproxy:
    image: nginx:1.21 # 指定容器的镜像文件.
    ports: # 配置容器与宿主机的端口
      - "5600:5600"
    networks: ## 引入外部预先定义的网段
       haproxy:
         ipv4_address: 176.22.1.12   #设置ip地址
    volumes:
      - "/www/biny/hanginx/conf:/etc/nginx"
    container_name: nginx_haproxy_176_12 # 这是容器的
    #command: nginx -c /nginx/conf/nginx.conf
# 设置网络模块
networks:
  # 自定义网络
  haproxy:
    driver: bridge
    ipam: #定义网段
      config:
        - subnet: "176.22.1.0/24"

docker-compose -f ha-proxy.yaml up -d
在这里插入图片描述

宿主机执行访问测试
这里是引用
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐