Redis系列:高可用哨兵方案部署(redis的哨兵)
mhr18 2024-11-07 11:01 16 浏览 0 评论
Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决
- 监控(Monitoring):Sentinel 会不断地检查主服务器和从服务器是否运作正常。
- 提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
0x01: 高可用哨兵方案推演
服务器信息如下
这里只有一台虚拟主机,采用端口不一样的方式。如果大家有多台虚拟主机的话,也可以使用多台虚拟主机部署。
基于redis.conf创建主从配置文件
cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-6739.conf
cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-26379.conf
cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-26380.conf
基于sentinel.conf 创建哨兵配置文件,sentinel.conf配置文件可以在下载的redis源码目录找到
cp sentinel.conf /usr/local/redis/sentinel-36378.conf
cp sentinel.conf /usr/local/redis/sentinel-36379.conf
cp sentinel.conf /usr/local/redis/sentinel-36380.conf
- 主服务器配置
bind 127.0.0.1 192.168.122.1
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/tmp/redis-6379.log"
dbfilename dump-6379.rdb
requirepass new2020
- 从服务器一配置
bind 127.0.0.1 192.168.122.1
port 26379
daemonize yes
pidfile /var/run/redis_26379.pid
logfile "/tmp/redis-26379.log"
dbfilename dump-26379.rdb
requirepass new2020
replicaof 127.0.0.1 6379
masterauth new2020
- 从服务器二配置
bind 127.0.0.1 192.168.122.1
port 26380
daemonize yes
pidfile /var/run/redis_26380.pid
logfile "/tmp/redis-26380.log"
dbfilename dump-26380.rdb
requirepass new2020
replicaof 127.0.0.1 6379
masterauth new2020
哨兵一配置
bind 127.0.0.1 192.168.122.1
protected-mode no
port 36378
daemonize yes
pidfile /var/run/redis-sentinel-36278.pid
logfile /tmp/redis-36378.log"
dir /tmp/36378
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster new2020
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
哨兵二配置
bind 127.0.0.1 192.168.122.1
protected-mode no
port 36379
daemonize yes
pidfile /var/run/redis-sentinel-36379.pid
logfile "/tmp/redis-36379.log"
dir /tmp/36379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster new2020
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
哨兵三配置
bind 127.0.0.1 192.168.122.1
protected-mode no
port 36380
daemonize yes
pidfile /var/run/redis-sentinel-36380.pid
logfile "/tmp/redis-36380.log"
dir /tmp/36380
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster new2020
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
说明:
① 禁止保护模式
protected-mode no
② 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,127.0.0.1代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 127.0.0.1 6379 2
③ sentinel author-pass定义服务的密码,mymaster是服务名称,new2020是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster new2020
④ 判断主master的挂机时间(毫秒),超时未返回正确信息后标记为sdown状态
sentinel down-after-milliseconds master-1 3000
⑤ 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1
⑥ 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout mymaster 180000
⑦ 工作路径,注意路径不要和主重复
dir "/tmp/36379"
0x02:启动redis
安装如下顺序
首先是主Redis服务进程,然后再启动从机的服务进程,最后启动3个哨兵的服务进程。
- 主Redis启动
# 启动主Redis服务器进程
/usr/local/redis/bin/redis-server /usr/local/redis/redis-6379.conf
- 从Rdis启动
# 启动从Redis服务器进程
/usr/local/redis/bin/redis-server /usr/local/redis/redis-26379.conf
/usr/local/redis/bin/redis-server /usr/local/redis/redis-26380.conf
- 启动哨兵
# 启动启动Redis哨兵进程
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36378.conf
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36379.conf
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36380.conf
启动完毕后使用如下命令验证是否启动成功
ps -ef | grep redis
如下图所示,说明启动成功
0x03:查看各服务的状态
- 查看主Redis状态
输入info命令,如果出现信息,说明一主两从搭建成功
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=26379,state=online,offset=43689,lag=1
slave1:ip=127.0.0.1,port=26380,state=online,offset=43955,lag=0
master_replid:b92588e7ee2f1922498de16031b7649b3082b22b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:43955
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:43955
- 查看从Redis一状态
输入info命令
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:101019
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b92588e7ee2f1922498de16031b7649b3082b22b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:101019
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:101019
注,使用同样的方式可以看到从Redis二也是一样的。
- 查看哨兵Redis状态
输入info命令
# 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=127.0.0.1:6379,slaves=2,sentinels=3
注,使用同样的方式可以看到哨兵Redis二和哨兵Redis三也是一样的。
0x04:验证主从切换
1、首先关闭主Redis(6379)服务(shutdown)。
2、查看哨兵,发现端口号为263的从服务变成了主服务,sentinel自动完成了故障切换。
#查看主Reids的进程号
ps -ef | grep redis
#杀死主Redis进程
kill -9 7973
#连接哨兵一
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 36378
使用info sentinel命令
127.0.0.1:36378> 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=127.0.0.1:26379,slaves=2,sentinels=3
3、启动刚才被shutdown的6379服务并查看,发现它变成了从服务。
连接6379Redis服务
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379
使用info replication命令
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:26379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1601531690
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:739195dc3c4b405905edb43b35cdd48e1589e48d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
相关推荐
- B站收藏视频失效?mybili 收藏夹备份神器完整部署指南
-
本内容来源于@什么值得买APP,观点仅代表作者本人|作者:羊刀仙很多B站用户都有过类似经历:自己精心收藏的视频突然“消失”,点开一看不是“已被删除”,就是“因UP主设置不可见”。而B站并不会主动通知...
- 中间件推荐初始化配置
-
Redis推荐初始化配置bind0.0.0.0protected-modeyesport6379tcp-backlog511timeout300tcp-keepalive300...
- Redis中缓存穿透问题与解决方法
-
缓存穿透问题概述在Redis作为缓存使用时,缓存穿透是常见问题。正常查询流程是先从Redis缓存获取数据,若有则直接使用;若没有则去数据库查询,查到后存入缓存。但当请求的数据在缓存和数据库中都...
- 后端开发必看!Redis 哨兵机制如何保障系统高可用?
-
你是否曾在项目中遇到过Redis主服务器突然宕机,导致整个业务系统出现数据读取异常、响应延迟甚至服务中断的情况?面对这样的突发状况,作为互联网大厂的后端开发人员,如何快速恢复服务、保障系统的高可用...
- Redis合集-大Key处理建议
-
以下是Redis大Key问题的全流程解决方案,涵盖检测、处理、优化及预防策略,结合代码示例和最佳实践:一、大Key的定义与风险1.大Key判定标准数据类型大Key阈值风险场景S...
- 深入解析跳跃表:Redis里的"老六"数据结构,专治各种不服
-
大家好,我是你们的码农段子手,今天要给大家讲一个Redis世界里最会"跳科目三"的数据结构——跳跃表(SkipList)。这货表面上是个青铜,实际上是个王者,连红黑树见了都要喊声大哥。...
- Redis 中 AOF 持久化技术原理全解析,看完你就懂了!
-
你在使用Redis的过程中,有没有担心过数据丢失的问题?尤其是在服务器突然宕机、意外断电等情况发生时,那些还没来得及持久化的数据,是不是让你夜不能寐?别担心,Redis的AOF持久化技术就是...
- Redis合集-必备的几款运维工具
-
Redis在应用Redis时,经常会面临的运维工作,包括Redis的运行状态监控,数据迁移,主从集群、切片集群的部署和运维。接下来,从这三个方面,介绍一些工具。先来学习下监控Redis实时...
- 别再纠结线程池大小 + 线程数量了,没有固定公式的!
-
我们在百度上能很轻易地搜索到以下线程池设置大小的理论:在一台服务器上我们按照以下设置CPU密集型的程序-核心数+1I/O密集型的程序-核心数*2你不会真的按照这个理论来设置线程池的...
- 网络编程—IO多路复用详解
-
假如你想了解IO多路复用,那本文或许可以帮助你本文的最大目的就是想要把select、epoll在执行过程中干了什么叙述出来,所以具体的代码不会涉及,毕竟不同语言的接口有所区别。基础知识IO多路复用涉及...
- 5分钟学会C/C++多线程编程进程和线程
-
前言对线程有基本的理解简单的C++面向过程编程能力创造单个简单的线程。创造单个带参数的线程。如何等待线程结束。创造多个线程,并使用互斥量来防止资源抢占。会使用之后,直接跳到“汇总”,复制模板来用就行...
- 尽情阅读,技术进阶,详解mmap的原理
-
1.一句话概括mmapmmap的作用,在应用这一层,是让你把文件的某一段,当作内存一样来访问。将文件映射到物理内存,将进程虚拟空间映射到那块内存。这样,进程不仅能像访问内存一样读写文件,多个进程...
- C++11多线程知识点总结
-
一、多线程的基本概念1、进程与线程的区别和联系进程:进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程;线程:是运行中的实际的任务执行者。可以说,进程中包含了多...
- 微服务高可用的2个关键技巧,你一定用得上
-
概述上一篇文章讲了一个朋友公司使用SpringCloud架构遇到问题的一个真实案例,虽然不是什么大的技术问题,但如果对一些东西理解的不深刻,还真会犯一些错误。这篇文章我们来聊聊在微服务架构中,到底如...
- Java线程间如何共享与传递数据
-
1、背景在日常SpringBoot应用或者Java应用开发中,使用多线程编程有很多好处,比如可以同时处理多个任务,提高程序的并发性;可以充分利用计算机的多核处理器,使得程序能够更好地利用计算机的资源,...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (63)
- oracle批量插入数据 (62)
- oracle事务隔离级别 (53)
- oracle 空为0 (50)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)