关闭

Redis主从复制

标签: redis数据库
149人阅读 评论(0) 收藏 举报
分类:

Redis主从复制

Redis主从复制功能可以实现读写分离操作,一般情况下主数据库提供读写功能,从数据库提供只读功能(但是从数据库也可以提供写功能,后面有介绍)。当对主数据库进行写操作时,主数据库会自动将数据同步到从数据库中,从而保证数据一致性。主数据库和从数据库间是一对多的关系,即一个主数据库可以有多个从数据库,但是一个从数据库只能有一个对应的主数据库。从数据库也可以有对应的从数据库,形成一棵树状结构。
主从复制结构图

开启主从复制功能

在Redis中开启主从复制功能仅需在从数据库中增加一行配置即可,主数据库并不需要做任何的配置修改,非常的简单和方便。
Redis中可以通过以下3种方法声明其是某个Redis数据库的从数据库:

  1. 修改配置文件 path/to/redis.conf
 #其中masterIp为主redisIp, masterPort为主redisPort
slaveof masterIp masterPort
  1. 通过启动参数配置
 $ redis-server --slaveof masterIp masterPort
  1. 通过向从redis数据库发送slaveof命令
 #如通过redis-cli客户端中向从redis服务发送slaveof命令
 redis> slaveof masterIp masterPort 

可以通过redis客户端向redis服务发送INFO命令查看主从配置信息

#以redis-cli为例
redis> INFO replication

通常情况下,从数据库仅提供只读功能,但是可以通过修改从数据库的slave-read-only配置值为no,使的从数据库可以提供写功能,但是在从数据库中进行写操作并不会同步到其他同级的从数据库或者对应的主数据库中,并且若主数据库更新了对应键的数据就会覆盖从数据库中原来的修改;因此如果不是有非常必要的理由,请谨慎开启从数据库的写功能。

若希望将某个从数据库提升为主数据库,可以通过向从数据库发送SLAVEOF NO ONE命令,使其升级成为主数据库不再接收其他数据库的同步。

通过部署Redis主从复制结构,可以实现读写分离操作和冗余备份能力,这种一主多从的结果非常适用于读多写少的业务场景,但是因为可写的主数据库只有1台,这种结构还是会出现单点故障的隐忧。

人工故障恢复

在这种结构下,若主数据库出现故障,需要人工进行故障恢复,恢复过程步骤大致如下:

1、首先选择一台从数据库(假设此数据库的ip为ipA,端口为portA),然后向此从数据库发送SLAVEOF NO ONE命令,使其转换为主数据库;
2、然后向其他所有的从数据库发送slaveof ipA portA,把这些从数据库的主数据库修改为上一步选择的数据库。

从上面的步骤可以看到,要人工进行故障恢复不仅发现故障的时间会有比较大的延迟(通常要到应用出现问题才会发现故障),而且故障恢复操作麻烦,会浪费较多的维护和故障恢复时间。

哨兵

Redis2.8版本后引入了稳定可靠的哨兵机制来实现Redis主从结构的自动化监控和故障恢复功能;哨兵机制很好的解决了上面提到的手工进行故障恢复时操作麻烦和故障发现时间延后的问题。
在一个Redis主从复制结构中,可以由多个哨兵同时提供监控服务,哨兵不仅监控Redis服务的可用性,同时哨兵间也会相互监控。此外,一个哨兵也可以同时监控多个Redis服务,多个哨兵也可以同时监控一个redis主从结构
哨兵监控结构图

哨兵的部署

a、创建哨兵配置文件:path/to/sentinel.conf;在此配置文件中输入sentinel monitor masterName masterIp masterPort quorum。若一个哨兵监控多个redis主从复制结构,仅需在配置文件中配置多条sentinel monitor masterName masterIp masterPort quorum配置项即可。
【其中masterName为主数据库的名称,自定义的由大小写字母、数字,”.-_”组成的字符串;masterIp、masterPort为当前主从结构系统的主数据库ip和端口;quorum为判定主数据库客观下线的最小哨兵数,判定主数据库的主客观下线下文原理部分会详细解析,关于哨兵的详细配置参看这里
b、执行命令redis-sentinel /path/to/sentinel.conf启动哨兵进程,哨兵以独立进程方式启动和监控主从系统。当哨兵判定主数据库客观下线会通过Raft算法推举出领头哨兵,由领头哨兵实现故障恢复,故障恢复过程和上文提到的手工恢复过程大致相同(主要的区别在选择备选从数据库的过程)。

哨兵监控原理

a、首先哨兵进程会根据配置文件中redis-sentinel /path/to/sentinel.conf的配置,获取主数据库的信息。哨兵启动成功后会与主数据库建立两条连接。
1)其中一条连接订阅主数据库的sentinel:hello频道,以获取其他监控此主数据库的哨兵的信息。
2)另外一条连接用于哨兵定期向主数据库发送INFO等命令,以获取主数据库的信息。【因为redis客户端连接进入订阅模式时,不能再执行其他命令,因此需要另外创建此连接来定期发送命令】
b、哨兵和主数据库间的连接创建完成后,哨兵会定期执行以下3条命令:
1)每1秒钟向主、从数据库、其他哨兵节点发送PING命令(每1秒钟这个时间间隔由down-after-milliseconds配置决定,默认是1秒,若此配置值大于1秒,则每一秒发送,若配置值小于1秒则按照配置值,此配置值单位为毫秒)。以监控主、从数据库和哨兵节点是否下线【如果超过down-after-milliseconds指定的时间后,接受PING命令的数据库或者哨兵还没有回复,则此哨兵认为被PING节点主观下线。若被判定主观下线的节点为主数据库,则此哨兵会发送SENTINEL is-master-down-by-addr命令询问其他哨兵是否也判定主数据库主观下线,若判定主数据库主观下线的哨兵数大于等于quorum配置值,则判定主数据库客观下线,触发推举领头哨兵和故障恢复操作】。
2)每2秒钟向主数据库的sentinel:hello频道发送自己的信息【信息格式为:<哨兵的地址>, <哨兵的端口>, <哨兵的运行 ID>, <哨兵的配置版本>, <主数据库的名字>, <主数据库的地址>, <主数据库的端口>, <主数据库的配置版本>】,因为其他哨兵都有监控主数据库的sentinel:hello频道,收到消息的哨兵会判断此哨兵是不是新发现的哨兵,如果是则将其加入到已发现哨兵列表中,并与该哨兵建立一条连接,用于发送PING命令;同时哨兵会根据主数据库的版本来确定是否要更新主数据库信息【若主接收到的主数据库版本比当前哨兵记录的版本高,则更新】。
3)每10秒向主、从数据库发送INFO命令。从而获取数据库的运行ID、主从复制信息等信息,通过此命令可以自动发现新增的节点和主、从数据库的信息。若发现新节点,哨兵则创建两个链接,然后将此节点加入到监控列表中;若发现主从数据库角色变化,则进行信息更新。

哨兵进行故障恢复过程:

哨兵进行自动故障恢复的过程和手工进行故障恢复的过程大致相同,先从后备从数据库选择出备选的数据库,然后向其发送SLAVEOF NO ONE命令使之成为主数据库,最后对其他的从数据库发送slaveof ipNewMaster portNewMaster指向新的主数据库。

下面简单说下哨兵选择备选从数据库的依据:

(1)从所有在线从数据库中选择优先级最高的数据库。(优先级可以在redis启动配置文件中的slave-priority配置项指定,默认为100,配置值越小优先级越大,值得注意的是当配置值为0时,此从数据库永远不会被选择做为主数据库)
(2)如果有多个最高优先级的从数据库,则复制的命令偏移量越大(即复制越完整,redis2.8版本后增量复制中的概念)越优先。
(3)如果以上条件都一样,则选择运行ID较小的从数据库。

sentinel.conf配置文件范例:

sentinel monitor masterA 127.0.0.1 6379 1                #若有1个或以上哨兵认为此主数据库主观下线,哨兵会判定此主数据库客观下线,将会触发推举领头哨兵和故障恢复操作
sentinel monitor masterB 127.0.0.1 6380 2                #若有2个或以上哨兵认为此主数据库主观下线,哨兵会判定此主数据库客观下线,将会触发推举领头哨兵和故障恢复操作

#down-after-milliseconds配置值以毫秒为单位,当小于1s时按配置值发送PING命令,大于1s时没秒发送PING命令
sentinel down-after-milliseconds masterA 60000            #每隔一秒发送PING命令
sentinel down-after-milliseconds masterB 600              #每隔600毫秒发送PING命令
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2367次
    • 积分:91
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论