Redis集群
主从复制
多台服务器连接方案
- 提供数据方:master
- 主服务器,主节点,主库
- 主客户端
- 接收数据的方:slave
- 从服务器,从节点,从库
- 从客户端
- 需要解决的问题
- 数据同步
- 核心工作
- master的数据复制到slave中
主从复制(一对多)
主从复制即将master中的数据即时、有效的复制到slave中
特征:一个master可以拥有多个slave,一个slave只对应一个master
职责:
- master:
- 写数据
- 执行写操作时,将出现变化的数据自动同步到slave
- 读数据(可忽略)
- slave:
- 读数据
- 写数据(禁止)
作用
- 读写分离额:master写,slave读,提高服务器的读写负载能力
- 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求的变化,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
- 故障恢复:当master出现问题时,由slave提供服务,实现快速的故障恢复
- 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式
- 高可用基石:基于主从复制,构建哨兵模式与集群,实现Redis的高可用方案
工作流程
- 主从复制过程大体可以分为3个阶段
- 建立连接阶段(即准备阶段)
- 数据同步阶段
- 命令传播阶段
建立连接阶段(第一阶段)
建立slave到master的连接,使master能够识别slave,并保存slave端口号
**主从连接(slave连接master) **
-
方式一:客户端发送命令
slaveof <masterip> <masterport>
127.0.0.1:6380> slaveof 127.0.0.1 6379 OK
-
方式二:启动服务器参数
redis-server -slaveof <masterip> <masterport>
redis-server /usr/local/redis/redis-4.0.0/conf/redis-6380.conf --slaveof 127.0.0.1 6379
-
方式三:服务器配置 (常用)
slaveof <masterip> <masterport>
port 6380 //不启动守护进程方式,使用本启动方式,redis将以服务的形式存在,日志不在打印到命令窗口中 daemonize no #logfile "6380.log" //当前服务文件保存位置 dir /usr/local/redis/redis-4.0.0/data slaveof 127.0.0.1 6379
主从断开连接
-
客户端发送命令
slaveof no one
- 说明: slave断开连接后,不会删除已有数据,只是不再接受master发送的数据
授权访问
-
master客户端发送命令设置密码
requirepass <password>
-
master配置文件设置密码
config set requirepass <password> config get requirepass
-
slave客户端发送命令设置密码
auth <password>
-
slave配置文件设置密码
masterauth <password>
-
slave启动服务器设置密码
redis-server –a <password>
数据同步阶段(第二阶段)
-
全量复制
- 将master执行bgsave之前,master中所有的数据同步到slave中
-
部分复制
(增量复制)
- 将master执行bgsave操作中,新加入的数据(复制缓冲区中的数据)传给slave,slave通过bgrewriteaof指令来恢复数据
数据同步过程只包含两个部分: 全量复制、部分复制
数据同步阶段master说明
-
如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
-
复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态。
repl-backlog-size 1mb
-
master单机内存占用主机内存的比例不应过大,建议使用50%-70%的内存,留下30%-50%的内存用于执 行bgsave命令和创建复制缓冲区
数据同步阶段slave说明
-
为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务。
slave-serve-stale-data yes|no
-
数据同步阶段,master发送给slave信息可以理解master是slave的一个客户端,主动向slave发送命令
-
多个slave同时对master请求数据同步,master发送的RDB文件增多,会对带宽造成巨大冲击,如果master带宽不足,因此数据同步需要根据业务需求,适量错峰
-
slave过多时,建议调整拓扑结构,由一主多从结构变为树状结构,中间的节点既是master,也是 slave。注意使用树状结构时,由于层级深度,导致深度越高的slave与最顶层master间数据同步延迟较大,数据一致性变差,应谨慎选择
命令传播阶段(第三阶段)
-
当master数据库状态被修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的动作称为命令传播
-
master将接收到的数据变更命令发送给slave,slave接收命令后执行命令
-
主从复制过程大体可以分为3个阶段
- 建立连接阶段(即准备阶段)
- 数据同步阶段
- 命令传播阶段
命令传播阶段的部分复制
-
命令传播阶段出现了断网现象
- 网络闪断闪连
- 短时间网络中断 部分复制
- 长时间网络中断 全量复制
-
部分复制的三个核心要素
- 服务器的运行 id(run id)
- 主服务器的复制积压缓冲区
- 主从服务器的复制偏移量
服务器的运行ID(runid)
- 概念:服务器运行ID是每一台服务器每次运行的身份识别码,一台服务器多次运行可以生成多个运行id
- 组成:运行id由40位字符组成,是一个随机的十六进制字符 例如- -
- fdc9ff13b9bbaab28db42b3d50f852bb5e3fcdce
- 作用:运行id被用于在服务器间进行传输,识别身份
- 如果想两次操作均对同一台服务器进行,必须每次操作携带对应的运行id,用于对方识别
- 实现方式:运行id在每台服务器启动时自动生成的,mast