这里我们先把主从环境的配置弄好
#这里我发现虚拟机会出问题,调快照的话,ip地址是英文。建议用压缩包解压
主:192.168.149.139
从:192.168.149.144
从:192.168.149.145
cd /usr/local/redis
#配置说明
#关闭保护模式,使外网能访问。
protected-mode no
#修改端口。三份文件分别不同
port 26379
#修改为前台运行。
daemonize no
#指定不同pid文件,注意文件夹不存在自己要新建。
pidfile /var/run/redis-sentinel.pid
#配置哨兵日志文件。
logfile ""
#配置哨兵工作路径。
dir "/tmp"
#配置哨兵需要监控的主节点ip和端口,2表示哨兵数(quorum)
sentinel monitor mymaster 192.168.149.139 6379 2
#配置哨兵连接主节点的认证密码。(主节点配置的requirepass)。
sentinel auth-pass mymaster admin123
#配置多少毫秒后没收到主节点的反馈,则主观认为主节点down了。
sentinel down-after-milliseconds mymaster 5000
#表示如果30秒后,mysater仍没活过来,则启动failover,从剩下的slave中选一个升级为master
sentinel failover-timeout mymaster 30000
#parallel-syncs 指定了在执行故障转移时, 最多可以有多少个slave同时对新的master进行同步, 这个数字越小, 完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1
注意:
majority表示大多数哨兵
quorum表示哨兵数
如果quorum < majority,比如5个哨兵,majority就是3,quorum设置为2,那么就3个哨兵授权就可以执行切换。
但是如果quorum >= majority,那么必须quorum数量的哨兵都授权,比如5个哨兵,quorum是5,那么必须5个哨兵都同意授权,才能执行切换。
单哨兵模式
#设置哨兵
#修改配置文件/usr/local/redis/sentinel.conf
vim sentinel.conf
#mymaster:监控主数据的名称,命名时可以使用大小写字母和“.-_”符号,192.168.149.139 6379:主机的IP和端口号
sentinel monitor mymaster 192.168.149.139 6379 1
#启动
./src/redis-sentinel ./sentinel.conf
#或
./src/redis-server ./sentinel.conf --sentinel
./src/redis-server ./6379.conf --sentinel
多哨兵模式
#禁用防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
sed -i.ori 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config
新建主从复制关系
#1.主 /usr/local/redis
#mkdir log && cd log && touch 27001.log && cd ..
cat >6379.conf <<EOF
daemonize yes
bind 0.0.0.0
port 6379
pidfile "/var/run/redis-sentinel-27001.pid"
logfile "/usr/local/redis/log/27001.log"
dir ./
save 900 1
save 300 10
save 60 10000
dbfilename "redis.rdb"
appendonly yes
appendfilename "redis.aof"
appendfsync everysec
EOF
#2.从1
#mkdir log && cd log && touch 27002.log && cd ..
#这么命令相当于vim,cat>xxx<<EOF表示要修改的文件,最后的EOF表示结尾
cat >6379.conf <<EOF
daemonize yes
bind 0.0.0.0
port 6379
pidfile "/var/run/redis-sentinel-27002.pid"
logfile "/usr/local/redis/log/27002.log"
dir ./
save 900 1
save 300 10
save 60 10000
dbfilename "redis.rdb"
appendonly yes
appendfilename "redis.aof"
appendfsync everysec
EOF
#3.从2
#mkdir log && cd log && touch 27003.log && cd ..
cat >6379.conf <<EOF
daemonize yes
bind 0.0.0.0
port 6379
pidfile "/var/run/redis-sentinel-27003.pid"
logfile "/usr/local/redis/log/27003.log"
dir ./
save 900 1
save 300 10
save 60 10000
dbfilename "redis.rdb"
appendonly yes
appendfilename "redis.aof"
appendfsync everysec
EOF
#都启动
./src/redis-server ./6379.conf
#主节点
./src/redis-cli -h 192.168.149.139 -p 6379 slaveof 192.168.149.144 6379
./src/redis-cli -h 192.168.149.139 -p 6379 slaveof 192.168.149.145 6379
Sentinel 状态的持久化
#三台服务器执行同样操作
touch log/redis26379.log
#配置
cat >6379.conf << EOF
daemonize yes
bind 0.0.0.0
port 26379
daemonize yes
logfile "/usr/local/redis/log/redis26379.log"
dir ./
# 注意修改主节点ip为你真实的主节点IP
sentinel monitor myredis 192.168.149.139 6379 2
sentinel down-after-milliseconds myredis 3000
sentinel parallel-syncs myredis 1
sentinel failover-timeout myredis 180000
EOF
#启动
./src/redis-server ./6379.conf --sentinel
常用的命令
./src/redis-cli -h 192.168.149.139 -p 26379 SENTINEL get-master-addr-by-name myredis
./src/redis-cli -h 192.168.149.144 -p 26379 SENTINEL get-master-addr-by-name myredis
./src/redis-cli -h 192.168.149.145 -p 26379 SENTINEL get-master-addr-by-name myredis
# 查看可用的sentinel节点数量
./src/redis-cli -h 192.168.149.139 -p 26379 SENTINEL ckquorum myredis
# 查看可用的sentinel的基本信息
# 总的信息
./src/redis-cli -h 192.168.149.139 -p 26379 INFO
# 总的信息中某一项分类信息
./src/redis-cli -h 192.168.149.139 -p 26379 INFO Sentinel
故障转移
如果一个主节点被标记为客观下线,那么就会Sentinel就会进行自动故障转移操作。
一次故障转移操作由以下步骤组成:
发现主节点已经进入客观下线状态。
先把那些"营养不良"的从节点淘汰掉:
在失效主节点的从节点当中, 那些被标记为主观下线、已断线、或者最后一次回复ping命令的时间大于五秒钟的从节点都会被淘汰。
在失效主节点下的从节点当中,那些与失效主节点连接断开的时长超过 down-after 选项指定的时长十倍的从节点都会被淘汰。
在经历了以上两轮淘汰之后剩下来的从节点中,才是精英,从这精英中,开始进行选举。
使用Ralt算法划分选举周期,开始进行选举,raft算法可以随机定义一个时间周期,这个周期就是选举的周期,如果该周期中没有选出leader,则进入下个时间周期,Raft将系统中的角色分为领导者(Leader)、跟从者(Follower)和候选人(Candidate)。
每个从节点的选举时钟不一样,这样就可以避免所有的从节点向其它节点同时发送选举指令。
首先从节点选投票给自己,然后发送请求给其它节点给自己投票。
其它从节点收到投票请求之后,先比较优先级,如果自己的大,则给自己投票,否则投票给别人。如果所有从节点的优先级都相同,则比较复制偏移量(从主节点同步的数据偏移量),如果自己大,则给自己投票,否则投票给别人。
如果偏移量相同,则比较runid(redis的标识,随机生成),如果自己的小,则投票给自己,否则投票给别人,每个节点只能投票一次,而每个节点有自己的投票箱。
最后比较投票的数量,数量最多,则成功上位,称为leader,如果数量相同,那么在设定的故障迁移超时时间的两倍之后,进入下一个选举周期,重新投票。
经过一顿选择之后,"幸运的候选人"被选出来了,向被选中的从节点发送 SLAVEOF NO ONE 命令,让它转变为主节点。
通过发布与订阅功能, 将更新后的配置传播给所有其他 Sentinel ,其他 Sentinel 对它们自己的配置进行更新。
向其它从节点发送slaveof命令,让它们去复制新的主节点。
当所有从节点都已经开始复制新的主节点时,领头 Sentinel 终止这次故障迁移操作。
干掉主节点
./src/redis-cli -h 192.168.149.139 -p 26379 SENTINEL slaves myredis
pkill -9 redis-server
./src/redis-cli -h 192.168.149.139 -p 26379 SENTINEL get-master-addr-by-name myredis
./src/redis-cli -h 192.168.149.139 -p 26379 SENTINEL master myredis
主动故障转移
# 先给不让当主节点的其它节点将权重
./src/redis-cli -h 192.168.149.144 -p 6379 CONFIG set slave-priority 0
./src/redis-cli -h 192.168.149.145 -p 6379 CONFIG set slave-priority 0
# 想让当主节点的从节点维持权重不变,等于变相的加了权重,这样从新选举时,就能按照我们想要的动作进行选举了
./src/redis-cli -h 192.168.149.139 -p 6379 CONFIG GET slave-priority
./src/redis-cli -h 192.168.149.144 -p 6379 CONFIG GET slave-priority
./src/redis-cli -h 192.168.149.145 -p 6379CONFIG GET slave-priority
#主动发生选举:
# 模拟故障转移命令,此命令将使我们的当前主节点不再可用,睡眠 30 秒。 它基本上模拟了由于某种原因而挂起的现象
./src/redis-cli -h 192.168.149.139 -p 6379 DEBUG sleep 30
# 你也可以指定给哨兵发个让指定主节点failover的命令,内部就会主动进行选举
./src/redis-cli -h 192.168.149.144 -p 26379 sentinel failover myredis
# 稍等会再执行,状态改变没那么快
./src/redis-cli -h 192.168.149.145 -p 26379 SENTINEL get-master-addr-by-name myredis
#恢复权重
./src/redis-cli -h 192.168.149.139 -p 6379 CONFIG set slave-priority 100
./src/redis-cli -h 192.168.149.144 -p 6379 CONFIG set slave-priority 100
./src/redis-cli -h 192.168.149.145 -p 6379 CONFIG set slave-priority 100
./src/redis-cli -h 192.168.149.139 -p 6379 CONFIG GET slave-priority
./src/redis-cli -h 192.168.149.144 -p 6379 CONFIG GET slave-priority
./src/redis-cli -h 192.168.149.145 -p 6379 CONFIG GET slave-priority