Sentinel简介
Redis HA 需要用到Redis的Sentinel模块,该模块的稳定版自2.8之后集成在Redis的发行版中,因此不需要单独安装。
Sentinel的特点
监控:持续检查Redis集群中Master Slave节点的健康状态;
通知:当节点有错误时通知使用者,管理员;
自动故障转移:当Master节点故障时,自动从Slave节点选择一个作为Master,其他Slave配置为新的Slave,通知客户端新的Master节点;
配置支持:client都从这里获取认证和连接的地址;
Sentinel本身也是集群,在每个Master Slave节点都启动一个Sentinel。
配置指南
配置Master-Slave集群
Sentinel集群要求最少要3个节点,因此这里配置3个节点,一个Master两个Slave
Master:10.111.134.44:6379
Slave1:10.111.134.7:6379
Slave2:10.111.134.55:6379
配置文件
示例如下:
daemonize yes
pidfile /var/run/redis/redis-server.pid
port 6379
bind 0.0.0.0
timeout 0
tcp-keepalive 0
loglevel notice
logfile /var/log/redis/redis-server.log
databases 16
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
slaveof 10.111.134.44 6379
min-slaves-to-write 1
min-slaves-max-lag 10
slave-serve-stale-data yes
slave-read-only yes
repl-disable-tcp-nodelay no
slave-priority 100
appendonly no
appendfilename "appendonly.aof"
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
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-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
注意这几行配置:
bind 0.0.0.0 # 绑定任何网卡
slaveof 10.111.134.44 6379 # master不需要配置这行
min-slaves-to-write 1 # 当slave1个都连不上时,master拒绝连接
min-slaves-max-lag 10 # 连不上slave的超时时间10秒
配置Sentinel
每个节点均需要配置Sentinel,但配置相同
# 指定端口
port 26379
# 监控master节点(10.111.134.44)的6379端口,2表示如果两个节点都不能连接到master,则认为master已经宕机
sentinel monitor master1 10.111.134.44 6379 2
# 如果5秒之内master不能连接,则认定master已经宕机
sentinel down-after-milliseconds master1 5000
# 故障转移超时
sentinel failover-timeout master1 180000
# 同时同步的slave节点个数
sentinel parallel-syncs master1 1
启动
启动Redis
$ sudo /etc/init.d/redis-server start
Starting redis-server: redis-server.
启动Sentinel
$ sudo /home/sensu/redis-3.0.1/src/redis-sentinel /etc/redis/sentinel.conf
20561:X 29 Dec 16:43:35.366 # Sentinel runid is 82decae77e954ca8fe14ebde0da937afbadc0688
20561:X 29 Dec 16:43:35.366 # +monitor master master1 10.111.134.44 6379 quorum 2
20561:X 29 Dec 16:48:57.603 * +slave slave 10.111.134.55:6379 10.111.134.55 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 16:53:16.568 * +sentinel sentinel 10.111.134.55:26379 10.111.134.55 26379 @ master1 10.111.134.44 6379
20561:X 29 Dec 16:53:48.825 * +slave slave 10.111.134.7:6379 10.111.134.7 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 16:53:56.447 * +sentinel sentinel 10.111.134.7:26379 10.111.134.7 26379 @ master1 10.111.134.44 6379
从日志可以看出master和slave都被监控了
查看master slave状态
$ redis-cli -h 10.111.134.44 info replication
# Replication
role:master
connected_slaves:2
min_slaves_good_slaves:2
slave0:ip=10.111.134.55,port=6379,state=online,offset=135234,lag=1
slave1:ip=10.111.134.7,port=6379,state=online,offset=135234,lag=0
master_repl_offset:135374
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:135373
测试
Master-Slave测试
在Master设置值
$ redis-cli -h 10.111.134.44 set test_ha 1
OK
获取:
$ redis-cli -h 10.111.134.44 get test_ha
"1"
$ redis-cli -h 10.111.134.7 get test_ha
"1"
$ redis-cli -h 10.111.134.55 get test_ha
"1"
在Slave设置值
$ redis-cli -h 10.111.134.55 set test_ha 2
(error) READONLY You can't write against a read only slave.
配置了不允许在slave写操作,防止混乱
HA测试
停止Slave
停止1个slave
$ ps aux | grep redis
redis 26189 0.2 0.9 38148 9644 ? Ssl 16:48 0:02 /home/sensu/redis-3.0.1/src/redis-server 0.0.0.0:6379
root 27265 0.0 0.2 64952 2136 pts/3 S+ 16:52 0:00 sudo /home/sensu/redis-3.0.1/src/redis-sentinel /etc/redis/sentinel.conf
root 27266 0.2 0.7 38152 7984 pts/3 Sl+ 16:52 0:02 /home/sensu/redis-3.0.1/src/redis-sentinel *:26379 [sentinel]
sensu 30928 0.0 0.0 11744 896 pts/1 S+ 17:10 0:00 grep redis
$ sudo kill -9 26189
获取
$ redis-cli -h 10.111.134.44 set test_ha 2
OK
停止2个slave后设置
$ redis-cli -h 10.111.134.44 set test_ha 3
(error) NOREPLICAS Not enough good slaves to write.
报错,因为设置了如果一个slave都不能连上就失败
获取
$ redis-cli -h 10.111.134.44 get test_ha
"2"
成功
停止Sentinel
停止Sentinel只影响,failover和monitor,GET SET都不影响
$ ps aux | grep redis
root 15603 0.0 0.2 64952 2136 pts/1 S+ 16:53 0:00 sudo /home/sensu/redis-3.0.1/src/redis-sentinel /etc/redis/sentinel.conf
root 15604 0.4 0.7 38152 7980 pts/1 Sl+ 16:53 0:09 /home/sensu/redis-3.0.1/src/redis-sentinel *:26379 [sentinel]
redis 23566 0.0 0.9 38148 9592 ? Ssl 17:30 0:00 /home/sensu/redis-3.0.1/src/redis-server 0.0.0.0:6379
sensu 23570 0.0 0.0 11744 896 pts/0 S+ 17:30 0:00 grep redis
$ sudo kill -9 15603 15604
GET SET
$ redis-cli -h 10.111.134.44 set test_ha 3
OK
$ redis-cli -h 10.111.134.7 get test_ha
"3"
$ redis-cli -h 10.111.134.55 get test_ha
"3"
停止Mater
在Master节点执行
$ ps aux | grep redis
redis 20518 0.4 0.2 38148 9656 ? Ssl 16:40 0:16 /home/sensu/redis-3.0.1/src/redis-server 0.0.0.0:6379
root 20560 0.0 0.0 64952 2132 pts/2 S+ 16:43 0:00 sudo /home/sensu/redis-3.0.1/src/redis-sentinel /etc/redis/sentinel.conf
root 20561 0.9 0.2 38152 7992 pts/2 Sl+ 16:43 0:31 /home/sensu/redis-3.0.1/src/redis-sentinel *:26379 [sentinel]
sensu 21280 0.0 0.0 11748 900 pts/3 S+ 17:38 0:00 grep redis
$ sudo kill -9 20518
查看Sentinel日志
5秒之后,因为我们配置的是5秒
20561:X 29 Dec 17:39:27.853 # +sdown master master1 10.111.134.44 6379
20561:X 29 Dec 17:39:27.921 # +odown master master1 10.111.134.44 6379 #quorum 2/2
20561:X 29 Dec 17:39:27.921 # +new-epoch 1
20561:X 29 Dec 17:39:27.921 # +try-failover master master1 10.111.134.44 6379
20561:X 29 Dec 17:39:27.926 # +vote-for-leader 82decae77e954ca8fe14ebde0da937afbadc0688 1
20561:X 29 Dec 17:39:27.931 # 10.111.134.7:26379 voted for 82decae77e954ca8fe14ebde0da937afbadc0688 1
20561:X 29 Dec 17:39:27.933 # 10.111.134.55:26379 voted for 82decae77e954ca8fe14ebde0da937afbadc0688 1
20561:X 29 Dec 17:39:27.985 # +elected-leader master master1 10.111.134.44 6379
20561:X 29 Dec 17:39:27.985 # +failover-state-select-slave master master1 10.111.134.44 6379
20561:X 29 Dec 17:39:28.053 # +selected-slave slave 10.111.134.55:6379 10.111.134.55 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 17:39:28.053 * +failover-state-send-slaveof-noone slave 10.111.134.55:6379 10.111.134.55 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 17:39:28.137 * +failover-state-wait-promotion slave 10.111.134.55:6379 10.111.134.55 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 17:39:28.974 # +promoted-slave slave 10.111.134.55:6379 10.111.134.55 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 17:39:28.974 # +failover-state-reconf-slaves master master1 10.111.134.44 6379
20561:X 29 Dec 17:39:29.071 * +slave-reconf-sent slave 10.111.134.7:6379 10.111.134.7 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 17:39:30.066 * +slave-reconf-inprog slave 10.111.134.7:6379 10.111.134.7 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 17:39:30.067 * +slave-reconf-done slave 10.111.134.7:6379 10.111.134.7 6379 @ master1 10.111.134.44 6379
20561:X 29 Dec 17:39:30.131 # -odown master master1 10.111.134.44 6379
20561:X 29 Dec 17:39:30.132 # +failover-end master master1 10.111.134.44 6379
20561:X 29 Dec 17:39:30.132 # +switch-master master1 10.111.134.44 6379 10.111.134.55 6379
20561:X 29 Dec 17:39:30.133 * +slave slave 10.111.134.7:6379 10.111.134.7 6379 @ master1 10.111.134.55 6379
20561:X 29 Dec 17:39:30.133 * +slave slave 10.111.134.44:6379 10.111.134.44 6379 @ master1 10.111.134.55 6379
20561:X 29 Dec 17:39:35.198 # +sdown slave 10.111.134.44:6379 10.111.134.44 6379 @ master1 10.111.134.55 6379
可以看到10.111.134.55 6379被选为master
验证一下:
$ redis-cli -h 10.111.134.44 info replication
Could not connect to Redis at 10.111.134.44:6379: Connection refused
Master已经连不上
$ redis-cli -h 10.111.134.55 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.111.134.7,port=6379,state=online,offset=46855,lag=0
master_repl_offset:46995
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:46994
$ redis-cli -h 10.111.134.7 info replication
# Replication
role:slave
master_host:10.111.134.55
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:69775
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
55已经变成了master,7成了他的slave
设置或获取
$ redis-cli -h 10.111.134.55 set test_ha 4
OK
$ redis-cli -h 10.111.134.7 set test_ha 4
(error) READONLY You can't write against a read only slave.
$ redis-cli -h 10.111.134.7 get test_ha
"4"
$ redis-cli -h 10.111.134.55 get test_ha
"4"
再次停止Master
$ ps aux | grep redis
redis 1849 0.2 0.9 38148 9680 ? Ssl 17:24 0:02 /home/sensu/redis-3.0.1/src/redis-server 0.0.0.0:6379
root 4612 0.0 0.2 65188 2364 pts/3 S+ 17:37 0:00 sudo /home/sensu/redis-3.0.1/src/redis-sentinel /etc/redis/sentinel.conf
root 4613 0.6 0.7 38152 7988 pts/3 Sl+ 17:37 0:03 /home/sensu/redis-3.0.1/src/redis-sentinel *:26379 [sentinel]
sensu 6739 0.0 0.0 11748 900 pts/1 S+ 17:48 0:00 grep redis
sensu@ubuntu:~$ sudo kill -9 1849
这次7成了唯一的master了
设置获取,没法设置
$ redis-cli -h 10.111.134.55 get test_ha
Could not connect to Redis at 10.111.134.55:6379: Connection refused
$ redis-cli -h 10.111.134.7 set test_ha 5
(error) NOREPLICAS Not enough good slaves to write.
$ redis-cli -h 10.111.134.7 get test_ha
"4"
恢复
恢复Slave
$ sudo /etc/init.d/redis-server start
Starting redis-server: redis-server.
$ redis-cli -h 10.111.134.7 info replication
# Replication
role:master
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
恢复的Slave并没有加到新的Master中,因为配置中是指到:44的
恢复Master
$ sudo /etc/init.d/redis-server start
Starting redis-server: redis-server.
$ redis-cli -h 10.111.134.7 info replication
# Replication
role:master
connected_slaves:1
slave0:ip=10.111.134.44,port=6379,state=online,offset=163,lag=0
master_repl_offset:163
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:162
恢复的Master加入了新的Master的Slave
过一会再次查看
$ redis-cli -h 10.111.134.7 info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.111.134.44,port=6379,state=online,offset=73074,lag=1
slave1:ip=10.111.134.55,port=6379,state=online,offset=73351,lag=1
master_repl_offset:73490
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:73489
发现第二个Slave也加入进来了,因为它配置的Master 44连上了
总结
Redis的HA部署至少需要3个Sentinel节点,实际不需要3个Master-Slave节点,官方文档有说明。各项配置都有trade off,需根据情况调整。仍需要有外部的监控工具保证Master-Slave在宕机后能及时恢复,不然节点在全部宕机后,HA失败,并且Master宕机的几秒(down-after-milliseconds)内新的Master被选举出来之前操作是失败的。
- 浏览: 338136 次
- 性别:
- 来自: 成都
最新评论
-
wodediqizhang:
PHP中的 $key="ABCDEFGHIJ0123 ...
java和php对等的3DES加密算法 -
xuxiaoyinliu:
chen_bing8 写道你好,为什么我用你的demo运行后报 ...
用jXLS和poi导出Excel -
zi_wu_xian:
java用poi和jxl对excel的读取还好,如果修改文件的 ...
用jXLS和poi导出Excel -
仰望摩天轮:
大神 用webloginc或者websphere容器的时候 j ...
用BTrace排查性能问题 -
sqq920556218:
很有用,也没有报错,正在研究应用于项目
用jXLS和poi导出Excel
相关推荐
redis 主从配置及ha方案、redis 主从配置及ha方案、redis 主从配置及ha方案
redis 安装配置到主从及ha的实现 详细配置操作步骤和脚本
redisha 具有复制和故障转移功能的 Redis (keepalived) 概述 本项目帮你部署redis with HA和自动恢复。 一个基本的集群是一个redis master和一个redis slave,slave从master同步数据。 只有一个redis master和一个...
初始化Redis配置文件。新建项目后系统默认的Redis配置文件。
redis配置文件: 1、单机版。 2、主从配置文件 3、哨兵配置文件 4、集群配置文件。
keepalived-redis高可用配置脚本,内含主从的keepalived.conf 及脚本
这将使用redis服务器和redis标记来设置redis,以创建供其他k8s服务使用的HA redis pod。 Redis和Sentinel的Docker映像 Kubernetes配置 在标准redis前哨/服务器端口上运行。 用法 更改部署文件中的$ {SERVICE_NAME}...
【windows】redis高可用主从+哨兵,有详细的word操作文档和已经配置好的主从文件,只需要把文件放在不同节点的电脑上按照word的说明进行更改就可以使用了,公司让我为新系统提供高可用真的是很折腾~~~
rains-redisproxyrains-redisproxy 是一个开源Redis中间件服务,支持redis协议通信,使用普通的redis客户端即可,无须修改业务应用程序任何代码与配置,与业务解耦;以netty 作为通信传输工具,让它具有高性能,高...
轻松地从3个或更多(默认配置)的Redis服务器中构建集群 由于连接断开而导致的自动故障转移 主机冲突解决(默认情况下,您的服务器可以主机,而haredis将选择最新鲜的服务器并发出SLAVEOF命令) 由操作员判断的...
Beholder 的目的是在 redis 节点发生故障后扩展 twemproxy 的 HA 功能。 为了实现这一点,beholder 持续监控+switch-master事件,然后它会更新 twemproxy 配置文件并重新启动资源。依赖关系使用和 ,所以第一步是...
这是的插件,旨在处理在HA体系结构中进入Logstash集群的事件的重复数据删除。 我们通过对要删除重复数据的字段进行哈希处理并将其存储在我们随后要检查的数据存储中来实现此目的。 如果找到匹配项,我们将对其进行...
139 Redis 为数据添加缓存-Redis HA 简介 140 Redis 为数据添加缓存-Redis Sentinel 高可用集群部署 141 Redis 为数据添加缓存-Redis 客户端的使用 142 Redis 为数据添加缓存-Spring Boot 集成 Redis1 142 Redis 为...
139 Redis 为数据添加缓存-Redis HA 简介 140 Redis 为数据添加缓存-Redis Sentinel 高可用集群部署 141 Redis 为数据添加缓存-Redis 客户端的使用 142 Redis 为数据添加缓存-Spring Boot 集成 Redis1 142 Redis...
│ 09 环境篇之hadoop安装配置.mp4 │ 11 环境篇之kafka的安装部署.mp4 │ 15 环境篇ES集群的测试.mp4 │ 16 环境篇之ES的head插件安装准备.mp4 │ 20 环境篇之redis的linux和window测试.mp4 │ 21 环境篇之...
linux 基础配置 python3的linux环境编译安装 1.linux下安装软件的方式 -首选yum工具,方便,自行解决软件之间的依赖关系,自动下载且安装 ... 还得配置第二个仓库,携带大量第三方软件(nginx,redis
Hadoop HA集群 + Zookeeper 进行集群配置、管理 Kafka集群 + Flume + Hive 进行数据采集、存储 SparkStreaming + SparkSQL 进行数据清洗、分析 Nginx负载均衡、反向代理服务器 MySQL集群 + MongoDB集群 + Redis集群 ...
1:Keepalived介绍和基本实现思路 2:VRRP协议:概念、理解、工作机制、负载分担等 ...7:Keepalived的HA,比如和:Varnish、Tomcat、Redis、MySql等 8:LVS基础知识 9:Keepalived+LVS实现高可用的负载均衡
Seata支持的第三方注册中心有nacos 、eureka、redis、zk、consul、etcd3、sofa、custom,支持的第三方配置中心有nacos 、apollo、zk、consul、etcd3、custom。seata官方主推的应该是nacos(毕竟是一家的),但是由于...
主要功能架构图Maven依赖使用maven中央仓库,项目约会如下... <dependency> <groupId>com.github.rtf666</groupId> <artifactId></artifactId> <version></version></dependency>配置说明spring: redis:问题反馈