目录
一、环境概述
在分布式集群系统中为了解决服务单点故障问题,通常会把数据复制出多个副本部署到不同的机器中,满足故障恢复和负载均衡等需求。Redis也是如此,它为我们提供了复制功能,实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础,Redis的哨兵和集群(Cluster)模式都是在主从复制模式的基础上实现的。复制也是Redis日常运维的常见维护点。因此深刻理解复制的工作原理与使用技巧对日常的运维非常有帮助。
二、Redis主从结构
2.1、一主一从结构
一主一从结构是Redis最简单的复制拓扑结构,用于主节点出现宕机时从节点来提供故障转移支持。当应用写命令并发量较高且需要持久化时,可以只在从节点上开启AOF,这样既保证数据安全性同时,也避免了持久化对主节点的性能压力。
2.2、一主多从结构
一主多从结构(又称为星型拓扑结构)使得应用端可以利用多个从节点实现读写分离方案。对于读占比较大的场景,可以把读命令发送到多个从节点来分担主节点压力。同时在日常开发中如果需要执行一些比较耗时的读命令,可以在其中一台从节点上执行,防止慢查询对主节点造成阻塞从而影响线上服务的稳定性。对于写并发量较高的场景,多个从节点会导致主节点写命令的多次发送从而过度消耗网络带宽,同时也加重了主节点的负载影响服务稳定性。
2.3、树状主从结构
树状结构(级联结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引入中间复制层,可以有效降低主节点负载和需要传送给从节点的数据量。当主节点需要挂载多个从节点时为了避免对主节点的性能干扰,可以采用树状主从结构降低主节点压力。
三、主从复制原理
3.1、复制流程
在从节点执行slaveof命令后,复制过程便开始运作,大致分为6个过程:
保存主节点信息
执行slaveof命令后从节点只保存主节点的地址信息便直接返回,这时建立复制流程还没有开始,在从节点执行info replication命令可以看到主节点的相关信息,并在日志中记录复制启动信息。
2.主从建立socket连接
从节点内部通过每秒运行的定时任务维护复制相关逻辑,当定时任务发现存在新的主节点后,会尝试与该节点建立网络连接。
从节点会建立一个socket套接字连接,专门用于接收主节点发送的复制命令。如果从节点无法建立连接,定时任务会无限重试,直到连接成功或者执行slaveof no one命令取消复制。
3.发送ping命令
连接建立成功后,从节点发送ping请求进行首次通信,目的在于:
检测主从之间网络套接字是否可用。
检测主节点当前是否可接受处理命令。
如果发送ping命令后,从节点没有收到主节点回复pong或者超时未回复,从节点会断开复制连接,等待下次定时任务发起重连。
4.权限验证
如果主节点设置了requirepass参数,则需要密码验证,从节点必须配置masterauth参数保证与主节点相同的密码才能通过验证。如果验证失败复制将终止,从节点重新发起复制流程。
5.同步数据集
主从复制连接正常通信后,对于首次建立复制的场景,主节点会把所有的数据全部发送给从节点,这部分操作是耗时最长的步骤。在同步过程中会分为两种情况:全量同步和部分同步。
6命令持续复制
当主节点把当前的数据同步给从节点后,便完成了复制建立的流程。接下来主节点会持续地把写命令发送给从节点,保证数据的一致性。
案例步骤
安装并配置master角色的redis服务;
安装并配置slave角色的redis服务(双实例);
配置master角色的文件;vim /etc/redis.conf
配置slave角色的文件;vim /etc/redis.conf
验证主从复制功能; redis-cli -h 192.168.235.159
环境准备
systemctl stop firewalld
setenforce 0
下载redis
一主一从
主配置文件
修改主配置文件: vim /etc/redis.conf
bind IP 绑定主的IP
关闭保护模式,允许外部访问Redis服务器,如果是yes的话是需要访问密码
端口号是6379
注意:这个是确保安全的,打开这个之后下次登录需要密码(一般都注释)
例如:requirepass 123.com
如果设置了密码,那么从配置文件也需要master主的密码位置修改为主的密码
从配置文件
修改从配置文件: vim /etc/redis.conf
绑定从的IP
关闭保护模式
这个位置就是主从复制的配置信息了
# replicaof <masterip> <masterport>
replicaof 192.168.235.160 6379
主的IP 主的端口号
如果主配置信息 requirepass foobarad 打开了并设置密码
那么从配置信息 masterauth <master-password> 设置主的密码
没有就默认注释
配置里的默认为只读(不用管)
登录主redis输入info进行查看
此时192.168.235.160为主(master)
192.168.235.159 是 192.168.235.160的从(slave)
登录从redis输入info进行查看
此时192.168.235.160为从(slave)
主从复制测试
主从重启 Redis 服务
登录reids数据库,查看存在的数据
切换从服务器,数据已经复制过来了
测试同步
主
从
一主多从
将192.168.235.153 作为192.18.235.160 的从
切换到192.18.235.153
先下载 yum -y install redis
启用redis systemctl start redis
修改配置文件: vim /etc/redis.conf
查看监听
登录redis(slave)
redis-cli -h 192.168.235.153(slave)
主从复制已成功,数据已同步
输入info进行查看
切换到192.168.235.160(mastet)
登录redis查看
查看监听
树状主从
树状结构(级联结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引入中间复制层,可以有效降低主节点负载和需要传送给从节点的数据量。当主节点需要挂载多个从节点时为了避免对主节点的性能干扰,可以采用树状主从结构降低主节点压力。
原理:主------->从(主)----->从
基于上述步骤
从(slave)配置
将192.168.235.153的主设置为192.168.235.159
重启redis
查看监听
已修改为将192.168.235.159作为192.168.235.153的主(master)
切换到192.168.235.159
登录redis
redis-cli -h 192.168.235.159
info
此时192.168.235.159 即是160的从(slave)也是153的主(master)
注意:159只是作为其他从节点的主节点继续向下层复制,只有读的权限。
树状主从结构目的是通过引入中间复制层,可以有效降低主节点负载和需要传送给从节点的数据量
测试验证
主(master)
192.168.235.160
从(slave)
192.168.235.153
哨兵集群
基于上述操作之后,现在把153的主改回为160
哨兵配置
基于OpenEuler
1、master端
[root@master ~]# vim /etc/redis-sentinel.conf #修改哨兵配置
[root@master ~]# systemctl start redis-sentinel #启用哨兵模式
[root@master ~]# netstat -anptu | grep redis #查看监听状态
2、slave1端
(从)192.168.235.159
[root@slave1 ~]# vim /etc/redis-sentinel.conf #修改哨兵配置
[root@slave1 ~]# systemctl start redis-sentinel #启用哨兵模式
[root@slave1 ~]# netstat -anptu | grep redis #查看redis服务监听状态
3、slave2端
(从)192.168.235.153
[root@slave ~]# vim /etc/redis-sentinel.conf #修改哨兵配置
[root@slave ~]# systemctl start redis-sentinel #启用哨兵模式
[root@slave ~]# netstat -anptu | grep redis #查看redis监听状态
4、验证
master端
5、故障模拟
然后另外几台slave就会选举出一个新主(master)
哨兵集群下配置slave至少要三台机子
注意:slave与slave之间的IP不要相连