前言

环境:centos 7.9

介绍

我们知道redis一共有3中集群模式,1、主从模式。2、哨兵模式。3、Cluster模式。

主从复制模式缺点:master挂掉之后,集群无法使用,slave也不会自动成为新的master,slave会一直等待master正常,所以主从复制故障之后需要人为介入。

哨兵模式是为了解决主从复制模式的缺点的,即哨兵模式还是基于主从复制模式,只不过多了一个“哨兵”,当master挂掉之后,哨兵就会在在所有的从节点竞选出新的主节点。

哨兵模式原理

哨兵模式核心还是主从复制,只不过在相对于主从模式在主节点宕机导致不可写的情况下,多了一个竞选机制:在所有的从节点竞选出新的主节点。每一个哨兵都是一个独立的sentinel进程,作为进程,它会独立运行。

当master挂掉之后,哨兵会自动从slave中选一个作为master,若master重新启动,master则会转化为现有的master下的一个slave,当slave切换时,会通过发布订阅方式,将slave所对应的master更改。

哨兵本身也有单点故障的问题,所以在一个一主多从的Redis系统中,可以使用多个哨兵进行监控,哨兵不仅会监控主数据库和从数据库,哨兵之间也会相互监控。每一个哨兵都是一个独立的进程,作为进程,它会独立运行。

哨兵模式搭建

下面将以一主一从一哨兵进行搭建演示,当然,你也可以搭建一主带多从,多个哨兵的模式。

首先:搭建redis主数据库,即master,搭建方法请参考https://blog.csdn.net/MssGuo/article/details/114283015,这里不在赘诉。
redis.conf配置文件要注意2个参数:

#表示监听本机哪个网卡地址,因为我们要让slave能连接master,所以让redis监听在一个外部网卡而不仅仅是127.0.0.1bind 192.168.118.133#设置密码requirepass 123456  

设置slave从服务器:
同理,正常搭建一个redis实例之后,修改redis.conf配置文件。主要修改下面这些参数:

vim redis.conf#编辑配置文件/REPLICATION#在命令行模式下搜索REPLICATION,这段就是配置主从复制的,5.0之前的版本叫SLAVEreplicaof 192.168.118.133 6379#找到replicaof参数,这个是配置master IP和端口的,5.0之前的版本叫slaveofmasterauth 123456#如果master设置了密码,还要配置master的密码,这样slave才能连的上masterreplica-read-only yes#slave只读,默认就是只读,保持默认即可,主从模式下master读写,slave只读

到这里,主从已经搭建完成,可以进入master,slave后输入:info Replication ,查看主从之间的相关信息,还可以在master写入一个数据之后查看slave是否正常同步到数据。

配置哨兵

这里仅配置一个哨兵,在master上配置一个哨兵,当然,如果你需要多个哨兵,还可以在每个slave上配置哨兵。

#在master上配置一个哨兵,如下:#复制哨兵的配置文件到redis安装目录下,与redis.conf配置文件放一块,在源码包里面有sentinel.conf文件[root@Redis ~]# cp /root/redis-6.2.6/sentinel.conf /usr/local/redis-6.2.6/etc/[root@Redis etc]# cd /usr/local/redis-6.2.6/etc/ && lltotal 108-rw-r--r-- 1 root root 93767 Sep  9 18:35 redis.conf#这是我们redis主配置文件-rw-r--r-- 1 root root 13768 Sep  9 21:45 sentinel.conf#这是我们的哨兵配置文件[root@Redis etc]# vim sentinel.conf#编辑哨兵配置文件,主要修改或启动下面这些参数[root@Redis etc]# grep -Ev '$^|#' sentinel.conf bind 192.168.118.133#哨兵监听本机哪个端口port 26379#哨兵的默认端口是26379daemonize yes#哨兵的启动模式,yes是后台启动pidfile /opt/redis/logs/redis-sentinel.pid#哨兵的pid文件存放位置logfile /opt/redis/logs/redis-sentinel.log#哨兵的日志文件存放位置dir /tmp#哨兵进程的工作目录,默认就是/tmp#哨兵监听的master数据库,mymaster是为主数据库起的名称,可以随便起个名字,后面是master的ip和端口# 最后面的1表示选举个数,含义是需要多少个哨兵认为master挂了才认定master挂掉,这里我设置为1是因为我只有一个哨兵,如果你配置# 了多个哨兵,建议配置2以上数字。sentinel monitor mymaster 192.168.118.133 6379 1sentinel auth-pass mymaster 123456#配置master的登陆密码,mymaster是你配置的master名称sentinel down-after-milliseconds mymaster 30000#30秒内master无响应则认为master挂掉acllog-max-len 128#保持默认即可#master重新选举之后,其它节点能同时并行进行数据同步的台数有多少台#显然该值越大,则所有slave能同步完成的速度越快,但如果此时刚好有人访问slave数据,可能造成读取失败,最保守的值建议设为1#即同一时间只能有一台进行数据同步,这样其它slave还能继续提供服务,但是所有的slave数据同步完成就会显得缓慢。sentinel parallel-syncs mymaster 1sentinel failover-timeout mymaster 180000#故障转移超时时间,指在该时间内如果故障转移没有成功,则会再发起一次故障转移sentinel deny-scripts-reconfig yes#保持默认即可SENTINEL resolve-hostnames no#保持默认即可SENTINEL announce-hostnames no#保持默认即可[root@Redis etc]# 

启动哨兵

sentinel.conf 配置文件修改完成之后,开启哨兵进程:

[root@Redis bin]# ./redis-sentinel ../etc/sentinel.conf #指定哨兵配置文件启动[root@Redis bin]# ps -ef | grep redis#查看进程,可以看到哨兵进程已经启动root      71838      1  0 21:43 ?        00:00:08 ./redis-server 192.168.118.133:6379#这是redis服务进程root      93433      1  0 22:35 ?        00:00:00 ./redis-sentinel 192.168.118.133:26379 [sentinel]#这是哨兵进程[root@Redis bin]# tail -22f ../logs/redis-sentinel.log #查看哨兵日志,没有报错,说明哨兵启动正常93433:X 09 Sep 2022 22:35:21.203 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo93433:X 09 Sep 2022 22:35:21.203 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=93433, just started93433:X 09 Sep 2022 22:35:21.203 # Configuration loaded93433:X 09 Sep 2022 22:35:21.204 * monotonic clock: POSIX clock_gettime93433:X 09 Sep 2022 22:35:21.205 * Running mode=sentinel, port=26379.93433:X 09 Sep 2022 22:35:21.206 # Sentinel ID is a39ed9dc9dd67d84a32eb135f957f8c060b662ee93433:X 09 Sep 2022 22:35:21.206 # +monitor master mymaster 192.168.118.133 6379 quorum 193433:X 09 Sep 2022 22:35:21.207 * +slave slave 192.168.118.132:6379 192.168.118.132 6379 @ mymaster 192.168.118.133 6379

登陆哨兵

登录哨兵还是使用redis-cli命令,指定主机端口和26379端口即可:

[root@Redis bin]# ./redis-cli -h 192.168.118.133 -p 26379#登录哨兵,没设密码所以不用输入密码# SENTINEL HELP可以查看哨兵使用命令帮助文档192.168.118.133:26379> SENTINEL master mymaster#查看哨兵监听的master的信息,master的名称我们在配置文件定义为mymaster 1) "name" 2) "mymaster" 3) "ip" 4) "192.168.118.133" 5) "port" 6) "6379" 7) "runid" 8) "02f3d42a68a5358a44c1dea60a80e6b774092e67" 9) "flags"10) "master"11) "link-pending-commands"12) "0"13) "link-refcount"14) "1"15) "last-ping-sent"16) "0"17) "last-ok-ping-reply"18) "55"19) "last-ping-reply"20) "55"21) "down-after-milliseconds"22) "30000"23) "info-refresh"24) "3349"25) "role-reported"26) "master"27) "role-reported-time"28) "354734"29) "config-epoch"30) "0"31) "num-slaves"32) "1"33) "num-other-sentinels"34) "0"35) "quorum"36) "1"37) "failover-timeout"38) "180000"39) "parallel-syncs"40) "1"192.168.118.133:26379> 192.168.118.133:26379> SENTINEL REPLICAS  mymaster#查看master的slave的信息1)  1) "name"    2) "192.168.118.132:6379"    3) "ip"    4) "192.168.118.132"    5) "port"    6) "6379"    7) "runid"    8) "0f52d6e66dc478ddeb7f82cc3f9a2f0ba6467c31"    9) "flags"   10) "slave"   11) "link-pending-commands"   12) "0"   13) "link-refcount"   14) "1"   15) "last-ping-sent"   16) "0"   17) "last-ok-ping-reply"   18) "554"   19) "last-ping-reply"   20) "554"   21) "down-after-milliseconds"   22) "30000"   23) "info-refresh"   24) "9229"   25) "role-reported"   26) "slave"   27) "role-reported-time"   28) "722021"   29) "master-link-down-time"   30) "0"   31) "master-link-status"   32) "ok"   33) "master-host"   34) "192.168.118.133"   35) "master-port"   36) "6379"   37) "slave-priority"   38) "100"   39) "slave-repl-offset"   40) "55892"   41) "replica-announced"   42) "1"192.168.118.133:26379> 

验证

下面验证master挂掉之后,哨兵会不会将slave提升为新的master。

#关闭master ,模拟挂点,看看哨兵会如何操作[root@Redis bin]# ./redis-cli  -h 192.168.118.133 -p 6379 -a 123456 shutdown[root@Redis bin]# ps -ef | grep redisroot      93433      1  0 22:35 ?        00:00:03 ./redis-sentinel 192.168.118.133:26379 [sentinel]root      99823  79065  0 22:50 pts/0    00:00:00 grep --color=auto redis#登录slave,查看现在slave的角色[root@node1 bin]# ./redis-cli  -h 192.168.118.132 -p 6379 -a 123456Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.192.168.118.132:6379> info Replication# Replicationrole:master#从已经变成master角色了connected_slaves:0master_failover_state:no-failovermaster_replid:9aa2e88aa729a454dae63f4a8c03cb2dcac40606master_replid2:4976935598fb02dc112bddd37068f5f5b45f085fmaster_repl_offset:82267second_repl_offset:69050repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:82267192.168.118.132:6379> [root@Redis bin]# ./redis-server  ../etc/redis.conf #重新之前挂点的master,看看是不是变成slave了[root@Redis bin]# ps -ef | grep redisroot      93433      1  0 22:35 ?        00:00:04 ./redis-sentinel 192.168.118.133:26379 [sentinel]root     101580      1  0 22:54 ?        00:00:00 ./redis-server 192.168.118.133:6379[root@Redis bin]# ./redis-cli -h 192.168.118.133 -p 6379 -a 123456192.168.118.133:6379> info Replication# Replicationrole:slave#角色变成slave,我们也没有该redis.conf配置文件master_host:192.168.118.132master_port:6379master_link_status:downmaster_last_io_seconds_ago:-1master_sync_in_progress:0slave_read_repl_offset:1slave_repl_offset:1master_link_down_since_seconds:-1slave_priority:100slave_read_only:1replica_announced:1connected_slaves:0master_failover_state:no-failovermaster_replid:fbec000371f598d941c57b877b0d4b71065448ccmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0192.168.118.133:6379> #这时如何重启新的master会怎么样,因为新的master的配置文件里面肯定有关于slave的配置192.168.118.132:6379> SHUTDOWN#关闭redis[root@node1 bin]# ./redis-server  ../etc/redis.conf #重新启动redis[root@node1 bin]# ./redis-cli  -h 192.168.118.132 -p 6379 -a 123456#登陆redisWarning: Using a password with '-a' or '-u' option on the command line interface may not be safe.192.168.118.132:6379> info Replication# Replicationrole:master#还是master角色,说明即使redis.conf配置文件配置了slave的相关信息,但是该节点受哨兵管理,主从仍是正常的connected_slaves:0master_failover_state:no-failovermaster_replid:7b55a5e55c316d416ad225ef96fe69cf302bf3fdmaster_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0192.168.118.132:6379>

总结

1、先搭建好redis主从复制模式,因为哨兵是基于主从复制模式的;
1、可以配置多个哨兵,解决哨兵单点故障问题;
2、可以在master节点上启动哨兵,如果需要多个哨兵,则可以在slave上也启动哨兵;
2、复制哨兵的配置文件到redis安装目录下,与redis.conf配置文件放一块,在源码包里面有sentinel.conf文件;
3、修改sentinel.conf文件对应的参数,主要是定义其监控的master节点ip端口密码等
4、启动哨兵:[root@Redis bin]# ./redis-sentinel ../etc/sentinel.conf #指定哨兵配置文件启动
5、登陆哨兵:[root@Redis bin]# ./redis-cli -h 192.168.118.133 -p 26379 #登录哨兵,没设密码所以不用输入密码
6、验证master挂掉,发现slave自动成为了新的master,而且当就的master故障恢复启动之后,就的master会自动成为slave角色;
7、在不该变redis.conf配置文件的情况下,重启新的master节点,发现其重启后仍是master节点,即使redis.conf配置了它是salve,这一点与没有哨兵模式的主从模式有所不同,在redis仅仅是主从模式时,重启master就是master角色,重启slave就是slave角色,因为配置文件就是这样定义的。