一、高可用性
任何一个技术,无论是Mysql,Oracle 还是Redis,为了保证服务器能够正常运行,不仅需要保持服务器能在其承载的范围内运行,还要保证当某一台服务器宕机以后,其余服务器能够继续提供服务,
Redis集群同样为了保证高可用性,提供了3种高可用方式: 1) master/slave主从方案 2) 哨兵模式来进行主从替换以及故障恢复 3) redis cluster集群方案
本文介绍的Redis如何实现主从复制及实现原理
二、主从复制
2.1 概述
Redis的主从复制,和Mysql的主从复制策略很相似,都是主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主
从而实现 读写分离 和 容灾恢复,下图为级联结构
Redis主从复制流程简图
redis主从复制的大致过程:
1)当一个从数据库启动时,会向主数据库发送sync命令,
2)主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来
3)当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。
4)从数据库收到后,会载入快照文件并执行收到的缓存的命令。
2.2.搭建
Redis的主从复制配置非常简单,就1条命令就可以实现从机挂载到主机
1) 环境准备
准备3台Redis服务器,搭建Redis主从复制集群,搭建模式为1主2从,这3台服务器可以在一台Linux虚拟机上启动3个redis进程,也可以在3台虚拟机上分别启动一个Redis进程
如果1个Linux虚拟机启动3个Redis进程,则需要将其配置文件进行修改,如果是3个虚拟机使用相同的配置启动则相同即可
我这里示例采用的一台Linux虚拟机启动3个Redis进程,配置文件需要有3个,需要保证端口号,日志地址,数据地址,持久化文件地址不同
序号 | 角色 | IP | 端口 |
1 | Master | 192.168.146.134 | 6379 |
2 | Slave-1 | 192.168.146.134 | 6380 |
3 | Slave-2 | 192.168.146.134 | 6381 |
2)搭建主从复制
分别启动3台Redis,然后通过Xshell工具连接3台Redis服务器
3)查看Redis状态
通过 info replication 命令查看状态
4)开启主从复制
通过在从机执行 SLAVEOF 主机IP地址 主机端口号 这个命令来将从机挂载到主机上
注意: 如果主机设置由密码,那么需要在从机的配置文件中添加 masterauth 来设置密码,注意,该 masterauth 配置在配置文件中默认不存在,需要手动添加
通过 SLAVEOF 命令实现主从复制以后,一定要通过 info replication命令查看是否成功
5) 主从复制测试
6)日志查看
我们也可以通过 Redis 查看到其日志,日志地址可以通过 redis.conf 配置文件种的 logfile 查看到
主机日志
从机日志
2.3 主从复制注意事项
1) 从机会从主机的根节点开始复制
将一个新的从机添加主从复制中,这个时候,如果主机中已经存在一些数据,那么从机会将主机的数据全部复制过来,也就是在主机加入主从复制体系种的时候,会把主机全部的数据都复制过来,而不是只把新产生的数据复制过来
2)主机可以读写,从机只能读取数据
3)主机宕机并重启,会发生什么变化
当 Master 主机宕机以后,从机的角色并未发生变化,依旧是Slave,只是由于主机宕机,从机的连接状态会由 up 变成 down
当我们将Master主机重启以后,发现会自动恢复主从复制的状态,不需要进行任何操作
4) 从机宕机以后并重启,会发生什么变化
从机宕机后,主机状态没有发生改变,至少从机的连接数量减少1个
从机重启以后,从机状态为Master,需要手动将从机添加到主从复制
2.4 薪火相传
一个主服务器可以有多个从服务器,从服务器也可以接受其他从服务器的连接
在上面的主从复制模式中,为1主2从,那么这会导致主机的压力越来越大,这个时候可以改变模式,可以从机1变成Master,从机2以从机1为Master,就变成了下面这种模型,但是这毕竟是相隔传递,可能会由一些误差
测试结果:
注意:
我们可以在主从复制的连接状态中,强行将一个slave的Master主机更改为另一个Master,直接通过slaveof 新主库IP 新主库端口 命令即可,这个时候会清空之前的数据,在重新拷贝最新的
2.5 停止主从复制连接
命令: SLAVEOF no one
通过该命令是当前数据库停止与其它数据库的同步,转成主数据库
2.6 复制原理
实现主从复制的功能,底层需要 全量同步 和 增量同步 两种方式
全量同步
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:
- 从服务器连接主服务器,发送SYNC命令;
- 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
- 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
- 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
- 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
增量同步
Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。
Redis主从同步策略
主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步。
2.7 主从复制缺点
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。