互联网的三高:
- 高可用
- 高并发
- 高性能
如果redis是单节点会出现以下问题:
- 机器故障:
- 容量瓶颈
redis主从复制:
为了避免单点Redis服务器故障,准备多台服务器,互相连通。将数据复制多个副本保存在不同的服
务器上,连接在一起,并保证数据是同步的。即使有其中一台服务器宕机,其他服务器依然可以继续
提供服务,实现Redis的高可用,同时实现数据冗余备份。
会提供两个或两个以上的机器进行搭建:
一个master作为数据的写入工作,其他的作为slave用于数据的读取
怎么解决数据的同步问题呢? 四个服务器数据如何相等呢?
将master中的数据复制到slave中
主从复制:
将主机master中的数据及时,有效的复制到多个从机slave中。
作用:
读写分离:master进行写slave进行读,提高读写负载
负载均衡:可以通过改变slave的数量来解决数度读取负载
故障恢复:
数据冗余:
高可用基石:
特征:
一个master有的多个slave,但是一个slave中有一个master
职责:
master:
- 写入数据
- 操作数据时候,同步到slave中
- 读数据(一般master将数据读取功能关闭)
slave:
- 读取数据
- 写入数据(slave中写数据功能关闭)
主从复制的工作流程:
- slave连接master
- master进行数据同步
- 反复进行数据同步(命令同步阶段)
阶段一:建立连接
步骤一:slave连接master(slaveof masterIp masterProt)
- 客户端发送命令 slaveof 127.0.0.1 6379
- 启动服务器参数 redis-server -slaveof 127.0.0.1 6379
- 服务器配置 在config配置文件中添加 slaveof 127.0.0.1 6379
步骤二:master接受命令,并且响应
步骤三:slave保存master的端口和ip
步骤四:slave根据创建的信息创建一个连接master的socket
步骤五:slave会周期性的给master发送ping指令,检查是否连接畅通
步骤六:slave通过replconf listening-port 发送自己slave的信息
步骤七:master保存slave的端口号
结果:
master: 保存slave的的端口
slave: 保存master的的地址和端口
slave断开:
slave on one
slave断开连接后,不会删除已有数据,只是不再接受master发送的数据
阶段二:数据同步
步骤一:slave发送psync2告知master可以进行全量复制
步骤二:master会fork一个子进程(bgsave),同时开辟一个命令缓冲区,用来接受slvae数据同步时发来的操作指令
步骤三:bgsave会生成一个rdb的文件 ,通过socket连接传送到slave
步骤四:slave接收到rdb文件,清空以前的数据,执行 rdb的恢复过程
全量复制完成
步骤五:slave恢复完成之后,会告知master,向master索要缓冲区中的指令
步骤六:master将缓冲区中的指令以aof的形式发送到slave
步骤七:slae接收到之后,进行指令的重写bgrewriteaof,恢复数据
结果:
slave: 具有master中全部的数据
master:保存了slave当前同步数据的位置
数据同步阶段注意的问题
- 如果master中的数据非常的庞大,数据的同步应该避开高峰期。
- 在master和slave进行全量复制的时候会开辟一个缓冲区,假如缓冲区空间太小,造成数据移除,master和slave数据不一致,又会去全量复制
详细数据同步过程(数据同步+命令传播)
缓冲区里面存储的数据类型:
心跳机制:
进入命令传播阶段候,master与slave间需要进行信息交换,使用心跳机制进行维护,实现双方连接保持在线
-
master心跳:
- 指令:PING
- 周期:由repl-ping-slave-period决定,默认10秒
- 作用:判断slave是否在线
- 查询:INFO replication 获取slave最后一次连接时间间隔,lag项维持在0或1视为正常
-
slave心跳任务
- 指令:REPLCONF ACK {offset}
- 周期:1秒
- 作用1:汇报slave自己的复制偏移量,获取最新的数据变更指令
- 作用2:判断master是否在线