Redis 分片集群

目录

​编辑一、搭建分片集群

1、集群结构

​编辑 2、准备实例和配置

3、启动

4、创建集群

二、散列插槽

 三、集群伸缩

四、故障转移

1、自动故障转移

2、手动故障转移

五、RedisTemplate 访问分片集群


一、搭建分片集群

1、集群结构

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

1、海量数据存储问题

2、高并发写的问题

使用分片集群可以解决上述问题,分片集群特征:

1、集群中有多个master,每个master保存不同数据

2、每个master都可以有多个slave节点

3、master之间通过ping监测彼此健康状态

4、客户端请求可以访问集群任意节点,最终都会被转发到正确节点 

这里我们会在同一台虚拟机中开启6个redis实例,模拟分片集群,信息如下:

 2、准备实例和配置

先删除之前的 7001、7002、7003 这几个目录,重新创建7001、7002、7003、8001、8002、8003 目录

# 进入/tmp目录
cd /tmp
# 删除旧的,避免配置干扰
rm -rf 7001 7002 7003
# 创建目录
mkdir 7001 7002 7003 8001 8002 8003

在 /tmp 下准备一个新的 redis.conf 文件,内容如下:

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /tmp/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /tmp/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
replica-announce-ip 111.229.153.16
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /tmp/6379/run.log

将这个文件拷贝到每个目录下:

# 进入/tmp目录
cd /tmp
# 执行拷贝
echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

修改每个目录下的redis.conf,将其中的6379修改为与所在目录一致:

# 进入/tmp目录
cd /tmp
# 修改配置文件
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

3、启动

因为已经配置了后台启动模式,所以可以直接启动服务:

# 进入/tmp目录
cd /tmp
# 一键启动所有服务
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

通过ps查看状态:

ps -ef | grep redis

如果要关闭所有进程,可以执行命令:

ps -ef | grep redis | awk '{print $2}' | xargs kill

4、创建集群

我使用的是Redis6.2版本,集群管理以及集成到了redis-cli中,格式如下:

/usr/redis/bin/redis-cli --cluster create --cluster-replicas 1 111.229.153.16:7001 111.229.153.16:7002 111.229.153.16:7003 111.229.153.16:8001 111.229.153.16:8002 111.229.153.16:8003

命令说明:

 输入 yes 之后,集群开始创建


二、散列插槽

Redis会把每一个master节点映射到0~16383共16384个插槽(hash slot)上,查看集群信息时就能看到:

那么为什么要做这样一个插槽呢?

假设现在,我们要 set num 123 那么这个 num 应该存储在哪个 master 上呢? ,假设我们将其存储到 7001 上,那么到时候我们找的时候又怎么知道它存储在 7001 上呢?

插槽就是用来解决这个问题的

数据key不是与节点绑定,而是与插槽绑定。redis 会根据 key 的有效部分计算插槽值,分两种情况:

1、key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分

2、key中不包含“{}”,整个key都是有效部分

例如:key是num,那么就根据num计算,如果是{itcast}num,则根据itcast计算。计算方式是利用CRC16算法得到一个hash值,然后对16384取余,得到的结果就是slot值。

为什么我们的 key 要去和插槽绑定,而不是和节点绑定呢?

这是因为我们 redis 的主节点是可能出现宕机等情况的,如果一个节点删除了或者宕机了,那么上面的数据也就会丢失,而如果数据是和插槽绑定,当节点宕机时,我们可以将这个节点对应的插槽转移到活着的节点,集群扩容时,我们也可以将插槽进行转移,这样数据跟着插槽走,就永远都能找到数据所在的位置了

key 和插槽绑定的体现:

总结:

Redis如何判断某个key应该在哪个实例?

1、将16384个插槽分配到不同的实例

2、根据key的有效部分计算哈希值,对16384取余

3、余数作为插槽,寻找插槽所在实例即可

如何将同一类数据固定的保存在同一个Redis实例?

这一类数据使用相同的有效部分,例如 key 都以 {typeId} 为前缀


 三、集群伸缩

redis-cli --cluster提供了很多操作集群的命令,可以通过下面方式查看:

redis-cli --cluster help

比如,添加节点的命令:

add-node

我们可以看到,添加节点的时候需要几个参数:新节点的端口和 IP,已经存在的主机的端口和 IP

那么为什么我们添加新节点还要知道旧节点的 IP 和端口呢?

因为当你向集群中添加节点,需要通知集群中的每个角色,那么就得先连上集群,提供了已经存在的主机的端口和 IP,就能联系上集群,从而把新节点的信息通知给每一个节点


四、故障转移

1、自动故障转移

当集群中有一个 master 宕机会发生什么呢?

1、首先是该实例与其它实例失去连接

2、然后是疑似宕机:

3、最后是确定下线,自动提升一个slave为新的master:

2、手动故障转移

利用 cluster failover 命令可以手动让集群中的某个 master 宕机,切换到执行 cluster failover 命令的这个 slave 节点,实现无感知的数据迁移。其流程如下:

再执行命令的那一刻,slave 会向 master 发送一个消息,告诉它 当前这个 slave 将要替换它,为了避免消息的丢失,master 就会拒绝客户端的一切请求

此时 master 会返回当前的 offset 给 slave ,如果二者 offset 不一致,就进行同步,同步完成之后,slave 与 master 数据就完全一致了。 

slave 与 master 数据完全一致之后就可以进行故障转移,slave 标记自己成 master 并广播故障转移的结果,master 受到广播后,就转为 slave

手动的 failover 支持三种不同模式:

缺省:默认的流程,如图1~6歩

force:省略了对offset的一致性校验

takeover:直接执行第5歩,忽略数据一致性、忽略master状态和其它master的意见


五、RedisTemplate 访问分片集群

RedisTemplate 底层同样基于 lettuce 实现了分片集群的支持,而使用的步骤与哨兵模式基本一致:

1、引入 redis 的 starter 依赖

2、配置分片集群地址

3、配置读写分离

与哨兵模式相比,其中只有分片集群的配置方式略有差异,如下:

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

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

相关文章

如何将苹果手机照片导出?教你3个导出照片的必备技巧!

照片是我们记录生活,以及留下美好瞬间的最佳方式之一。通过手机照片,我们可以随时随地回忆过去的点点滴滴,还能将其分享给朋友和家人。因此,照片对于大家来说具有不可替代的价值与意义。 为了防止手机照片丢失,部分小…

多路IO—POll函数,epoll服务器开发流程

引言 "在计算机网络编程中,多路IO技术是非常常见的一种技术。其中,Poll函数和Epoll函数是最为常用的两种多路IO技术。这两种技术可以帮助服务器端处理多个客户端的并发请求,提高了服务器的性能。本文将介绍Poll和Epoll函数的使用方法&am…

算法通关村第四关-黄金挑战基础计算器问题

大家好我是苏麟 , 今天带来栈的比较难的问题 . 计算器问题 基础计算器 LeetCode 224 描述 : 给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。 s 由数字、、-、(、)、和 组成s 表示一个有效的表达式 不能用作一元运算(例如, …

高效处理异常值的算法:One-class SVM模型的自动化方案

一、引言 数据清洗和异常值处理在数据分析和机器学习任务中扮演着关键的角色。清洗数据可以提高数据质量,消除噪声和错误,从而确保后续分析和建模的准确性和可靠性。而异常值则可能对数据分析结果产生严重影响,导致误导性的结论和决策。因此&…

C++类和对象下(初始化列表,静态成员,explicit关键字,友元)

C类和对象下[初始化列表,静态成员,explicit关键字,友元] 一.初始化列表1.为什么会有初始化列表2.初始化列表的语法形式3.没有默认构造函数的自定义成员变量4.初始化列表是成员变量定义的地方5.初始化列表可以跟函数体内定义搭配使用6.初始化列表执行的顺序7.总结建议 二.静态成…

当风格遇上浴缸:浴室装饰的秘诀

浴室不再仅仅是个洗漱的地方,如今它们是室内设计的一部分,有时甚至是焦点。浴室的装饰风格可以塑造整个房间的氛围,而浴缸通常是浴室内最引人注目的元素之一。在这里,我们将简单探讨不同室内设计风格与浴缸如何融合,让…

PlantSimulation安装帮助文档端口被占用的解决办法

PlantSimulation安装帮助文档端口被占用的解决办法 从PlantSimulaiton(TPS)2201开始帮助文档开始使用在线,如果使用本地则需要安装本地文档服务器。但是在安装过程中你可能会遇到,5000断开被占用的情况。解决办法如下&#xff1a…

C# 发送邮件

1.安装 NuGet 包 2.代码如下 SendMailUtil using MimeKit; using Srm.CMER.Application.Contracts.CmerInfo; namespace Srm.Mail { public class SendMailUtil { public async static Task<string> SendEmail(SendEmialDto sendEmialDto,List<strin…

java APP自动化测试AppIum

一、前言 二、Appium环境搭建 2.1 JDK安装 2.2 Android SDK安装配置 2.3 模拟器安装及配置 2.4 Appium Desktop安装及使用 2.5 Appium配置连接模拟器 三、实战基本脚本编写 3.1 创建Maven项目并配置 3.2 简单Demo 四、写在最后 一、前言 随着移动互联网的发展&#xff0c;AP…

mac录屏快捷键指南,轻松录制屏幕内容!

“大家知道mac电脑有录屏快捷键吗&#xff0c;现在录屏不太方便&#xff0c;每次都花很多时间&#xff0c;要是有录屏快捷键&#xff0c;应该会快速很多&#xff0c;可是哪里都找不到&#xff0c;有人知道吗&#xff1f;帮帮我&#xff01;” 苹果的mac电脑以其精美的设计和卓…

Java使用pdfbox进行pdf和图片之间的转换

简介 pdfbox是Apache开源的一个项目,支持pdf文档操作功能。 官网地址: Apache PDFBox | A Java PDF Library 支持的功能如下图.引入依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app</artifactId><version>…

AIGC|把Azure Open AI和Jira集成起来,实现智能化项目管理

目录 一、Jira与Azure OpenAI介绍 二、Jira和Azure OpenAI的REST API对接 三、利用Chats插件实现对话的过程 四、总结 一、Jira与Azure OpenAI介绍 Jira是一款由澳大利亚公司Atlassian开发的项目管理工具&#xff0c;主要用于追踪问题、管理需求、构建报告和管理故障等事项…

ruby语言怎么写个通用爬虫程序?

Ruby语言爬虫是指使用Ruby编写的网络爬虫程序&#xff0c;用于自动化地从互联网上获取数据。其中&#xff0c;CRawler是一个基于文本的小型地牢爬虫&#xff0c;它被设计为可扩展&#xff0c;所有游戏数据均通过JSON文件提供&#xff0c;程序仅处理游戏引擎。除此之外&#xff…

EasyExcel复杂表头数据导入

目录 表头示例导入代码数据导出 表头示例 导入代码 Overridepublic void importExcel(InputStream inputStream) {ItemExcelListener itemExcelListener new ItemExcelListener();EasyExcel.read(inputStream, ImportItem.class, itemExcelListener).headRowNumber(2).sheet()…

OSPF 高级特性3

一、OSPF安全特性 1、OSPF报文验证&#xff1a; 区域验证模式&#xff1a;在区域下配置一致的密码才能加入同一个区域。 [r3-ospf-1-area-0.0.0.0]authentication-mode md5 1 cipher 123456 接口验证模式&#xff1a;链路两端的接口必须配置一致的密码才能建立邻居关系 [r5-Gig…

回归预测 | Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测

Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测 目录 Matlab实现SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量机的多输入单输出回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.SO-CNN-SVM蛇群算法优化卷积神经网络-支持向量…

oracel处理XML时,报ORA-31011、ORA-19202。

原字段为clob&#xff0c; 查询 SELECT XMLTYPE(字段) FROM TABLE_A报错如下&#xff1a; ORA-31011: XML 语法分析失败 ORA-19202: XML 处理 LPX-00217: invalid character 12 (U000C) Error at line 1559时出错 ORA-06512: 在 "SYS.XMLTYPE", line 272 ORA-0651…

大洋钻探系列之一引子

大洋科学钻探计划自1968年启动开始&#xff0c;迄今已有50余年&#xff0c;先后经历了&#xff14;个阶段。深海钻探计划(Deep Sea Drilling Program&#xff0c;DSDP&#xff0c;1968-1983年&#xff09;、国际大洋钻探计划&#xff08;Ocean Drilling Program&#xff0c;ODP…

目标检测 图像处理 计算机视觉 工业视觉

目标检测 图像处理 计算机视觉 工业视觉 工业表盘自动识别&#xff08;指针型和数值型&#xff09;智能水尺识别电梯中电动车识别&#xff0c;人数统计缺陷检测&#xff08;半导体&#xff0c;电子元器件等&#xff09;没带头盔检测基于dlib的人脸识别抽烟检测和睡岗检测/驾驶疲…

【使用Python编写游戏辅助工具】第三篇:鼠标连击器的实现

前言 这里是【使用Python编写游戏辅助工具】的第三篇&#xff1a;鼠标连击器的实现。本文主要介绍使用Python来实现鼠标连击功能。 鼠标连击是指在很短的时间内多次点击鼠标按钮&#xff0c;通常是鼠标左键。当触发鼠标连击时&#xff0c;鼠标按钮会迅速按下和释放多次&#xf…