如何解决redis单点故障——redis的主从架构和哨兵模式配置

一、redis主从和哨兵模式简介

采用主从架构的模式,可以实现当主redis进行数据存储操作时,从redis也同样进行存储,实现了数据的备份;再结合哨兵模式,监控所有redis节点,当主redis宕机后,如果超过一半数量的哨兵都检测到主宕机,就会在从redis中选举出新的主redis,于是从redis切换为新的主服务器,继续提供redis服务,解决了单点故障的问题。

二、哨兵模式原理和作用

哨兵模式原理
哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机制选择新的master并将所有slave连接到新的master。所以整个运行哨兵的集群的数量不得少于3个节点。

哨兵模式的作用
① 监控
不断的检查master和slave是否正常运行。
master存活检测、master与slave运行情况检测
② 通知(提醒)
当被监控的服务器出现问题时,向其他(哨兵间,客户端)发送通知。
③ 自动故障转移
断开master与slave连接,选取一个slave作为master,将其他slave连接到新的master,并告知客户端新的服务器地址
PS:哨兵也是一台redis服务器,只是不提供数据服务
哨兵的启动依赖于主从模式,所以须把主从模式安装好的情况下再去做哨兵模式,所有节点上都需要部署哨兵模式,哨兵模式会监控所有的redis工作节点是否正常,当master出现问题的时候,因为其他节点与主节点失去联系,因此会投票,投票过半就认为这个master的确出现问题,然后会通知哨兵间,然后从slaves中选取一个作为新的master

三、案例详解

3.1 案例环境

三台服务器都安装redis,安装方法 redis安装

3.2 主从模式配置

修改配置文件(三个节点都需要修改)

[root@master utils]# vi /etc/redis/6379.conf 
#master、slave节点都需要修改
#69行 修改监听地址为0.0.0.0(在实验环境使用),现网环境建议绑定从服务器IP地址
#136行 开启守护进程
daemonize yes
#171行 修改日志文件目录
logfile /var/log/redis_6379.log
#263行 修改工作目录
dir /var/lib/redis/6379
#699行 开启AOF持久化功能
appendonly yes

两个slave实现同步的配置

replicaof 192.168.247.160 6379   # 跟随master的状态,修改为master的IP和redis端口号

三个节点都重启redis服务

[root@master utils]# /etc/init.d/redis_6379 restart
[root@master utils]# tail -f /var/log/redis_6379.log 
8573:M 11 Nov 2020 11:49:46.451 * Starting BGSAVE for SYNC with target: disk
8573:M 11 Nov 2020 11:49:46.451 * Background saving started by pid 8577
8573:M 11 Nov 2020 11:49:46.453 * Replica 192.168.247.170:6379 asks for synchronization
8573:M 11 Nov 2020 11:49:46.453 * Full resync requested by replica 192.168.247.170:6379
8577:C 11 Nov 2020 11:49:46.453 * DB saved on disk
8573:M 11 Nov 2020 11:49:46.453 * Waiting for end of BGSAVE for SYNC
8577:C 11 Nov 2020 11:49:46.453 * RDB: 6 MB of memory used by copy-on-write
8573:M 11 Nov 2020 11:49:46.550 * Background saving terminated with success
8573:M 11 Nov 2020 11:49:46.550 * Synchronization with replica 192.168.247.180:6379 succeeded #两个从建立成功
8573:M 11 Nov 2020 11:49:46.550 * Synchronization with replica 192.168.247.170:6379 succeeded

验证主从的效果

查看master的日志文件

root@master utils]# tail -f /var/log/redis_6379.log 
8573:M 11 Nov 2020 11:49:46.451 * Starting BGSAVE for SYNC with target: disk
8573:M 11 Nov 2020 11:49:46.451 * Background saving started by pid 8577
8573:M 11 Nov 2020 11:49:46.453 * Replica 192.168.247.170:6379 asks for synchronization
8573:M 11 Nov 2020 11:49:46.453 * Full resync requested by replica 192.168.247.170:6379
8577:C 11 Nov 2020 11:49:46.453 * DB saved on disk
8573:M 11 Nov 2020 11:49:46.453 * Waiting for end of BGSAVE for SYNC
8577:C 11 Nov 2020 11:49:46.453 * RDB: 6 MB of memory used by copy-on-write
8573:M 11 Nov 2020 11:49:46.550 * Background saving terminated with success
8573:M 11 Nov 2020 11:49:46.550 * Synchronization with replica 192.168.247.180:6379 succeeded #两个从建立成功
8573:M 11 Nov 2020 11:49:46.550 * Synchronization with replica 192.168.247.170:6379 succeeded

也可登录redis查看replication状态

[root@master utils]# redis-cli -p 6379
127.0.0.1:6379> info replication
# Replication
role:master    #身份为主
connected_slaves:2    #有两个从
slave0:ip=192.168.247.180,port=6379,state=online,offset=196,lag=1
slave1:ip=192.168.247.170,port=6379,state=online,offset=196,lag=1
master_replid:a9379edf8ebb5c9b3395eb6e318878689f1bd7a5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:196
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:196

3.3 哨兵模式配置

在三个节点都需要部署哨兵,修改哨兵配置文件

vi redis-5.0.4/sentinel.conf  #在安装包目录下
行号
17/  protected-mode no  #关闭保护模式
26/  daemonize yes #指定sentinel为后台启动
36/  logfile "/var/log/sentinel.log" #指定日志存放路径
65/  dir "/var/lib/redis/6379" #指定数据库存放路径
84/  sentinel monitor mymaster 192.168.247.160 6379 2  #至少两个哨兵检测到主服务器故障了,才会进行故障迁移
113/  sentinel down-after-milliseconds mymaster 3000 #判定服务器down掉的时间周期,默认30000毫秒(30秒)
146/  sentinel failover-timeout mymaster 100000 #故障节的的最大超时时间为100000100秒),默认为180s

启动哨兵模式,先启动master,再启动slave

[root@master redis-5.0.7]# redis-sentinel sentinel.conf &  #放入后台运行
[1] 8762

查看哨兵信息

[root@master redis-5.0.7]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.247.160:6379,slaves=2,sentinels=3 #一主两从三哨兵

3.4 验证

故障模拟,使主宕机
查看redis进程号为8573

[root@master redis-5.0.7]# ps -elf | grep redis
5 S root       8573      1  0  80   0 - 39869 ep_pol 11:49 ?        00:00:01 /usr/local/bin/redis-server 0.0.0.0:6379
5 S root       8763      1  0  80   0 - 38461 ep_pol 12:01 ?        00:00:00 redis-sentinel *:26379 [sentinel]
0 S root       8797   4086  0  80   0 - 28169 pipe_w 12:04 pts/3    00:00:00 grep --color=auto redis

杀死进程

[root@master redis-5.0.7]# kill -9 8573

查看哨兵的日志文件,看主从迁移过程

[root@master redis-5.0.7]# tail -f /var/log/sentinel.log

也可登录redis查看哨兵状态

[root@master redis-5.0.7]# redis-cli -p 26379 info Sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0     #现在主为192.168.247.180
master0:name=mymaster,status=ok,address=192.168.247.180:6379,slaves=2,sentinels=3

本文地址:https://blog.csdn.net/qq_41786285/article/details/109619080

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐