redis版本为7,搭建的架构为1主2从3哨兵的架构。本文是对搭建的过程做一个回忆,过程可能遗漏了某些步骤,见谅。
首先,需要有一个已经安装了的redis。我们从redis源码目录中,找到一个redis.conf文件,这个文件是redis作为server的配置文件模板,mkdir一个新的目录,将这个配置文件cp到新的目录中并对cv的新配置文件进行改动。
此外,还有一个sentinel.conf文件,这个是作为sentinel的配置文件,也可以复制过去。如果想要搭建一个demo,最小化配置即可,只需要简单几个配置放在一个新文件中,不需要复制这样的一个文件。
一,修改server配置文件
搭建的是demo,所以日志最好在前台输出,针对性的对配置文件做出修改如下:
对作为server的配置文件,需要准备3份,1主2从,port不同,其他的都和下面的配置一致即可。
#redis前台运行
daemonize no
#空字符串表示在前台输出
logfile ""
#指定端口
port 6379
二,修改sentinel配置文件
sentinel的最小化配置文件如下
#指定本台sentinel的端口为26379
port 26379
#指定的本机上的端口为6379的redis为master,master name叫mymaster,需要2台sentinel及以上,才能选举出新的master(本次共3台sentinel,为了防止脑裂,需要2台sentinel的选举结果一致)
sentinel monitor mymaster ::1 6379 2
#sentinel向其他sentinel广播自身ip时用的ip。如果是在一台机器上部署多个redis实例,这个配置是必写的。
sentinel announce-ip "127.0.0.1"
最后准备出如下的配置文件
三,启动伪集群
redis默认开机启动的话,需要先关闭redis,进入客户端后,关闭server
redis-cli -p 6379
127.0.0.1:6379> shutdown
查看redis进程
ps -fe | grep redis
确认redis关闭完后,启动master
#redis-server后面跟配置文件的路径
redis-server ~/test/6379.conf
启动replica
#可以通过--replica ip port,在启动的时候就作为replica,
#也可以在客户端中,通过replicaof命令转为指定ip port的redis的replica,格式和上面一样,replica可以通过replicaof no one重新作为独立的server。
redis-server ~/test/6380.conf --replicaof localhost 6379
启动sentinel
#--sentinel表示这台redsi作为哨兵启动
#也可以通过redis-sentinel,取消最后的--sentinel,启动
redis-server ~/test/26379.conf --sentinel
四,测试哨兵
查看master或replica日志,看到master和replica的sync成功,说明主从数据同步成功。
依次启动哨兵,下图中为第一台哨兵,可以看到它监测到了2台replica和2台其他哨兵的启动
此时关闭master6379,哨兵会重新选举master,选举结束后不指定replicaof重新启动6379,6379变为新的master6380的replica。
#epoch1表示开启了一个新的纪元1,也就是说选举出来一个新的主人master。不得不说redis作者有点恶趣味的。
9667:X 31 Jul 2023 04:38:44.108 # +new-epoch 1
9667:X 31 Jul 2023 04:38:44.108 # +try-failover master mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:44.128 * Sentinel new configuration saved on disk
9667:X 31 Jul 2023 04:38:44.128 # +vote-for-leader 2588ffd5f5be5c93c66544b82b3d39dca44de508 1
9667:X 31 Jul 2023 04:38:44.130 # a87c3d3f480da6b1edc0c99f1187a20a1e332bfa voted for a87c3d3f480da6b1edc0c99f1187a20a1e332bfa 1
9667:X 31 Jul 2023 04:38:44.159 # 166b0a6fa12f54717be667b4eccd59ec5ff7015b voted for 2588ffd5f5be5c93c66544b82b3d39dca44de508 1
#监测到了master6379的失联
9667:X 31 Jul 2023 04:38:44.221 # +elected-leader master mymaster 127.0.0.1 6379
#6379是失联状态
9667:X 31 Jul 2023 04:38:44.221 # +failover-state-select-slave master mymaster 127.0.0.1 6379
#选举6380准备代替6379
9667:X 31 Jul 2023 04:38:44.321 # +selected-slave slave [::1]:6380 ::1 6380 @ mymaster 127.0.0.1 6379
#后面sentinel更新了自己的配置文件,并发送给了其他sentinel,等待6379失联的最终确定。
9667:X 31 Jul 2023 04:38:44.321 * +failover-state-send-slaveof-noone slave [::1]:6380 ::1 6380 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:44.374 * +failover-state-wait-promotion slave [::1]:6380 ::1 6380 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:45.197 * Sentinel new configuration saved on disk
9667:X 31 Jul 2023 04:38:45.197 # +promoted-slave slave [::1]:6380 ::1 6380 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:45.197 # +failover-state-reconf-slaves master mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:45.257 * +slave-reconf-sent slave [::1]:6381 ::1 6381 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:46.223 * +slave-reconf-inprog slave [::1]:6381 ::1 6381 @ mymaster 127.0.0.1 6379
9667:X 31 Jul 2023 04:38:46.223 * +slave-reconf-done slave [::1]:6381 ::1 6381 @ mymaster 127.0.0.1 6379
#最终确认6379失联了
9667:X 31 Jul 2023 04:38:46.294 # -odown master mymaster 127.0.0.1 6379
#失联状态结束,后面它就是down状态了
9667:X 31 Jul 2023 04:38:46.294 # +failover-end master mymaster 127.0.0.1 6379
#转换新的master6380
9667:X 31 Jul 2023 04:38:46.294 # +switch-master mymaster 127.0.0.1 6379 ::1 6380
#通知2个replica6380 6381进行对应的转换,6380变为master,6381变为6380的replica
9667:X 31 Jul 2023 04:38:46.294 * +slave slave [::1]:6381 ::1 6381 @ mymaster ::1 6380
9667:X 31 Jul 2023 04:38:46.294 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster ::1 6380
9667:X 31 Jul 2023 04:38:46.317 * Sentinel new configuration saved on disk
#6379也要变为6380的replica,只不过6379现在是down的状态,重新启动6379,不需要--replica指定,6379就会变成6380的replica
9667:X 31 Jul 2023 04:38:49.334 # +sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster ::1 6380
9667:X 31 Jul 2023 04:46:10.375 # -sdown slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster ::1 6380
#重新启动6379,不需要指定--replicaof,直接变为6380的replica
9667:X 31 Jul 2023 04:46:29.370 * +slave slave [::1]:6379 ::1 6379 @ mymaster ::1 6380
9667:X 31 Jul 2023 04:46:29.371 * Sentinel new configuration saved on disk
五,注意事项
1,是如果是同一台linux装了这些redis,前面提到的sentinel announced-ip配置项一定要配置,不然sentinel会争抢ip。
2,如果在启动sentinel的过程中出现了问题,如果想恢复并重新启动1主2从3哨兵,那么仅仅是通过命令启动,或者将新选举出来的master改为我们想要的port,是不够的。
因为sentinel会自动对sentinel和server replica的配置文件进行追加,追加内容主要是master replica 其他sentinel的ip端口,唯一id,还有状态等。
如果想恢复,一定要将包括master replica sentinel在内的6个配置文件中,包括新选举的master的ip,和sentinel自动追加的内容全部修改或删除,重新依次启动,才能完成恢复。