Redis 复制的原理和优化
1.什么是主从复制
单机问题
机器故障(高可用问题)、容量瓶颈、QPS瓶颈(分布式问题)
一主多从
redis(master)–>复制–>redis(slave)
主结点的更新讲同步到从结点
作用:为数据提供多个副本 扩展读性能
总结:
一个master 可以有多个slave
一个slave 只能有一个master
数据流向是单向的,master 到 slave
2.主从复制的配置
1.命令实现
slaveof masterIP:port #主从复制不再同一机器上(异步操作)
salveof no one #取消复制,同步的数据没有清楚
2. 修改配置
port
dir
dbfilename
logfile
pidfile #进程名字
slaveof ip port #配置从节点对应的主节点
redis-cli
info replication #查看主从节点属性
方式 | 命令 | 配置 |
---|---|---|
优点 | 无需重启 | 统一配置 |
缺点 | 不便于管理 | 需要重启 |
3.全量复制和部分复制
run_id #每个redis 启动随机一个
master_repl_offset(偏移量) #判断主从是否一致
1.全量赋值:
1.当前状态同步给slave.
2.在此期间写入的命令会记录起来 ,rdb加载完以后,通过偏移量对比,将值同步给从节点
流程如下:
slave :psync ? -1
master: {runID}{offset}
slave:save masterInfo
master: bgsave
master:sendRDB
master:send buffer #在备份RDB期间,所生成的数据
slave:flush old data #删除旧的数据
slave:load RDB #内存中加载
当一个从数据库启动后,会向主数据库发送SYNC命令,同时主数据库收到SYNC命令后会开始在后台保存快照(即RDB持久化的过程)并在保存快照期间将收到的命令缓存起来,当快照完成后,Redis 会将快照文件和所有缓存的命令一起发给从数据库.从数据库收到后,会载入快照文件并执行收到的缓存命令,以上过程成为复制初始化.复制初始化结束后,主数据库每当收到写命令时就会将命令同步给从数据库.从而保障主从数据库数据库一致.
2.全量赋值的开销
bgsave 时间
RDB 文件网络传输时间
从节点情况时间
加载RDB时间
可能的AOF重写
3.部分复制
发生抖动时候,再连接时候。
slave:connection lost #发生抖动
master:write–sendbuffer–>repl_back-buffer #复制缓存区
slave:connection to master
salve:pysnc{offset}{runID} #将自己当前的offset 告诉主节点
master:Continue
master:send partial data
1.主数据库会判断从数据库传送过来的运行ID 是否和自己相等
2.判断从数据库最后同步成功的命令偏移量是否在挤压队列中,如果在则可以进行增量复制,否则全部同步。
4.故障处理
主从复制结构中:
slave 故障(宕机):client 连接到另一个slave
master故障:选择新master(slaveof no one) slave选择新master
需要高可用:发生故障时候,不需要手动操作,故障自动转移