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

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

相关推荐
小醉你真好1 小时前
15、Docker Compose 安装ELK + Filebeat单机版
elk·docker·jenkins
我真的是大笨蛋2 小时前
Redis的String详解
java·数据库·spring boot·redis·spring·缓存
Gss7773 小时前
Docker 公有仓库使用、Docker 私有仓库(Registry)使用总结
docker·容器
暴富奥利奥3 小时前
完成docker方式的ros环境配置
linux·学习·docker·容器
zhengzizhe4 小时前
Redssion出现attempt to unlock lock, not locked by current thread by node id
redis
海海思思5 小时前
解决Docker "exec format error":架构不匹配问题分析
docker·容器
帅帅梓6 小时前
docker网络
网络·docker·php
Lv-D-J7 小时前
mac下Docker安装nacos
docker
兜兜风d'8 小时前
redis字符串命令
数据库·redis·缓存
西瓜er9 小时前
Docker 一键部署指南:GitLab、Nacos、Redis、MySQL 与 MinIO 全解析
redis·docker·gitlab