Redis_07_集群


本文介绍Redis集群。

1. 概述

我们知道,单台机器的性能是有限,随着用户越来越多,因此需要多台服务器联合提供服务。对于数据库也是,需要搭建集群。针对Redis服务器,一般情况下主要用于读数据,另外,针对读写分离,搭建的集群主要分为读服务器(slave,从服务器,大量)和写服务器(master,主服务器,少量),即主写从读。之后,服务器之间会同步数据,不会影响为客户提供服务。

1.1 主从复制

主服务器更新后根据配置和策略,自动同步到从服务器,Master以写为主,Slave以读为主。

1.2 案例:一主二从

即搭建三台Redis服务。为了简单起见,这里在一台主机上以不同的配置信息启动三次(如监听不同的端口号等等)

  1. 提供三分Redis配置文件(三份文件不同的有:端口号、pidfile、日志文件、持久化文件),并启动redis。

    redis_013.png (1048×330) (gitee.io)

  2. 登录客户端,并分别查看三台Redis服务在集群中的主从角色:info replication。(注意,此时还没有设置集群,但是会默认有角色。)如下图所示,可以看到,三台服务都是master,没有从机,都是可读可写。并且三台Redis互相独立,互不影响。在其中一台服务上写数据,其他两台不会有数据。

    redis_014.png (640×327) (gitee.io)

    redis_015.png (624×328) (gitee.io)

    redis_016.png (626×326) (gitee.io)

  3. 设置主从关系。6379做master可读可写(一般情况下只用写),6380、6381做slave只读。

    在6380、6381上执行:slaveof ip port,即本服务从属于指定ip上的指定port上的服务。6379主机不需要做任何修改。(其实从机也可以有从机。即一台主机可以有两个角色,既是主机,也是从机。但是只要有从机角色,就不能写数据。

    为了方便观察,此时先在6379上设置一条数据,之后再执行上述命令。可以看到,执行命令后,三台主机的主从角色发生了变化,并且数据进行了同步。

    redis_017.png (668×485) (gitee.io)

    redis_018.png (624×617) (gitee.io)

    redis_019.png (625×616) (gitee.io)

    一旦主从关系确定,会自动把主机上已有的数据同步复制到从库,这种全部复制称为全量复制。之后,在6379上写数据,会自动将新添加的数据复制到从服务器上面。这种复制称为增量复制。

  4. 读写分离。

    此时再从服务器上写数据,可以看到提示,此主机已经是readOnly了,即从服务器只读不写,而主服务器可写可读(一般用于写)

  5. 主机宕机

    作为主机,肯定会存在宕机的风险。那么master主服务器宕机了,从服务器是什么情况呢?经测试,从服务器处于原地待命的状况,即只读不写,且数据不再更新了。可以认为仍然提供读服务。

  6. 主机恢复

    master主服务恢复后。三台服务的主从关系仍然和正常保持一样,一切恢复正常。

  7. 从机宕机

    从机宕机后,查看主从信息,仅仅是主机中的slave数量发生了变化,其他从机不变。

  8. 从机恢复

    从机恢复后,从机变成了独立的master主机,需要重新设置主从关系才能恢复原状。

  9. 主机宕机,从机上位

    前面提到过,主机宕机了,此时集群相当于不提供写服务了,这是不合理的。可以设置从机上位,临时作为master主服务。

    1. 从机断开原来的主从关系:slaveof no one
    2. 重新设置其他从机的主从关系,设置从属于上述主机。

    注意,因为主机宕机后,整个集群的数据都不会再写入了,所以任何从机上的数据都是全部数据,所以任何一台从机做主机均可。

  10. 主机修好,作为从机隶属于上面上位的主机

    直接在主机上配置从属关系即可。

1.3 总结

一台主机可以配置多台从机,一台从机又可以配置多台从机,从而形成一个庞大的集群架构。主要是为了减轻单台主机的压力。缺点是增加了服务间的延迟,数据备份较大,硬盘开销较大。

1.4 复制原理

1.4.1 全量复制

slave启动成功连接到master后会发送一个sync命令;Master接收到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,master将传送整个数据文件到slave,以完成一次完全同步;slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

只要是重新连接master,一次全量复制将被自动执行。

1.4.2 增量复制

Master将所有新收集到的修改命令依次传给slave,完成同步。

1.5 Redis哨兵模式

上面的集群中主机宕机之后其实是存在问题的。首先是不知道什么时候宕机,不可能运维人员时刻监控;另外,宕机之后,不可能把服务停掉,用户那边可不管你宕不宕机,只看你能不能提供服务,而手动重新设置主从关系则比较麻烦。因此,Redis提供了哨兵模式。该哨兵可监控指定的集群,并自动化重选从机升级为主机,重新布置主从关系。

步骤如下所示:

  1. 搭建集群(步骤和上面一样)

  2. 提供哨兵配置文件(sentinel.conf)

    内容为:sentinel monitor dc-redis ip port 1。sentinel为命令,monitor表示监控监控的意思,dc-redis为哨兵名称(自定义)。后面依次表示哨兵监控主服务的ip地址、端口号、得到哨兵的投票数(当哨兵投票数大于或等于此数时切换主从关系,当监控的主机宕机后,程序会自动启动,对所有从机进行投票,当从机的投票数最先达到这个数的从机,上位为主机)。

  3. 输入Linux命令:redis-sentinel 哨兵配置文件名

主机宕机后,可发现哨兵自动对从机投票,并上位从机。另外,如果原来主机恢复后,哨兵自动将其从属于新主机。

启动命令后的界面如下所示,可看到当前的主机以及从机:

redis_020.png (1323×619) (gitee.io)

主机宕机后,发生如下所示,可以看到,6381端口服务称为新的主机:

redis_021.png (1471×578) (gitee.io)

原始主机恢复后,哨兵将其作为从机隶属于新主机。

redis_022.png (1319×152) (gitee.io)

1.6 小节

Redis的主从复制最大的缺点就是延迟,主机负责写,从机负责备份,这个过程有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重。并且从机数量的增加也会使这个问题更加严重。

2. 备注

参考B站《动力节点》。


文章作者: 浮云
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 浮云 !
  目录