jedispool redis哨兵_Redis详解(九)------ 哨兵(Sentinel)模式详解

在上一篇博客----Redis详解(八)------ 主从复制,我们简单介绍了Redis的主从架构,但是这种主从架构存在一个问题,当主服务器宕机,从服务器不能够自动切换成主服务器,为了解决这个问题,我们又介绍了哨兵模式,本篇博客我们继续深入的介绍一下这种模式.

1、架构图

2、服务器列表

3、搭建主从模式

①、主要配置项

主服务器(上图的Node1)配置文件 redis.config 主要配置项:

#配置端口

port 6379

#以守护进程模式启动

daemonize yes

#pid的存放文件

pidfile /var/run/redis_6379.pid

#日志文件名

logfile "redis_6379.log"

#存放备份文件以及日志等文件的目录

dir "/opt/redis/data"

从服务器配置文件主要配置项基本和主服务器保持一致,需要修改端口 port ;另外存放位置和日志文件名也可以根据需要修改.

为了表示主从关系,还需要在从服务器配置文件中添加一行重要配置:

#配置主服务器IP,端口

slaveof 192.168.14.101 6379

②、验证主从关系

配置完成后,我们通过 redis-server redis.conf 命令启动Redis.然后通过 redis-cli -p 端口 分别进入到各台服务器的控制行页面:

输入如下命令:

info replication

三台服务器打印结果如下:

由上图可以看到,Node1 服务器作为主服务器,节点角色是 master,另外的两台从服务器,节点角色都是 slave.

另外还可以进行如下测试:可以在主服务器上添加一条数据,然后看看从服务器上是否能够查到该数据.

③、问题

如果对于上面的测试,主服务器上添加的数据,从服务器上无法查询到,可以查看前面配置的目录/opt/redis/data 日志文件,有一种错误如下:

这是由于主服务器设置了登录密码,从服务器在向主服务器进行数据同步复制时,由于不知道主服务器密码,导致连接不上,从而无法进行同步.

解决这个问题,需要明确两个配置:

一.requreipass

设置redis的登录密码.

二.masterauth

针对master对应的slave节点设置的,在slave节点数据同步的时候用到。

建议,如果启用Redis密码校验,最好将各个节点的masterauth和requirepass设置为相同的密码;如果不设置为相同的,要注意slave节点masterauth和master节点requirepass的对应关系.

4、搭建哨兵模式

①、主要配置项

配置文件名称为:sentinel.conf

#配置端口

port 26379

#以守护进程模式启动

daemonize yes

#日志文件名

logfile "sentinel_26379.log"

#存放备份文件以及日志等文件的目录

dir "/opt/redis/data"

#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2个

sentinel monitor mymaster 192.168.14.101 6379 2

#30秒ping不通主节点的信息,主观认为master宕机

sentinel down-after-milliseconds mymaster 30000

#故障转移后重新主从复制,1表示串行,>1并行

sentinel parallel-syncs mymaster 1

#故障转移开始,三分钟内没有完成,则认为转移失败

sentinel failover-timeout mymaster 180000

注意三台服务器的端口配置.如果redis服务器配置了密码连接,则要增加如下配置:

sentinel auth-pass mymaster 123

后面的123表示密码.注意这行配置要配置到 sentinel monitor mymaster ip port 后面,因为名称 mymaster要先定义.

②、启动哨兵

redis-sentinel sentinel.conf

③、验证主从自动切换

首先kill掉Redis 主节点.然后查看sentinel 日志:

上面截图红框框住的几个重要信息,这里先介绍最后一行,switch-master mymaster 192.168.14.101 6379 192.168.14.103 6381 表示master服务器将由6379的redis服务切换为6381端口的redis服务器.

PS:+switch-master 表示切换主节点.

然后我们通过 info replication 命令查看 6381的redis服务器:

我们发现,6381的Redis服务已经切换成master节点了.

另外,也可以查看sentinel.conf 配置文件,里面的 sentinel monitor mymaster 192.168.14.101 6379 2 也自动更改为 sentinel monitor mymaster 192.168.14.103 6381 2 配置了.

5、Java客户端连接哨兵集群

这里通过springboot项目来连接,代码地址如下:

https://github.com/YSOcean/redis-sentinel.git

这里贴一下主要测试代码:

PS:实际上springboot已经为我们注入了RedisTemplate,我们在实际项目中不用写的像下面代码这么麻烦,这样写是为了详细的表明连接步骤.

//1.设置sentinel 各个节点集合

Set sentinelSet = new HashSet<>();

sentinelSet.add("192.168.14.101:26379");

sentinelSet.add("192.168.14.102:26380");

sentinelSet.add("192.168.14.103:26381");

//2.设置jedispool 连接池配置文件

JedisPoolConfig config = new JedisPoolConfig();

config.setMaxTotal(10);

config.setMaxWaitMillis(1000);

//3.设置mastername,sentinelNode集合,配置文件,Redis登录密码

JedisSentinelPool jedisSentinelPool = new JedisSentinelPool("mymaster",sentinelSet,config,"123");

Jedis jedis = null;

try {

jedis = jedisSentinelPool.getResource();

//获取Redis中key=hello的值

String value = jedis.get("hello");

System.out.println(value);

} catch (Exception e) {

e.printStackTrace();

} finally {

if(jedis != null){

jedis.close();

}

}

6、Java客户端连接原理

①、结构图

②、连接步骤

一.客户端遍历所有的 Sentinel 节点集合,获取一个可用的 Sentinel 节点.

二.客户端向可用的 Sentinel 节点发送 get-master-addr-by-name 命令,获取Redis Master 节点.

三.客户端向Redis Master节点发送role或role replication 命令,来确定其是否是Master节点,并且能够获取其 slave节点信息.

四.客户端获取到确定的节点信息后,便可以向Redis发送命令来进行后续操作了

需要注意的是:客户端是和Sentinel来进行交互的,通过Sentinel来获取真正的Redis节点信息,然后来操作.实际工作时,Sentinel 内部维护了一个主题队列,用来保存Redis的节点信息,并实时更新,客户端订阅了这个主题,然后实时的去获取这个队列的Redis节点信息.

7、哨兵模式工作原理

①、三个定时任务

一.每10秒每个 sentinel 对master 和 slave 执行info 命令:该命令第一个是用来发现slave节点,第二个是确定主从关系.

二.每2秒每个 sentinel 通过 master 节点的 channel(名称为_sentinel_:hello) 交换信息(pub/sub):用来交互对节点的看法(后面会介绍的节点主观下线和客观下线)以及自身信息.

三.每1秒每个 sentinel 对其他 sentinel 和 redis 执行 ping 命令,用于心跳检测,作为节点存活的判断依据.

②、主观下线和客观下线

一.主观下线

SDOWN:subjectively down,直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.

二.客观下线

ODOWN:objectively down,直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启故障转移机制.

结合我们第4点搭建主从模式,验证主从切换时,kill掉Redis主节点,然后查看 sentinel 日志,如下:

发现有类似 sdown 和 odown 的日志.在结合我们配置 sentinel 时的配置文件来看:

#监控的IP 端口号 名称 sentinel通过投票后认为mater宕机的数量,此处为至少2个

sentinel monitor mymaster 192.168.14.101 6379 2

最后的 2 表示投票数,也就是说当一台 sentinel 发现一个 Redis 服务无法 ping 通时,就标记为 主观下线 sdown;同时另外的 sentinel 服务也发现该 Redis 服务宕机,也标记为 主观下线,当多台 sentinel (大于等于2,上面配置的最后一个)时,都标记该Redis服务宕机,这时候就变为客观下线了,然后进行故障转移.

③、故障转移

故障转移是由 sentinel 领导者节点来完成的(只需要一个sentinel节点),关于 sentinel 领导者节点的选取也是每个 sentinel 向其他 sentinel 节点发送我要成为领导者的命令,超过半数sentinel 节点同意,并且也大于quorum ,那么他将成为领导者,如果有多个sentinel都成为了领导者,则会过段时间在进行选举.

sentinel 领导者节点选举出来后,会通过如下几步进行故障转移:

一.从 slave 节点中选出一个合适的 节点作为新的master节点.这里的合适包括如下几点:

1.选择 slave-priority(slave节点优先级)最高的slave节点,如果存在则返回,不存在则继续下一步判断.

2.选择复制偏移量最大的 slave 节点(复制的最完整),如果存在则返回,不存在则继续.

3.选择runId最小的slave节点(启动最早的节点)

二.对上面选出来的 slave 节点执行 slaveof no one 命令让其成为新的 master 节点.

三.向剩余的 slave 节点发送命令,让他们成为新master 节点的 slave 节点,复制规则和前面设置的 parallel-syncs 参数有关.

四.更新原来master 节点配置为 slave 节点,并保持对其进行关注,一旦这个节点重新恢复正常后,会命令它去复制新的master节点信息.(注意:原来的master节点恢复后是作为slave的角色)

可以从 sentinel 日志中出现的几个消息来进行查看故障转移:

1.+switch-master:表示切换主节点(从节点晋升为主节点)

2.+sdown:主观下线

3.+odown:客观下线

4.+convert-to-slave:切换从节点(原主节点降为从节点)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427918.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从java到C++入门

C基础知识前言基础前言 当初为了赶一波互联网热潮自学了java&#xff0c;如今因为需要就从java转向C开发&#xff0c;于是就有了java到C入门&#xff0c;每次的学习我都会记录一下C的学习历程。 基础 C对于内存的控制管理比java要有更多要求&#xff0c;因此C对于变量的创建…

wordpress 外部数据接口_使用接口方式获取WordPress用户信息的方法

今天WordPress主题站简单介绍一下WordPress系统中用户信息获取方式&#xff0c;今天就讲讲使用接口方式获取WordPress用户信息的方法。接口文件如下&#xff1a;if (POST ! $_SERVER[REQUEST_METHOD]) {header(Allow: POST);header(HTTP/1.1 405 Method Not Allowed);header(Co…

结构体内存拷贝的两种方法

结构体内存拷贝的两种方法前言内容总结前言 最近看一些代码&#xff0c;发现内存拷贝的两种方式&#xff0c;下面我就来介绍一下两种方式。 内容 首先定义一个结构体processorHead.h&#xff1a; #pragma pack(1)typedef struct {short b;int c;long long d; }DATA;#pragma…

大学物理实验长度的测量实验报告_大学物理实验教案长度和质量的测量两篇

大学物理实验教案长度和质量的测量两篇篇一&#xff1a;大学物理实验教案4--长度测量大学物理实验教案实验目的&#xff1a;1&#xff0e;掌握游标卡尺、螺旋测微计和移测显微镜的测量原理和使用方法。 2&#xff0e;根据仪器的精度和有效数字的定义&#xff0c;正确记录原始数…

Linux命令应用大词典-第25章 备份与还原

25.1 mkisofs:创建ISO9660/Joliet/hfs文件系统转载于:https://www.cnblogs.com/tqtl911/p/8661006.html

C++灵魂->指针

C灵魂->指针地址指针野指针空指针 【内存动态分配】指针变量的运算&#xff08;&#xff0c;-&#xff0c;&#xff0c;--&#xff09;指针与一维数组地址 计算机将内存以单个字节为单位分开&#xff0c;并对每个字节进行唯一性编号&#xff0c;那么这个编号就是地址。 取…

cpython cython_python – 优化Cython中的字符串

我建议你在cpython.array.arrays上进行你的操作.最好的文档是C API和Cython源码,我太懒了链接了.from cpython cimport arraydef cfuncA():cdef str acdef int i,jfor j in range(1000):a .join([chr(i) for i in range(127)])def cfuncB():cdef:str aarray.array[char] arr,t…

团队协作小结

0.前提&#xff1a;协作目标保持一致&#xff0c;目标理解一致。 1.量化工作内容&#xff0c;以工作量算&#xff0c;可以适当结合成员自身特点划分内容。 2.职责明确&#xff0c;工作块必须有一名负责人&#xff0c;不要搞多人化&#xff0c;防止责任推诿。 转载于:https://ww…

TCP解决粘包问题(结构数据封包拆包)

TCP封包拆包前言封包一、包结构二、封包方法拆包总结前言 TCP协议(Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的通信协议&#xff0c;即TCP采用字节流的方式&#xff0c;以字节为单位传输字节序列。 如果简单的发送长串的数据流&#xf…

mac下nvm_mac中nvm的安装和使用

nvm 是 Mac 下的 node 管理工具&#xff0c;如果是管理 Windows 下的 node&#xff0c;可以使用 nvmw 或 nvm-windows 。一、若电脑中已安装node,需先卸载。参考学习的文档&#xff1a;http://blog.csdn.net/zjuwwj/article/details/72805671npm ls -g --depth0# 查看已经安装在…

求交错序列前N项和(15 分)

7-2 求交错序列前N项和&#xff08;15 分&#xff09; 本题要求编写程序&#xff0c;计算交错序列 1-2/33/5-4/75/9-6/11... 的前N项之和。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中输出部分和的值&#xff0c;结果保留三位小数。 输入样例: 5输出样例: 0.…

拆包--缓冲区查找包头及包尾偏移

缓冲区查找包头及包尾偏移前言一、采用动态数组QByteArray的自带函数二、采用字节对比方法测试代码前言 根据前面所讲的内容封包拆包&#xff0c;当将网络中的数据读出存储在自定义缓冲区QByteArray中&#xff0c;则对数据包进行拆分。则首先要进行的工作就是找到包头的位置及…

5自适应单页源码_超详细!如何建立一个CPA单页网站,附高转化CPA模板源码

做CPA的老手一般都会建立一个CPA单页站&#xff0c;用来提升转化&#xff0c;提高推广质量。今天教大家搭建一个完整的CPA单页站搭建一个网站需要3样东西&#xff1a;域名服务器网站源码一、购买域名域名就是你网站的地址&#xff0c;建议从万网购买就可以&#xff0c;比较方便…

20154319 《网络对抗技术》后门原理与实践

一、实验说明 任务一&#xff1a;使用netcat获取主机操作Shell&#xff0c;cron启动 (0.5分) 任务二&#xff1a;使用socat获取主机操作Shell, 任务计划启动 (0.5分) 任务三&#xff1a;使用MSF meterpreter&#xff08;或其他软件&#xff09;生成可执行文件&#xff0c;利用…

强制类型转换的取整及四舍五入取整

强制类型转换取整相关前言取整方法例&#xff1a;(signed int)double四舍五入取整前言 开发中一般运算过程都采用浮点类型数据以免出现运算不精确的错误&#xff0c;而当运算结果需要时整型的时候就需要对浮点类型的结果进行取整处理&#xff0c;而取整的方法有向上取整&#…

github电脑壁纸_GitHub - githubtaotao/bing-wallpaper: Bing每日壁纸,自动获取Bing的精美图片设置为壁纸,并且支持随机切换历史壁纸,查看壁纸故事...

Bing每日壁纸发布一个开源小软件&#xff0c;Bing每日壁纸。该小软件可以自动获取Bing的精美图片设置为壁纸&#xff0c;并且支持随机切换历史壁纸&#xff0c;查看壁纸故事。欢迎大家下载使用&#xff0c;点star&#xff01;有问题请留言或者提issue。想了解技术原理的请看 技…

关于字节对齐

关于字节对齐前言意义自定义字节对齐存储空间内存读取效率平台适应性结论前言 计算机中的内存空间大小是以字节&#xff08;byte&#xff09;为基本单位划分的&#xff0c;从理论上讲似乎对任何类型的变量的访问可以从任何地址开始&#xff0c;而计算机并非逐字节大小读写内存…

c++中的多线程

使用 std::thread 时需要包含 #include<thread> 头文件&#xff0c;定义了表示线程的类、用于互斥访问的类与方法等。 参考网址&#xff1a; https://blog.csdn.net/liuker888/article/details/46848905https://blog.csdn.net/fengbingchun/article/details/73393229成员…

C++ reverse memcpy

C reverse memcpy前言基于QT的测试样例结果前言 C 实现翻转memcpy 基于QT的测试样例 代码如下&#xff1a; #include <iostream> #include <QtCore/QCoreApplication> #include <QDebug>using namespace std;void *reversememcpy(void *out, const void *…

打架程序_学生打架不知道怎么处理?一般程序了解下,对你或许有帮助

很多新老师&#xff0c;对处理学生问题的步骤其实还不是很了解&#xff0c;一遇到学生问题就很苦恼&#xff0c;用的方法很多&#xff1a;或劝、或骂、或赏、或罚&#xff0c;但总是觉得不得要领。今天我想通过昨天我处理的一个实例&#xff0c;针对性的聊一聊这个问题。希望对…