Redis的哨兵和集群实现高可用

一个典型的高可用Redis集群示例配置

1个主服务器
2-3个从服务器
3-5个哨兵

哨兵和集群就是为了高可用

哨兵

哨兵的功能:监听和故障转移

(1)客户端可以从哨兵获得集群的状态。
(2)当主服务器断开,哨兵可以进行选举主服务器。

哨兵的工作流程

  1. 在配置中,设置master的ip和端口
  2. 创建master之间的命令连接和订阅连接

命令连接:发送命令
订阅连接:即发布与订阅功能的订阅功能,订阅了_sentinel_:hello频道,用来发布配置变更等
当一个哨兵通过命令连接向服务器发送一条命令后,服务器会再哨兵频道发布这条命令,此时订阅的所有哨兵都能感知到

  1. sentinel默认10秒一次通过命令连接向主服务器获取当前集群消息。(从服务器的ip,port,状态,offset等)
  2. 建立从服务器的命令连接和订阅哨兵频道
  3. 和其他哨兵建立命令连接
  4. 主服务器主观下线和客观下线

因为哨兵的超时下线时间配置不同,当一个哨兵检测到下线那么就是主观下线,当多个哨兵(个数需要配置)同时同意主服务器下线,那么就是客观下线

  1. 选举领头哨兵(随机)
  2. 领头哨兵进行故障转移(raft)
    将一个从服务器转为主服务器,掉线主服务器重连后作为从服务器。
    即向新主服务器发送slaveof no one,其他服务器发送slaveof 新主服务器的ip port

集群

redis的主从框架是为了备份和高可用,集群是为了分布式集群扩容。
集群就是将数据发布到不同的redis程序中。
使用集群功能时只能使用0号数据库。

数据分片

所有的信息都分布到槽中:
Redis 集群使用 CRC16 哈希函数来计算每个键的哈希值,然后对 16384 取模,以确定该键属于哪个槽。具体公式为:
计算一个key的hash值:slot=CRC16(key)%16384

要想集群工作,需要将1万6的槽都分配

如果 Redis 集群中的所有 16384 个槽没有被分配完,那么集群将无法正常工作。每个槽都需要被分配给一个节点,否则集群会认为它尚未完全初始化,导致集群状态为不健康。

重定向

当客户端请求的键不在当前节点负责的槽范围内时,需要进行重定向,以确保请求被正确处理。
客户端只需发送一次 GET 命令,Redis 集群会处理重定向并将结果返回给客户端。

节点间通信

Redis 集群中的所有节点(主节点和从节点)需要互相通信以交换状态信息、检测故障以及协调数据分片和故障转移。主要的通信方式包括:

Gossip 协议:节点之间使用 Gossip 协议交换集群状态信息。每个节点会定期向其他节点发送 PING 消息,并接收 PONG 响应,以检测节点的健康状况和状态变化。
Pub/Sub 机制:节点之间使用发布/订阅机制来传播集群配置更改和槽分配信息。

故障检测和转移

Redis 集群通过节点间的心跳消息和故障检测机制来实现高可用性。当主节点发生故障时,集群会自动进行故障转移(failover),具体步骤如下:

故障检测:集群中的每个节点都会定期向其他节点发送 PING 消息,以检测节点的健康状态。如果一个节点在一定时间内未能响应 PING 消息,该节点将被标记为下线。
故障确认:其他节点也会检查该节点的状态,如果大多数主节点都认为该节点下线,则该节点会被标记为故障节点。
选举新的主节点:从节点中选举一个新的主节点。选举过程由集群中的节点协同完成,通常选择拥有最新数据的从节点作为新的主节点。
角色转换:被选中的从节点会转换为主节点,并接管故障主节点的槽。其他从节点会重新配置,开始复制新的主节点的数据。
新的主节点接管了故障主节点的槽,客户端请求会被重定向到新的主节点。

开放通信端口

Redis 节点需要开放两个端口,一个是标准的 Redis 端口(默认 6379),另一个是集群总线端口(通常是 Redis 端口加 10000,例如 16379)。集群总线端口用于节点间的 Gossip 通信和故障检测。

集群配置

配置 Redis 集群时,需要确保各个节点可以正确识别和通信。常见的配置步骤包括:
配置文件:在每个 Redis 实例的配置文件中启用集群模式,并指定节点间的通信端口。例如:
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
启动集群:使用 redis-cli 工具创建和初始化集群时,确保所有节点的 IP 地址和端口正确,并且节点间可互相访问。例如:
redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 --cluster-replicas 1

从节点加入集群

(1)正确配置 slaveof 命令:
从节点需要通过 slaveof 命令将自己配置为某个主节点的从节点。例如:
slaveof
(2)从节点需要开启集群模式:
在 Redis 集群中,所有的节点(主节点和从节点)都需要在配置文件中启用集群模式。这可以通过设置 cluster-enabled yes 来实现。
(3)集群握手和加入:
当从节点正确配置了 slaveof 命令并启用了集群模式后,它会尝试连接主节点,并进行握手和加入集群的过程。主节点会识别连接的从节点,并将其加入到集群中。从节点会从主节点同步数据,并参与集群中的数据复制和故障转移。
(4)自动发现其他节点:
一旦从节点成功加入集群,它会通过集群的 gossip 协议与其他节点通信,获取集群的配置信息和状态。

集群客户端:lettuce

在 Java 中连接 Redis 集群,通常使用的是 lettuce 或 Jedis Cluster 这两个主要的客户端库。它们都支持 Redis 集群模式,并提供了自动的节点发现、数据分片管理和自动重定向功能。

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

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

相关文章

UI图标库推荐网站

在推荐图标库时,我会考虑图标的多样性、质量、易用性以及是否免费或开源等因素。以下是一些值得推荐的图标库: 1. Font Awesome 特点:Font Awesome是一套绝佳的图标字体库和CSS框架,提供可缩放的矢量图标。您可以使用CSS所提供的…

24/7/12总结

axios Axios 是一个基于 promise 网络请求库&#xff0c;作用于node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和node.js中)。在服务端它使用原生 node.js http 模块, 而在客户端 (浏览端) 则使用 XMLHttpRequests。 get请求: <script>function…

【Linux网络】数据链路层【下】{MAC/MTU/ARP/ICMP/NAT/PING/代理服务器原理}

文章目录 1.逐步深入数据链路层1.1MAC帧1.2由集线器到交换机1.3认识MTU 2.ARP 地址解析协议/RARP逆地址解析协议3.DNS(Domain Name System)域名从输入url后到能看到网页 发生了什么【典中典】 4.ICMP协议&#xff1a;一个网络层协议有了TCP&#xff0c;为什么还要用ICMPICMP协议…

面向对象程序设计之常用集合类

容器集合类&#xff0c;是后端的基础&#xff0c;本文以面向对象语言c#与java为例&#xff0c;了解常用的集合类。 c# List<T>: System.Collections.Generic.List<T> 是动态数组的泛型集合类。它提供了类型安全性和高效的元素访问。 List<string> list ne…

uboot学习:(一)基础认知

目录 uboot是一个裸机程序&#xff08;bootloader&#xff09; 作用 要运行linux系统时&#xff0c;如何从外置的flash拷贝到DDR中&#xff0c;才能启动 uboot使用步骤 步骤1中的命令例子 注意 uboot源码获取方法 uboot是一个裸机程序&#xff08;bootloader&#xff09…

1、预处理

C语言预处理 预处理是C语言编译过程中的第一个阶段&#xff0c;它主要处理以 # 开头的预处理指令。预处理器会在实际编译之前对源代码进行一些文本操作。 1. 宏定义 (#define) 宏定义用于定义常量或者简单的函数。 1.1 简单的宏定义 // 定义圆周率常量 #define PI 3.14159…

解决RedisTemplate配置JSON序列化后@Cacheable序列化仍然是JDK序列化的问题

问题现象 在参考网上的Redis集成后&#xff0c;配置了RedisTemplate的序列化&#xff0c;配置成功后Cacheable注解的缓存仍然是jdk的序列化&#xff0c;配置无效。 参考配置的类似代码&#xff1a; Bean("redisTemplate") public RedisTemplate<Object, Objec…

[Python学习篇] Python Socket网络编程

Python中的socket编程是通过内置的socket模块实现的&#xff0c;可以方便地创建网络应用程序&#xff0c;包括客户端和服务器。 服务端 1. 创建套接字 使用socket.socket()函数创建一个TCP套接字。套接字可以是流式&#xff08;TCP&#xff09;或数据报式&#xff08;UDP&…

HSP_15章 Python_模板设计模式和oop进阶总结

P136 模板设计模式 1. 设计模式简介 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式 设计模式就像是经典的棋谱&#xff0c;不同的棋局&#xff0c;我们用不同的棋谱&#xff0c;免去我们自己再思考和摸索 2. 模板设计模式 基本…

【面试八股总结】单例模式实现详解

一、基本概念 单例设计模式是⼀种确保⼀个类只有⼀个实例&#xff0c;并提供⼀个全局访问点来访问该实例的创建模式。 关键概念&#xff1a; 一个私有构造函数&#xff1a;确保只能单例类自己创建实例一个私有静态变量&#xff1a;确保只有一个实例&#xff0c;私有静态变量用…

4-4 词嵌入技术(word2vec)

4-4 词嵌入技术&#xff08;word2vec&#xff09; 词嵌入技术&#xff08;word2vec&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一种关键技术&#xff0c;通过将词语映射到低维向量空间中&#xff0c;使得计算机能够理解和处理语言中的语义信息。词嵌入不仅可以…

【性能测试】第一节.性能测试基础

文章目录 前言一、性能测试概述二、常见的性能测试指标 2.1 并发 2.2 响应时间 2.3 事务 2.4 点击率 2.5 吞吐量 2.6 资源利用率三、性能测试的分类 3.1 一般性能测试 3.2 负载测试 3.3 压力测试 3.4 稳定性测试总结 前言 一…

CAS详解

文章目录 CAS使用示例Unsafe类实现原理CAS问题 CAS CAS全称为Compare and Swap被译为比较并交换&#xff0c;是一种无锁算法。用于实现并发编程中的原子操作。CAS操作检查某个变量是否与预期的值相同&#xff0c;如果相同则将其更新为新值。CAS操作是原子的&#xff0c;这意味…

【错题集-编程题】栈和排序(栈 + 贪心)

牛客对于题目连接&#xff1a;栈和排序_牛客题霸_牛客网 (nowcoder.com) 一、分析题目 每次尽可能的先让当前需要的最大值弹出去。 二、代码 // 修改后的代码 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方…

【2024_CUMCM】Matlab快速入门

目录 常识 disp and input 字符串合并 sum 提取矩阵指定位置的元素 指定行列 指定行or指定列&#xff08;返回行/列向量&#xff09; 指定某些行 指定全部元素&#xff0c;按列拼接 size repmat 矩阵的运算 基本运算 形状相同的矩阵运算 每个元素同时和常数相乘或相…

C++相关概念和易错语法(19)(继承规则、继承下的构造和析构、函数隐藏)

1.继承规则 继承的本质是复用&#xff0c;是结构上的继承而不是内容上的继承&#xff0c;近似于在子类中声明了父类的成员变量。 &#xff08;1&#xff09;写法&#xff1a;class student : public person 派生类&#xff08;子类&#xff09;&#xff0c;继承方式&…

代码随想录算法训练营第二十八天|56. 合并区间、738.单调递增的数字

56. 合并区间 给出一个区间的集合&#xff0c;请合并所有重叠的区间。 class Solution { public:static bool cmp(const vector<int>& A, const vector<int>& B){if(A[0]!B[0]) return A[0]<B[0];return A[1]<B[1];}vector<vector<int>&g…

Python的基础语法——持续更新版

1、type查看数据类型 # 直接输出结果 print(type("Hello")) # 先用变量存储 string_type type("Hello") print(string_type) 2、 类型转化 任何类型可以转化为字符串&#xff0c;但字符串不可以随意转化&#xff0c;要求字符串类内容都是数字 # 类型…

泛二级泛目录多模板程序程序(泛目录和二级目录的区别)

泛解析站群_优化网站排名吸引百度蜘蛛必备程序主要功能&#xff1a; 1、网站支持无限生成页面不存在死链的风险每个也是不是网站栏目就是文章内容! 2、支持域名泛解析绑定&#xff0c;每个二级域名都是一个独立的 3、支持百度自动提交收录&#xff0c;每天随机自动提交无限自己…

echarts图表:类目轴

category 类目轴&#xff0c;适用于离散的类目数据。 例如商品名称、时间等。 类目轴上的每个刻度代表一个类目&#xff0c;刻度之间没有量的关系&#xff0c;只是简单的分类。 在类目轴上&#xff0c;数据点会对应到相应的类目上。