Docker Swarm部署Redis 高可用 哨兵模式

1.1、假定部署环境如下:

IPhostname部署实例
172.16.xxx.101swarm01redis1、sentinel1
172.16.xxx.102swarm02redis2、sentinel2
172.16.xxx.103swarm02redis3、sentinel2

1.2、给节点添加标签,指定redis实例运行在哪些节点上

#  在任意一个Manager节点上执行
docker node update --label-add cluster.redis=node1 swarm01
docker node update --label-add cluster.redis=node2 swarm02
docker node update --label-add cluster.redis=node3 swarm03

注意:上面的swarm01/02/03要修改为真实环境中的节点名称

1.2、部署架构图

在这里插入图片描述

1.3、创建数据卷映射目录

# 在三个服务器节点上,分别执行以下命令
mkdir -p /usr/local/redis/conf/
mkdir -p /usr/local/redis/data/

1.4、修改 docker compose编排脚本

将下面脚本中的IP172.16.xxx.xxx替换为实际部署环境中的真实IP,其他信息不用改

version: '3.8'
services:
  redis1:
    image: redis:6.2.4
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 6379
        published: 6379
        protocol: tcp
        mode: host
    volumes:
      - /usr/local/redis/data:/data
      - /usr/local/redis/conf:/conf
    networks:
      - net
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.cluster.redis == node1
    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 172.16.xxx.101' >> /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: redis:6.2.4
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 6379
        published: 6379
        protocol: tcp
        mode: host
    volumes:
      - /usr/local/redis/data:/data
      - /usr/local/redis/conf:/conf
    networks:
      - net
    depends_on:
      - redis1
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.cluster.redis == node2
    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 172.16.xxx.102' >> /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 172.16.xxx.101 6379' >> /conf/redis.conf ;
      echo 'appendonly yes' >> /conf/redis.conf ; fi &&
      redis-server /conf/redis.conf"
  redis3:
    image: redis:6.2.4
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 6379
        published: 6379
        protocol: tcp
        mode: host
    volumes:
      - /usr/local/redis/data:/data
      - /usr/local/redis/conf:/conf
    networks:
      - net
    depends_on:
      - redis1
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.cluster.redis == node3
    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 172.16.xxx.103' >> /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 172.16.xxx.101 6379' >> /conf/redis.conf ;
      echo 'appendonly yes' >> /conf/redis.conf ; fi &&
      redis-server /conf/redis.conf"
  sentinel1:
    image: redis:6.2.4
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 26379
        published: 26379
        protocol: tcp
        mode: host
    depends_on:
      - redis1
      - redis2
      - redis3
    volumes:
      - /usr/local/redis/data:/data
      - /usr/local/redis/conf:/conf
    networks:
      - net
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.cluster.redis == node1
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/sentinel.conf ];then
      echo 'port 26379' > /conf/sentinel.conf ;
      echo 'sentinel announce-ip 172.16.xxx.101' >> /conf/sentinel.conf ;
      echo 'sentinel monitor mymaster 172.16.xxx.101 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: redis:6.2.4
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 26379
        published: 26379
        protocol: tcp
        mode: host
    depends_on:
      - redis1
      - redis2
      - redis3
    volumes:
      - /usr/local/redis/data:/data
      - /usr/local/redis/conf:/conf
    networks:
      - net
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.cluster.redis == node2
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/sentinel.conf ];then
      echo 'port 26379' > /conf/sentinel.conf ;
      echo 'sentinel announce-ip 172.16.xxx.102' >> /conf/sentinel.conf ;
      echo 'sentinel monitor mymaster 172.16.xxx.101 6379 2' >> /conf/sentinel.conf ;
      echo 'sentinel auth-pass mymaster 123456' >> /conf/sentinel.conf ; fi &&
      redis-server /conf/sentinel.conf --sentinel"
  sentinel3:
    image: redis:6.2.4
    environment:
      TZ: "Asia/Shanghai"
    ports:
      - target: 26379
        published: 26379
        protocol: tcp
        mode: host
    depends_on:
      - redis1
      - redis2
      - redis3
    volumes:
      - /usr/local/redis/data:/data
      - /usr/local/redis/conf:/conf
    networks:
      - net
    deploy:
      mode: global
      placement:
        constraints:
          - node.labels.cluster.redis == node3
    sysctls:
      net.core.somaxconn: '511'
    command: >
      bash -c "if [ ! -f /conf/sentinel.conf ];then
      echo 'port 26379' > /conf/sentinel.conf ;
      echo 'sentinel announce-ip 172.16.xxx.103' >> /conf/sentinel.conf ;
      echo 'sentinel monitor mymaster 172.16.xxx.101 6379 2' >> /conf/sentinel.conf ;
      echo 'sentinel auth-pass mymaster 123456' >> /conf/sentinel.conf ; fi &&
      redis-server /conf/sentinel.conf --sentinel"
networks:
  net:
    driver: overlay
    ipam:
      driver: default
      config:
        - subnet: "192.168.1.0/24"

1.5、直接在portainer -> stack 菜单,执行以上docker compose编排脚本即可部署成功

在这里插入图片描述

服务实例启动成功后,每个服务器节点的文件结构如下:

[root@swarm01 redis]# pwd
/usr/local/redis
[root@swarm01 redis]# tree
.
├── conf
│   ├── redis.conf
│   └── sentinel.conf
└── data
    ├── appendonly.aof
    └── dump.rdb
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过 Docker Swarm 部署 Redis 集群来实现高可用和负载均衡。下面是一些步骤: 1. 准备 Docker Swarm:首先,需要设置一个 Docker Swarm 环境。在一台机器上运行以下命令以初始化 Swarm: ``` $ docker swarm init ``` 2. 创建网络:创建一个 overlay 网络,以便在 Swarm 中的各个节点之间进行通信。 ``` $ docker network create --driver overlay redis-network ``` 3. 创建 Redis 服务:使用以下命令在 Swarm 中创建 Redis 服务: ``` $ docker service create \ --name redis-cluster \ --network redis-network \ --replicas 6 \ --publish 6379:6379 \ redis:latest \ redis-server --cluster-enabled yes --cluster-require-full-coverage no --cluster-replicas 1 ``` 此命令将创建一个名为 "redis-cluster" 的服务,并在 Swarm 中的6个副本中运行 Redis 容器。每个容器都将监听主机的6379端口,并启用 Redis 集群模式。 4. 创建 Redis 集群:使用以下命令启动 Redis 集群: ``` $ docker exec -it $(docker ps -qf "name=redis-cluster.1.") redis-cli --cluster create <ip1>:6379 <ip2>:6379 <ip3>:6379 <ip4>:6379 <ip5>:6379 <ip6>:6379 --cluster-replicas 1 ``` 其中,<ip1>、<ip2>等是 Redis 容器的 IP 地址。你可以使用 `docker service ls` 和 `docker service ps <service-name>` 命令来获取这些 IP 地址。 5. 验证 Redis 集群:使用以下命令验证 Redis 集群是否正常工作: ``` $ docker exec -it $(docker ps -qf "name=redis-cluster.1.") redis-cli cluster info ``` 你应该能够看到集群的相关信息。 通过这些步骤,你可以在 Docker Swarm 中成功部署 Redis 集群。请确保根据你的需求进行适当的调整,如副本数量和端口映射等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值