[redis] linux下哨兵篇(3)
一.前言
1.为何部署sentinel哨兵
前文redis主从架构中,当主服务故障时,需要手动将从服务切换为主服务,sentinel服务就是将这个过程自动化。
主要功能有:
1)不时监控主从服务正常运行
2)可以通过脚本、API接口发出报警
3)自动故障迁移
当然sentinel不止以上这些,更多的功能参考https://redis.io/topics/sentinel
二.redis部署sentinel
1.环境说明
系统基于CentOS-6.7-x86_64-minimal.iso
源码安装包redis-3.2.4版本,sentinel功能2.8版本开始支持
192.168.56.101 host101
192.168.56.102 host102
192.168.56.103 host103 master 192.168.56.101:6379
slave1 192.168.56.102:6379
slave2 192.168.56.103:6379
sentinel1 192.168.56.101:26379
sentinel2 192.168.56.102:26379
sentinel3 192.168.56.103:26379
2.redis配置
#master端配置
#复制一份默认的配置文件再修改以下个地方
[root@host101 ~]# cp /usr/local/src/redis-3.2.4/redis.conf /etc/redis/6379.conf
[root@host101 ~]# vim /etc/redis/6379.conf
bind 0.0.0.0 #监控地址
daemonize yes #dameon形式运行
pidfile /var/run/redis_6379.pid #pid文件
logfile "/var/log/redis_6379.log" #启动日志
dbfilename dump.rdb #数据文件
dir /var/lib/redis #数据目录
requirepass mima #配置连接密码 #slave1端配置
[root@host102 ~]# vim /etc/redis/6379.conf
bind 0.0.0.0 #监控地址
daemonize yes #dameon形式运行
pidfile /var/run/redis_6379.pid #pid文件
logfile "/var/log/redis_6379.log" #启动日志
dbfilename dump.rdb #数据文件
dir /var/lib/redis #数据目录
requirepass mima #配置连接密码
slaveof 192.168.56.101 6379 #指定master
masterauth mima #slave认证master密码
slave-read-only yes #设置slave为只读模式 #slave2端配置
[root@host103 ~]# vim /etc/redis/6379.conf
bind 0.0.0.0 #监控地址
daemonize yes #dameon形式运行
pidfile /var/run/redis_6379.pid #pid文件
logfile "/var/log/redis_6379.log" #启动日志
dbfilename dump.rdb #数据文件
dir /var/lib/redis #数据目录
requirepass mima #配置连接密码
slaveof 192.168.56.101 6379 #指定master
masterauth mima #slave认证master密码
slave-read-only yes #设置slave为只读模式
3.启动redis并查看主从状态
#启动redis服务,三台都操作
[root@host101 redis]# /usr/local/redis/bin/redis-server /etc/redis/6379.conf #查看主从状态
[root@host101 redis]# /usr/local/redis/bin/redis-cli -a mima
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.56.102,port=6379,state=online,offset=15,lag=0
slave1:ip=192.168.56.103,port=6379,state=online,offset=15,lag=1
master_repl_offset:15
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:14 #测试读写
[root@host101 redis]# /usr/local/redis/bin/redis-cli -a mima
127.0.0.1:6379> set name marry
OK
127.0.0.1:6379> get name
"marry"
127.0.0.1:6379> exit
[root@host101 redis]# /usr/local/redis/bin/redis-cli -h 192.168.56.103 -a mima
192.168.56.103:6379> get name
"marry"
192.168.56.103:6379> set name marry3
(error) READONLY You can't write against a read only slave.
192.168.56.103:6379> exit
[root@host101 redis]# /usr/local/redis/bin/redis-cli -h 192.168.56.102 -a mima
192.168.56.102:6379> info replication
# Replication
role:slave
master_host:192.168.56.101
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:537
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
4.配置sentinel并启动
#三台都修改为以下同样配置
[root@host101 ~]# grep -Ev "^$|#" /usr/local/src/redis-3.2.4/sentinel.conf > /etc/redis/sentinel.conf
[root@host101 ~]# vim /etc/redis/sentinel.conf
port 26379 #sentinel监听端口
daemonize yes #以daemon形式运行在后台
logfile /var/log/sentinel.log #日志文件
dir /tmp
sentinel monitor mymaster 192.168.56.101 6379 2 #监控mymaster组,master地址,端口,quorum次数
sentinel down-after-milliseconds mymaster 5000 #5000毫秒即5秒连续不能连通master,认为master挂掉
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 60000 #故障切换超时时间
sentinel auth-pass mymaster mima #密码认证
protected-mode no #默认情况下sentinel只监听环回地址,这样就导致sentinel之间不能通信,可以改为监听网卡或者关闭protected-mode #三台都启动
[root@host101 ~]# /usr/local/redis/bin/redis-sentinel /etc/redis/sentinel.conf #查看sentinel启动日志
#正常情况下可以看到+sentinel-address-switch字样
[root@host101 ~]# more /var/log/sentinel.log
24470:X 08 Dec 10:53:12.205 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.2.4 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in sentinel mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 26379
| `-._ `._ / _.-' | PID: 24470
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-' 24470:X 08 Dec 10:53:12.206 # Sentinel ID is 106e22fad7ad280b2c38542c164f7060b6587d68
24470:X 08 Dec 10:53:12.206 # +monitor master mymaster 192.168.56.101 6379 quorum 2
24470:X 08 Dec 10:53:14.321 * +sentinel-address-switch master mymaster 192.168.56.101 6379 ip 192.168.56.102 port 26379 for fae94df5596af315af0f5f97fe7ade3fad0b8a98
24470:X 08 Dec 10:53:14.336 * +sentinel-address-switch master mymaster 192.168.56.101 6379 ip 192.168.56.103 port 26379 for 8ea722390cabf3ad304b20f8cc42157603d21d84 #需要注意的地方,一旦启动sentinel服务后,服务会自动修改sentinel配置文件/etc/redis/sentinel.conf
[root@host101 ~]# cat /etc/redis/sentinel.conf
port 26379
daemonize yes
dir "/tmp"
logfile "/var/log/sentinel.log"
sentinel myid 106e22fad7ad280b2c38542c164f7060b6587d68
sentinel monitor mymaster 192.168.56.101 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000
sentinel auth-pass mymaster mima
protected-mode no
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-slave mymaster 192.168.56.102 6379
sentinel known-slave mymaster 192.168.56.103 6379
sentinel known-sentinel mymaster 192.168.56.103 26379 8ea722390cabf3ad304b20f8cc42157603d21d84
sentinel known-sentinel mymaster 192.168.56.102 26379 fae94df5596af315af0f5f97fe7ade3fad0b8a98
sentinel current-epoch 0
4.详细介绍以上几个参数的用途
sentinel monitor mymaster 192.168.56.101 6379 2
4.1这一行代表sentinel监控的master的名字叫做mymaster,地址为192.168.56.101:6379,行尾最后的一个2代表什么意思呢?我们知道,网络是不可靠的,有时候一个sentinel会因为网络堵塞而误以为一个master redis已经死掉了,当sentinel集群式,解决这个问题的方法就变得很简单,只需要多个sentinel互相沟通来确认某个master是否真的死了,这个2代表,当集群中有2个sentinel认为master死了时,才能真正认为该master已经不可用了。(sentinel集群中各个sentinel也有互相通信,通过gossip协议)。
sentinel down-after-milliseconds mymaster 5000
4.2sentinel会向master发送心跳PING来确认master是否存活,如果master在“一定时间范围”内不回应PONG 或者是回复了一个错误消息,那么这个sentinel会主观地(单方面地)认为这个master已经不可用了(subjectively down, 也简称为SDOWN)。而这个down-after-milliseconds就是用来指定这个“一定时间范围”的,单位是毫秒。
不过需要注意的是,这个时候sentinel并不会马上进行failover主备切换,这个sentinel还需要参考sentinel集群中其他sentinel的意见,如果超过某个数量的sentinel也主观地认为该master死了,那么这个master就会被客观地(注意哦,这次不是主观,是客观,与刚才的subjectively down相对,这次是objectively down,简称为ODOWN)认为已经死了。需要一起做出决定的sentinel数量在上一条配置中进行配置。
sentinel failover-timeout mymaster 60000
4.3failover过期时间,当failover开始后,在此时间内仍然没有触发任何failover操作,当前sentinel将会认为此次failoer失败。
5.测试故障转移
#任意sentinel节点,查看状态
[root@host101 ~]# /usr/local/redis/bin/redis-cli -p 26379
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.56.101:6379,slaves=2,sentinels=3 #slave监听sentinel日志
[root@host102 redis]# tail -f /var/log/sentinel.log #master杀掉redis-server进程
[root@host101 ~]# killall redis-server #slave监听sentinel日志,大概5秒后刷出日志
[root@host102 redis]# tail -f /var/log/sentinel.log
6711:X 08 Dec 11:16:15.164 # +sdown master mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:15.223 # +odown master mymaster 192.168.56.101 6379 #quorum 2/2
6711:X 08 Dec 11:16:15.224 # +new-epoch 1
6711:X 08 Dec 11:16:15.224 # +try-failover master mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:15.226 # +vote-for-leader fae94df5596af315af0f5f97fe7ade3fad0b8a98 1
6711:X 08 Dec 11:16:15.232 # 8ea722390cabf3ad304b20f8cc42157603d21d84 voted for fae94df5596af315af0f5f97fe7ade3fad0b8a98 1
6711:X 08 Dec 11:16:15.232 # 106e22fad7ad280b2c38542c164f7060b6587d68 voted for fae94df5596af315af0f5f97fe7ade3fad0b8a98 1
6711:X 08 Dec 11:16:15.293 # +elected-leader master mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:15.293 # +failover-state-select-slave master mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:15.346 # +selected-slave slave 192.168.56.102:6379 192.168.56.102 6379 @ mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:15.346 * +failover-state-send-slaveof-noone slave 192.168.56.102:6379 192.168.56.102 6379 @ mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:15.447 * +failover-state-wait-promotion slave 192.168.56.102:6379 192.168.56.102 6379 @ mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:16.273 # +promoted-slave slave 192.168.56.102:6379 192.168.56.102 6379 @ mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:16.273 # +failover-state-reconf-slaves master mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:16.333 * +slave-reconf-sent slave 192.168.56.103:6379 192.168.56.103 6379 @ mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:17.283 * +slave-reconf-inprog slave 192.168.56.103:6379 192.168.56.103 6379 @ mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:17.283 * +slave-reconf-done slave 192.168.56.103:6379 192.168.56.103 6379 @ mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:17.358 # -odown master mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:17.358 # +failover-end master mymaster 192.168.56.101 6379
6711:X 08 Dec 11:16:17.358 # +switch-master mymaster 192.168.56.101 6379 192.168.56.102 6379
6711:X 08 Dec 11:16:17.358 * +slave slave 192.168.56.103:6379 192.168.56.103 6379 @ mymaster 192.168.56.102 6379
6711:X 08 Dec 11:16:17.358 * +slave slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.102 6379
6711:X 08 Dec 11:16:22.402 # +sdown slave 192.168.56.101:6379 192.168.56.101 6379 @ mymaster 192.168.56.102 6379 #再次查看sentinel状态,可以看到master节点已变为原192.168.56.102:6379
[root@host101 ~]# /usr/local/redis/bin/redis-cli -p 26379
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.56.102:6379,slaves=2,sentinels=3
6.恢复原master192.168.56.101:3679
#添加redis-server认证密码,因为一开始原master并没有配置这个选项,启动服务
[root@host101 ~]# echo "masterauth mima" >> /etc/redis/6379.conf
[root@host101 ~]# /usr/local/redis/bin/redis-server /etc/redis/6379.conf #检查sentinel日志,检查replication状态,测试读写
总结:sentinel只是实现的redis的高可用,并没有实现前端服务的高可用。
1,keepalived:通过keepalived的虚拟IP,提供主从的统一访问,在主出现问题时,通过keepalived运行脚本将从提升为主,待主恢复后先同步后自动变为主,该方案的好处是主从切换后,应用程序不需要知道(因为访问的虚拟IP不变),坏处是引入keepalived增加部署复杂性, 而且keepalived的应用场景有限,比如它的核心协议VRRP只能工作在局域网内,不能工作在局域网外(网间、广域网),而且在网络不受自己控制时基本不能用,除非设定好的VIP是供局域网使用;
2,zookeeper:通过zookeeper来监控主从实例,维护最新有效的IP,应用通过zookeeper取得IP,对Redis进行访问;
3,sentinel:通过Sentinel监控主从实例,自动进行故障恢复,该方案有个缺陷:因为主从实例地址(IP PORT)是不同的,当故障发生进行主从切换后,应用程序无法知道新地址,故在Jedis2.2.2中新增了对Sentinel的支持,应用通过redis.clients.jedis.JedisSentinelPool.getResource()取得的Jedis实例会及时更新到新的主实例地址。
[redis] linux下哨兵篇(3)的更多相关文章
- [redis] linux下主从篇(2)
一.前言1.为何要主从架构避免单机故障,主服务器挂掉后,还可以手动切换从服务为主服务继续工作,保持缓存数据完整. 2.主从同步的原理步骤从服务器连接主服务器,发送SYNC命令:主服务器接收到SYNC命 ...
- [redis] linux下安装篇(1)
一.redis是什么redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...
- redis linux下的开机启动
redis linux下的环境搭建 http://www.cnblogs.com/zsg88/p/8321644.html 安装完redis-4.0.1后设置linux开机自启动. 1.在re ...
- Redis linux 下安装
Redis linux 下安装 下载Redis安装包,可以从Redis中文网站中下载 下载地址:http://www.redis.cn/download.html Redis4.0 稳定版本 使用&l ...
- 信步漫谈之Redis—Linux下环境搭建
一.环境 Linux 系统:Suse11(SLES-11-SP3-DVD-x86_64-GM-DVD1)Redis 安装包:redis-4.0.11.tar.gz 下载地址:http://d ...
- php使用redis扩展以及安装redis(linux下)
一,安装redis 1,下载redis包:wget http://download.redis.io/releases/redis-2.8.9.tar.gz 2,解压redis包后,进入redis-2 ...
- Redis linux 下安装 及扩展配置
1.首先在/usr/local/ 创建文件夹 reids Cd /usr/local/ mkdir redis 2.把redis安装包放在redis目录下面进行解压phpredis-2.2.4.tar ...
- redis linux下的环境搭建
系统 CentOS7 Redis 官网下载 https://redis.io/download 1.下载解压 [root@TestServer-DFJR programs]# /usr/loca ...
- Linux下Redis安装使用,主从模式,哨兵模式与PHP扩展(PHP7适用)
一,软件准备 #redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz #phpredis 非php7使用 下载后文件名为:ph ...
随机推荐
- iOS 数据安全、数据加密传输
近期接到一个新需求:APP企业版需要接入热更新功能. 热更新需要下发补丁脚本, 脚本下发过程中需要保证脚本传输安全,且需要避免中间人攻击. 需要用到数据加密传输方面的知识,以下是我设计的加密解密流程: ...
- to meet you
1:Java特性 (1)平台无关性 一次编译到处运行 (2)GC 垃圾回收机制 (3)语言特性 泛型-反射机制-lambda表达式 (4)面向对象 面向对象语言-三大特性(封装,继承,多态) (5)类 ...
- Sppring MVC核心应用-2
一.Spring MVC框架中400状态码的请求错误:控制台BindException异常, 解决方法: 二.Sping 表单标签 三.数据校验 实现JSR 303验证步骤 四.REST风格 五.Sp ...
- Mac配置PHP+Nginx+MySQL开发环境
Homebrew简称brew,OSX上的软件包管理工具,在Mac终端可以通过brew安装.更新.卸载各种软件,(简直就是神器级武器). 废话不多说,没安装brew自己去百度学习安装,这里就不多说了. ...
- Home Assistant系列--之树莓派安装Samba 和 Jupyter Notebook
1.什么是Samba? Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上 ...
- [project X] tiny210(s5pv210)上电启动流程(BL0-BL2)
建议参考文档: S5PV210-iROM-ApplicationNote-Preliminary-20091126 S5PV210_UM_REV1.1 项目介绍参考 [project X] tiny2 ...
- DMZ靶场渗透
0x00 目标站点www.test.ichunqiu 0x01 尝试登陆系统 -尝试弱密码登陆 结果:forbidden!!! -尝试万能账号密码登陆 1‘ or 1=1--+ 和 1‘ or 1=1 ...
- mysql5.6升级为mysql5.7部署jboss/wildfly应用项目
一.部署mysql5.7二进制版 解压tar -xvf mv mysql-5.7 /usr/local/mysql5.7 或者其他文件夹 cd /usr/local/mysql.57 usera ...
- Go黑帽子
使用go语言来实现python黑帽子和绝技的代码 1.unix密码破解器 package main import( "bufio" "flag" "i ...
- 基于visual studio 2017 以及cubemx 搭建stm32的开发环境(0)
(1)安装visual studio 2017 官网下载安装即可 (2)安装visual GDB 链接:https://pan.baidu.com/s/1TgXI1BRQLAWiWlqCcIS9TA ...