基于Docker-Compose搭建Redis哨兵模式

基于Docker-Compose搭建Redis哨兵模式

一、部署环境

环境: 一台Linux虚拟机、Docker、Docker-Compose
目标: Redis哨兵模式,一主二从三哨兵
明细: Redis主节点(Redis6379)、Redis从节点1(Redis6380)、Redis从节点2(Redis6381)、Redis哨兵1(Sentinel26379)、Redis哨兵2(Sentinel26380)、Redis哨兵3(Sentinel26381)

二、编写Redis配置文件

Redis6379.conf

# redis 服务器的端口号(默认:6379)
port 6379

# 绑定的 IP 地址,如果设置为 127.0.0.1,则只能本地访问;若设置为 0.0.0.0,则监听所有接口(默认:127.0.0.1)
bind 0.0.0.0

# 设置密码,客户端连接时需要提供密码才能进行操作,如果不设置密码,可以注释掉此行(默认:无)
# requirepass foobared
requirepass bingo

# 是否以守护进程(daemon)模式运行,默认为 "no",设置为 "yes" 后 Redis 会在后台运行
daemonize no

# 设置日志级别(默认:notice)。可以是 debug、verbose、notice、warning
loglevel notice

# 设置日志文件的路径(默认:空字符串),如果不设置,日志会输出到标准输出
logfile "6379.log"

# 设置数据库数量(默认:16),Redis 使用数据库索引从 0 到 15
databases 16

# 是否启用 AOF 持久化,默认为 "no"。如果设置为 "yes",将在每个写操作执行时将其追加到文件中
appendonly no

# 设置 AOF 持久化的文件路径(默认:appendonly.aof)
appendfilename "appendonly6379.aof"

# 设置是否开启 RDB 持久化,默认为 "yes"。如果设置为 "no",禁用 RDB 持久化功能
save 900 1
save 300 10
save 60 10000

# 设置 RDB 持久化文件的名称(默认:dump.rdb)
dbfilename dump6379.rdb

仿照上面的配置复制两份,依次命名为Redis6380.conf、Redis6381.conf,将文件中涉及到的端口6379改成对应的6380和6381即可

在这里插入图片描述

三、编写哨兵配置文件

Sentinel26379.conf

# 服务器的端口号
port 26379

# 可访问的 IP 地址
bind 0.0.0.0     

# 日志文件
logfile "sentinel26379.log"

# 监控的主机(格式为 sentinel monitor 主机名 主机ip 主机端口 多少个哨兵节点都认为主节点不可达时才会进行故障转移的数量)
sentinel monitor redis6379 192.168.163.130 6379 2

# 监控的主机密码(格式为 sentinel auth-pass 主机名 主机连接密码)
sentinel auth-pass redis6379 bingo

# 指定在多少毫秒内,哨兵节点没有收到主节点的响应时,就会将主节点判定为下线状态(格式为 sentinel down-after-milliseconds 主机名 超时毫秒数)
sentinel down-after-milliseconds redis6379 5000

# 指定进行故障转移的超时时间,即在多少毫秒内完成故障转移操作(格式为 sentinel failover-timeout 主机名 主机连接密码)
sentinel failover-timeout redis6379 60000

# 这个配置项用于指定在进行故障转移时可以同时同步的从节点数量(格式为 sentinel parallel-syncs 主机名 主机连接密码)
sentinel parallel-syncs redis6379 1

复制两份,依次命名为sentinel26380.conf和sentinel26381.conf

在这里插入图片描述

四、编写Docker-Compose.yml

compose-redis.yml

version: '3.3'
services:

  redis6379: # 服务名
    image: redis:latest # 使用的镜像
    container_name: redis6379 # docker启动的容器名称
    ports:
      - '6379:6379' # 启动的端口(本机:容器)
    volumes: # 挂载卷的位置(本机:容器),自己创建好目录即可,只需修改本机的目录路径,不需要修改容器的路径
      - /mydata/redis/data:/data
      - /mydata/redis/conf/redis6379.conf:/usr/local/etc/redis/redis.conf
      - /mydata/redis/logs:/logs
    #配置文件启动命令
    command: redis-server /usr/local/etc/redis/redis.conf

  redis6380:
    image: redis:latest
    container_name: redis6380
    ports:
      - '6380:6380'
    volumes:
      - /mydata/redis/data:/data
      - /mydata/redis/conf/redis6380.conf:/usr/local/etc/redis/redis.conf
      - /mydata/redis/logs:/logs
    command: redis-server /usr/local/etc/redis/redis.conf

  redis6381:
    image: redis:latest
    container_name: redis6381
    ports:
      - '6381:6381'
    volumes:
      - /mydata/redis/data:/data
      - /mydata/redis/conf/redis6381.conf:/usr/local/etc/redis/redis.conf
      - /mydata/redis/logs:/logs
    command: redis-server /usr/local/etc/redis/redis.conf

  sentinel26379:
    image: redis:latest
    container_name: sentinel26379
    ports:
      - '26379:26379'
    volumes:
      - /mydata/redis/data:/data
      - /mydata/redis/conf/sentinel26379.conf:/usr/local/etc/redis/sentinel.conf
      - /mydata/redis/logs:/logs
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    depends_on: # 设置依赖关系,哨兵等待redis服务启动成功之后再启动
      - redis6379
      - redis6380
      - redis6381

  sentinel26380:
    image: redis:latest
    container_name: sentinel26380
    ports:
      - '26380:26380'
    volumes:
      - /mydata/redis/data:/data
      - /mydata/redis/conf/sentinel26380.conf:/usr/local/etc/redis/sentinel.conf
      - /mydata/redis/logs:/logs
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    depends_on:
      - redis6379
      - redis6380
      - redis6381

  sentinel26381:
    image: redis:latest
    container_name: sentinel26381
    ports:
      - '26381:26381'
    volumes:
      - /mydata/redis/data:/data
      - /mydata/redis/conf/sentinel26381.conf:/usr/local/etc/redis/sentinel.conf
      - /mydata/redis/logs:/logs
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    depends_on:
      - redis6379
      - redis6380
      - redis6381

五、执行yml文件,启动容器

docker-compose -f compose-redis.yml up -d

在这里插入图片描述

docker ps 查看容器状态

在这里插入图片描述

可以看到所有容器都已经成功启动了

六、查看Redis各个角色状态

info replication 查看Redis节点信息、info sentinel 查看Redis哨兵信息

先连接主节点容器redis6379,然后查看主节点信息

docker exec -it redis6379 redis-cli -a bingo

在这里插入图片描述

列出了其两个从节点信息

connected_slaves:2
slave0:ip=192.168.48.1,port=6381,state=online,offset=109274,lag=0
slave1:ip=192.168.48.1,port=6380,state=online,offset=109274,lag=1

查看从节点redis6380信息

docker exec -it redis6380 redis-cli -p 6380 -a bingo

在这里插入图片描述

可以看到当前从节点的主节点信息

role:slave
master_host:192.168.163.130
master_port:6379
master_link_status:up

进入容器sentinel26379,查看哨兵sentinel26379的信息

docker exec -it sentinel26379 redis-cli -p 26379
info sentinel

在这里插入图片描述

可以看到主节点信息、状态和Redis的配置详情(两个从节点,三个哨兵)

master0:name=redis6379,status=ok,address=192.168.163.130:6379,slaves=2,sentinels=3

七、主从复制验证

先在主节点redis6379上设置k1

在这里插入图片描述

然后在从节点redis6380和redis6381上查询

在这里插入图片描述

在这里插入图片描述

可以看到主节点上设置的k1自动同步到了从节点上

注意,Redis的从节点是不能设置值的,只能读取值

在这里插入图片描述

八、主节点故障恢复验证

先关掉主节点redis6379

docker stop redis6379

在这里插入图片描述

然后进入哨兵sentinel26379查看Redis的节点信息

在这里插入图片描述

可以看到主节点的地址已经改成了6380(注意,matser的name是redis6379是因为我们最开始在sentinel.conf文件中配置的,这个名字可以自定义)

然后我们进入redis6380查看主机信息并尝试设置值

在这里插入图片描述

现在redis6380被选举成了主节点,便可设置值了,至此,主节点故障恢复成功

小结

以上就是作者基于Docker-Compose搭建Redis哨兵模式的所有内容,如果文中有错误或者表述不清楚的地方欢迎指正和讨论,谢谢 ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值