Redis:集群

为什么要有集群?

Redis 集群(Redis Cluster)是 Redis 官方提供的分布式解决方案,用于解决单机 Redis 在数据容量、并发处理能力和高可用性上的局限。通过 Redis 集群,可以实现数据分片、故障转移和高可用性,适用于高性能和大规模数据的场景。

image.png

数据分片算法

对三种数据分片算法的介绍以及 Redis 选择哈希槽分区算法而不选其他算法的原因:

哈希求余算法

对键的哈希值进行取模运算:节点 = hash(key) % N(N为节点数),直接决定数据存储在哪个节点。

特点

  • 简单直接,实现容易。
  • 节点增减时(N变化),几乎所有数据都需要重新映射。
  • 扩容/缩容成本高,数据迁移量大。

一致性哈希算法

将哈希空间组织为虚拟环(0~2^32-1),节点和键都哈希映射到环上,数据存储在顺时针方向第一个节点。

特点

  • 节点增减只影响相邻节点的数据。
  • 引入虚拟节点解决数据倾斜问题。
  • 扩容时数据迁移量约为1/N(N为节点数)。

哈希槽分区算法

预分配固定数量的槽位(Redis为16384个),槽位均匀分配给节点,键通过CRC16(key) % 16384确定槽位。

特点

  • 解耦数据与节点的直接关系。
  • 节点增减只需迁移对应槽位的数据。

Redis选择哈希槽的核心原因

  1. 扩展和缩容的平滑性
    • 与哈希求余算法相比,哈希槽分区算法在扩缩容时迁移的数据更少,保持集群的稳定性。
    • 相比一致性哈希算法,哈希槽固定且简单,节点扩展只需要重新分配少量槽位即可,不需要额外的虚拟节点管理。
  2. 负载均衡:Redis 通过哈希槽分区实现较为均衡的数据分布,同时在实际生产环境中可以手动调整节点和哈希槽的分配,提升负载均衡效果。
  3. 实现复杂度:一致性哈希算法需要维护复杂的环状结构和大量的虚拟节点,而哈希槽分区算法通过预设 16384 个哈希槽,大大简化了实现和管理成本。
  4. 可控的迁移成本:发生主节点故障时,通过哈希槽快速找到备用节点,自动进行故障转移,并更新槽位信息,维护高可用性。

工作原理

  1. 读写请求处理
  • 写操作只能由主节点处理,并同步到从节点。
  • 读操作默认在主节点处理,可以通过配置允许从节点处理读请求,以减轻主节点压力。
  1. 节点通信
  • Redis 集群的所有节点之间通过Gossip 协议进行通信,交换状态信息,检测节点的存活状态。
  • 每个节点都会定期向其他随机节点发送 PING 消息,以检测对方是否在线。
  • 如果检测到某主节点下线,Redis 会在一定条件下进行故障转移
  1. 故障检测与转移
  • 集群中的所有节点,都会周期性的使⽤心跳包进行通信,并对节点是否下线进行判定:

    • 主观下线:节点 A 认为节点 B 不可达,但其他节点可能不同意。

    • 客观下线:超过半数主节点认为节点 B 不可达,此时触发故障转移。

  • 故障转移过程包括:

    • 从节点选举新的主节点。
    • 更新集群的槽信息并广播。
    • 应用客户端更新主从关系。

集群扩容

添加新节点到集群,使用redis-cli添加节点:

# 添加主节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port
  • redis-cli --cluster表明使用 Redis 命令行工具来操作集群。
  • add-node是添加节点的操作指令。
  • new_host:new_port代表新节点的地址和端口,也就是要加入集群的节点;
  • existing_host:existing_port是集群中已存在的某个节点的地址和端口,借助这个已存在的节点,新节点就能和整个集群建立联系。
# 添加从节点
redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id <master-id>
  • --cluster-slave参数表明新节点要作为从节点加入集群。
  • --cluster-master-id <master-id>用于指定该从节点对应的主节点 ID,<master-id>需要替换成实际的主节点 ID,这样新节点就会成为指定主节点的从节点,负责复制主节点的数据。
# 自动平衡哈希槽
redis-cli --cluster rebalance <任意集群节点IP:端口> --cluster-use-empty-masters
  • rebalance指令会让集群自动调整哈希槽的分布,使各个节点的负载更均衡。
  • <任意集群节点IP:端口>表示可以指定集群中任意一个节点的地址和端口,命令会通过这个节点和集群通信并执行操作。
  • --cluster-use-empty-masters参数表示在平衡过程中会考虑使用那些没有分配哈希槽的主节点。

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

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

相关文章

【2012】【论文笔记】太赫兹波在非磁化等离子体——

前言 类型 太赫兹 + 等离子体 太赫兹 + 等离子体 太赫兹+等离子体 期刊 物理学报 物理学报 物理学报 作者

Linux字符驱动设备开发入门之框架搭建

声明 本博客所记录的关于正点原子i.MX6ULL开发板的学习笔记&#xff0c;&#xff08;内容参照正点原子I.MX6U嵌入式linux驱动开发指南&#xff0c;可在正点原子官方获取正点原子Linux开发板 — 正点原子资料下载中心 1.0.0 文档&#xff09;&#xff0c;旨在如实记录我在学校学…

小刚说C语言刷题——第15讲 多分支结构

1.多分支结构 所谓多分支结构是指在选择的时候有多种选择。根据条件满足哪个分支&#xff0c;就走对应分支的语句。 2.语法格式 if(条件1) 语句1; else if(条件2) 语句2; else if(条件3) 语句3; ....... else 语句n; 3.示例代码 从键盘输入三条边的长度&#xff0c;…

Apache httpclient okhttp(1)

学习链接 Apache httpclient & okhttp&#xff08;1&#xff09; Apache httpclient & okhttp&#xff08;2&#xff09; httpcomponents-client github apache httpclient文档 apache httpclient文档详细使用 log4j日志官方文档 【Java基础】- HttpURLConnection…

洛谷题单3-P1420 最长连号-python-流程图重构

题目描述 输入长度为 n n n 的一个正整数序列&#xff0c;要求输出序列中最长连号的长度。 连号指在序列中&#xff0c;从小到大的连续自然数。 输入格式 第一行&#xff0c;一个整数 n n n。 第二行&#xff0c; n n n 个整数 a i a_i ai​&#xff0c;之间用空格隔开…

使用binance-connector库获取Binance全市场的币种价格,然后选择一个币种进行下单

一个完整的示例,展示如何使用 api 获取Binance全市场的币种价格,然后选择一个最便宜的币种进行下单操作 代码经过修改,亲测可用,目前只可用于现货,合约的待开发 获取市场价格:使用client.ticker_price()获取所有交易对的当前价格 账户检查:获取账户余额,确保有足够的资…

算法设计学习10

实验目的及要求&#xff1a; 本查找实验旨在使学生深入了解不同查找算法的原理、性能特征和适用场景&#xff0c;培养其在实际问题中选择和应用查找算法的能力。通过实验&#xff0c;学生将具体实现多种查找算法&#xff0c;并通过性能测试验证其在不同数据集上的表现&#xff…

5天速成ai agent智能体camel-ai之第1天:camel-ai安装和智能体交流消息讲解(附源码,零基础可学习运行)

嗨&#xff0c;朋友们&#xff01;&#x1f44b; 是不是感觉AI浪潮铺天盖地&#xff0c;身边的人都在谈论AI Agent、大模型&#xff0c;而你看着那些密密麻麻的代码&#xff0c;感觉像在读天书&#xff1f;&#x1f92f; 别焦虑&#xff01;你不是一个人。很多人都想抓住AI的风…

MySQL介绍及使用

1. 安装、启动、配置 MySQL 1. 安装 MySQL 更新软件包索引 sudo apt update 安装 MySQL 服务器 sudo apt install mysql-server 安装过程中可能会提示你设置 root 用户密码。如果没有提示&#xff0c;可以跳过&#xff0c;后续可以手动设置。 2. 配置 MySQL 运行安全脚本…

九、重学C++—类和函数

上一章节&#xff1a; 八、重学C—动态多态&#xff08;运行期&#xff09;-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/147004745?spm1001.2014.3001.5502 本章节代码&#xff1a; cpp/cppClassAndFunc.cpp CuiQingCheng/cppstudy - 码云 - 开源中国…

lua和C的交互

1.C调用lua例子 #include <iostream> #include <lua.hpp>int main() {//用于创建一个新的lua虚拟机lua_State* L luaL_newstate();luaL_openlibs(L);//打开标准库/*if (luaL_dofile(L, "test.lua") ! LUA_OK) {std::cerr << "Lua error: &…

java高并发------守护线程Daemon Thread

文章目录 1.概念2.生命周期与行为2. 应用场景3. 示例代码4. 注意事项 1.概念 Daemon &#xff1a; 滴门 在Java中&#xff0c;线程分为两类&#xff1a;用户线程(User Thread)和守护线程(Daemon Thread)。 守护线程是后台线程&#xff0c;主要服务于用户线程&#xff0c;当所…

Docker存储策略深度解析:临时文件 vs 持久化存储选型指南

Docker存储策略深度解析&#xff1a;临时文件 vs 持久化存储选型指南 一、存储类型全景对比二、临时存储适用场景与风险2.1 最佳使用案例2.2 风险警示 三、持久化存储技术选型3.1 Volume核心优势Volume管理命令&#xff1a; 3.2 Bind Mount适用边界挂载模式对比&#xff1a; 四…

【Linux网络#18】:深入理解select多路转接:传统I/O复用的基石

&#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 目录 一、前言&#xff1a;&#x1f525; I/O 多路转接 为什么需要I/O多路转接&#xff1f; 二、I/O 多路转接之 select 1. 初识 select2. select 函数原型2.1 关于 fd_set 结…

高级:微服务架构面试题全攻略

一、引言 在现代软件开发中&#xff0c;微服务架构被广泛应用于构建复杂、可扩展的应用程序。面试官通过相关问题&#xff0c;考察候选人对微服务架构的理解、拆分原则的掌握、服务治理的能力以及API网关的运用等。本文将深入剖析微服务架构相关的面试题&#xff0c;结合实际开…

使用MQTTX软件连接阿里云

使用MQTTX软件连接阿里云 MQTTX软件阿里云配置MQTTX软件设置 MQTTX软件 阿里云配置 ESP8266连接阿里云这篇文章里有详细的创建过程&#xff0c;这里就不再重复了&#xff0c;需要的可以点击了解一下。 MQTTX软件设置 打开软件之后&#xff0c;首先点击添加进行创建。 在阿…

【HFP】蓝牙Hands-Free Profile(HFP)核心技术解析

蓝牙 Hands-Free Profile&#xff08;HFP&#xff09;作为车载通信和蓝牙耳机的核心协议&#xff0c;定义了设备间语音交互的标准化流程&#xff0c;并持续推动着无线语音交互体验的革新。自2002年首次纳入蓝牙核心规范以来&#xff0c;HFP历经多次版本迭代&#xff08;最新为v…

轻量化大模型微调工具XTuner指令微调实战(下篇)

接着上篇文章《轻量化大模型微调工具XTuner指令微调实战&#xff08;上篇&#xff09;》来接着写教程。 一、模型转换 模型训练后会自动保存成 PTH 模型&#xff08;例如 iter_500.pth&#xff09;&#xff0c;我们需要利用 xtuner convert pth_to_hf 将其转换为 HuggingFace…

pyTorch框架使用CNN进行手写数字识别

目录 1.导包 2.torchvision数据处理的方法 3.下载加载手写数字的训练数据集 4.下载加载手写数字的测试数据集 5. 将训练数据与测试数据 转换成dataloader 6.转成迭代器取数据 7.创建模型 8. 把model拷到GPU上面去 9. 定义损失函数 10. 定义优化器 11. 定义训练…

强化学习课程:stanford_cs234 学习笔记(3)introduction to RL

文章目录 前言7 markov 实践7.1 markov 过程再叙7.2 markov 奖励过程 MRP&#xff08;markov reward process&#xff09;7.3 markov 价值函数与贝尔曼方程7.4 markov 决策过程MDP&#xff08;markov decision process&#xff09;的 状态价值函数7.4.1 状态价值函数7.4.2 状态…