目录
什么是redis-sentinel?
谈redis-sentinel离不开谈主从架构,主从架构,主节点master只负责写入,写入的数据会同步的从节点。查询时去从节点拿数据。这就是主从架构。
它的问题在于,主节点如果挂掉以后,从节点就没用了。
redis-sentinel架构,除了主从节点以外,还有哨兵。这个哨兵的作用,是监测节点的健康状况,如果主节点挂掉了,哨兵会从 从节点之后选举出新的主节点,如果主节点又恢复了,那它会变为从节点。
docker搭建redis-sentinel
文档结构 以及 配置文件内容
TIPS: windows下使用cmd命令 tree /f > dir.txt 可以在当前目下生成目录结构 并输出到dir.txt文件中呦
F:.
│ dyh.md
│
└─redis-sentinel
└─config
│ docker-compose.yml
│ redis-master.conf
│ redis-sentinel-1.conf
│ redis-sentinel-2.conf
│ redis-sentinel-3.conf
│ redis-slave1.conf
│ redis-slave2.conf
│
├─data
│ ├─redis-master
│ │ dump.rdb
│ │
│ ├─redis-slave-1
│ │ dump.rdb
│ │
│ └─redis-slave-2
│ dump.rdb
│
└─log
docker-compose.yml配置
---
version: '3'
services:
# 主节点的容器
redis-server-master:
build:
network: host
image: redis
container_name: redis-server-master
restart: always
# 为了规避Docker中端口映射可能带来的问题
# 这里选择使用host网络
# 指定时区,保证容器内时间正确
environment:
TZ: "Asia/Shanghai"
volumes:
# 映射配置文件和数据目录
- ./redis-master.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-master:/data
- ./redis-sentinel-1.conf:/usr/local/etc/redis/redis-sentinel.conf
- ./log:/home/log
sysctls:
# 必要的内核参数
net.core.somaxconn: '511'
command: redis-server /usr/local/etc/redis/redis.conf
# 从节点1的容器
redis-server-slave-1:
build:
network: host
image: redis
container_name: redis-server-slave-1
restart: always
environment:
TZ: "Asia/Shanghai"
volumes:
- ./redis-slave1.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-slave-1:/data
- ./redis-sentinel-2.conf:/usr/local/etc/redis/redis-sentinel.conf
- ./log:/home/log
sysctls:
net.core.somaxconn: '511'
command: redis-server /usr/local/etc/redis/redis.conf
# 从节点1的容器
redis-server-slave-2:
build:
network: host
image: redis
container_name: redis-server-slave-2
restart: always
environment:
TZ: "Asia/Shanghai"
volumes:
- ./redis-slave2.conf:/usr/local/etc/redis/redis.conf
- ./data/redis-slave-2:/data
- ./redis-sentinel-3.conf:/usr/local/etc/redis/redis-sentinel.conf
- ./log:/home/log
sysctls:
net.core.somaxconn: '511'
command: redis-server /usr/local/etc/redis/redis.conf
节点的配置
redis-master.conf
# bind 127.0.0.1
# protected-mode yes
port 6379
# 设定密码认证
requirepass 123456
masterauth 123456
redis-slave1.conf
# bind 127.0.0.1
port 6380
requirepass 123456
slaveof redis-server-master 6379
masterauth 123456
redis-slave2.conf
# bind 127.0.0.1
port 6381
requirepass 123456
slaveof redis-server-master 6379
masterauth 123456
sentinel配置
redis-sentinel-1.conf
# bind 127.0.0.1
logfile "/home/log/sentinel1.log"
port 26379
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master redis-server-master 6379 2# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
sentinel down-after-milliseconds local-master 30000#后台执行
daemonize yes
redis-sentinel-2.conf
# bind 127.0.0.1
logfile "/home/log/sentinel2.log"
port 26380
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master redis-server-master 6379 2# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
sentinel down-after-milliseconds local-master 30000#后台执行
daemonize yes
redis-sentinel-3.conf
# bind 127.0.0.1
logfile "/home/log/sentinel3.log"
port 26381
# 设定密码认证
requirepass 123456
# 配置哨兵的监控参数
# 格式:sentinel monitor <master-name> <ip> <redis-port> <quorum>
# master-name是为这个被监控的master起的名字
# ip是被监控的master的IP或主机名。因为Docker容器之间可以使用容器名访问,所以这里写master节点的容器名
# redis-port是被监控节点所监听的端口号
# quorom设定了当几个哨兵判定这个节点失效后,才认为这个节点真的失效了
sentinel monitor local-master redis-server-master 6379 2# 连接主节点的密码
# 格式:sentinel auth-pass <master-name> <password>
sentinel auth-pass local-master 123456# master在连续多长时间无法响应PING指令后,就会主观判定节点下线,默认是30秒
sentinel down-after-milliseconds local-master 30000#后台执行
daemonize yes
具体操作步骤
1.进入到文档目录
# cd 到docker-compose所在的目录
PS C:\Users\GW00190182> cd F:
PS F:\> cd docker
PS F:\docker> cd .\redis-sentinel\
PS F:\docker\redis-sentinel> cd config
PS F:\docker\redis-sentinel\config>
2.执行docker compose
docker compose up -d
PS F:\docker\redis-sentinel\config> docker compose up -d
[+] Running 4/4
- Network "config_default" Created 0.0s
- Container redis-server-master Star... 0.7s
- Container redis-server-slave-2 Sta... 0.6s
- Container redis-server-slave-1 Sta... 0.6s
查看运行状态
PS F:\docker\redis-sentinel\config> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
469efd8bb683 redis "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 6379/tcp redis-server-master
65001dc46e8f redis "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 6379/tcp redis-server-slave-2
59ea1855464b redis "docker-entrypoint.s…" 4 seconds ago Up 3 seconds 6379/tcp redis-server-slave-1
以上都启动成功
3.开启redis sentinel
进入master容器 查看主从架构是否生效了
PS F:\docker\redis-sentinel\config> docker exec -it redis-server-master redis-cli
127.0.0.1:6379> auth 123456
OK
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.18.0.3,port=6380,state=online,offset=4214,lag=1
slave1:ip=172.18.0.2,port=6381,state=online,offset=4214,lag=1
master_replid:c5a0145917afedc81326a0bdf86fa0e8b27b8da4
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:4214
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:4214
127.0.0.1:6379>
好的!主从架构完毕。
分别进入到master和从节点 开启redis sentinel
PS F:\docker\redis-sentinel\config> docker exec -it redis-server-master /bin/bash
root@469efd8bb683:/data# redis-sentinel /usr/local/etc/redis/redis-sentinel.conf
53:X 19 Mar 2021 09:18:49.413 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
53:X 19 Mar 2021 09:18:49.413 # Redis version=6.0.10, bits=64, commit=00000000, modified=0, pid=53, just started
53:X 19 Mar 2021 09:18:49.413 # Configuration loaded
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.0.10 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 53
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'53:X 19 Mar 2021 09:18:49.420 # Could not rename tmp config file (Device or resource busy)
53:X 19 Mar 2021 09:18:49.420 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
53:X 19 Mar 2021 09:18:49.420 # Sentinel ID is 788272feca447e06f46db987a45080c6829e5231
53:X 19 Mar 2021 09:18:49.420 # +monitor master local-master 172.18.0.4 6379 quorum 2
53:X 19 Mar 2021 09:18:49.420 * +slave slave 172.18.0.3:6380 172.18.0.3 6380 @ local-master 172.18.0.4 6379
53:X 19 Mar 2021 09:18:49.424 # Could not rename tmp config file (Device or resource busy)
53:X 19 Mar 2021 09:18:49.424 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
53:X 19 Mar 2021 09:18:49.424 * +slave slave 172.18.0.2:6381 172.18.0.2 6381 @ local-master 172.18.0.4 6379
53:X 19 Mar 2021 09:18:49.427 # Could not rename tmp config file (Device or resource busy)
53:X 19 Mar 2021 09:18:49.427 # WARNING: Sentinel was not able to save the new configuration on disk!!!: Device or resource busy
4.进行测试
如上哨兵模式搭建完毕
关闭master
docker stop redis-server-master
查看选主过程
查看从节点是否变为了主节点
slave-1 正式上位
恢复master 看看是否变为了从节点
sentinel 打印的选举过程
遇到的问题:
1.docekr 的网络模式 需要选择为host ,不然哨兵无法连通
2.如果报出了配置文件的错误,建议自己手打一份文件,就可以解决问题
3.本想redis 启动和sentinel 启动 都放在docker-compose.yml之中,一气呵成,发现这样不可行,sentinel的启动必须要进入到容器里面,手动启动,而且如果主节点挂掉之后重启,sentinel也需要手动重启一遍。这里可以使用脚本,设置成开机自启。