10分钟彻底理解Redis持久化和主从复制( 四 )


connected_slaves:1 slave0:ip=127.0.0.1,port=6380,state=online,offset=9472,lag=1 master_replid:2cbd65f847c0acd608c69f93010dcaa6dd551cee master_repl_offset:9472 当 Master 与 Slave 正常连接时,Slave 使用 PSYNC 命令向 Master 发送自己记录的旧 Master 的 Replication id 和 Offset 。
而 Master 会计算与 Slave 之间的数据偏移量,并将缓冲区中的偏移数量同步到 Slave,此时 Master 和 Slave 的数据一致 。
而如果 Slave 引用的 Replication 太旧了,Master 与 Slave 之间的数据差异太大,则 Master 与 Slave 之间会使用全量复制的进行数据同步 。
配置主从复制
Redis 的主从配置非常简单,我们可以使用两种方式来配置主从服务器,在这时我们先假设 Redis 的 Master 服务器地址为 192.168.0.101 。
客户端发送同步命令:
# 向客户端 saveof 192.168.1.101 6379 Slave 服务器配置主服务器:在这里 Slave 服务器的 redis.conf 通过 saveof 选项,可以指定 Master 服务器,如下:
slaveof 192.168.1.101 6379 通过上面两种方式的配置,Master 服务器与 Slave 服务器便已经可以开始进行数据同步了 。
Master 要求验证:上面配置的是 Master 服务器没有设置密码的情况,如果 Master 设置了密码,则可以在连接到 Slave 服务器的 redis-cli 执行下面的命令:
# <password>指代实际的密码 config set masterauth <password> 或者在 Slave 服务器的 redis.conf 中配置下面的选项:
# <password>指代实际的密码 masterauth <password> 避免 Slave 被清空
Slave 会被清空?Slave 不用同步了 Master 的数据吗?备份的数据怎么会清空了呢?
当 Master 服务器关闭了持久化时,如果发生故障后自动重启时,由本地没有保存持久化的数据,重启的 Redis 内存数据为空,而 Slave 会自动同步 Master 的数据,这时候,Slave 服务器的数据也会被清空 。
如何避免 Slave 被清空呢?如果条件允许(一般都可以的),Master 服务器还是要开启持久化,这样 Master 故障重启时,可以快速恢复数据,而同步这台 Master 的 Slave 数据也不会被清空 。
如果 Master 不能开启持久化,则不应该设置让 Master 发生故障后重启(有些机器会配置自动重启),而是将某个 Slave 服务器升级为 Master 服务器,对外继续提供服务 。
Slave 默认为只读的
在 Redis 2.6 以后,Slave 只读模式是默认开启的,我们可以通过配置文件中的 slave-read-only 选项配置是否开启只读模式:
# 默认是yes slave-read-only yes/no 或者在客户端中通过 config set 命令设置是否开启只读模式:
config set slave-read-only no 上面将 Slave 服务器设置为可以写入,但是要注意,如果 Slave 也配置了自己的从服务器(Sub-Slave),那么 Sub-Slave 只会同步从 Master 服务器同步到 Slave 的数据,而并会同步我们直接写入 Slave 服务器的数据 。
主从复制中的 Key 过期问题
我们都知道 Redis 可以通过设置 Key 的过期时间来限制 Key 的生存时间,Redis 处理 Key 过期有惰性删除和定期删除两种机制 。
而在配置主从复制后,Slave 服务器就没有权限处理过期的 Key,这样的话,对于在 Master 上过期的 Key,在 Slave 服务器就可能被读取 。
所以 Master 会累积过期的 Key,积累一定的量之后,发送 Del 命令到 Slave,删除 Slave 上的 Key 。
如果 Slave 服务器升级为 Master 服务器 ,则它将开始独立地计算 Key 过期时间,而不需要通过 Master 服务器的帮助 。
主从复制的作用
①保存 Redis 数据副本
当我们只是通过 RDB 或 AOF 把 Redis 的内存数据持久化毕竟只是在本地,并不能保证绝对的安全,而通过将数据同步 Slave 服务器上,可以保留多一个数据备份,更好地保证数据的安全 。
②读写分离
在配置了主从复制之后,如果 Master 服务器的读写压力太大,可以进行读写分离,客户端向 Master 服务器写入数据,在读数据时,则访问 Slave 服务器,从而减轻 Master 服务器的访问压力 。
 

10分钟彻底理解Redis持久化和主从复制

文章插图
 
 
③高可用性与故障转移
服务器的高可用性是指服务器能提供 7*24 小时不间断的服务,Redis 可以通过 Sentinel 系统管理多个 Redis 服务器 。
当 Master 服务器发生故障时,Sentineal 系统会根据一定的规则将某台 Slave 服务器升级为 Master 服务器,继续提供服务,实现故障转移,保证 Redis 服务不间断 。
小结:Redis 的主从复制可以让我们把 Redis 中的数据同步到其他服务器上,为数据安全提供更加安全的保障,也可以让我们的服务器在发生故障而无法重启时,可以更加快速地切换服务器,继续对外提供服务 。


推荐阅读