Redis主从复制
简介
单机redis的缺陷
这个技术主要为了实现服务的高可用,单机redis会存在一下缺点:
- 机器故障,系统崩溃,数据丢失
- 容量瓶颈,硬件条件不能满足生产环境需求
为了避免单机故障,就准备多台服务器,互联互通,将数据复制多个副本保存在不同的服务器上,并保证数据实时同步。这样的话即使其中一台服务器宕机,其他服务器依然可以继续提供服务,从而实现redis的高可用,同时实现数据的冗余备份。
多台服务器连接方案
- 提供数据方:master
主服务器,主节点,主库
主客户端 - 接收数据方:slave
从服务器,从节点,从库
从客户端 - 需要解决的问题
数据同步 - 核心工作
将master中的数据同步到salve中
主从复制
即将master中的数据即使、有效的复制到slave中
特征:一个master可以有多个slave,一个slave只对应一个master
职责:
- master
- 写数据
- 执行写操作时,将出现变化的数据自动同步到slave中
- 读数据(可忽略)
- slave
- 读数据
- 写数据(一般禁止,读写分离)
作用
- 读写分离:master写数据,slave读数据,提高服务器的读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由salve分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高redis服务器并发量与数据吞吐量
- 故障恢复:当master出现问题时,由slave提供服务,实现快速给故障修复
- 数据冗余:实现数据的热备份,是持久化之外的一种数据冗余方式
- 高可用基石:基于主从复制,构建哨兵模式和集群,实现redis高可用方案
过程
主从连接
建立slave到master的连接,使master能够识别slave,并保存slave的端口号
步骤:
- 设置master的地址和端口(salveof ip port),保存master信息(ip及端口)
- 建立socket连接
- 定时发送ping命令(master相应pong)
- 身份验证(master有身份验证的时候需要,slave需要发送auth password命令给master验证)
- 发送slave端口信息
- 连接成功
状态:
- slave:保存了master的ip及端口
- master:保存了slave的端口
- 主从创建了连接的socket
连接命令:
- 连接方式一:客户端发送命令
slaveof masterIp masterPort
- 连接方式二:启动服务器参数
redis-server -slaveof masterIp masterPort
- 连接方式三:服务器配置
slaveof masterIp masterPort
- 断开连接
slaveof no one
授权访问命令
- master配置文件设置密码
requirepass passeord
- master客户端发送命令来设置密码
config set requirepass password
config get requirepass
- slave客户端发送命令设置密码
auth password
- slave配置文件设置密码
masterauth password
- 启动客户端设置密码
redis-cli -a password
数据同步
- 在slave初次连接master后,复制master中的所有数据到slave中
- 将slave的数据库状态更新成master当前的数据库状态
步骤
- slave请求同步数据(psync2)
- master创建rdb数据文件,并发送给slave(通过bgsave生成rdb,通过socket发送)
- slave恢复master的rdb文件(接收rdb,清空数据,执行rdb文件)
- slave请求部分同步数据(master生成rdb的过程中,若有写入操作,master会创建一个“复制缓冲区”,将这部分操作过程写到“复制缓冲区”中)
- master发送复制缓冲区信息给slave
- slave恢复部分同步数据(接收信息,执行bgwriteaof,恢复数据)
- 同步完成
状态
- slave:具有master库的全部数据
- master:保存slave当前数据库同步的位置(相当于偏移量)
- 主从完成了数据克隆
注意事项
- master
- 若master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
- 复制缓冲区的size过小,则会导致数据溢出,如果进行全量复制周期过长,进行部分复制时发现数据存在丢失的情况,必须进行第二次全量复制,只是master和salve陷入死循环。
- master可设置每次同步到slave的数据大小,来解决此问题 repl-backlog-size 1mb
- master单机内存占用主机内存比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执行bgsave命令和创建复制缓冲区
- slave
- 为避免slave进行全量复制或者部分复制的过程中,造成服务器响应阻塞或数据不同步,建议关闭此期间的对外服务(读写)
slave-server-stale-data yes|no
- 数据同步阶段,master发送给slave信息可以理解成master时slave的一个客户端,主动向slave发送命令
- 多个slave同时对master请求数据同步,master发送的rdb文件增多,会对带宽造成巨大冲击,如果master带宽不足,因此数据同步需要根据业务需求,适量错峰
- slave过多时,建议调整拓扑结构,由一主多从结构变为树状结构,中间的节点既是master,也是slave,注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层的master间数据同步延迟较大,数据一致性变差,应谨慎选择