分布式缓存 - Redis进阶(四)(哨兵(Sentinel)模式)
mhr18 2024-11-11 11:58 24 浏览 0 评论
1、什么是哨兵模式?
反客为主的自动版,能够自动监控master是否发生故障,如果故障了会根据投票数从slave中挑选一个作为master,其他的slave会自动转向同步新的master,实现故障自动转义。
2、原理
sentinel会按照指定的频率给master发送ping请求,看看master是否还活着,若master在指定时间内未正常响应sentinel发送的ping请求,sentinel则认为master挂掉了,但是这种情况存在误判的可能,比如:可能master并没有挂,只是sentinel和master之间的网络不通导致,导致ping失败。
为了避免误判,通常会启动多个sentinel,一般是奇数个,比如3个,那么可以指定当有多个sentinel都觉得master挂掉了,此时才断定master真的挂掉了,通常这个值设置为sentinel的一半,比如sentinel的数量是3个,那么这个量就可以设置为2个。
slaveof no one当多个sentinel经过判定,断定master确实挂掉了,接下来sentinel会进行故障转移:会从slave中投票选出一个服务器,将其升级为新的主服务器, 并让失效主服务器的其他从服务器slaveof指向新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
3、配置1主2从3个哨兵
下面来实现1主2从3个sentinel的配置,当从的挂掉之后,要求最少有2个sentinel认为主的挂掉了,才进行故障转移。
为了方便,我们在一台机器上进行模拟,我的机器ip是:192.168.200.129,通过端口来区分6个不同的节点(1个master、2个slave、3个sentinel),节点配置信息如下:
3.1、创建案例工作目录:sentinel
执行下面命令创建 /opt/sentinel 目录,本次所有操作,均在 sentinel 目录进行。
# 方便演示,停止所有的redis
ps -ef | grep redis | awk -F" " '{print $2;}' | xargs kill -9
mkdir /opt/sentinel
cd /opt/sentinel/
3.2、将redis.conf复制到sentinel目录
redis.conf 是redis默认配置文件
cp /opt/redis-6.2.1/redis.conf /opt/sentinel/
3.3、创建master的配置文件:redis-6379.conf
在/opt/sentinel目录创建 redis-6379.conf 文件,内容如下:
include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/
port 6379
dbfilename dump_6379.rdb
pidfile /var/run/redis_6379.pid
logfile "./6379.log"
3.4、创建slave1的配置文件:redis-6380.conf
在/opt/sentinel目录创建 redis-6380.conf 文件,内容如下,和上面master的类似,只是将6379换成6380了
include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/
port 6380
dbfilename dump_6380.rdb
pidfile /var/run/redis_6380.pid
logfile "./6380.log"
3.5、创建slave2的配置文件:redis-6381.conf
在/opt/sentinel目录创建 redis-6381.conf 文件,内容如下:
include /opt/sentinel/redis.conf
daemonize yes
bind 192.168.200.129
dir /opt/sentinel/
port 6381
dbfilename dump_6381.rdb
pidfile /var/run/redis_6381.pid
logfile "./6381.log"
3.6、启动master、slave1、slave2
redis-server /opt/sentinel/redis-6379.conf
redis-server /opt/sentinel/redis-6380.conf
redis-server /opt/sentinel/redis-6381.conf
3.7、配置slave1为master的从库
(1)执行下面命令,连接slave1
redis-cli -h 192.168.200.129 -p 6380
(2)执行下面命令,指定slave1的作为master的从机
slaveof 192.168.200.129 6379
(3)如下,使用 info replication 查看下slave1的主从信息
3.8、配置slave2为master的从库
(1)执行下面命令,连接slave2
redis-cli -h 192.168.200.129 -p 6381
(2)执行下面命令,指定slave2的作为master的从机
slaveof 192.168.200.129 6379
(3)如下,使用 info replication 查看下slave2的主从信息
3.9、验证主从复制是否正常
运行下面命令,连接master
redis-cli -h 192.168.200.129 -p 6379
运行下面命令,查看master主从信息
info replication
在master中执行下面命令,写入数据
flushdb
set name jack
如下,查看slave1中name的值
192.168.200.129:6380> get name
"jack"
如下,查看slave2中name的值
192.168.200.129:6381> get name
"jack"
数据一致,说明同步正常。
3.10、创建sentinel1的配置文件:sentinel-26379.conf
在/opt/sentinel目录创建 sentinel-26379.conf 文件,内容如下:
# 配置文件目录
dir /opt/sentinel/
# 日志文件位置
logfile "./sentinel-26379.log"
# pid文件
pidfile /var/run/sentinel_26379.pid
# 是否后台运行
daemonize yes
# 端口
port 26379
# 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当
Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 192.168.200.129 6379 2
# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping
不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000
# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000
# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理
解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1
# 指定mymaster主的密码(没有就不指定)
# sentinel auth-pass mymaster 123456
3.11、创建sentinel2的配置文件:sentinel-26380.conf
在/opt/sentinel目录创建 sentinel-26380.conf 文件,内容如下:
# 配置文件目录
dir /opt/sentinel/
# 日志文件位置
logfile "./sentinel-26380.log"
# pid文件
pidfile /var/run/sentinel_26380.pid
# 是否后台运行
daemonize yes
# 端口
port 26380
# 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当
Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 192.168.200.129 6379 2
# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping
不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000
# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000
# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理
解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1
# 指定mymaster主的密码(没有就不指定)
# sentinel auth-pass mymaster 123456
3.12、创建sentinel3的配置文件:sentinel-26381.conf
在/opt/sentinel目录创建 sentinel-26381.conf 文件,内容如下:
# 配置文件目录
dir /opt/sentinel/
# 日志文件位置
logfile "./sentinel-26381.log"
# pid文件
pidfile /var/run/sentinel_26381.pid
# 是否后台运行
daemonize yes
# 端口
port 26381
# 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当
Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
sentinel monitor mymaster 192.168.200.129 6379 2
# master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在20秒内,ping
不通master,则主观认为master不可用
sentinel down-after-milliseconds mymaster 60000
# 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
sentinel failover-timeout mymaster 180000
# 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理
解为1是串行复制,大于1是并行复制
sentinel parallel-syncs mymaster 1
# 指定mymaster主的密码(没有就不指定)
# sentinel auth-pass mymaster 123456
3.13、启动3个sentinel
启动sentinel有2种方式:
方式1:redis-server sentinel.conf --sentinel
方式2:redis-sentinel sentinel.conf
下面我们使用方式2来启动3个sentinel
/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26379.conf
/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26380.conf
/opt/redis-6.2.1/src/redis-sentinel /opt/sentinel/sentinel-26381.conf
3.14、分别查看3个sentinel的信息
分别对3个sentinel执行下面命令,查看每个sentinel的信息
redis-cli -p sentinel的端口
info sentinel
sentinel1 的信息如下,其他2个sentinel的信息这里就不列了,自己去看一下
3.15、验证故障自动转移是否成功
step1:在master中执行下面命令,停止master
192.168.200.129:6379> shutdown
step2:等待2分钟,等待完成故障转移
sentinel中我们配置 down-after-milliseconds 的值是60秒,表示判断主机下线时间是60秒,所以我们等2分钟,让系统先自动完成故障转移。
step3:查看slave1的主从信息,如下
使用 info replication 命令查看主从信息
step4:查看slave2的主从信息,如下
slave2变成master了,且slave2变成slave1的从库了,完成了故障转移。
step5:下面验证下slave1和slave2是否同步
在slave2中执行下面命令
192.168.200.129:6381> set address china
OK
在slave1中执行下面命令,查询一下address的值,效果如下,说明slave2和slave1同步正常
192.168.200.129:6380> get address
"china"
3.16、恢复旧的master自动俯首称臣
当旧的master恢复之后,会自动挂在新的master下面,咱们来验证下是不是这样的。
step1:执行下面命令,启动旧的master
redis-server /opt/sentinel/redis-6379.conf
step2:执行下面命令,连接旧的master
redis-cli -h 192.168.200.129 -p 6379
step3:执行下面命令,查看其主从信息
info replication
效果如下,确实和期望的一致。
4、Redis客户端命令对应的RedisTemplate中的方法列表:
String类型结构 | |
Redis | RedisTemplate rt |
set key value | rt.opsForValue().set("key","value") |
get key | rt.opsForValue().get("key") |
del key | rt.delete("key") |
strlen key | rt.opsForValue().size("key") |
getset key value | rt.opsForValue().getAndSet("key","value") |
getrange key start end | rt.opsForValue().get("key",start,end) |
append key value | rt.opsForValue().append("key","value") |
Hash结构 | |
Redis | RedisTemplate rt |
hmset key field1 value1 field2 value2... | rt.opsForHash().putAll("key",map) //map是一个集合对象 |
hset key field value | rt.opsForHash().put("key","field","value") |
hexists key field | rt.opsForHash().hasKey("key","field") |
hgetall key | rt.opsForHash().entries("key") //返回Map对象 |
hvals key | rt.opsForHash().values("key") //返回List对象 |
hkeys key | rt.opsForHash().keys("key") //返回List对象 |
hmget key field1 field2... | rt.opsForHash().multiGet("key",keyList) |
hsetnx key field value | rt.opsForHash().putIfAbsent("key","field","value" |
hdel key field1 field2 | rt.opsForHash().delete("key","field1","field2") |
hget key field | rt.opsForHash().get("key","field") |
List结构 | |
Redis | RedisTemplate rt |
lpush list node1 node2 node3... | rt.opsForList().leftPush("list","node") rt.opsForList().leftPushAll("list",list) //list是集合对象 |
rpush list node1 node2 node3... | rt.opsForList().rightPush("list","node") rt.opsForList().rightPushAll("list",list) //list是集合对象 |
lindex key index | rt.opsForList().index("list", index) |
llen key | rt.opsForList().size("key") |
lpop key | rt.opsForList().leftPop("key") |
rpop key | rt.opsForList().rightPop("key") |
lpushx list node | rt.opsForList().leftPushIfPresent("list","node") |
rpushx list node | rt.opsForList().rightPushIfPresent("list","node") |
lrange list start end | rt.opsForList().range("list",start,end) |
lrem list count value | rt.opsForList().remove("list",count,"value") |
lset key index value | rt.opsForList().set("list",index,"value") |
Set结构 | |
Redis | RedisTemplate rt |
sadd key member1 member2... | rt.boundSetOps("key").add("member1","member2",...) rt.opsForSet().add("key", set) //set是一个集合对象 |
scard key | rt.opsForSet().size("key") |
sidff key1 key2 | rt.opsForSet().difference("key1","key2") //返回一个集合对象 |
sinter key1 key2 | rt.opsForSet().intersect("key1","key2")//同上 |
sunion key1 key2 | rt.opsForSet().union("key1","key2")//同上 |
sdiffstore des key1 key2 | rt.opsForSet().differenceAndStore("key1","key2","des") |
sinter des key1 key2 | rt.opsForSet().intersectAndStore("key1","key2","des") |
sunionstore des key1 key2 | rt.opsForSet().unionAndStore("key1","key2","des") |
sismember key member | rt.opsForSet().isMember("key","member") |
smembers key | rt.opsForSet().members("key") |
spop key | rt.opsForSet().pop("key") |
srandmember key count | rt.opsForSet().randomMember("key",count) |
srem key member1 member2... | rt.opsForSet().remove("key","member1","member2",...) |
相关推荐
- Java培训机构,你选对了吗?(java培训机构官网)
-
如今IT行业发展迅速,不仅是大学生,甚至有些在职的员工都想学习java开发,需求量的扩大,薪资必定增长,这也是更多人选择java开发的主要原因。不过对于没有基础的学员来说,java技术不是一两天就能...
- 产品经理MacBook软件清单-20个实用软件
-
三年前开始使用MacBookPro,从此再也不想用Windows电脑了,作为生产工具,MacBook可以说是非常胜任。作为产品经理,值得拥有一台MacBook。MacBook是工作平台,要发挥更大作...
- RAD Studio(Delphi) 本月隆重推出新的版本12.3
-
#在头条记录我的2025#自2024年9月,推出Delphi12.2版本后,本月隆重推出新的版本12.3,RADStudio12.3,包含了Delphi12.3和C++builder12.3最...
- 图解Java垃圾回收机制,写得非常好
-
什么是自动垃圾回收?自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者删掉的机制。所谓使用中的对象(已引用对象),指的是程序中有指针指向的对象;而未使用中的对象(未引用...
- Centos7 初始化硬盘分区、挂载(针对2T以上)添加磁盘到卷
-
1、通过命令fdisk-l查看硬盘信息:#fdisk-l,发现硬盘为/dev/sdb大小4T。2、如果此硬盘以前有过分区,则先对磁盘格式化。命令:mkfs.文件系统格式-f/dev/sdb...
- 半虚拟化如何提高服务器性能(虚拟化 半虚拟化)
-
半虚拟化是一种重新编译客户机操作系统(OS)将其安装在虚拟机(VM)上的一种虚拟化类型,并在主机操作系统(OS)运行的管理程序上运行。与传统的完全虚拟化相比,半虚拟化可以减少开销,并提高系统性能。虚...
- HashMap底层实现原理以及线程安全实现
-
HashMap底层实现原理数据结构:HashMap的底层实现原理主要依赖于数组+链表+红黑树的结构。1、数组:HashMap最底层是一个数组,称为table,它存放着键值对。2、链...
- long和double类型操作的非原子性探究
-
前言“深入java虚拟机”中提到,int等不大于32位的基本类型的操作都是原子操作,但是某些jvm对long和double类型的操作并不是原子操作,这样就会造成错误数据的出现。其实这里的某些jvm是指...
- 数据库DELETE 语句,还保存原有的磁盘空间
-
MySQL和Oracle的DELETE语句与数据存储MySQL的DELETE操作当你在MySQL中执行DELETE语句时:逻辑删除:数据从表中标记为删除,不再可见于查询结果物理...
- 线程池—ThreadPoolExecutor详解(线程池实战)
-
一、ThreadPoolExecutor简介在juc-executors框架概述的章节中,我们已经简要介绍过ThreadPoolExecutor了,通过Executors工厂,用户可以创建自己需要的执...
- navicat如何使用orcale(详细步骤)
-
前言:看过我昨天文章的同鞋都知道最近接手另一个国企项目,数据库用的是orcale。实话实说,也有快三年没用过orcale数据库了。这期间问题不断,因为orcale日渐消沉,网上资料也是真真假假,难辨虚...
- 你的程序是不是慢吞吞?GraalVM来帮你飞起来性能提升秘籍大公开
-
各位IT圈内外的朋友们,大家好!我是你们的老朋友,头条上的IT技术博主。不知道你们有没有这样的经历:打开一个软件,半天没反应;点开一个网站,图片刷不出来;或者玩个游戏,卡顿得想砸电脑?是不是特别上火?...
- 大数据正当时,理解这几个术语很重要
-
目前,大数据的流行程度远超于我们的想象,无论是在云计算、物联网还是在人工智能领域都离不开大数据的支撑。那么大数据领域里有哪些基本概念或技术术语呢?今天我们就来聊聊那些避不开的大数据技术术语,梳理并...
- 秒懂列式数据库和行式数据库(列式数据库的特点)
-
行式数据库(Row-Based)数据按行存储,常见的行式数据库有Mysql,DB2,Oracle,Sql-server等;列数据库(Column-Based)数据存储方式按列存储,常见的列数据库有Hb...
- AMD发布ROCm 6.4更新:带来了多项底层改进,但仍不支持RDNA 4
-
AMD宣布,对ROCm软件栈进行了更新,推出了新的迭代版本ROCm6.4。这一新版本里,AMD带来了多项底层改进,包括更新改进了ROCm的用户空间库和AMDKFD内核驱动程序之间的兼容性,使其更容易...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (56)
- oracle 乐观锁 (53)
- 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)