Windows下搭建Redis高可用集群-哨兵模式(Redis-Sentinel)

Sentinel的分布式特性

Redis Sentinel 是一个分布式系统, 你可以在一个架构中运行多个 Sentinel 进程(progress), 这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线的信息, 并使用投票协议(agreement protocols)来决定是否执行自动故障迁移, 以及选择哪个从服务器作为新的主服务器。

单个sentinel进程来监控redis集群是不可靠的,当sentinel进程宕掉后(sentinel本身也有单点问题,single-point-of-failure)整个集群系统将无法按照预期的方式运行。所以有必要将sentinel集群,这样有几个好处:

  • 有一些sentinel进程宕掉了,依然可以进行redis集群的主备切换;

  • 如果只有一个sentinel进程,如果这个进程运行出错,或者是网络堵塞,那么将无法实现redis集群的主备切换(单点问题);

  • 如果有多个sentinel,redis的客户端可以随意地连接任意一个sentinel来获得关于redis集群中的信息;

一个健壮的部署至少需要三个哨兵实例。三个哨兵实例应该放置在客户使用独立方式确认故障的计算机或虚拟机中。例如不同的物理机或不同可用区域的虚拟机。

开始准备环境搭建:
本次在window上搭建哨兵模式的Redis集群。按照上一篇文章Redis主从复制的指导,先搭建好Redis的集群,具体情况如下:
在git上下载好window下的Redis免安装的包,解压配置好之后,再复制两份,端口号分别为6380和6381,Redis安装目录则分别为redis6379、redis6380、redis6381.

  • 127.0.0.1 6379 master
  • 127.0.0.1 6380 slave
  • 127.0.0.1 6381 slave
  • 127.0.0.1:26379 127.0.0.1:26380 127.0.0.1:26381 sentinel

Redis的密码都设置成requirepass 123456

配置Sentinel

在上述三个Redis安装目录下新建sentinel.conf文件,在其中写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 这个是Redis6379配置内容,其他文件同理新增然后改一下端口即可,26380,和 26381。
#当前Sentinel服务运行的端口
port 26379
# 哨兵监听的主服务器
sentinel monitor mymaster 127.0.0.1 6379 2
# 3s内mymaster无响应,则认为mymaster宕机了
sentinel down-after-milliseconds mymaster 3000
#如果10秒后,mysater仍没启动过来,则启动failover
sentinel failover-timeout mymaster 10000
# 执行故障转移时, 最多有1个从服务器同时对新的主服务器进行同步
sentinel parallel-syncs mymaster 1

# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456

在另外的两个Redis目录里面分别创建sentinel.conf,注意修改其中port端口分26380和26381。
配置文件只需要配置master的信息就好啦,不用配置slave的信息,因为slave能够被自动检测到(master节点中有关于slave的消息)。

为了更清楚每一行配置的含义,对每个选项的含义进行简单介绍:

1
sentinel monitor [master-group-name] [ip] [port] [quorum]
  • master-group-name:master名称(可以自定义)
  • ip port : IP地址和端口号
  • quorum:票数,Sentinel需要协商同意master是否可到达的数量。

第一行配置指示 Sentinel 去监视一个名为 mymaster 的主服务器, 这个主服务器的 IP 地址为 127.0.0.1 , 端口号为 6379 , 而将这个主服务器判断为失效至少需要 2 个 Sentinel 同意 (只要同意 Sentinel 的数量不达标,自动故障迁移就不会执行)。
票数在本文中:redis集群中有3个sentinel实例,其中master挂掉啦,这里设置票数为2,表示有2个sentinel认为master挂掉啦,才能被认为是正真的挂掉啦。

1
sentinel <选项的名字> <主服务器的名字> <选项的值>
  • down-after-milliseconds 选项指定了 Sentinel 认为服务器已经断线所需的毫秒数。

如果服务器在给定的毫秒数之内, 没有返回 Sentinel 发送的 PING 命令的回复, 或者返回一个错误, 那么 Sentinel 将这个服务器标记为主观下线(subjectively down,简称 SDOWN )。
不过只有一个 Sentinel 将服务器标记为主观下线并不一定会引起服务器的自动故障迁移: 只有在足够数量的 Sentinel 都将一个服务器标记为主观下线之后, 服务器才会被标记为客观下线(objectively down, 简称 ODOWN ), 这时自动故障迁移才会执行。
将服务器标记为客观下线所需的 Sentinel 数量由对主服务器的配置决定。

  • parallel-syncs 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长。

新增Redis启动脚本:startRedisServer.bat

1
2
3
@echo off
redis-server.exe redis.conf
@pause

新增Redis-Sentinel启动脚本:startRedisSentinel.bat

1
2
3
@echo off
redis-server.exe sentinel.conf --sentinel
@pause

另外两个进行同样的操作,创建新增Redis启动脚本和Redis-Sentinel启动脚本。

开始启动环境

  • 点击startRedis.bat,启动Redis集群
  • 点击startRedisSentinel.bat,启动哨兵实例

搭建中出现的问题

  • sentinel配置文件的顺序问题

    1
    2
    3
    4
    5
    6
    7
    8
    [3968] 01 Mar 11:06:38.314 #
    *** FATAL CONFIG FILE ERROR ***

    [3968] 01 Mar 11:06:38.314 # Reading the configuration file, at line 10

    [3968] 01 Mar 11:06:38.314 # >>> 'sentinel down-after-milliseconds mymaster 3000'

    [3968] 01 Mar 11:06:38.314 # No such master with specified name.

    解决方法:哨兵监听的主服务器的配置

    1
    sentinel monitor mymaster 127.0.0.1 6379 2

    要尽量放到sentinel配置的前面

  • 配置文件的空格问题

    1
    Invalid argument during startup: unknown conf file parameter :

    解决方法:删除或者更改配置注意不要留有空格

未完

  • 作者: Sam
  • 发布时间: 2019-02-28 23:32:15
  • 最后更新: 2020-10-02 11:11:00
  • 文章链接: https://ydstudios.gitee.io/post/bdbc3b8a.html
  • 版权声明: 本网所有文章除特别声明外, 禁止未经授权转载,违者依法追究相关法律责任!