欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-16 20:37:52
一、redis主从和哨兵模式简介采用主从架构的模式,可以实现当主redis进行数据存储操作时,从redis也同样进行存储,实现了数据的备份;再结合哨兵模式,监控所有redis节点,当主redis宕机后,如果超过一半数量的哨兵都检测到主宕机,就会在从redis中选举出新的主redis,于是从redis切换为新的主服务器,继续提供redis服务,解决了单点故障的问题。二、哨兵模式原理和作用哨兵模式原理哨兵(sentinel) 是一个分布式系统,用于对主从结构中的每台服务器进行监控,当出现故障时通过投票机...

一、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安装

如何解决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单点故障——redis的主从架构和哨兵模式配置
也可登录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