redis主从复制完整攻略
宋标 Lv5

1.主从配置

1.1单机

在服务器中copy一份redis.cnf

1
[root@localhost redis-5.0.3]# cp redis.conf slave-redis.cnf

修改端口号、pid文件、指定主redis的ip和端口

1
2
3
4
5
6
7
[root@localhost redis-5.0.3]# vim slave-redis.cnf

port 6380
#改为唯一即可
pidfile /var/run/redis_6380.pid
#5版本后是replicaof 有的版本可能为slaveof 自己留意
replicaof 127.0.0.1 6379

1.2测试

启动redis从服务 启动端口为6380的客户端

1
2
redis-server slave-redis.cnf 
redis-cli -p 6380

在主redis上添加数据

1
2
127.0.0.1:6379> set 1 1
OK

从redis

1
2
127.0.0.1:6380> get 1
"1"

2.同步原理

如果你的redis仅当作缓存来使用,可以不必操太多的心,但是用到了持久化的功能,也就是当作一个数据库来使用,数据的持久性和一致性是必须得以重视!以下内容只针对主从同步原理做了讲解。

2.1增量同步

主节点会将自己做出的指令存储到本地buffer中,然后从节点异步的读取指令来尽可能达到和主节点的数据一致,因为buffer的内存有限,buffer的内存结构是一个环形数组,从头写到尾时(写完一圈),将会覆盖之前的指令数据。
注意: 如果,从节点网络状态不好,无法和主节点同步数据,没来的及的同步数据被覆盖掉,这时,就需要下面的快照同步。

2.2快照同步

这是一个十分耗时的操作。
首先主节点会进行一次内存全盘扫描(bgsave),将内存中的所有数据写入到磁盘中,写入完毕时后传送到从节点,从节点接受完毕后,首先将内存清空,然后执行一次全量加载,再然后进行增量同步。
注意: 在从节中快照同步的同时,主节点的操作指令依旧在写到buffer中,如果快照同步十分的耗时,以至于buffer中的指令又被覆盖,那么将陷入死循环中!
为了避免死循环,请合适的设置buffer容量参数。

2.3无盘复制

自redis 2.8.18版本后,引入了无盘复制,主节点直接通过套接字将内容传递给从节点。主节点一边遍历内存一边将序列化的内容传送到从节点中,从节点先将接收到的数据存入到磁盘中,最后执行一次全量加载。

新加入的从节点,必须先进行一次快照同步,后再进行增量同步

文章文献参考《redis深度历险核心原理与应用实践》

 评论