Docker swarm 配置 redis 高可用 哨兵模式

882 阅读4分钟

Docker swarm 配置 redis 高可用 哨兵模式

一,环境准备条件

docker版本 :Docker version 20.10.1, build 831ebea

mongodb版本:4.2.7

服务器版本:CentOS Linux release 7.7.1908 (Core)

1,准备三台服务器互相可以访问

例如:

10.11.32.25

10.11.32.26

10.11.32.27

2,三台服务器都要安装docker 环境

配置 daemon.conf

三台服务器都要创建 docker.service 文件 ,具体内容见附录

vi /lib/systemd/system/docker.service 

重启docker

systemctl daemon-reload
systemctl restart docker

3,redis 集群架构

image-20210906153659268.png

二,创建swarm 集群及集群网络

1,在一台服务器上创建swarm 集群

docker swarm init --advertise-addr  10.11.32.25(本机ip)

在其它两台服务器执行加入swarm集群

docker swarm join --token SWMTKN-1-42w2dmkv2u18k9d6vi65rhqggjcqcc31iijnecd4bbi43bmom2-b3o89g28thkcken0v3qxtczuj 172.16.10.85:2377

忘记token 执行以下命令

docker swarm join-token manager  查看加入manager的命令

查看集群关系

docker node ls  

管理节点:赋值其他工作节点为管理节点

docker node promote 工作节点主机名1
docker node promote 工作节点主机名2 

2,manager节点创建集群网络**

docker network create -d overlay --attachable GIE-IOT-mongodbs

--attachable 允许其他容器加入此网络

查看集群网络

docker network ls

image-20210904224257693.png

三,配置mongodb高可用步骤

1,初始化目录创建yml文件

所有服务器创建相创建相关目录

mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/redis1/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/redis2/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/redis3/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/sentinel1/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/sentinel2/{conf,data,logs}
mkdir -pv /data/docker/composes/prod/middleware/redis_cluster/sentinel3/{conf,data,logs}

leader服务器创建 docker-compose-redis-cluster.yml文件

version: '3.8'
services:
  redis1:
    image: 10.11.32.23:5000/redis:v5.0.10
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 6379
        published: 6379
        protocol: tcp
        mode: host
    volumes:
      - /data/docker/composes/prod/middleware/redis_cluster/redis1/data:/data
      - /data/docker/composes/prod/middleware/redis_cluster/redis1/conf:/conf
    networks:
      - GIE-IOT-mongodbs
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == GIE-EC-Node03
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/redis.conf ];then
      echo 'port 6379' > /conf/redis.conf ;
      echo 'bind 0.0.0.0' >> /conf/redis.conf ;
      echo 'slave-announce-ip 10.11.32.25' >> /conf/redis.conf ;
      echo 'slave-announce-port 6379' >> /conf/redis.conf ;
      echo 'masterauth 123456' >> /conf/redis.conf;
      echo 'requirepass 123456' >> /conf/redis.conf ;
      echo 'appendonly yes' >> /conf/redis.conf ; fi &&
      redis-server /conf/redis.conf"
      # 行1:如果redis.conf不存在
      # 行2-8:新建redis.conf文件,并写入配置信息
      # 行9:启动redis实例
  redis2:
    image: 10.11.32.23:5000/redis:v5.0.10
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 6379
        published: 6379
        protocol: tcp
        mode: host
    volumes:
      - /data/docker/composes/prod/middleware/redis_cluster/redis2/data:/data
      - /data/docker/composes/prod/middleware/redis_cluster/redis2/conf:/conf
    networks:
      - GIE-IOT-mongodbs
    depends_on:
      - redis1
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == GIE-EC-Node04
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/redis.conf ];then
      echo 'port 6379' > /conf/redis.conf ;
      echo 'bind 0.0.0.0' >> /conf/redis.conf ;
      echo 'slave-announce-ip 10.11.32.26' >> /conf/redis.conf ;
      echo 'slave-announce-port 6379' >> /conf/redis.conf ;
      echo 'masterauth 123456' >> /conf/redis.conf;
      echo 'requirepass 123456' >> /conf/redis.conf ;
      echo 'replicaof 10.11.32.25 6379' >> /conf/redis.conf ;
      echo 'appendonly yes' >> /conf/redis.conf ; fi &&
      redis-server /conf/redis.conf"
  redis3:
    image: 10.11.32.23:5000/redis:v5.0.10
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 6379
        published: 6379
        protocol: tcp
        mode: host
    volumes:
      - /data/docker/composes/prod/middleware/redis_cluster/redis3/data:/data
      - /data/docker/composes/prod/middleware/redis_cluster/redis3/conf:/conf
    networks:
      - GIE-IOT-mongodbs
    depends_on:
      - redis1
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == GIE-EC-Node05
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/redis.conf ];then
      echo 'port 6379' > /conf/redis.conf ;
      echo 'bind 0.0.0.0' >> /conf/redis.conf ;
      echo 'slave-announce-ip 10.11.32.27' >> /conf/redis.conf ;
      echo 'slave-announce-port 6379' >> /conf/redis.conf ;
      echo 'masterauth 123456' >> /conf/redis.conf;
      echo 'requirepass 123456' >> /conf/redis.conf ;
      echo 'replicaof 10.11.32.25 6379' >> /conf/redis.conf ;
      echo 'appendonly yes' >> /conf/redis.conf ; fi &&
      redis-server /conf/redis.conf"
  sentinel1:
    image: 10.11.32.23:5000/redis:v5.0.10
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 26379
        published: 26379
        protocol: tcp
        mode: host
    depends_on:
      - redis1
      - redis2
      - redis3
    volumes:
      - /data/docker/composes/prod/middleware/redis_cluster/sentinel1/data:/data
      - /data/docker/composes/prod/middleware/redis_cluster/sentinel1/conf:/conf
    networks:
      - GIE-IOT-mongodbs
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == GIE-EC-Node03
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/sentinel.conf ];then
      echo 'port 26379' > /conf/sentinel.conf ;
      echo 'sentinel announce-ip 10.11.32.25' >> /conf/sentinel.conf ;
      echo 'sentinel monitor mymaster 10.11.32.25 6379 2' >> /conf/sentinel.conf ;
      echo 'sentinel auth-pass mymaster 123456' >> /conf/sentinel.conf ; fi &&
      redis-server /conf/sentinel.conf --sentinel"
      # 行1:如果sentinel.conf不存在
      # 行2-5:新建sentinel.conf文件,并写入配置信息
      # 行6:启动sentinel实例
  sentinel2:
    image: 10.11.32.23:5000/redis:v5.0.10
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 26379
        published: 26379
        protocol: tcp
        mode: host
    depends_on:
      - redis1
      - redis2
      - redis3
    volumes:
      - /data/docker/composes/prod/middleware/redis_cluster/sentinel2/data:/data
      - /data/docker/composes/prod/middleware/redis_cluster/sentinel2/conf:/conf
    networks:
      - GIE-IOT-mongodbs
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == GIE-EC-Node04
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/sentinel.conf ];then
      echo 'port 26379' > /conf/sentinel.conf ;
      echo 'sentinel announce-ip 10.11.32.26' >> /conf/sentinel.conf ;
      echo 'sentinel monitor mymaster 10.11.32.25 6379 2' >> /conf/sentinel.conf ;
      echo 'sentinel auth-pass mymaster 123456' >> /conf/sentinel.conf ; fi &&
      redis-server /conf/sentinel.conf --sentinel"
  sentinel3:
    image: 10.11.32.23:5000/redis:v5.0.10
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 26379
        published: 26379
        protocol: tcp
        mode: host
    depends_on:
      - redis1
      - redis2
      - redis3
    volumes:
      - /data/docker/composes/prod/middleware/redis_cluster/sentinel3/data:/data
      - /data/docker/composes/prod/middleware/redis_cluster/sentinel3/conf:/conf
    networks:
      - GIE-IOT-mongodbs
    deploy:
      replicas: 1
      placement:
        constraints:
          - node.hostname == GIE-EC-Node05
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/sentinel.conf ];then
      echo 'port 26379' > /conf/sentinel.conf ;
      echo 'sentinel announce-ip 10.11.32.27' >> /conf/sentinel.conf ;
      echo 'sentinel monitor mymaster 10.11.32.25 6379 2' >> /conf/sentinel.conf ;
      echo 'sentinel auth-pass mymaster 123456' >> /conf/sentinel.conf ; fi &&
      redis-server /conf/sentinel.conf --sentinel"
networks:
  GIE-IOT-mongodbs:
    external: true

启动服务,在 manager上执行

docker stack deploy -c docker-compose-mongo-cluster.yml mongo

在 manager查看服务的启动情况

docker service ls

image-20210906154120515.png

2, 查看是否配置成功

登录任意一台服务器通过客户端访问redis

例如: 10.11.32.26

docker exec -it redis_cluster_redis2  redis-cli  

image-20210906154621152.png

执行 输入密码

127.0.0.1:6379> auth 123456

执行 info 可以查看主从信息

127.0.0.1:6379> info

image-20210906154833176.png

其它服务器用同样的方法查看发现是 slave

image-20210906155143397.png

3, 测试数据是否同步,主节点挂掉从节点是否顶替主机节点

删除redis主节点

docker service rm  [主节点serviceId]  

访问从节点发现有一个从节点已经成为 master

127.0.0.1:6379> info  查看

已经测试过,这里就赘述了。

附录

参考文档

blog.csdn.net/liushengit/…

blog.csdn.net/weixin_4217…

www.cnblogs.com/aspirant/p/… yml文件说明