主从模式介绍
哨兵是 Redis 的一种运行模式,它专注于对 Redis 实例(主节点、从节点)运行状态的监控,并能够在主节点发生故障时通过一系列的机制实现选主及主从切换,实现故障转移,确保整个 Redis 系统的可用性。结合 Redis官方文档,可以知道 Redis 哨兵具备的能力有如下几个:
- 监控:持续监控 master 、slave 是否处于预期工作状态。
- 自动切换主库:当 Master 运行故障,哨兵启动自动故障恢复流程:从 slave 中选择一台作为新 master。
- 通知:让 slave 执行 replicaof ,与新的 master 同步;并且通知客户端与新 master 建立连接。
1.每个 Sentinel 以每秒一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。
2.如果一个实例距离最后一次有效回复 PING 命令的时间超过指定的值, 那么这个实例会被 Sentinel 标记为主观下线。
3.正在监视这个主服务器的所有 Sentinel 要以每秒一次的频率确认主服务器的确进入了主观下线状态。
4.有足够数量的 Sentinel 在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。
5.每个 Sentinel 会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。当一个主服务器被 Sentinel 标记为客观下线时, Sentinel 向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。
6.Sentinel 和其他 Sentinel 协商主节点的状态,如果主节点处于 SDOWN 状态,则投票自动选出新的主节点。将剩余的从节点指向新的主节点进行数据复制。
7.当没有足够数量的 Sentinel 同意主服务器 下线时, 主服务器的客观下线状态就会被移除。主服务器重新向 Sentinel 的 PING 命令返回有效回复时,主服务器主观下线状态就会被移除
8.当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
环境准备:拉取redis
[root@172-16-82-218 redis]# docker pull redis:5.0.14
[root@172-16-82-218 redis]# docker images | grep redis
准备redis的配置文件redis.conf(放在自己定义的目录上),并复制redis.conf出3份用于redis docker镜像启动的配置文件
[root@172-16-82-218 redis]# wget http://download.redis.io/redis-stable/redis.conf
[root@172-16-82-218 redis]# cp redis.conf redis-6379.conf
[root@172-16-82-218 redis]# cp redis.conf redis-6380.conf
[root@172-16-82-218 redis]# cp redis.conf redis-6381.conf
配置这3个文件【redis-6379.conf为主服务器配置文件,redis-6380.conf , redis-6381.conf为从服务器配置文件】
1)修改配置文件redis-6379.conf如下参数,然后保存退出
vi redis-6379.conf
#允许远程连接
bind 0.0.0.0
#关闭保护模式(设置成:protected-mode no;保护模式关闭,如果你不关闭保护模式,启动哨兵的时候,无法正常运行。还有个解决办法就是你设置密码,但是一般都不设置redis的密码。麻烦,我每次连接还得输入密码。在部署中,可以设置密码。)
protected-mode no
#开启后,Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里
appendonly yes
#当protected-mode 设置成yes时,需要设置master的密码,否则不用设置
requirepass 123456 设置密码
#日志文件
logfile "/var/log/redis/redis-6379.log"
2)修改配置文件redis-6380.conf修改如下,然后保存退出
vi redis-6380.conf
bind 0.0.0.0
#关闭保护模式(设置成:protected-mode no;保护模式关闭,如果你不关闭保护模式,启动哨兵的时候,无法正常运行。还有个解决办法就是你设置密码,但是一般都不设置redis的密码。麻烦,我每次连接还得输入密码。在部署中,可以设置密码。)
protected-mode no
appendonly yes
slave-read-only no
replicaof 172.17.0.3 6379
logfile "/var/log/redis/redis-6380.log"
#当protected-mode 设置成yes时,需要设置master的密码,否则不用设置
requirepass 123456 设置密码
3)修改配置文件redis-6381.conf修改如下,然后保存退出
vi redis-6381.conf
bind 0.0.0.0
#关闭保护模式(设置成:protected-mode no;保护模式关闭,如果你不关闭保护模式,启动哨兵的时候,无法正常运行。还有个解决办法就是你设置密码,但是一般都不设置redis的密码。麻烦,我每次连接还得输入密码。在部署中,可以设置密码。)
protected-mode no
appendonly yes
slave-read-only no
replicaof 172.17.0.3 6379
logfile "/var/log/redis/redis-6380.log"
#当protected-mode 设置成yes时,需要设置master的密码,否则不用设置
requirepass 123456 设置密码
启动三个容器如下:
-d:后台运行容器,默认不进入容器
–name:容器别名
-p:指定映射的端口号
-v:绑定挂载目录
主服务器:redis-6379
[root@172-16-82-218 redis]# docker run -d --name redis-6379 -p 6379:6379 -v /software/redis/redis-6379.conf:/usr/local/etc/redis/redis-6379.conf redis:5.0.14
第二个从服务器redis-6380
[root@172-16-82-218 redis]# docker run -d --name redis-6380 -p 6380:6379 -v /software/redis/redis-6380.conf:/usr/local/etc/redis/redis-6380.conf redis:5.0.14
第三个从服务器redis-6381
[root@172-16-82-218 redis]# docker run -d --name redis-6381 -p 6381:6379 -v /software/redis/redis-6381.conf:/usr/local/etc/redis/redis-6381.conf redis:5.0.14
测试3个容器是否安装成功,出现有名称为,redis-6379,redis-6380,redis-6381表示启动成功,启动不成功,排查路径及配置文件,是否配置正确
此时这三台容器都是主服务器,例如进入redis-cli查看:
[root@172-16-82-218 redis]# docker exec -it redis-6379 redis-cli
执行redis指令:info Replication,这时可以看见节点在集群中的角色role是master
服务redis-6380和redis-6381重复上述操作查看
把【redis-6380,redis-6381配置成从服务器】
[root@172-16-82-218 redis]# docker exec -it redis-6380 redis-cli
执行redis指令:SLAVEOF 172.17.0.2 6379
在redis-6379查看master状态,可以看到主节点下链接了两个slaves
测试redis集群的操作
在主节点上
[root@localhost redis]# docker exec -it redis-6379 redis-cli
127.0.0.1:6379> set test 123
OK
127.0.0.1:6379> get test
"123"
127.0.0.1:6379>
在从节点上(redis-6380、redis-6381 上分别查看)
[root@localhost redis]# docker exec -it redis-6380 redis-cli
127.0.0.1:6379> get test
"123"
127.0.0.1:6379>
sentinel 配置[redis哨兵]
使用docker inspect redis-6380 查看ip地址
redis-6379 ip 为 172.17.0.3
redis-6380 ip 为 172.17.0.4
redis-6381 ip 为 172.17.0.5
redis哨兵模式说明
使用docker启动3个redis服务器,一个master(主), 两个slave (从),进行主从配置。
3台redis服务器分别启动一个哨兵sentinel。
第一步:【master容器配置哨兵】:docker exec -it redis-6379 /bin/bash
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf (建立sentinel(哨兵模式)的配置文件,保存退出,内容如下:)
port 26379 (指定哨兵监听端口)
dir "/data" #sentinel工作目录
logfile "sentinel.log" #日志文件
sentinel monitor name 172.17.0.2 6379 2 #启动哨兵(名称:name) 监听master
daemonize yes #后台运行
#启动哨兵:
#redis-sentinel sentinel.conf第二步:【slave01容器配置哨兵:docker exec -it redis-6380 /bin/bash】
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf (建立sentinel配置文件保存退出,内容如下)
port 26380
dir "/data"
logfile "sentinel.log"
sentinel monitor name 172.17.0.2 6379 2
daemonize yes 启动哨兵:
redis-sentinel sentinel.conf第三步:【slave02容器配置哨兵:docker exec -it redis-6381 /bin/bash】
#cd / (进入根目录)
#apt-get update (更新依赖)
#apt-get install -y vim (安装vim)
#vim sentinel.conf (建立sentinel的配置文件保存退出,内容如下)
port 26381
dir "/data"
logfile "sentinel.log"
sentinel monitor name 172.17.0.2 6379 2
daemonize yes 启动哨兵:
redis-sentinel sentinel.conf
测试:redis-6379是主服务器,redis-6380, redis-6381是从服务器,
1、进入到容器,查看哨兵允许状态,26380.log为哨兵日志文件,上面有说道,此为实时显示最后20条日志
#docker exec -it redis-6380 /bin/bash
#tail -f 20 26380.log
> 26380.log <
12:X 20 Sep 2020 13:57:47.439 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12:X 20 Sep 2020 13:57:47.439 # Redis version=5.0.9, bits=64, commit=00000000, modified=0, pid=12, just started
12:X 20 Sep 2020 13:57:47.439 # Configuration loaded
13:X 20 Sep 2020 13:57:47.443 * Running mode=sentinel, port=26380.
… …
1、现在把主服务器redis-6379容器停止,
查看redis-6379容器id
root@lixiong:/home/lx# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7f8fd1c59f55 redis “docker-entrypoint.s…” 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26381->26379/tcp sentinel3
ee5093e6f3a9 redis “docker-entrypoint.s…” 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26380->26379/tcp sentinel2
8ed84c9b5621 redis “docker-entrypoint.s…” 2 hours ago Up 2 hours 6379/tcp, 0.0.0.0:26379->26379/tcp sentinel
d3b0c49aac92 redis “docker-entrypoint.s…” 3 hours ago Up 2 hours 0.0.0.0:6381->6379/tcp redis-6382
87611597b78b redis “docker-entrypoint.s…” 3 hours ago Up 2 hours 0.0.0.0:6380->6379/tcp redis-6381
#docker stop redis-6379
8ed84c9b5621
2、打开redis-6380客户端,:info replication查看,原先主服务器为redis-6379,此时从服务器会上升到主服务器[30秒后自动转换主服务器节点]
#docker exec -it redis-6380 redis-cli
127.0.0.1:6379>info replication
127.0.0.1:6379> info replication
Replication
role:master
master_host:172.17.0.3
master_port:6380
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:32521
slave_priority:100