目录
主从复制为了解决什么问题?
为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续提供服务,实现Redis的高可用,同时实现数据冗余备份。
这里有4个redis服务器。
主从复制即将master(主)中的数据及时有效的复制到slave(从)中。
特征:一个master可以拥有多个slave,一个slave只对应一个master。
主从复制的作用
- 读写分离:master写、slave读,提高服务器的读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数 量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
- 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
- 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
- 高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案
主从复制连接过程
主从连接(slave连接master) 三种方式
方式一:客户端发送命令
方式二:启动服务器时加上参数
方式三:服务器配置文件中加上配置参数
主从断开连接
在slave服务器使用命令
说明:slave断开连接后,不会删除已有数据,只是不再接受master发送的数据
实际测试 (使用方式一连接)
两个服务器在不建立主从关系的情况下
1.开启一个端口6379的redis服务器(redis-6379.conf是自定义确定配置文件):
2.开启一个端口6380的redis服务器:
3.开启第一个客户端,连接端口6379的服务器:
存储一个数据:set name abcd
4.开启第二个客户端,连接端口6380的服务器:
获取数据key=name
结果:在未设置服务器主从关系的情况下,第二个客户端获取的数据不同于第一个客户端存储的数据。
两个服务器在建立主从关系的情况下
1.在第二个客户端(连接端口6380的服务器),使用指令slave 127.0.0.1 6379与6379端口服务器建立连接。6379为主,6380为从。
2.在第一个客户端中再次set name abcd2
3.然后在第二个客服端进行查询get name
结果:这次获取的值与第一个客户端设置值一样。说明主服务器的数据会同步到从服务器。
主从复制工作流程
在slave初次连接master后,复制master中的所有数据到slave,将slave的数据库状态更新成master当前的数据库状态。
大致步骤:
步骤1:slave发送指令psync2请求同步数据。
步骤2:master创建RDB同步数据发送给slave。
步骤3:slave恢复RDB同步数据。
步骤4:slave请求部分同步数据(在复制阶段,master新进来的数据)。
步骤5:master发送部分数据。
步骤6:slave恢复部分同步数据。
数据同步阶段master注意点(一)
1. 如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行。
2. 复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已 经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态。
3. master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执 行bgsave命令和创建复制缓冲区
数据同步阶段master注意点(二)
1. 为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务。
2. 数据同步阶段,master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送 命令 。
3. 多个slave同时对master请求数据同步,master发送的RDB文件增多,会对带宽造成巨大冲击,如果 master带宽不足,因此数据同步需要根据业务需求,适量错峰。
4. slave过多时,建议调整拓扑结构,由一主多从结构变为树状结构(多主多从),中间的节点既是master,也是 slave。
注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层master间数据同步延迟 较大,数据一致性变差,应谨慎选择 。