使用redis sentinel构建redis高可用

一、redis sentinel部署

1、主从复制存在的问题

(1)主节点出现故障时,整个故障的迁移过程需要人工干预

(2)主节点写能力受到单机限制

(3)主节点存储能力受到单机限制

2redis sentinel概述

      Redis sentinel是redis2.8版本推出的监控redis主从复制的一套分布式架构,redis sentinel中包含若干个sentinel节点和redis数据节点,每个sentinel节点会对数据节点和其余的sentinel节点进行监控,当发现节点不可达时,会对节点做下线标识。如果标识的是主节点时会和其他的sentinel节点进行协商,当大多数sentinel都认为主节点不可达时,会选举一个sentinel节点来完成自动故障转移工作。

使用redis sentinel构建redis高可用_第1张图片

3redis sentinel的作用

(1)监控

(2)主节点故障转移

(3)将故障转移结果通知给应用方

(4)配置提供者

4redis sentinel安装部署

(1)部署规划

角色

IP地址

端口

主机内存大小

主机cpu

Redis master

192.168.16.128

6379

16g

4v

Redis slave1

192.168.16.129

6379

16g

4v

Redis master

192.168.16.130

6379

16g

4v

Redis master

192.168.16.128

26379

16g

4v

Redis master

192.168.16.129

26379

16g

4v

Redis master

192.168.16.130

26379

16g

4v

(2)redis节点的安装配置

    Redis节点的安装配置启动同正常单节点的redis安装配置启动一致,具体的配置可根据自己需求配置。但是需要在redis从节点执行命令”slaveof 192.168.16.128 6379”或将此命令加入redis配置文件中,以建立主从同步。

    使用yum安装的redis3.6版本在主从复制时需要通过认证或者关闭保护模式(在配置文件中添加” protected-mode no”),否则主从同步会出现问题。

(3)sentinel节点的安装配置

    安装完redis后,redis sentinel默认会安装,使用yum安装的redis默认会在”/etc/redis”目录下生成配置文件,编译安装的redis需要手动创建配置文件。

    Redis sentinel的主要配置文件内容如下:

#sentinel监听的端口,默认为6379
port 26379
#启动后在后台运行
daemonize yes
#工作目录
dir /tmp
# 监控的主节点,判断主节点失败至少需要两个sentinel节点同意
sentinel monitor mymaster 192.168.16.129 6379 2
# 多久(单位毫秒)收不到master回应则认为master不可用
sentinel down-after-milliseconds mymaster 30000
# 发生主备切换时,最多有多少个slave对新的master同步
sentinel parallel-syncs mymaster 1
# 故障转移的超时时间
sentinel failover-timeout mymaster 180000
# 日志存放目录
logfile /var/log/redis/sentinel.log
# 如果redis主节点添加了密码,监控主节点时需要认证(默认是注释掉的)
sentinel auth-pass  
# 故障转移时调用脚本路径(默认是注释掉的)
sentinel notification-script mymaster /var/redis/notify.sh
# 故障转移后,调用脚本的路径(默认注释掉的,可支持redis定义好的参数)
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

    redis sentinel也可支持通过动态的设置参数配置,需要登录redis sentinel api进行设置。设置的命令为:sentintl set

(4)启动redis sentinel

    Redis sentinel配置完成后分别启动三个Redis sentinel节点,有两种方法进行启动,启动方法如下:

    启动方法一:redis-sentinel redis-sentinel.conf

    启动方法二:redis-server redis-sentinel.conf --sentinel

# 分别启动三个redis sentinel节点
]# redis-sentinel /etc/redis-sentinel.conf
# 查看启动后监听端口是否成功
]# lsof -i :26379
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-sen 52852 root    4u  IPv6  95541      0t0  TCP *:26379 (LISTEN)
redis-sen 52852 root    5u  IPv4  95542      0t0  TCP *:26379 (LISTEN)

(5)查看状态

]# redis-cli -h 127.0.0.1 -p 26379 info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.16.128:6379,slaves=2,sentinels=3

(6)监控多套redis主节点

    如果部署了多套redis主从节点,使用redis sentinel监控redis 主节点时不需要同时部署多套redis sentinel,在同一套sentinel中通过制定多个mastername来区分不同的节点即可完成多套redis主从节点的监控。

二、redis sentinel工作原理

1sentinelredis的定时监控任务

    1)每隔10秒,每隔sentinel节点会想主节点和从节点发送info命令获取最新的拓扑结构,从节点的信息是通过主节点获取的(命令”info replication”执行结果中显示的信息)。

    2)每隔2秒每个sentinel节点会向redis数据节点的”_sentinel_:hello”频道发送该sentinel节点对主节点的判断以及当前sentinel节点的信息。每个sentinel节点也会订阅该频道来了解其他sentinel节点对主节点的判断。

    3)每隔一秒,每个sentinel节点会向主节点、从节点及其他sentinel节点发送一条ping命令做一次心跳检测,确认节点是否可达。

2redis主管下线

    当sentinel发送ping命令超过”down-after-milliseconds”时没有进行回复,sentinel节点就会对该节点做失败判定。

3、客观下线

    当sentinel主观下线的是主节点时,该sentinel节点会通过”sentinel is-master-down-by-addr”命令向其他sentinel节点询问对主节点的判断,当超过”quorum”个数时,sentinel节点认为主节点有问题,这时sentinel节点会做出客观下线的决定。

4redis sentinel leader节点的选举

    Sentinel对redis主节点客观下线后,需要在sentinel节点中选举出一个leader完成故障的转移。选举流程如下:

    1)确认主节点主观下线时,向其他sentinel节点发送”sentinel is-master-down-by-addr”命令,要求将自己设置为主节点。

    2)收到命令的sentinel节点,如果没有同意其他节点的”sentinel is-master-down-by-addr”命令,将同意该请求。

    3)如果该sentinel节点发现自己票数大于max(quorum,num(sentinels)/2+1),该节点将成为leader。

    4)如果此次没有选举出leader,将进入下一轮选举。

5、故障转移

选举出leader节点后,leader节点负责故障转移,故障转移的过程如下:

    1)在从节点列表中选举出一个节点作为新的主节点

    2)对选出来的从节点执行”slaveof no one”命令,让选出的从节点成为主节点

    3)让其他的从节点从新的主节点复制,复制规则和”parallel-syncs”参数有关

    4)将原来的主节点更新为从节点,等待恢复后让他从新的主节点复制。

 

三、redis sentinel的管理与维护

1redis sentinel 常用操作命令

(1)查看监控的主节点的状态信息

    Redis sentinel有自己专属的API,查看相关信息时需要登录sentinel API(登录本地API命令” redis-cli -h 127.0.0.1 -p 26379”),或者直接在登录命令后加操作命令操作。登录操作时,命令没有不全功能。

    命令:sentinel master

127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.16.128"

(2)展示指定主节点的状态信息

    命令:sentinel master

127.0.0.1:26379> sentinel master mymaster
 1) "name"
 2) "mymaster"
 3) "ip"
 4) "192.168.16.128"

(3)查看指定主节点的从节点的状态信息

    命令:sentinel slaves

#会将所有的从节点依次列出来
127.0.0.1:26379> sentinel slaves mymaster
1)  1) "name"
    2) "192.168.16.133:6379"
    3) "ip"
    4) "192.168.16.133"

(4)展示指定的mastername的sentinel节点集合

    命令:sentinel sentinels

# 不会显示当前sentinel节点的集合,并将其他的sentinel节点依次列出
127.0.0.1:26379> sentinel sentinels mymaster
1)  1) "name"
    2) "bf1a96e79aaf8be19cf7be613ab9363e961e2221"
    3) "ip"
    4) "192.168.16.128"

(5)返回指定mastername主节点的IP地址和端口

    命令:sentinel get-master-addr-by-name

127.0.0.1:26379> sentinel get-master-addr-by-name mymaster
1) "192.168.16.128"
2) "6379"

(6)对主节点的配置进行重置

    命令:sentinel reset

    当前sentinel节点对符合通配符风格主节点的配置进行重置,包括清除主节点的相关状态,重新发现从节点和sentinel节点。

(7)对指定的主节点进行强制的故障转移

    命令:sentinel failover

# 对主节点mymaster进行强制故障转移
127.0.0.1:26379> sentinel failover mymaster
OK
# 查看转移后的主节点已经变为192.168.16.133
127.0.0.1:26379> sentinel masters
1)  1) "name"
    2) "mymaster"
    3) "ip"
    4) "192.168.16.133"

(8)检测当前可达的sentinel节点总数是否达到的个数

    命令:sentinel ckquorum

(9)将sentinel节点的配置强制刷到磁盘

    命令:sentinel flushconfig

(10)取消当前sentinel节点对指定mastername主节点的监控

    命令:sentinel remove

127.0.0.1:26379> sentinel remove mymaster
OK
# 取消后查看当前节点监控的主节点
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:0
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0

(11)通过命令方式完成sentinel对master主节点的监控

    命令:sentinel monitor

# 重新监控主节点192.168.17.133
127.0.0.1:26379> sentinel monitor mymaster 192.168.16.133 6379 2
OK
# 再次查看时有监控到了主节点192.168.17.133
127.0.0.1:26379> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.16.133:6379,slaves=2,sentinels=3

2、节点的下线

    Redis使用的过程中,有些时候,由于节点所在的机器原因或者节点自身的原因,需要对节点下线,节点的下线也分为永久下线和临时下线。

(1)对主节点下线

    通过任意一个sentinel的api执行命令”sentinel failover”将从节点晋升为主节点,在将原来的主节点下线。

    如果要将指定的从节点晋升为主节点,先将其他的从节点的”slave-priority”配置为0,在执行”sentinel failover”命令,晋升完成后再讲”slave-priority”该回原值。

(2)对从节点及sentinel节点下线

    可直接对其进行下线。但是下线后redis依然会对这些下线节点进行监控。这是由redis设计思路决定的。

3、节点的上线

(1)添加从节点

    添加从节点只需在配置文件中添加”slaveof masterip masterport”启动从节点即可,或从节点启动后执行命令”slaveof masterip masterport”即可。

(2)添加sentinel节点

    在sentinel节点配置文件汇总添加相关的配置,直接启动sentinel节点即可。

 

你可能感兴趣的:(nosql)