Redis 有三种集群模式,第一个就是主从模式
,第二种“哨兵”模式
,第三种是Cluster集群模式
,第三种的集群模式是在 Redis 3.x
以后的版本才增加进来的,我们今天就来说一下 Redis 第一种集群模式:主从集群模式。
Redis 主从配置比较简单,基本就是在从节点配置文件加上:slaveof 192.168.1.128 6379
主要是通过 master server
持久化的 rdb
文件实现的。master server 先 dump 出内存快照文件,然后将 rdb 文件传给 slave server,slave server 根据 rdb 文件重建内存表。
初始化:配置好主从后,无论 slave server 是初次还是重新连接到 master server , slave server 都会发送 PSYNC 命令到 master server。 如果是重新连接,且满足增量同步的条件(下面详述),那么 Redis 会将内存缓存队列中的命令发给 slave server ,完成增量同步(Partial resynchronization),否则进行全量同步。
正常同步开始:任何对 master server 的写操作都会以 redis 命令的方式(可以查看 Redis 的 RESP 协议),通过网络发送给 slave server。
SYNC
命令给 master server;需要注意(Redis 2.8 之前):slave server 如果因为网络或其他原因断开与 master server 的连接,当 slave server 重新连接时,需要重新获取 master server 的内存快照文件,slave server 的数据会自动全部清空,然后再重新建立内存表,这样会让 slave server 启动恢复服务比较慢,同时也给 master server 带来较大压力,可以看出 Redis 的复制没有增量复制的概念,这是 Redis 主从复制的一个主要弊端,在实际环境中,尽量规避中途增加从库。
Redis 2.8 之前不支持增量,到 2.8 之后就支持增量了!
几个重要概念:
现网络连接断开后,slave server 将尝试重连 master server 。当满足下列条件时,重连后会进行增量同步:
确认执行增量同步后,Redis 会将内存缓存队列中的命令通过网络发给 slave server , 完成增量同步。
环境:
将 slave server 的日志级别调整为 verbose:
设置主从:
在 slave server 执行如下语句:
[root@peipei3514 bin]# ./redis-cli
127.0.0.1:6379> slaveof 192.168.1.128 6379 # 设置 master server
OK
127.0.0.1:6379>
查看日志:
[root@peipei3514 /]# tail -f /usr/local/redis/logs/redis.log
......
1578:S 24 Jun 13:31:49.416 * Before turning into a slave, using my master parameters to synthesize a cached master: I may be able to synchronize with the new master with just a partial transfer.
1578:S 24 Jun 13:31:49.420 * SLAVE OF 192.168.1.128:6379 enabled (user request from 'id=4 addr=127.0.0.1:60734 fd=8 name= age=13 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=slaveof')
1578:S 24 Jun 13:31:49.528 * Connecting to MASTER 192.168.1.128:6379
1578:S 24 Jun 13:31:49.536 * MASTER <-> SLAVE sync started # 发送 SYNC 命令
1578:S 24 Jun 13:31:49.591 * Non blocking connect for SYNC fired the event.
1578:S 24 Jun 13:31:49.600 * Master replied to PING, replication can continue...
1578:S 24 Jun 13:31:49.620 * Trying a partial resynchronization (request 910f37d9a6d3be1de6341ba6f5f52871419b7c68:1).
1578:S 24 Jun 13:31:49.990 * Full resync from master: 18aca6a0c6a726e118fc7c0e799cea01bb707436:0 # 从 master server 进行全量同步
1578:S 24 Jun 13:31:49.992 * Discarding previously cached master state.
1578:S 24 Jun 13:31:50.089 * MASTER <-> SLAVE sync: receiving 240 bytes from master # 接收到 master server 发来的数据
1578:S 24 Jun 13:31:50.095 * MASTER <-> SLAVE sync: Flushing old data ## 清除旧数据
1578:S 24 Jun 13:31:50.098 * MASTER <-> SLAVE sync: Loading DB in memory ## 将 master server 发来的数据加载到内存
1578:S 24 Jun 13:31:50.106 * MASTER <-> SLAVE sync: Finished with success ## 完成同步
1578:S 24 Jun 13:31:50.572 - DB 0: 3 keys (0 volatile) in 4 slots HT.
......
关闭 slave server 的网络,在 master server 增加一条数据,然后重新打开 slave server 的网络。日志如下:
1676:S 24 Jun 14:05:27.579 - DB 0: 4 keys (0 volatile) in 4 slots HT.
1676:S 24 Jun 14:05:27.579 - 3 clients connected (0 slaves), 1897296 bytes in use
1676:S 24 Jun 14:05:30.657 # MASTER timeout: no data nor PING received... # 与 master server 连接超时
1676:S 24 Jun 14:05:30.657 # Connection with master lost.
1676:S 24 Jun 14:05:30.657 * Caching the disconnected master state.
1676:S 24 Jun 14:05:30.658 * Connecting to MASTER 192.168.1.128:6379 # 重新连接到 master server
1676:S 24 Jun 14:05:30.670 * MASTER <-> SLAVE sync started # 开始同步数据
1676:S 24 Jun 14:05:32.704 - DB 0: 4 keys (0 volatile) in 4 slots HT.
1676:S 24 Jun 14:05:32.704 - 2 clients connected (0 slaves), 1897272 bytes in use
1676:S 24 Jun 14:05:32.713 * Non blocking connect for SYNC fired the event. # 发送 SYNC 命令
1676:S 24 Jun 14:05:32.727 * Master replied to PING, replication can continue...
1676:S 24 Jun 14:05:32.734 * Trying a partial resynchronization (request 18aca6a0c6a726e118fc7c0e799cea01bb707436:2402). # 进行增量同步
1676:S 24 Jun 14:05:32.741 * Successful partial resynchronization with master. # 同步完成
1676:S 24 Jun 14:05:32.741 * MASTER <-> SLAVE sync: Master accepted a Partial Resynchronization.
1676:S 24 Jun 14:05:37.841 - DB 0: 5 keys (0 volatile) in 8 slots HT.
1676:S 24 Jun 14:05:37.841 - 3 clients connected (0 slaves), 1897392 bytes in use
1676:S 24 Jun 14:05:42.957 - DB 0: 5 keys (0 volatile) in 8 slots HT.
Redis 的主从模式很简单,但在实际的生产环境中却是很少使用的,我也不建议在实际的生产环境中使用主从模式来提供系统的高可用性,之所以不建议使用都是由它的缺点造成的,在数据量非常大的情况,或者对系统的高可用性要求很高的情况下,主从模式也是不稳定的。虽然这个模式很简单,但是这个模式是其他模式的基础,所以必须深刻的理解,对其他模式的学习才会有帮助作用。
参考文章: