优化方案:
1、在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
想办法提高主从集群全量同步的效率,默认的全量同步方式是master先将所有数据都备份(生成RDB文件)然后写入磁盘,然后将备份经过网络传输发送给slave,slave接收到发送过来的备份数据(RDB文件)后,再将它从磁盘读到内存。期间经过磁盘IO消耗,效率就比较低了,可以在master中配置repl-diskless-sync yes(开启无磁盘复制),从而避免了全量同步时的磁盘IO。
2、Redis单节点上内存占用不要太大,减少RDB导致的过多磁盘IO
你想啊,如果Redis单节点就10几个G,那它做一次全量复制岂不是要很久?哪这时候就有人要说了,我redis单节点就存7、8个G,不够用怎么办?可以多建立几个不同的redis集群嘛,不同的业务用不同的redis集群嘛,也可以做redis的分片集群来解决这个问题。
3、适当提高repl baklog的大小,发现slave宕机时尽快实现故障恢复,尽可能避免全量同步
repl baklog越大被写满的所需要时间就越久,repl baklog没被写满的话在slave恢复过来后就可以使用增量同步恢复宕机期间未同步的数据,repl baklog被写满的话在slave恢复过来后使用全量同步同步数据。从而尽量避免全量同步的发生。运维发现slave宕机后要尽快恢复,不能让它宕机太久。
4、限制一个master上的slave节点的数量,如果实在是太多slave,可以采用主-从-从链式结构,减少master压力
字面意思啊,master下的slave越多,master需要同步给slave的压力就越大。主-从-从链式结构的缺点也比较容易理解,下面的slave链路变长了,同步时间变长就会有延迟。
来三道题总结一下:
简述全量同步和增量同步区别?
全量同步: master将完整内存数据生成RDB,发送RDB到slave。
增量同步: slave提交自己的offset到master,master获取 repl baklog中slave的offset之后的命令给slave
什么时候执行全量同步?
slave节点第一次连接master节点时
slave节点断开时间太久,replbaklog中的offset已经被覆盖时
什么时候执行增量同步?
slave节点断开又恢复,并且在repl baklog中能找到offset时