阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Redis HA方案之sentinel

99次阅读
没有评论

共计 7071 个字符,预计需要花费 18 分钟才能阅读完成。

上一篇研究了 redis 监控(http://www.linuxidc.com/Linux/2014-02/96078.htm),这一篇来分析 redis HA,广泛流传的是 keepalived+redis,这个我在分析时有些问题还没搞明白,下一篇会提到,这一篇主要是研究官方的 sentinel。

IP 10.20.112.26/27

redis-server  2.6.16

官网:http://redis.io/topics/sentinel

sentinel 是一个管理 redis 实例的工具,它可以实现对 redis 的监控、通知、自动故障转移。sentinel 不断的检测 redis 实例是否可以正常工作,通过 API 向其他程序报告 redis 的状态,如果 redis master 不能工作,则会自动启动故障转移进程,将其中的一个 slave 提升为 master,其他的 slave 重新设置新的 master 服务器。

sentinel 是一个分布式系统,在源码包的 src 目录下会有 redis-sentinel 命令,其实比较其和 redis-server 命令的 md5sum 值,发现是一样的,你可以在多台机器上部署 sentinel 进程,共同监控 redis 实例。

redis sentinel    10.20.112.26:26379
redis master      10.20.112.26:6379
redis slave      10.20.112.26:6380
redis slave      10.20.112.27:6379
redis slave      10.20.112.27:6380

部署 10.20.112.26,所有 redis 配置文件在 /etc/redis/

redis_6379.conf

daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile /var/log/redis_6379.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump_6379.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

redis_6380.conf

### 配置和 redis_6379.conf 大部分一致,只要修改如下几行
pidfile /var/run/redis_6380.pid
port 6380
logfile /var/log/redis_6380.log
dbfilename dump_6380.rdb

sentinel.conf

port 26379
sentinel monitor mymaster 0.0.0.0 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel can-failover mymaster yes
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 900000

部署完毕后,启动 redis 实例,三个配置文件中 sentinel.conf 的配置文件大家不常见,不过里面内容比较少,解释起来很方便,在文章最后面有解释。

部署 10.20.112.27

在 27 上面同样部署 redis_6379.conf 和 redis_6380.conf,方法同 26 一样,可以在 27 上部署 sentinel,也可以不用部署 sentinel,我选择没有部署 sentinel。

在 10.20.112.26/27 上分别执行如下命令:

###10.20.112.26
# 终端 1
redis-cli -p 6379

# 终端 2
redis-cli -p 6380
  SLAVEOF 10.20.112.26 6379

###10.20.112.27
# 终端 1
redis-cli -p 6379
  SLAVEOF 10.20.112.26 6379
# 终端 2
redis-cli -p 6380
  SLAVEOF 10.20.112.26 6379

 

Redis 的详细介绍 :请点这里
Redis 的下载地址 :请点这里

推荐阅读:

Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

在 26 上执行如下命令:

redis-cli -p 6379 INFO Replication

效果如下:

Redis HA 方案之 sentinel

可以看到有三台 slave 连接上来。

在 27 上执行如下命令:

redis-cli -p 6379 INFO Replication

redis-cli -p 6380 INFO Replication

效果如下:

Redis HA 方案之 sentinel

可以看到他们的 master 都是 26 的 6379

在 26 上启动 sentinel

redis-server sentinel.conf –sentinel

效果如下:

Redis HA 方案之 sentinel

执行如下命令,查看 master 信息:

redis-cli -h 10.20.112.26 -p 26379 info sentinel

效果如下:

Redis HA 方案之 sentinel

可以看到 master 的信息及状态。

开始模拟 redis master 故障,在 26 上执行如下命令:

redis-cli -p 6379 shutdown

sentinel 日志如下:

Redis HA 方案之 sentinel

在 27 上执行以下命令:

redis-cli -p 6379 info Replication

redis-cli -p 6380 info Replication

结果如下:

Redis HA 方案之 sentinel

可以看到 sentinel 选择 10.20.112.27 的 6380 为新的 redis master。而且其他 redis slave 已经链接到新的 master 上面了

上一篇研究了 redis 监控(http://www.linuxidc.com/Linux/2014-02/96078.htm),这一篇来分析 redis HA,广泛流传的是 keepalived+redis,这个我在分析时有些问题还没搞明白,下一篇会提到,这一篇主要是研究官方的 sentinel。

IP 10.20.112.26/27

redis-server  2.6.16

官网:http://redis.io/topics/sentinel

sentinel 是一个管理 redis 实例的工具,它可以实现对 redis 的监控、通知、自动故障转移。sentinel 不断的检测 redis 实例是否可以正常工作,通过 API 向其他程序报告 redis 的状态,如果 redis master 不能工作,则会自动启动故障转移进程,将其中的一个 slave 提升为 master,其他的 slave 重新设置新的 master 服务器。

sentinel 是一个分布式系统,在源码包的 src 目录下会有 redis-sentinel 命令,其实比较其和 redis-server 命令的 md5sum 值,发现是一样的,你可以在多台机器上部署 sentinel 进程,共同监控 redis 实例。

redis sentinel    10.20.112.26:26379
redis master      10.20.112.26:6379
redis slave      10.20.112.26:6380
redis slave      10.20.112.27:6379
redis slave      10.20.112.27:6380

部署 10.20.112.26,所有 redis 配置文件在 /etc/redis/

redis_6379.conf

daemonize yes
pidfile /var/run/redis_6379.pid
port 6379
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile /var/log/redis_6379.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump_6379.rdb
dir ./
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
lua-time-limit 5000
slowlog-log-slower-than 10000
slowlog-max-len 128
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-entries 512
list-max-ziplist-value 64
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit slave 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
aof-rewrite-incremental-fsync yes

redis_6380.conf

### 配置和 redis_6379.conf 大部分一致,只要修改如下几行
pidfile /var/run/redis_6380.pid
port 6380
logfile /var/log/redis_6380.log
dbfilename dump_6380.rdb

sentinel.conf

port 26379
sentinel monitor mymaster 0.0.0.0 6379 1
sentinel down-after-milliseconds mymaster 30000
sentinel can-failover mymaster yes
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 900000

部署完毕后,启动 redis 实例,三个配置文件中 sentinel.conf 的配置文件大家不常见,不过里面内容比较少,解释起来很方便,在文章最后面有解释。

部署 10.20.112.27

在 27 上面同样部署 redis_6379.conf 和 redis_6380.conf,方法同 26 一样,可以在 27 上部署 sentinel,也可以不用部署 sentinel,我选择没有部署 sentinel。

在 10.20.112.26/27 上分别执行如下命令:

###10.20.112.26
# 终端 1
redis-cli -p 6379

# 终端 2
redis-cli -p 6380
  SLAVEOF 10.20.112.26 6379

###10.20.112.27
# 终端 1
redis-cli -p 6379
  SLAVEOF 10.20.112.26 6379
# 终端 2
redis-cli -p 6380
  SLAVEOF 10.20.112.26 6379

 

Redis 的详细介绍 :请点这里
Redis 的下载地址 :请点这里

推荐阅读:

Redis 集群明细文档 http://www.linuxidc.com/Linux/2013-09/90118.htm

Ubuntu 12.10 下安装 Redis(图文详解)+ Jedis 连接 Redis http://www.linuxidc.com/Linux/2013-06/85816.htm

Redis 系列 - 安装部署维护篇 http://www.linuxidc.com/Linux/2012-12/75627.htm

CentOS 6.3 安装 Redis http://www.linuxidc.com/Linux/2012-12/75314.htm

Redis 配置文件 redis.conf 详解 http://www.linuxidc.com/Linux/2013-11/92524.htm

下面我们接着恢复 26 上面的 6379 redis,这时候 27 的 6380 是 master,26 的 6380 和 27 的 6379 作为 slave 链接到 master 上面。26 执行如下命令:

redis-server redis_6379.conf

sentinel 日志如下:

Redis HA 方案之 sentinel

这时候我们在 27 上看看 6379 和 6380 的信息:

redis-cli -p 6379 info Replication

redis-cli -p 6380 info Replication

效果如下:

Redis HA 方案之 sentinel

可以看到新恢复的 26 的 6379 并没有恢复到 master,而是作为新的 slave 链接到现有的 master 上面。

sentinel.conf 详解

#sentinel 实例监听的端口
port 26379

# 告诉 sentinel 监控这个名为 mymaster 的 master,它的监听地址是 127.0.0.1,并且设置 failing sentinel 为 2,表示当有 2 台 sentinel 探测到该实例失败时,该实例进入 O_DOWN 状态。
sentinel monitor mymaster 127.0.0.1 6379 2

#redis 实例多少毫秒不可达 sentinel,sentinel 则认为该实例的状态转变为 S_DOWN,但是这个状态还不足以启动 automatic failover 机制。只有足够多的实例认为该实例是 S_DOWN 状态,这时该实例进入 O_DOWN 状态,
sentinel down-after-milliseconds mymaster 30000

# 在 sentinel 检测到 O_DOWN 后,是否对这台 redis 启动 failover 机制
sentinel can-failover mymaster yes

# 在 failover 时,我们可以设置允许多少 slave 同时可以连接新的 master。该值越低,完成 failover 的进程花费的时间越多,如果对从数据要求不是很及时,你可能不需要所有的从在同一时间同步到新的主(同步到新主,意味着数据重传),你确定在宕机时只有一个从可达则设置为 1(如果这样的话其它的从还能用老的数据来干活
sentinel parallel-syncs mymaster 1

# 设置 failover 的超时时间是多少毫秒
sentinel failover-timeout mymaster 900000

 

redis sentinel 在监控 redis 实例时有两种 redis 宕机状态 S_DOWN 和 O_DOWN:

S_DOWN: 当 sentinel 在指定的超时时间内没有收到一个正确的 ping 回复值,则认为是 S_DOWN

O_DOWN:O_DOWN 的条件是有足够多的 sentinel 认为该 redis 实例是 S_DOWN。

注意:O_DOWN 只能是发生在主服务器,sentinel 和其他从服务器不会发生 O_DOWN

上面只是简单的试用,sentinel 还没合并进稳定版本中,大家可以尝试试用。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-20发表,共计7071字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中