使用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.测试自动选举

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

相关推荐
小白学大数据42 分钟前
基于Scrapy-Redis的分布式景点数据爬取与热力图生成
javascript·redis·分布式·scrapy
THMAIL1 小时前
mac M芯片运行docker-desktop异常问题
macos·docker·容器
Kookoos1 小时前
Redis + ABP vNext 构建分布式高可用缓存架构
redis·分布式·缓存·架构·c#·.net
两点王爷2 小时前
IDEA中springboot项目中连接docker
spring boot·docker·intellij-idea
家庭云计算专家2 小时前
还没用过智能文档编辑器吗?带有AI插件的ONLYOFFICE介绍
服务器·人工智能·docker·容器·编辑器
孤的心了不冷5 小时前
【Docker】CentOS 8.2 安装Docker教程
linux·运维·docker·容器·eureka·centos
头疼的程序员6 小时前
docker学习与使用(概念、镜像、容器、数据卷、dockerfile等)
学习·docker·容器
IT小郭.6 小时前
使用 Docker Desktop 安装 Neo4j 知识图谱
windows·python·sql·docker·知识图谱·database·neo4j
淡水猫.6 小时前
hbit资产收集工具Docker(笔记版)
运维·docker·容器
dddaidai12315 小时前
分布式ID和分布式锁
redis·分布式·mysql·zookeeper·etcd