原创

Ubuntu系统下Redis集群搭建(主从+哨兵)


Ubuntu系统下Redis集群搭建(主从+哨兵)

一、Redis 主从配置及数据同步

  • 在第一步 Redis 安装部署中我们已经启动了 Redis 服务,但是配置文件并没有做修改,因为主从配置主要就是通过修改配置文件来实现,所以 Redis 配置文件的修改统一在这里进行讲解。
  • 这里我创建了三台虚拟机来演示,分别按照上述安装方式安装好 Redis,三台虚拟机如下配置:
ip地址端口号角色
192.168.98.156379主机(master)
192.168.98.176379从机(slave)
192.168.98.186379从机(slave)
  1. 主机配置,修改/usr/local/redis/redis.conf配置文件,修改参数如下所示:
#Redis 默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
bind 0.0.0.0
#Redis 端口配置
port 6379
#关闭保护模式,可以外部访问。
protected-mode no
#设置为后台启动。
daemonize yes
#Redis 日志文件,生成后在 bin 目录下可找到。
logfile ./redis.log
#设置 redis 连接密码。
requirepass root
#slave 服务连接 master 的密码。
masterauth root
  1. 从机配置,修改/usr/local/redis/redis.conf配置文件,修改参数如下所示:

    #Redis 默认只允许本机访问,把 bind 修改为 0.0.0.0 表示允许所有远程访问。如果想指定限制访问,可设置对应的 ip。
    bind 0.0.0.0
    #Redis 端口配置
    port 6379
    #关闭保护模式,可以外部访问。
    protected-mode no
    #设置为后台启动。
    daemonize yes
    #Redis 日志文件,生成后在 bin 目录下可找到。
    logfile ./redis.log
    #设置 redis 连接密码。
    requirepass root
    #slave 服务连接 master 的密码。
    masterauth root
    #指定当本机为 slave 服务时,设置 master 服务的IP地址及端口,在 redis 启动的时候会自动跟 master 进行数据同步,所以两台从机都这样配置即可。
    replicaof 192.168.98.15 6379
    
    
    1. 配置完成之后重启redis服务:

      kill -9 id
      redis-server /usr/local/redis/redis.conf
      

      此处注意:由于我们搭建的集群需要自动容灾切换,主数据库可能会变成从数据库,所以三台机器上都需要同时设置 requirepass 和 masterauth 配置项。

  2. 查看Redis主从节点是否配置成功:

    • 主节点(master)

    在这里插入图片描述

    • 从节点(slave)

    在这里插入图片描述

  3. 主从数据同步验证:

  4. 在主机(master)添加几条数据,看从机(slave)是否可以获取到,如果能获取,说明数据已经同步到了从机,主机添加数据,如下:

在这里插入图片描述

  1. 两台从机已经获取到数据,证明主从搭建成功并可同步数据,如下所示:

在这里插入图片描述

在这里插入图片描述

二、Redis 哨兵模式搭建

  1. 哨兵模式详解

    Redis Sentinel是Redis 的高可用性解决方案,由一个或多个Sentinel(哨兵)实例组成。它可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,它的主要功能如下:

    监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常。

    通知(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel可以通过API向管理员或者其他应用程序发送通知。

    故障迁移:当主服务器不能正常工作时,Sentinel会自动进行故障迁移,也就是主从切换。

    统一的配置管理:连接者询问sentinel取得主从的地址。

  2. 哨兵原理

    Sentinel 使用的算法核心是 Raft 算法,主要用途就是用于分布式系统,系统容错,以及Leader选举,每个Sentinel都需要定期的执行以下任务:

    每个 Sentinel 会自动发现其他 Sentinel 和从服务器,它以每秒钟一次的频率向它所知的主服务器、从服务器以及其他 Sentinel 实例发送一个 PING 命令。 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 那么这个实例会被 Sentinel 标记为主观下线。 有效回复可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。 如果一个主服务器被标记为主观下线, 那么正在监视这个主服务器的所有Sentinel要以每秒一次的频率确认主服务器的确进入了主观下线状态。 如果一个主服务器被标记为主观下线, 并且有足够数量的Sentinel(至少要达到配置文件指定的数量)在指定的时间范围内同意这一判断, 那么这个主服务器被标记为客观下线。 在一般情况下, 每个Sentinel会以每 10 秒一次的频率向它已知的所有主服务器和从服务器发送 INFO 命令。 当一个主服务器被Sentinel标记为客观下线时,Sentinel向下线主服务器的所有从服务器发送 INFO 命令的频率会从 10 秒一次改为每秒一次。 当没有足够数量的Sentinel同意主服务器已经下线, 主服务器的客观下线状态就会被移除。 当主服务器重新向Sentinel的 PING 命令返回有效回复时, 主服务器的主管下线状态就会被移除。

    img

  3. 哨兵搭建

    在主服务器上编辑sentinel.conf配置文件:

    cd /usr/local/redis/
    vi sentinel.conf
    

    修改内容如下:

    #端口默认为26379。
    port 26379
    #关闭保护模式,可以外部访问。
    protected-mode no
    #设置为后台启动。
    daemonize yes
    #日志文件。
    logfile ./sentinel.log
    #指定主机IP地址和端口,并且指定当有2台哨兵认为主机挂了,则对主机进行容灾切换。
    sentinel monitor mymaster 192.168.98.15 6379 2
    #当在Redis实例中开启了requirepass,这里就需要提供密码。
    sentinel auth-pass mymaster root
    #这里设置了主机多少秒无响应,则认为挂了。
    sentinel down-after-milliseconds mymaster 3000
    #主备切换时,最多有多少个slave同时对新的master进行同步,这里设置为默认的1。
    sentinel parallel-syncs mymaster 1
    #故障转移的超时时间,这里设置为三分钟。
    sentinel failover-timeout mymaster 180000
    
    
  4. 启动哨兵

    redis-sentinel /usl/local/redis/sentinel.conf
    
  5. 登录查看哨兵信息:

    redis-cli -p 26379
    info sentinel
    

    可以看到,哨兵已经监听到当前的主机IP端口和运行状态,并且有2台从机,3个哨兵,信息如下所示;

    在这里插入图片描述

  6. 容灾测试:

    1. 模拟主机宕机情况,将主机Redis 服务关闭,:

      redis-cli -p 6379 shutdown
      
    2. 现在我们去看三台服务器的情况,发现刚才的主机(192.168.98.15 6379)已经变成了从机,如下

      在这里插入图片描述

    3. 哨兵(Sentinel)通过选举机制选举了从机(192.168.98.17 6379)作为了新的主机,如下

      在这里插入图片描述

    4. 需要注意的是,主从切换后配置文件已经被自动进行了更改,我们现在看一下新上位的主机 redis 日志,如下

      在这里插入图片描述

可以看到,当主机挂了的时候,一直连接主机被拒绝,当哨兵选举它为主机后,它成功执行重写的配置文件,并且连接了其他从机。