前言

环境: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集群哨兵模式原理_数据库


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

redis哨兵集群迁移 redis集群哨兵模式原理_redis_02

哨兵模式搭建

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

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

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

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

vim redis.conf						#编辑配置文件
/REPLICATION						#在命令行模式下搜索REPLICATION,这段就是配置主从复制的,5.0之前的版本叫SLAVE
replicaof 192.168.118.133 6379		#找到replicaof参数,这个是配置master IP和端口的,5.0之前的版本叫slaveof
masterauth 123456					#如果master设置了密码,还要配置master的密码,这样slave才能连的上master
replica-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/ && ll
total 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														#哨兵的默认端口是26379
daemonize 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 1				
sentinel 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 1
sentinel 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 oO0OoO0OoO0Oo
93433:X 09 Sep 2022 22:35:21.203 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=93433, just started
93433:X 09 Sep 2022 22:35:21.203 # Configuration loaded
93433:X 09 Sep 2022 22:35:21.204 * monotonic clock: POSIX clock_gettime
93433: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 a39ed9dc9dd67d84a32eb135f957f8c060b662ee
93433:X 09 Sep 2022 22:35:21.206 # +monitor master mymaster 192.168.118.133 6379 quorum 1
93433: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 redis
root      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 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.132:6379> info Replication
# Replication
role:master											#从已经变成master角色了
connected_slaves:0
master_failover_state:no-failover
master_replid:9aa2e88aa729a454dae63f4a8c03cb2dcac40606
master_replid2:4976935598fb02dc112bddd37068f5f5b45f085f
master_repl_offset:82267
second_repl_offset:69050
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:82267
192.168.118.132:6379> 

[root@Redis bin]# ./redis-server  ../etc/redis.conf 			#重新之前挂点的master,看看是不是变成slave了
[root@Redis bin]# ps -ef | grep redis
root      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 123456

192.168.118.133:6379> info Replication
# Replication
role:slave														#角色变成slave,我们也没有该redis.conf配置文件
master_host:192.168.118.132
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:1
slave_repl_offset:1
master_link_down_since_seconds:-1
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:fbec000371f598d941c57b877b0d4b71065448cc
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
192.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			#登陆redis
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.118.132:6379> info Replication
# Replication
role:master		#还是master角色,说明即使redis.conf配置文件配置了slave的相关信息,但是该节点受哨兵管理,主从仍是正常的
connected_slaves:0
master_failover_state:no-failover
master_replid:7b55a5e55c316d416ad225ef96fe69cf302bf3fd
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
192.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角色,因为配置文件就是这样定义的。