本文链接:http://www.cnblogs.com/zhenghongxin/p/8885879.html

我们知道redis是有主从复制的,例如下图:

但如果master主进程挂掉之后,没有slave站出来当master,那么整个写redis业务就崩溃了。虽然其他业务可以从从redis上继续读取数据,当主写redis已经崩溃了,势必造成影响。而redis为我们提供了Sentinel来做redis的高可用工具,因此个人觉得实际上redis并不需要像Nginx那样,与keepalived组合成高可用,或者进行集群化操作,用多sentinel与主从即可。当然集群也有着它的好处:构建多节点,节点上的数据都不一样把数据都分散存放到各个节点上进行存储,某个节点的退出依旧有其他节点补充。引用网上的图:

(集群节点)

主从是master或者slave都会备份一份数据,集群是节点共享数据,在中间件模式中,可以使用集群与主从相结合的模式开发。

部署

构建简单的一个sentinel,一个 master redis ,两个slove redis 。

在linux上自建的conf配置目录(/code/redis/conf)下,可以看到四个conf文件:

[root@VM_71_225_centos conf]# ll
-rw-r----- 1 root root 138 Apr 19 19:17 redis-6379.conf
-rw-r--r-- 1 root root 108 Apr 19 19:15 redis-6380.conf
-rw-r--r-- 1 root root  86 Apr 19 19:15 redis-6381.conf
-rw-r--r-- 1 root root 447 Apr 19 19:18 sentinel-26379.conf

分别配置如下:

(这里只是简单的配置版本,实际生产环境中,需要注意主从库的备份机制,备份方式,只读权限,连接密码等细节)

redis-6379.conf   ==>

port
daemonize yes
logfile "6379.log"
dbfilename "dump-6379.rdb"
dir "/tmp/log"

redis-6380.conf  ==>

port
daemonize yes
logfile "6380.log"
dbfilename "dump-6380.rdb"
dir "/tmp/log"
slaveof 127.0.0.1

redis-6381.conf  ==>

port
daemonize yes
logfile "6381.log"
dbfilename "dump-6381.rdb"
dir "/tmp/log"
slaveof 127.0.0.1

sentinel-26379.conf  ==>

port
dir "/tmp/log"
logfile "26379.log" sentinel monitor mymaster 127.0.0.1 # 当前Sentinel节点监控 127.0.0.1:6379 这个主节点 , 1 代表判断主节点失败至少需要2个Sentinel节点节点同意
sentinel down-after-milliseconds mymaster 10000   # 每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过10000毫秒且没有回复,则判定不可达
sentinel failover-timeout mymaster 900000 # 故障转移超时时间

请测试的时候,把注释去掉

启动

启动主从redis

redis-server redis-.conf
redis-server redis-.conf
redis-server redis-.conf

分别查看info replication 信息:

127.0.0.1:> info replication
# Replication
role:master
connected_slaves:
slave0:ip=127.0.0.1,port=,state=online,offset=,lag=
slave1:ip=127.0.0.1,port=,state=online,offset=,lag=
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:
[root@VM_71_225_centos conf]# redis-cli -p
127.0.0.1:> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:
master_link_status:up
master_last_io_seconds_ago:
master_sync_in_progress:
slave_repl_offset:
slave_priority:
slave_read_only:
connected_slaves:
master_repl_offset:
repl_backlog_active:
repl_backlog_size:
repl_backlog_first_byte_offset:
repl_backlog_histlen:

此时,6379为主,其他两个端口为从

启动sentinel

redis-sentinel sentinel-.conf &

查看info信息:

redis-cli -h 127.0.0.1 -p  INFO Sentinel
[root@VM_71_225_centos conf]# redis-cli -h 127.0.0.1 -p  INFO Sentinel
# Sentinel
sentinel_masters:
sentinel_tilt:
sentinel_running_scripts:
sentinel_scripts_queue_length:
sentinel_simulate_failure_flags:
master0:name=mymaster,status=ok,address=127.0.0.1:,slaves=,sentinels=1
//这里可以看到 6379为主,有两个slaves 和一个sentinels ,这也意味着,sentinels是可以多个集群的

如果我们想要多个sentinel集群,方法一致,只是端口不一致而已,其他配置一致。

这样我们将会构成如下的模式:

再看sentinel-26379.conf 的配置,已经被sentinel改写:

port
dir "/tmp/log"
logfile "26379.log" sentinel myid 45ad97bb868a74e2f7ba5cdba7ba723af1095027
sentinel monitor mymaster 127.0.0.1
sentinel down-after-milliseconds mymaster
# Generated by CONFIG REWRITE
sentinel failover-timeout mymaster
sentinel config-epoch mymaster
sentinel leader-epoch mymaster
sentinel known-slave mymaster 127.0.0.1
sentinel known-slave mymaster 127.0.0.1
sentinel current-epoch

模拟master redis 挂掉后

sentinel 自动把其中一个slave拉起作为master,再看sentinel的信息:

[root@VM_71_225_centos conf]# redis-cli -h 127.0.0.1 -p  INFO Sentinel
# Sentinel
sentinel_masters:
sentinel_tilt:
sentinel_running_scripts:
sentinel_scripts_queue_length:
sentinel_simulate_failure_flags:
master0:name=mymaster,status=ok,address=127.0.0.1:,slaves=,sentinels=

已经被sentinel改写

其他命令:

  • sentinel monitor mymaster 127.0.0.1 6379 2

当前Sentinel节点监控 127.0.0.1:6379 这个主节点

2代表判断主节点失败至少需要2个Sentinel节点节点同意

mymaster是主节点的别名

  • sentinel down-after-milliseconds mymaster 30000

每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒且没有回复,则判定不可达

sentinel parallel-syncs mymaster 1

当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1。

  • sentinel failover-timeout mymaster 180000

故障转移超时时间为180000

  • sentinel auth-pass \ \ 

如果Sentinel监控的主节点配置了密码,可以通过sentinel auth-pass配置通过添加主节点的密码,防止Sentinel节点无法对主节点进行监控。

例如:sentinel auth-pass mymaster MySUPER--secret-0123passw0rd

  • sentinel notification-script \ \ 

在故障转移期间,当一些警告级别的Sentinel事件发生(指重要事件,如主观下线,客观下线等)时,会触发对应路径的脚本,想脚本发送相应的事件参数。

例如:sentinel notification-script mymaster /var/redis/notify.sh

  • sentinel client-reconfig-script \ \ 

在故障转移结束后,触发应对路径的脚本,并向脚本发送故障转移结果的参数。

例如:sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

Sentinel 哨兵 实现redis高可用的更多相关文章

  1. sentinel监控redis高可用集群(一)

    一.首先配置redis的主从同步集群. 1.主库的配置文件不用修改,从库的配置文件只需增加一行,说明主库的IP端口.如果需要验证的,也要加多一行,认证密码. slaveof 192.168.20.26 ...

  2. Redis高可用架构

    前言 Redis是一个高性能的key-value数据库,现时越来越多企业与应用使用Redis作为缓存服务器.楼主是一枚JAVA后端程序员,也算是半个运维工程师了.在Linux服务器上搭建Redis,怎 ...

  3. Redis高可用之哨兵模式Sentinel配置与启动(五)

    0.Redis目录结构 1)Redis介绍及部署在CentOS7上(一) 2)Redis指令与数据结构(二) 3)Redis客户端连接以及持久化数据(三) 4)Redis高可用之主从复制实践(四) 5 ...

  4. Redis Sentinel(哨兵)主从高可用方案

    环境搭建 三台服务器: 192.168.126.100(master) 192.168.126.110(slaver) 192.168.126.120(slaver) 拷贝192.168.126.10 ...

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

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

  6. redis主从+ 哨兵模式(sentinel)+漂移VIP实现高可用系统

    原文:https://www.jianshu.com/p/c2ab606b00b7 客户端程序 客户端程序(如PHP程序)连接redis时需要ip和port,但redis-server进行故障转移时, ...

  7. 9.Redis高可用-哨兵

    9.Redis高可用-哨兵9.1 基本概念9.1.1 主从复制的问题9.1.2 高可用9.1.3 Redis Sentinel的高可用性9.2 安装和部署9.2.1 部署拓扑结构9.2.2 部署Red ...

  8. Redis高可用集群-哨兵模式(Redis-Sentinel)搭建配置教程【Windows环境】

    No cross,no crown . 不经历风雨,怎么见彩虹. Redis哨兵模式,用现在流行的话可以说就是一个"哨兵机器人",给"哨兵机器人"进行相应的配置 ...

  9. Redis 高可用之哨兵模式

    参考   : https://mp.weixin.qq.com/s/Z-PyNgiqYrm0ZYg0r6MVeQ 一.redis高可用解决方案 redis主从 优点:1.高可靠性,主从实时备份,有效解 ...

随机推荐

  1. TYVJ 1940 创世纪

    Description: 上帝手中有着 N 种被称作“世界元素”的东西,现在他要把它们中的一部分投放到一个新的空间中去以建造世界.每 种世界元素都可以限制另外一种世界元素,所以说上帝希望所有被投放的世 ...

  2. 1. Install Git and GitExtension

    Install Git Step 1:   Run

  3. break MISSING_BLOCK_LABEL_160; 看源代码出现的,源代码是反编译的

    break MISSING_BLOCK_LABEL_160; FileNotFoundException fnfe; fnfe; out.close(); throw fnfe; in.close() ...

  4. HTML5 history详解

    最近研究vue-router单页转跳而不向服务器请求的原理, 主要是HTML5 history以及hash的应用,支持history时使用history模式 下面详细学习了一下常用的history相关 ...

  5. 关于某一discuz 6.0论坛故障的记录

    某日,额突然发现公司的discuz 6.0论坛在IE6浏览器下面显示出现问题: 每个链接都出现了下划线,很难看,不过已访问的链接(a:visted)却没有下划线,于是怀疑css.htm有问题.于是对c ...

  6. 2018软工项目UML设计(团队)

    团队信息 队名:火箭少男100 本次作业课上成员 短学号 名 本次作业博客链接 2507 俞辛(临时队长) https://www.cnblogs.com/multhree/p/9821080.htm ...

  7. 编译HBase1.0.0-cdh5.4.2版本

    1. 编译环境准备 Jdk:1.7.0_x Maven : 3.3.9 hbase: cdh5.4.2-release 2. 用idea打开项目 使用git clone得到HBase源码.打开git: ...

  8. 2018.10.08 NOIP模拟 序列(主席树)

    传送门 T2防ak题? 其实也不是很难(考试时sb了). 直接变形一下求出区间长度在[l2,r2][l2,r2][l2,r2]之间,中位数≤l1−1\le l1-1≤l1−1的区间数,和区间长度在[l ...

  9. 2018.09.12 hdu2473Junk-Mail Filter(并查集)

    传送门 一开始开题还以为是平衡树. 仔细想了一想并查集就可以了. 合并操作没什么好说的. 删除操作:对于每个点记录一个pos值表示原来的点i现在的下标是什么. 每次删除点i是就新建一个点cnt,然后令 ...

  10. ThinkPHP5 union分页

    直接贴代码,记录一下,备用 $a = Db::name(表名)->field(字段)->where(条件)->buildSql(); $b = Db::name(表名)->fi ...