AnthonyZero's Bolg

Redis主从复制

Master-Slave主从模式

Redis Server可以设置为另一个Redis Server的主机(从机),特殊的,一个从机同样可以设置为一个 Redis Server 的主机,这样一来 Master-Slave 的分布看起来就是一个有向无环图 DAG,如此形成 Redis Server 集群,无论是主机还是从机都是 Redis Server,都可以提供服务,主机数据更新后根据配置和策略,自动同步到从机上。Master以写为主,Slave为读为主。

  • Redis使用异步复制。从Redis2.8开始从服务器会以每秒一次的频率向主服务器报告复制流(replication stream)的处理进度
  • 一个主服务器可以有多个从服务器
  • 不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器,多个从服务器之间可以构成一个图状结构
  • 复制功能不会阻塞主服务器:即使有一个或多个从服务器正在进行初次同步,主服务器也可以继续处理请求
  • 复制功能也不会阻塞从服务器:只要在 redis.conf文件中进行了相应的设置,即使从服务器正在进行初次同步,服务器也可以使用旧版本的数据集来处理命令查询。不过,在从服务器删除旧版本数据集并载入新版本数据集的那段时间内,连接请求会被阻塞。
  • 复制功能可以单纯地用于数据冗余(data redundancy),也可以通过让多个从服务器处理只读命令请求来提升扩展性(scalability):比如说,繁重的SORT命令可以交给附属节点去运行
  • 可以通过复制功能来让主服务器免于执行持久化操作:只要关闭主服务器的持久化功能,然后由从服务器去执行持久化操作即可

全量同步

Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。具体步骤如下
1)从服务器连接主服务器,发送SYNC命令;
2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令;
3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令;
4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照;
5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令;
6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;
完成上面几个步骤后就完成了从服务器数据初始化的所有操作,从服务器此时可以接收来自用户的读请求。

增量同步

Redis增量复制是指Slave初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。
增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令。

当主从服务器之间的连接由于某些原因断开时,从服务器可以自动进行重连接,一般都会进行一个完整的重新同步,(从Redis 2.8开始,如果遭遇连接断开,重新连接之后可以从中断处继续进行复制,而不必重新同步)

只读从服务器

从Redis2.6开始,从服务器支持只读模式,并且是默认模式。这个行为是由Redis.conf文件中的slave-read-only 参数控制的,默认是yes。只读的从服务器会拒绝所有写命令,所以对从服务器不会有误写操作。

1.当主机停止服务,从机原地待命仍可处理读请求,等待主机归位 2.当从机停止服务,从机恢复成默认的master角色(info replication命令查看),要想继续作为从机工作,必须重新连接(slaveof ip port),除非配置了redis.conf文件

Liunx下配置

环境规划:
master:119.29.234.73 6379
slave:119.29.234.73 6380
slave:119.29.234.73 6381

自己用一台云服务器(CentOS6.6) 3个不同端口模拟主从复制(一主二从),为了便于区分我修改了redis进程号文件路径、日志文件名、rdb快照文件名、端口;然后分别以不同的配置文件启动redis服务。

Alt text
Alt text
Alt text

从服务器只需要(slaveof 主数据库地址 主数据库端口)便可成为从机,主机无需配置

Slaveof 命令可以将当前服务器转变为指定服务器的从属服务器(slave server)
如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port 将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步
另外,对一个从属服务器执行命令 SLAVEOF NO ONE将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。


用info replication命令查看主从信息:如下图
可以看到6379端口的主库有两个从库分别为6380和6381
Alt text

接下来进行验证:首先在主库上设置一个name的键值为11,然后到从库检查该值是否已经自动同步到了从库。如下图可以看到:数据确实从主库同步到了从库。
Alt text

哨兵模式

Redis的主从架构,如果master发现故障了,还得手动将slave切换成master继续服务,手动的方式容易造成失误,导致数据丢失,那Redis有没有一种机制可以在master和slave进行监控,并在master发送故障的时候,能自动将slave切换成master呢?有的,那就是哨兵(当主机停止服务,从机不在原地待命而是由redis由多个从机中选出一个当主机,而原先的主机如果后面恢复服务则不再是主机,而是成为新主机的从机)

redis-sentinel /../sentinel.conf 启动哨兵进行监控:配置文件必须是sentinel.conf,里面的内容为:
sentinel monitor 被监控的数据库名(自己取名) 主机ip 端口 1

哨兵的作用

  1. 监控redis进行状态,包括master和slave
  2. 当master机 down后,能自动将slave切换成master