Redis容灾部署(哨兵Sentinel)

哨兵的作用

1. 监控:监控主从是否正常
2. 通知:出现问题时,可以通知相关人员
3. 故障迁移:自动主从切换
4. 统一的配置管理:连接者询问sentinel取得主从的地址

Raft分布式算法

1. 主要用途:用于分布式系统,系统容错,以及选出领头羊
2. 作者:Diego Ongaro,毕业于哈佛
3. 目前用到这个算法的项目有:

a. CoreOS : 见下面

b. ectd : a distributed, consistent shared configuration

c. LogCabin : 分布式存储系统

d. redis sentinel : redis 的监控系统

Sentinel使用的Raft算法核心: 原则

1. 所有sentinel都有选举的领头羊的权利
2. 每个sentinel都会要求其他sentinel选举自己为领头羊(主要由发现redis客观下线的sentinel先发起选举)
3. 每个sentinel只有一次选举的机会
4. 采用先到先得的原则
5. 一旦加入到系统了,则不会自动清除(这一点很重要, why?)
6. 每个sentinel都有唯一的uid,不会因为重启而变更
7. 达到领头羊的条件是 N/2 + 1个sentinel选择了自己
8. 采用配置纪元,如果一次选举出现脑裂,则配置纪元会递增,进入下一次选举,所有sentinel都会处于统一配置纪元,以最新的为标准。

Raft算法核心: 可视图

Raft Visualization (算法演示)

Raft分布式算法的应用

coreos:云计算新星 Docker 正在以火箭般的速度发展,与它相关的生态圈也渐入佳境,CoreOS 就是其中之一。CoreOS 是一个全新的、面向数据中心设计的 Linux 操作系统,在2014年7月发布了首个稳定版本,目前已经完成了800万美元的A轮融资。

Sentinel实现Redis容灾部署

三哨兵架构

[root@rocket sentinel]# tree

.

├── redis-cli

├── redis-sentinel

├── redis-server

├── sentinel1

│  ├── sentinel1.conf

│  └── sentinel1.log

├── sentinel2

│  ├── sentinel2.conf

│  └── sentinel2.log

└── sentinel3

├── sentinel3.conf

└── sentinel3.log

哨兵一配置sentinel1.conf
 
# Example sentinel.conf

# port <sentinel-port>
port 26371 # 守护进程模式
daemonize yes # 指明日志文件名
logfile "./sentinel1.log" # 工作路径,sentinel一般指定/tmp比较简单
dir ./ # 哨兵监控这个master,在至少quorum个哨兵实例都认为master down后把master标记为odown
# (objective down客观down;相对应的存在sdown,subjective down,主观down)状态。
# slaves是自动发现,所以你没必要明确指定slaves。
sentinel monitor TestMaster 127.0.0.1 7003 1 # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds TestMaster 1500 # 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout TestMaster 10000 # 设置master和slaves验证密码
sentinel auth-pass TestMaster 0234kz9*l sentinel config-epoch TestMaster 15
sentinel leader-epoch TestMaster 8394 # #除了当前哨兵, 还有哪些在监控这个master的哨兵
sentinel known-sentinel TestMaster 127.0.0.1 26372 0aca3a57038e2907c8a07be2b3c0d15171e44da5
sentinel known-sentinel TestMaster 127.0.0.1 26373 ac1ef015411583d4b9f3d81cee830060b2f29862 sentinel current-epoch 8394
 
哨兵二配置sentinel2.conf
 
# Example sentinel.conf

# port <sentinel-port>
port 26372 # 守护进程模式
daemonize yes # 指明日志文件名
logfile "./sentinel2.log" # 工作路径,sentinel一般指定/tmp比较简单
dir ./ # 哨兵监控这个master,在至少quorum个哨兵实例都认为master down后把master标记为odown
# (objective down客观down;相对应的存在sdown,subjective down,主观down)状态。
# slaves是自动发现,所以你没必要明确指定slaves。
sentinel monitor TestMaster 127.0.0.1 7003 1 # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds TestMaster 1500 # 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout TestMaster 10000 # 设置master和slaves验证密码
sentinel auth-pass TestMaster 0234kz9*l sentinel config-epoch TestMaster 15
sentinel leader-epoch TestMaster 8394 # #除了当前哨兵, 还有哪些在监控这个master的哨兵
sentinel known-sentinel TestMaster 127.0.0.1 26371 b780bbc20fdea6d3789637053600c5fc58dd0690
sentinel known-sentinel TestMaster 127.0.0.1 26373 ac1ef015411583d4b9f3d81cee830060b2f29862 sentinel current-epoch 8394
 
哨兵三配置sentinel3.conf
 
# Example sentinel.conf

# port <sentinel-port>
port 26373 # 守护进程模式
daemonize yes # 指明日志文件名
logfile "./sentinel3.log" # 工作路径,sentinel一般指定/tmp比较简单
dir ./ # 哨兵监控这个master,在至少quorum个哨兵实例都认为master down后把master标记为odown
# (objective down客观down;相对应的存在sdown,subjective down,主观down)状态。
# slaves是自动发现,所以你没必要明确指定slaves。
sentinel monitor TestMaster 127.0.0.1 7003 1 # master或slave多长时间(默认30秒)不能使用后标记为s_down状态。
sentinel down-after-milliseconds TestMaster 1500 # 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout TestMaster 10000 # 设置master和slaves验证密码
sentinel auth-pass TestMaster 0234kz9*l sentinel config-epoch TestMaster 15
sentinel leader-epoch TestMaster 8394 # #除了当前哨兵, 还有哪些在监控这个master的哨兵
sentinel known-sentinel TestMaster 127.0.0.1 26371 b780bbc20fdea6d3789637053600c5fc58dd0690
sentinel known-sentinel TestMaster 127.0.0.1 26372 0aca3a57038e2907c8a07be2b3c0d15171e44da5 sentinel current-epoch 8394
 
在sentinel中查看所监控的master和slave

[root@rocket sentinel]# ./redis-cli -p 26371

127.0.0.1:26371> SENTINEL masters

1)  1) "name"

2) "TestMaster"

3) "ip"

4) "127.0.0.1"

5) "port"

6) "7003"

7) "runid"

8) "de0896e3799706bda49cb92048776e233841e25d"

9) "flags"

10) "master"

127.0.0.1:26371> SENTINEL slaves TestMaster

1)  1) "name"

2) "127.0.0.1:8003"

3) "ip"

4) "127.0.0.1"

5) "port"

6) "8003"

7) "runid"

8) "9b2a75596c828d6d605cc8529e96edcf951de25d"

9) "flags"

10) "slave"

查看当前的master

127.0.0.1:26371> SENTINEL get-master-addr-by-name TestMaster

1) "127.0.0.1"

2) "7003"

停掉master,查看容灾切换情况

[root@rocket master]# ps axu|grep redis

root      24000  0.2  0.9 137356  9556 ?        Ssl  Jan12  0:30 ./redis-server *:7003

root      24240  0.2  0.7 137356  7504 ?        Ssl  Jan12  0:26 ./redis-server *:8003

root      24873  0.3  0.7 137356  7524 ?        Ssl  01:31  0:25 ../redis-sentinel *:26371

root      24971  0.3  0.7 137356  7524 ?        Ssl  01:33  0:25 ../redis-sentinel *:26372

root      24981  0.3  0.7 137356  7520 ?        Ssl  01:33  0:25 ../redis-sentinel *:26373

root      24995  0.0  0.5  19404  5080 pts/2    S+  01:34  0:00 ./redis-cli -p 26371

root      25969  0.0  0.0 103252  844 pts/0    S+  03:33  0:00 grep redis

[root@rocket master]# kill -QUIT 24000

再查看master,发现已经master已经切换为原来的slave

127.0.0.1:26371> SENTINEL get-master-addr-by-name TestMaster

1) "127.0.0.1"

2) "8003"

查看sentinel日志

启动原来的master,发现变成了slave

[root@rocket master]# ./redis-server ./redis.conf

127.0.0.1:26371> SENTINEL slaves TestMaster

1)  1) "name"

2) "127.0.0.1:7003"

3) "ip"

4) "127.0.0.1"

5) "port"

6) "7003"

发现主从发生了对调。

sentinel自动发现

每个Sentinel 都订阅了被它监视的所有主服务器和从服务器的__sentinel__:hello 频道,查找之前未出现过的sentinel(looking for unknown sentinels)。当一个Sentinel 发现一个新的Sentinel 时,它会将新的Sentinel 添加到一个列表中,这个列表保存了Sentinel 已知的,监视同一个主服务器的所有其他Sentinel。

127.0.0.1:7003[1]> SUBSCRIBE __sentinel__:hello

Reading messages... (press Ctrl-C to quit)

1) "subscribe"

2) "__sentinel__:hello"

3) (integer) 1

1) "message"

2) "__sentinel__:hello"

3) "127.0.0.1,26373,7d919ccfb5752caf6812da2d0dba4ed0a528ceda,8436,TestMaster,127.0.0.1,7003,8436"

1) "message"

2) "__sentinel__:hello"

3) "127.0.0.1,26372,9eda79e93e6d1aa4541564ac28e3dc899d39e43b,8436,TestMaster,127.0.0.1,7003,8436"

1) "message"

2) "__sentinel__:hello"

3) "127.0.0.1,26371,8d63bebfbca9e1205a43bc13b52079de6015758e,8436,TestMaster,127.0.0.1,7003,8436"

Redis容灾部署(哨兵Sentinel)的更多相关文章

  1. redis主从集群搭建及容灾部署(哨兵sentinel)

    Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 Redis安装 整体架构 Redis主从结构搭建 Redis容灾部署(哨兵sentinel) Redis常见问题 ...

  2. 主从集群搭建及容灾部署redis

    redis主从集群搭建及容灾部署(哨兵sentinel) Redis也用了一段时间了,记录一下相关集群搭建及配置详解,方便后续使用查阅. 提纲 l  Redis安装 l  整体架构 l  Redis主 ...

  3. 四、针对redis容灾切换导致"脑裂"的情况

    网上参考到别人博客说,redis容灾切换的时候,有几率出现脑裂的情况. 什么是脑裂: sentinel判断master宕机,切换slave为新master的过程中,业务数据还在持续往原master写入 ...

  4. 【转载】redis容灾策略

    版权声明:转载请注明出处 http://blog.csdn.net/irean_lau. https://blog.csdn.net/Irean_Lau/article/details/5136027 ...

  5. Redis(十五):哨兵Sentinel

    Redis哨兵 Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel 会不断地检查你 ...

  6. redis单点、redis主从、redis哨兵sentinel,redis集群cluster配置搭建与使用

    目录 redis单点.redis主从.redis哨兵 sentinel,redis集群cluster配置搭建与使用 1 .redis 安装及配置 1.1 redis 单点 1.1.2 在命令窗口操作r ...

  7. redis集群之哨兵模式【原】

    redis集群之哨兵(sentinel)模式 哨兵模式理想状态 需要>=3个redis服务,>=3个redis哨兵,每个redis服务搭配一个哨兵. 本例以3个redis服务为例: 一开始 ...

  8. 五、redis哨兵两套环境同一局域网容灾切换问题

    上周遇到个灵异事件,实验室有两套环境来搭建redis集群和哨兵,分别是: 第一套环境IP:67(master) 65(salve) 66(salve)第二套环境IP:115(master) 116(s ...

  9. (六) Docker 部署 Redis 高可用集群 (sentinel 哨兵模式)

    参考并感谢 官方文档 https://hub.docker.com/_/redis GitHub https://github.com/antirez/redis happyJared https:/ ...

随机推荐

  1. MapReduce 计算模型

    前言 本文讲解Hadoop中的编程及计算模型MapReduce,并将给出在MapReduce模型下编程的基本套路. 模型架构 在Hadoop中,用于执行计算任务(MapReduce任务)的机器有两个角 ...

  2. NetCDF 格式化数据概述

    前言 马上要开始新的项目了.气象局方面要求处理的数据是 NetCDF 格式的,这是一种封装好了的数据结构,需要连接一些库,调用特定的 API 进行操作. 可这方面我知之甚少,遂利用周日上午的时间学习这 ...

  3. 带同时滚动小色条的banner轮播图jq

    <div class="baoliao tongcheng"> <p class="headline1">同城<font>活 ...

  4. 在web.xml中配置error-page

    在web.xml中配置error-page 在web.xml中有两种配置error-page的方法,一是通过错误码来配置,而是通过异常的类型来配置,分别举例如下: 一.   通过错误码来配置error ...

  5. Codeforces Round #136 (Div. 2)

    A. Little Elephant and Function 逆推. B. Little Elephant and Numbers \(O(\sqrt n)\)枚举约数. C. Little Ele ...

  6. POJ3352 Road Construction(边双连通分量)

                                                                                                         ...

  7. android中的DatePicker与TimePicker

    1.布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  8. UVALive-4670 Dominating Patterns(AC自动机)

    题目大意:找出出现次数最多的模式串. 题目分析:AC自动机裸题. 代码如下: # include<iostream> # include<cstdio> # include&l ...

  9. flash全屏输入模式

    params.allowscriptaccess = "sameDomain"; params.allowfullscreen = "true"; params ...

  10. (转) Reinforcement Learning for Profit

    Reinforcement Learning for Profit July 17, 2016 Is RL being used in revenue generating systems today ...