如何解决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 #故障节的的最大超时时间为100000(100秒),默认为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
上一篇: 吃腊八粥的寓意是什么
下一篇: C语言中定义字符串的几种方式