Redis主从复制集群及哨兵模式搭建

1.1 哨兵的作用

sentinel是redis高可用的解决方案,sentinel系统(N个sentinel实例,N >= 1,一般为单数)可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。

1.2 主观下线

所谓主观下线,就是单个sentinel认为某个服务下线(有可能是接收不到订阅,之间的网络不通等等原因)。
sentinel会以每秒一次的频率向所有与其建立了命令连接的实例(master,从服务,其他sentinel)发ping命令,通过判断ping回复是有效回复,还是无效回复来判断实例时候在线(对该sentinel来说是“主观在线”)。
sentinel配置文件中的down-after-milliseconds设置了判断主观下线的时间长度,如果实例在down-after-milliseconds毫秒内,返回的都是无效回复,那么sentinel回认为该实例已(主观)下线,修改其flags状态为SRI_S_DOWN。如果多个sentinel监视一个服务,有可能存在多个sentinel的down-after-milliseconds配置不同,这个在实际生产中要注意。

1.3 客观下线

当sentinel监视的某个服务主观下线后,sentinel会询问其它监视该服务的sentinel,看它们是否也认为该服务主观下线,接收到足够数量(这个值可以配置)的sentinel判断为主观下线,既任务该服务客观下线,并对其做故障转移操作。
sentinel通过发送 SENTINEL is-master-down-by-addr ip port current_epoch runid,(ip:主观下线的服务id,port:主观下线的服务端口,current_epoch:sentinel的纪元,runid:*表示检测服务下线状态,如果是sentinel 运行id,表示用来选举领头sentinel)来询问其它sentinel是否同意服务下线。
一个sentinel接收另一个sentinel发来的is-master-down-by-addr后,提取参数,根据ip和端口,检测该服务时候在该sentinel主观下线,并且回复is-master-down-by-addr,回复包含三个参数:down_state(1表示已下线,0表示未下线),leader_runid(领头sentinal id),leader_epoch(领头sentinel纪元)。
sentinel接收到回复后,根据配置设置的下线最小数量,达到这个值,既认为该服务客观下线

1.4 选举领头sentinel

一个redis服务被判断为客观下线时,多个监视该服务的sentinel协商,选举一个领头sentinel,对该redis服务进行古战转移操作。选举领头sentinel遵循以下规则:

所有的sentinel都有公平被选举成领头的资格
所有的sentinel都有且只有一次将某个sentinel选举成领头的机会(在一轮选举中),一旦选举某个sentinel为领头,不能更改
sentinel设置领头sentinel是先到先得,一旦当前sentinel设置了领头sentinel,以后要求设置sentinel为领头请求都会被拒绝
每个发现服务客观下线的sentinel,都会要求其他sentinel将自己设置成领头
当一个sentinel(源sentinel)向另一个sentinel(目sentinel)发送is-master-down-by-addr ip port current_epoch runid命令的时候,runid参数不是*,而是sentinel运行id,就表示源sentinel要求目标sentinel选举其为领头
源sentinel会检查目标sentinel对其要求设置成领头的回复,如果回复的leader_runid和leader_epoch为源sentinel,表示目标sentinel同意将源sentinel设置成领头
如果某个sentinel被半数以上的sentinel设置成领头,那么该sentinel既为领头
如果在限定时间内,没有选举出领头sentinel,暂定一段时间,再选举

1.5 故障转移

故障转移分为三个主要步骤

从下线的主服务的所有从服务里面挑选一个从服务,将其转成主服务
sentinel状态数据结构中保存了主服务的所有从服务信息,领头sentinel按照如下的规则从从服务列表中挑选出新的主服务:
删除列表中处于下线状态的从服务
删除最近5秒没有回复过领头sentinel info信息的从服务
删除与已下线的主服务断开连接时间超过 down-after-milliseconds*10毫秒的从服务,这样就能保留从的数据比较新(没有过早的与主断开连接)
领头sentinel从剩下的从列表中选择优先级高的,如果优先级一样,选择偏移量最大的(偏移量大说明复制的数据比较新),如果偏移量一样,选择运行id最小的从服务
已下线主服务的所有从服务改为复制新的主服务
挑选出新的主服务之后,领头sentinel 向原主服务的从服务发送 slaveof 新主服务 的命令,复制新master
将已下线的主服务设置成新的主服务的从服务,当其回复正常时,复制新的主服务,变成新的主服务的从服务
同理,当已下线的服务重新上线时,sentinel会向其发送slaveof命令,让其成为新主的从
配置步骤推荐先主从复制,后搭建哨兵模式

2.redis主从复制集群搭建

2.1 下载源码 https://github.com/antirez/redis 下载稳定版redis(使用3.0.7及以上版本)
2.2 解压安装包
2.3 在src下执行 make && make install (用风云诀已经准备好的压缩包 make install即可)
2.4 修改配置文件redis.conf(是否重命名根据个人习惯定)

公共配置

#绑定host
bind 0.0.0.0   此处注意redis.conf中有俩个bind 需要干掉 bind 127.0.0.1

#受保护模式运行
protected-mode no 

# 端口号
port 6379

# 以守护进程运行
daemonize yes

# 守护进程pid路径(文件夹不存在的话 需要先创建)
pidfile /data/server/redis-3.2.3/run/redis.pid

# redis日志路径(文件夹不存在的话 需要先创建)
logfile “/data/log/redis/redis_logs.log"

从节点需要在公共配置基础上添加以下配置

#slaveof master's host + port 
slaveof 192.168.1.85 6379

2.5 启动

#默认配置文件 后台 启动
redis-server &

#指定配置文件 后台启动(推荐)
redis-server redis.conf &

2.6 验证
进入redis客户端

> redis-cli

显示类似下图,代表此节点redis启动成功

Redis主从复制集群及哨兵模式搭建
查看节点信息,全部信息info 查看复制信息 info replication 显示如图,集群搭建成功

主节点显示如下
Redis主从复制集群及哨兵模式搭建从节点显示如下
Redis主从复制集群及哨兵模式搭建主从复制校验
主节点设置一个值
set hello world
Redis主从复制集群及哨兵模式搭建从节点获取
get hello
Redis主从复制集群及哨兵模式搭建
以上,主从复制集群搭建完毕

3.redis哨兵集群搭建

个人理解:

  • 哨兵是一个特殊的redis-server,不需要读写库,实时监听master和slave的健康状态。
  • 一般哨兵为单数个,避免出现同票的情况。
  • 哨兵与master的关系是 n:1

3.1修改配置文件sentinel.conf(或新建配置文件 根据个人习惯而定),三个哨兵的配置文件一致即可

#关闭保护模式
proteted-mode no   ***加这个属性启动会报错****

#端口号
port 26379

#master的名称、ip、端口,以及晋升所需投票数
sentinel monitor mymaster 192.168.1.85 6379 2

#主观认定master实效时间
sentinel down-after-milliseconds mymaster 5000

#选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长,但越大就意味着越多的从服务器因为复制而不可用。可以通过将这个值设为 1 来保证每次只有一个从服务器处于不能处理命令请求的状态。
sentinel parallel-syncs mymaster 1

#故障转移超时时间
sentinel failover-timeout mymaster 6000

#守护进程模式
daemonize yes

#日志文件路径
logfile "/data/log/sentinel/sentinel_log.log"

3.2启动sentinel

redis-sentinel sentinel.conf &

日志显示如下,即启动成功
Redis主从复制集群及哨兵模式搭建3.3 验证哨兵模式
查看初始集群状态
Redis主从复制集群及哨兵模式搭建把master杀掉,此时主节点的cli是进不去的
Redis主从复制集群及哨兵模式搭建查看其他节点状态,此时84成为新master,并且83成为84的从节点,同时配置文件更新(新主节点去除slaveof, 从节点更新master的host)
Redis主从复制集群及哨兵模式搭建Redis主从复制集群及哨兵模式搭建以上,哨兵模式搭建完毕

4.问题汇总

4.1 redis启动失败,报错
Redis主从复制集群及哨兵模式搭建原因:指定的文件夹不存在

解决方法:修改配置文件指向已存在的文件夹或者去该路径下创建新文件夹

4.2 出现死循环报错(未复现)
原因:多半为节点的保护模式开启或者修改后的配置文件不生效(使用redis-server &启动)
解决方法:修改配置文件,使用推荐方式启动

4.3 第一次启动哨兵和所有redis节点,正常,第二次启动从节点找不到主节点,循环报错,但从节点的cli中通过 slaveof 192.168.1.83 6379指令,可以连接到主节点,并 info replication显示正常。

原因:从节点的配置文件被修改,不存在slaveof信息或有误,我遇到的是因为哨兵中 sentinel monitor mymaster xxx.xxx.xxx.xxx 6379 2为设置
解决方法:正确配置配置文件