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间数据同步延迟较大,数据一致性变差,应谨慎选择

命令传播

posted @ 2020-06-17 23:33  liujiangbo  阅读(40)  评论(0编辑  收藏  举报