redis哨兵

image.png

setinel介绍

redis的主从模式下.主节点一旦发生故障不能提供服务,需要人工预收,将从节点晋升为主节点,同时还需要修改客户端配置.对于很多应用场景这种方式无法接受.
sentinel(哨兵)架构解构了redis主从人工干预的问题.
redis sentinel是redis的高可用实现方案,实际生产环境中,对提高整个系统可用性非常有帮助的.

哨兵主要功能

redis sentinel是一个分布式系统, redis sentinel为redis提供高可用性,可以在没有人干预的情况下组织某种类型的故障.
redis的sentinel系统用于管理多个redis服务器(instance)该系统执行以下三干任务:

1.监控(monitoring):

sentinel会不断地定期检查你的主服务器和从服务器是否运作正常

2.提醒(Notification)

当被监控的某个redis服务器出现问题时,sentinel可以通过API向管理员或者其他应用程序发生通知.

3.自动故障迁移(Automaticfailover)

当一个主服务器不能正常工作时,sentinel会开始一次自动故障迁移操作,它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器,当客户端试图链接失效的主服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器

部署哨兵

主机规划

角色 IP 端口
master/sentinel-01 172.16.210.53 6379/26379
slaversentinel-02 172.16.210.54 6379/26379
slaver/sentinel-03 172.16.210.55 6379/26379

1.准备三台安装安装有redis的主机

1.在master节点编写hosts文件

[root@db01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
db01 172.16.210.53
db02 172.16.210.54
db03 172.16.210.55

2.创建相关目录

[root@db01 ~]# mkdir -p /data/soft ##创建软件存放目录
[root@db01 ~]# mkdir -p /data/redis_cluster/redis_6379 ##创建数据存放目录
[root@db01 ~]# mkdir -p /data/redis_cluster/redis_6379 ##创建数据存放目录
[root@db01 ~]# mkdir -p /opt/redis_cluster/redis_6379/{conf,pid,logs} ##创建redis相关信息目录

3.获取安装包并编译

[root@db01 ~]# cd /data/soft/ 
[root@db01 soft]# wget http://download.redis.io/releases/redis-3.2.9.tar.gz ##获取redis 的安装包
--2020-06-12 17:08:03--  http://download.redis.io/releases/redis-3.2.9.tar.gz
正在解析主机 download.redis.io (download.redis.io)... 109.74.203.151
正在连接 download.redis.io (download.redis.io)|109.74.203.151|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 302 Found
位置:http://117.128.6.28/cache/download.redis.io/releases/redis-3.2.9.tar.gz?ich_args2=528-12170713052158_fcf495896a00289755434f539a1a387e_10001002_9c896d2ddec6f3d9943e518939a83798_c4d476f5af6cd0116d51bd1ef853167b [跟随至新的 URL]
--2020-06-12 17:08:04--  http://117.128.6.28/cache/download.redis.io/releases/redis-3.2.9.tar.gz?ich_args2=528-12170713052158_fcf495896a00289755434f539a1a387e_10001002_9c896d2ddec6f3d9943e518939a83798_c4d476f5af6cd0116d51bd1ef853167b
正在连接 117.128.6.28:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:1547695 (1.5M) [application/x-gzip]
正在保存至: “redis-3.2.9.tar.gz”

100%[==============================================>] 1,547,695   1.06MB/s 用时 1.4s   

2020-06-12 17:08:05 (1.06 MB/s) - 已保存 “redis-3.2.9.tar.gz” [1547695/1547695])
[root@db01 soft]# tar zxf redis-3.2.9.tar.gz -C /opt/redis_cluster/ ##解压安装包到指定目录
[root@db01 soft]# cd /opt/redis_cluster/
[root@db01 redis_cluster]# ln -s redis-3.2.9 redis ##创建一个软链接
[root@db01 redis_cluster]# cd redis
[root@db01 redis]# make install ##开始编译安装

4.编辑配置文件

[root@db01 redis]# cat /opt/redis_cluster/redis_6379/conf//redis_6379.conf
## 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 172.16.210.53
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid
logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump,rdb
##15分钟内,有1个key发生改变,就会执行bgasave命令
save 900 1
#5分钟内,有10个key发生改变,就会执行bgasave命令
save 300 10 
#1分钟内,有10000个key发生改变,就会执行bgasave命令
save 60 10000 
dbfilename redis_6379.rdb
### 本地数据库的目录
dir /data/redis_cluster/redis_6379   

5.打包配置文件再传给其他主机

[root@db01~]# cd /opt/
[root@db01 opt]# tar zcvf db01.tar *     ##打包redis的软件目录
[root@db01 opt]# scp db01.tar 172.16.210.54:/opt ##把打包好的redis软件目录传给从库主机的opt目录
[root@db01 opt]# scp db01.tar 172.16.210.55:/opt ##把打包好的redis软件目录传给从库主机的opt目录

6.两台从库安装redis
在54和55两台主机操作

cd /opt/  ##进入opt目录
tar tar -xzvf db01.tar  ##把master主机传过来的压缩目录解压
cd redis_cluster/redis  ##进入redis目录
make install ##开始编译
mkdir /data/redis_cluster/redis_6379/  -p ##创建数据目录

7.修改配置文件的监听地址
在54主机操作

sed -i 's#bind 172.16.210.53#bind 172.16.210.54#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf  ##修改监听端口为sentinel-02的ip地址

在55主机操作

sed -i 's#bind 172.16.210.53#bind 172.16.210.55#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf  ##修改监听端口为sentinel-02的ip地址

8.启动redis并连接测试
在3台主机操作

redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf  ### 启 动redis 
redis-cli -h 172.16.210.53 ##连接53主机的redis
redis-cli -h 172.16.210.54 ##连接54主机的redis
redis-cli -h 172.16.210.55 ##连接55主机的redis

此时,3台主机的redis已经部署完成

2.创建redis哨兵相关的配置文件

在主机53上操作

[root@db01 ~]# mkdir -p /data/redis_cluster/redis_26379 ##创建数据目录
[root@db01 ~]# mkdir -p /opt/redis_cluster/redis_26379 ##
[root@db01 ~]# mkdir -p /opt/redis_cluster/redis_26379/{conf,pid,logs}
[root@db01 ~]# vim /opt/redis_cluster/redis_26379/conf/redis_26379.conf
bind 172.16.210.53
port 26379
daemonize yes
logfile /opt/redis_cluster/redis_26379/logs/redis_26379.log
dir /data/redis_cluster/redis_26379
sentinel monitor mymaster 172.16.210.53 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 18000
[root@db01 ~]# rsync -avz /opt/* 172.16.210.54:/opt ##将配置文件数据同步到第二台主机
[root@db01 ~]# rsync -avz /opt/* 172.16.210.55:/opt ##将配置文件数据同步到第三台主机

在主机54上操作

[root@db02 ~]# sed -i 's#bind 172.16.210.53#bind 172.16.210.54#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf  ##修改监听地址为54主机的ip地址
[root@db02 ~]# sed -i 's#bind 172.16.210.53#bind 172.16.210.54#g' /opt/redis_cluster/redis_26379/conf/redis_26379.conf  ##修改监听地址为54主机的ip地址
[root@db02 ~]# echo "slaveof 172.16.210.53 6379" >> /opt/redis_cluster/redis_6379/conf/redis_6379.conf  ##把同步53节点的命令写入配置文件里

在sentinel-03(55)上操作

[root@db03 redis]# mkdir -p /data/redis_cluster/redis_26379 ##创建数据目录
[root@db03 redis]# sed -i 's#bind 172.16.210.53#bind 172.16.210.55#g' /opt/redis_cluster/redis_6379/conf/redis_6379.conf    ##修改监听地址为55主机的ip地址
[root@db03 redis]#  sed -i 's#bind 172.16.210.53#bind 172.16.210.55#g' /opt/redis_cluster/redis_26379/conf/redis_26379.conf  ##修改监听地址为55主机的ip地址
[root@db03 redis]# echo "slaveof 172.16.210.53 6379" >> /opt/redis_cluster/redis_6379/conf/redis_6379.conf  ##把同步53节点的命令写入配置文件里

配置文件详解

sentinel monitor mymaster 172.16.210.53 6379 2
##mymaster 主节点别名 主节点 ip 和端口,判断主节点失败,两个sentinel节点同意
sentinel down-after-milliseconds mymaster 3000
##选项指定了sentinel认为服务器已经断线所需的毫秒数
sentinel parallel-syncs mymaster 1
##向新的主节点发起复制操作的从节点个数,1轮循发起复制
sentinel failover-timeout mymaster 18000
##故障转移超时时间

3.启动redis和redis哨兵

在三台主机操作

pkill redis ##关闭和redis有关的进程
redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf ##启动redis
redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf  ##启动哨兵

检查三台主机的redis和哨兵都是否正常启动
在三台主机检查

[root@db01 ~]#  ps -ef |grep redis
root      2865     1  0 20:06 ?        00:00:00 redis-server 172.16.210.53:6379
root      2886     1  0 20:08 ?        00:00:00 redis-sentinel 172.16.210.53:26379 [sentinel]
root      2890  2145  0 20:08 pts/0    00:00:00 grep --color=auto redis

redis和redis哨兵都正常启动

注意

[root@db01 ~]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
bind 172.16.210.53
port 26379
daemonize yes
logfile "/opt/redis_cluster/redis_26379/logs/redis_26379.log"
dir "/data/redis_cluster/redis_26379"
sentinel myid 7661e27af1c8737f068456604e665b2193f9b38b
sentinel monitor mymaster 172.16.210.53 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel failover-timeout mymaster 18000
# Generated by CONFIG REWRITE
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel known-sentinel mymaster 172.16.210.55 26379 9636d32c6e8187d7c96b9f8275f2ccdcc1c1c8f8
sentinel known-sentinel mymaster 172.16.210.54 26379 bb7728148e8515beda9972413c9a981569af9890
sentinel current-epoch 1

当所有节点启动后,配置文件的内容发生了变化,体现在三个方面

  1. sentinel节点自动发现了从节点.
  2. 去掉了默认配置,例如parallel-syncs failover-timeout参数
  3. 添加了配置纪元相关参数

4.哨兵常用操作

[root@db01 ~]# redis-cli -h 172.16.210.53 -p 26379 ##连接哨兵
172.16.210.53:26379> INFO sentinel  ##获取当前哨兵的信息
172.16.210.53:26379> sentinel masters ##获取组的信息
172.16.210.53:26379> sentinel master mymaster ##获取mymaster组的master信息
172.16.210.53:26379> sentinel slaves mymaster  ##获取mymaster组的slaver信息 

5.故障模拟演练

在53节点操作

[root@db01 ~]# pkill redis ##把主节点的redis关闭

此时查看54节点的哨兵配置文件

[root@db02 ~]# cat /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
sentinel monitor mymaster 172.16.210.55 6379 2 ##发现主节点就已经切换成了55节点

再查看55节点的哨兵配置文件

[root@db03 redis]# cat /opt/redis_cluster/redis_26379/conf/redis_26379.conf 
sentinel monitor mymaster 172.16.210.55 6379 2

验证:

[root@db03 redis]# redis-cli -h 172.16.210.55 -p 26379 ##登录55主节点
172.16.210.55:26379> sentinel get-master-addr-by-name mymaster
1) "172.16.210.55"    ##可以看到master节点已经变成53了
2) "6379"
[root@db03 redis]# redis-cli -h 172.16.210.55  ##登录redis
172.16.210.55:6379> set k1 v1 
OK ##也可以写入数据

在54从节点验证

[root@db02 ~]# redis-cli -h 172.16.210.54
172.16.210.54:6379> set k2 v2
(error) READONLY You can't write against a read only slave. ##因为是从节点,所以是不能写数据的
172.16.210.54:6379> get k1
"v1"  ##但是可以查看数据

故障修复

重启53节点的redis和哨兵

[root@db01 ~]# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf 
[root@db01 ~]# redis-sentinel /opt/redis_cluster/redis_26379/conf/redis_26379.conf 

验证:

[root@db01 ~]# redis-cli -h 172.16.210.53 ##连接53的redis
172.16.210.53:6379> GET k1 
"v1" ##可以查看数据
172.16.210.53:6379> set k2 v2
(error) READONLY You can't write against a read only slave. ##但不能插入数据,所以此时的53节点就已经变为从库

修改优先级

现在的主从切换是哨兵通过选举选出来的主节点,我们可以通过修改优先级,来自定义故障后的主节点.

查看每个节点的优先级

[root@db01 ~]# redis-cli -h 172.16.210.53 
172.16.210.53:6379> CONFIG GET slave-priority 
1) "slave-priority"
2) "100"
[root@db02 ~]#  redis-cli -h 172.16.210.54
172.16.210.54:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"
[root@db03 redis]# redis-cli -h 172.16.210.55
172.16.210.55:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "100"

三台主机默认的优先级都是是100

设置优先级

将53主机的优先级调高

[root@db01 ~]# redis-cli -h 172.16.210.53 
172.16.210.55:6379> CONFIG SET slave-priority 150
OK ##修改优先级为150
172.16.210.55:6379> CONFIG GET slave-priority
1) "slave-priority"
2) "150"  ##查看优先级,修改成功

强制发生重新选举

[root@db01 ~]# redis-cli -h 172.16.210.53 -p 26379 ##连接53主机的哨兵
172.16.210.53:26379> sentinel failover mymaster
OK ##重新选举成功
172.16.210.53:26379> sentinel get-master-addr-by-name mymaster
1) "172.16.210.53" ##查看当前主节点地址为53,证明已经重新选举成功
2) "6379" 

把优先级还原

如果不是特别需要指定那台主机做主节点,所以推荐3台主机的优先级一样

[root@db01 ~]# redis-cli -h 172.16.210.53 
172.16.210.53:6379> CONFIG SET slave-priority 100
OK ##修改回100成功
172.16.210.53:6379> CONFIG GET slave-priority 
1) "slave-priority"
2) "100" ##当前权重值回到100
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,009评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,808评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,891评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,283评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,285评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,409评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,809评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,487评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,680评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,499评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,548评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,268评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,815评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,872评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,102评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,683评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,253评论 2 341