文章目录
一、实验要求
要求:完成 Redis 哨兵结构的搭建,具体要求如下:
(1)搭建一主二从的主从复制的结构;
(2)搭建三个哨兵节点;
(3)进行主从数据同步的测试;
(4)模拟主节点出现故障,哨兵节点自动转移故障;
二、知识总结
1. 主从复制
1.1 什么是主从复制
主从复制,是将多台数据库服务器分为主节点(master)和从节点(slaver),主节点数据更新后会根据配置和策略,自动同步到从节点上,从而保证主从节点中存有相同的数据。主从复制常见结构如下。
1.2 主从复制的作用
有了主从复制,数据可以有多份副本,这就带来了很多好处:
- 提升数据库系统的请求处理能力 单个节点能够支撑的读流量有限。部署多个节点,并构成主从关系,主从节点一起提供服务。
- 默认实现读写分离机制,Master 以写为主,Slave 以读为主,提升系统的缓存读写性能
- 容灾快速恢复,提升整个系统的可用性
因为从节点中有主节点数据的副本,当主节点宕机后,可以立刻提升其中一个从节点为主节点,继续提供服务。
1.3 Redis 的主从复制原理
主从复制,直观的做法是主节点产生一份数据的快照发送给从节点,以快照数据为基准,将之后增量的数据变更同步给从节点,保证主从数据的一致。总体来看,主从复制一般包含全量数据同步、增量同步两个阶段。
- 全量数据同步 :主节点产生一份全量数据的快照,即 RDB 文件,并将此快照发送给从节点。且从产生快照时刻起,记录新接收到的写命令。当快照发送完成后,将累积的写命令发送绐从节点,从节点执行这些写命令。一般用于主从节点首次数据同步,完成基准数据。
- 增量同步(命令传播) :全量数据同步完成后,主节点将执行过的写命令源源不断地发送给从节点,从节点执行这些命令,保证主从节点中数据有相同的变更,保证主从节点数据的一致。
2. 哨兵模式
2.1 哨兵模式的结构和作用
哨兵(Sentinel)是 Redis 官方提供的一种高可用方案,它可以监控多个 Redis 服务实例的运行情况。本质上,Sentinel 也是一个运行在特殊模式下的 Redis 服务器。主从复制模式下,一般会配置多个 Sentinel 节点,通过互相协作来实现系统的高可用。
2.2 哨兵模式
Sentinel 模式的作用如下:
- 监控:Sentinel 不断的检查主服务和从服务器是否按照预期正常工作;
- 提醒:被监控的 Redis 出现问题时,Sentinel 会通知管理员或其他应用程序;
- 自动故障转移:监控的主 Redis 不能正常工作,Sentinel 会自动进行故障迁移操作。即将一个从服务器升级新的主服务器,并让其他从服务器挂到新的主服务器,同时向客户端提供新的主服务器地址。
2.3 Sentinel 监控原理
Sentinel 基于心跳机制监测服务状态,每隔 1 秒向集群的每个实例发送 ping 命令:
- 主观下线:如果某 sentinel 发现某实例未在规定时间响应,则认为该实例主观下线。
- 客观下线:若超过指定数量(quorum)的 sentinel 都认为该实例主观下线,则该实例客观下线。quorum 值最好超过 Sentinel 实例数量的一半。
quorum在配置文件中如下配置:
sentinel monitor 参数及配置
格式:Sentinel monitor <name> <masterIP> <masterPort> <Quorum投票数>
作用:监控主服务器, 并根据 Master 的配置自动监控 Master 的 Slave 节点
参数说明:
- name:主从结构的名字
- masterIP:主服务器的 IP
- masterPort:主服务器的端口号
- Quorum:判断主节点失效时,需要的哨兵节点的投票数
例如:
三、实验具体流程
准备配置文件
(1) 三个 Redis 主从服务的 IP 和配置文件如下:
主节点(master):端口号为 6379 完整 IP:127.0.0.1 6379
配置文件:redis.windows_6379.conf
从节点 1(slave1):端口号为 6380 完整 IP:127.0.0.1 6380
配置文件:redis.windows_6380.conf
从节点 2(slave2):端口号为 6381 完整IP:127.0.0.1 6381
配置文件:redis.windows_6381.conf
(2) 三个 Sentinel 节点配置如下:
哨兵 1(sentinel1):端口号为 26380 完整 IP:127.0.0.1 26380
配置文件:sentinel_26380.conf
哨兵 2(sentinel2):端口号为 26381 完整 IP:127.0.0.1 26381
配置文件:sentinel_26381.conf
哨兵 3(sentinel2):端口号为 26382 完整IP:127.0.0.1 26382
配置文件:sentinel_26382.conf
注意:
以上配置文件较多,实验中将这些配置文件统一放在了 D:\redis\Redis-x64-3.0.504\master_slave下:
(3)配置CONF文件的内容
配置文件:redis.windows_6379.conf
port 6379
配置文件:redis.windows_6380.conf
port 6380
slaveof 127.0.0.1 6379
配置文件:redis.windows_6381.conf
port 6381
slaveof 127.0.0.1 6379
配置文件:sentinel_26380.conf
#当前Sentinel服务运行的端口
port 26380
#Sentinel去监视一个名为mymaster的主redis实例
sentinel monitor mymaster 127.0.0.1 6379 1
#指定了Sentinel认为Redis实例已经失效所需的毫秒数
sentinel down-after-milliseconds mymaster 5000
配置文件:sentinel_26381.conf
port 26381
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 5000
配置文件:sentinel_26382.conf
port 26382
sentinel monitor mymaster 127.0.0.1 6379 1
sentinel down-after-milliseconds mymaster 5000
(1)搭建一主二从的主从复制的结构:
启动主从三个Redis 服务
启动服务的方法:
在cmd中进入到redis文件的目录下
小技巧:
可以直接在文件管理器中对应的目录里输入cmd回车后快速地打开对应文件位置的cmd窗口:
分别打开三个对应位置的cmd窗口后分别输入以下命令:
redis-server.exe .\master_slave\redis.windows_6379.conf
redis-server.exe .\master_slave\redis.windows_6380.conf
redis-server.exe .\master_slave\redis.windows_6381.conf
6379:
6380:
6381:
(2)搭建三个哨兵节点:
启动 3 个Sentine服务
同理分别打开三个对应位置的cmd窗口后分别输入以下命令:
redis-server.exe .\master_slave\sentinel_26380.conf --sentinel
redis-server.exe .\master_slave\sentinel_26381.conf --sentinel
redis-server.exe .\master_slave\sentinel_26382.conf --sentinel
查看主从结构和哨兵结构的信息
使用命令:info replication
显示主从复制的相关信息。
打开一个对应位置的cmd窗口输入redis-cli.exe
启动客户端连接到主节点上
执行 info replication
命令。master 主节点信息如下:
启动客户端连接到任意一台哨兵节点上,执行 info sentinel 命令:
命令:redis-cli.exe -p 26380
(3)进行主从数据同步的测试:
用三个 redis-cli.exe 客户端分别连接到三台服务器上:
向 Master 主节点中写入数据:
在两个从节点上都可以到读主 Master 的数据,实现了主从数据同步:
从节点不能写数据实验:
(4)模拟主节点出现故障,哨兵节点自动转移故障:
将Master主节点停止,模拟故障:
在主节点对应的客户端执行shutdown
哨兵节点已监视到6379故障,自动把6381提升为主节点:
这个可能会将不同的从节点提升到主节点,不一定是6381,也可能是6380
连接到 6381 节点,可以发现它已成为 master:
现在的主从(Master/Slave)关系为:
Master是6381服务器,
Slave是6380服务器,可以继续处理用户的请求。
故障机6379服务器重启后,哨兵会自动将它设置为6381的从节点
重启6379服务器:
原来的 6379 主节点重新工作后,查询它的状态如下,可以看到它已成为从节点:
最后,主从结构为如下:
可见,哨兵机制自动对故障进行了转移处理,实现了高可用。
现在的Master/Slaver 结构是:
- Master: 6381 服务器
- Slave: 6380 和 6379 服务器