使用DockerCompose配置基于哨兵模式的redis主从架构集群

文章目录

使用DockerCompose配置单个redis环境可以参考另一篇文章【使用DockerCompose安装Redis】

一、注意事项(坑点!!!)

  1. 在slave配置指定master时(slaveof redis-master 6379),尽管master是配置映射的6380,但是端口还是要指定6379,这个端口必须是master容器内的端口,而不是映射到主机的端口。
  2. 配置sentinel.conf时,指定master要用ip或者域名,指定master的容器名无法通过(只有redis.conf里知道master时容器名可以通过,如果有朋友知道其中原理是什么,欢迎在评论区留言讨论)。
  3. 使用docker-compose down删除容器集群之后,下一次启动时master的ip可能变了,要重新查询master的ip并修改哨兵的配置文件。

二、配置Redis主从架构集群

第一步:创建目录文件结构

sh 复制代码
# 进入docker相关文件目(没有可以参考文章顶部的文章创建一个)
cd /docker
# 创建相关目录
mkdir redis-master-slave redis-master-slave/master redis-master-slave/slave1 redis-master-slave/slave2

第二步:编写DockerCompose配置文件

sh 复制代码
vim /docker/docker-compose/redis-master-slave.yml

写入以下内容

yml 复制代码
version: '3' 
services:
  # ------------------- master ------------------- 
  redis-master:
    image: redis:6.2.14
    container_name: redis-master
    ports:
      - 6380:6379
    volumes:
      - /docker/redis-master-slave/master/redis.conf:/usr/local/etc/redis/redis.conf
      - /docker/redis-master-slave/master/data:/data
      - /docker/redis-master-slave/master/logs:/var/log/redis
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: always

  # ------------------- slave1 ------------------- 
  redis-slave1:
    image: redis:6.2.14
    container_name: redis-slave1
    ports:
      - 6381:6379
    volumes:
      - /docker/redis-master-slave/slave1/redis.conf:/usr/local/etc/redis/redis.conf
      - /docker/redis-master-slave/slave1/data:/data
      - /docker/redis-master-slave/slave1/logs:/var/log/redis
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: always

  # ------------------- slave2 ------------------- 
  redis-slave2:
    image: redis:6.2.14
    container_name: redis-slave2
    ports:
      - 6382:6379
    volumes:
      - /docker/redis-master-slave/slave2/redis.conf:/usr/local/etc/redis/redis.conf
      - /docker/redis-master-slave/slave2/data:/data
      - /docker/redis-master-slave/slave2/logs:/var/log/redis
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: always

第三步:编写redis.conf

  1. 配置master的redis.conf
sh 复制代码
vim /docker/redis-master-slave/master/redis.conf

写入以下内容

sh 复制代码
# 配置密码
requirepass 123456
# 开启aof
appendonly yes 
# aof文件名
appendfilename "appendonly.aof"
# aof记录的策略                                                                                                                                      
appendfsync always
# appendfsync everysec
# appendfsync no
  1. 配置slave1的redis.conf
    注意slave的6379是容器内的端口,如果没必须是6379
sh 复制代码
vim /docker/redis-master-slave/slave1/redis.conf

写入以下内容

sh 复制代码
# 配置密码
requirepass 123456
# 开启aof
appendonly yes 
# aof文件名
appendfilename "appendonly.aof"
# aof记录的策略
appendfsync always
# appendfsync everysec
# appendfsync no

# 指定master
slaveof redis-master 6379
# 指定master的密码                                                                                                                                   
masterauth 123456
  1. 配置slave2的redis.conf
sh 复制代码
vim /docker/redis-master-slave/slave2/redis.conf

写入以下内容(和slave1一模一样)

sh 复制代码
# 配置密码
requirepass 123456
# 开启aof
appendonly yes 
# aof文件名
appendfilename "appendonly.aof"
# aof记录的策略
appendfsync always
# appendfsync everysec
# appendfsync no

# 指定master
slaveof redis-master 6379
# 指定master的密码                                                                                                                                   
masterauth 123456

第四步:启动redis主从集群

sh 复制代码
cd /docker/docker-compose
docker-compose -f redis-master-slave.yml up -d

启动后使用docker ps 命令查看状态

补充:

  • 停用:docker-compose -f redis-master-slave.yml down

三、配置哨兵

可以配置一个,也可以配置多个,当然配置多个哨兵的话,才更能保证高可用。这里我就只配置一个,配置多个几乎是一模一样的配置,只是端口变一下。

第一步:编写DockerCompose配置文件

sh 复制代码
vim /docker/docker-compose/redis-ms-sentinal.yml

写入以下内容

yml 复制代码
version: '3' 
services:
  # ------------------- sentinel ------------------- 
  redis-sentinel:
    image: redis:6.2.14
    container_name: redis-sentinel
    ports:
      - 26379:26379
    volumes:
      - /docker/redis-master-slave/sentinel.conf:/usr/local/etc/redis/sentinel.conf
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf                                                                                       
    restart: always

第二步:获取master在容器中的ip

使用 docker inspect 容器id|grep IPAddress命令,如下

第三步:编写sentinel.conf

sh 复制代码
vim /docker/redis-master-slave/sentinel.conf 

写入以下内容(注意填入正确的 master ip)

yml 复制代码
port 26379
# 哨兵    监视   主机名      主机ip    端口 票数
sentinel monitor mymaster 192.168.48.5 6379 1
# 集群的密码
sentinel auth-pass mymaster 123456

第四步:启动哨兵

sh 复制代码
cd /docker/docker-compose
docker-compose -f redis-ms-sentinal.yml up -d

启动后使用docker ps 命令查看状态

四、测试从机自动升级效果

1. 测试联通性

2.测试自动选举

通过流言协议和投票协议进行重新选举需要几秒钟的时间

相关推荐
分布式存储与RustFS3 天前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
IT大白鼠3 天前
Redis 系列 · 第 01 篇——认知入门:Redis 是什么
redis·nosql
彧azz3 天前
Linux 环境下 Redis 学习总结:数据类型、持久化、锁、事务、主从与缓存问题
linux·redis·笔记·学习·面试
玉&心3 天前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing3 天前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
guo_wen_qiang3 天前
上传本地镜像到harbor中
docker·容器·持续部署
羑悻的小杀马特3 天前
Dockerfile 全景指南:从入门编写dockerfile到生产环境镜像优化实战,一步步带你从啃透制作指令到镜像制作落地!
docker·dockerfile·镜像制作
BianHuanShiZhe3 天前
docker常见命令
docker
lbb 小魔仙3 天前
OpenClaw + cpolar 实战:远程 NAS、分享小游戏、RDP,再配置公网 AI 入口
数据库·人工智能·redis·oracle·prometheus
夕除3 天前
redis--018
redis