Redis 分片集群

news2024/11/29 0:46:32

目录

​编辑一、搭建分片集群

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.coloradmin.cn/o/1166309.html

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

相关文章

01-SDV全域OS研发思考

背景 近年来,随着汽车“新四化”浪潮的兴起,软件定义已成为产业共识,将深度参与到整个汽车的定义、开发验证销售以及服务全过程。一方面确保软件可升级,跨车型、软件甚至跨车企软件重用。另一方面对于硬来讲,要做到可…

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

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

UTONMOS:元宇宙顺势而上,重构数字化发展新形态

元宇宙(Metaverse)是一个虚拟的、且与现实世界平行的虚拟世界,由一系列相互关联的技术组成。在这个虚拟世界中,人们可以通过 VR、 AR等设备进入其中,与虚拟人物进行互动。 随着新一代信息技术的飞速发展,元…

将函数模板作为拷贝构造函数

目录 前言 一.认识pair 二.创建一个mypair对象 二.用mypair对象去初始化另一个mypair对象 三.全局的函数模版make_pair 四.map中的insert函数 五.验证 ​​​​​​​前言 当一个类的成员变量有自定义类型时,我们可以考虑将构造函数设为模板,这…

北斗卫星显身手,铁路作业人员安全防护再升级

北斗卫星显身手!铁路作业人员安全防护再升级 在铁轨上忙碌的铁路作业人员,承载着运输与交通的重任,他们的辛勤付出为我们的生活提供了便利。然而,背后也隐藏着一系列的安全隐患和风险。为了确保铁路作业人员的安全,保障…

【实践篇】一次Paas化热部署实践分享 | 京东云技术团队

前言 本文是早些年,Paas化刚刚提出不久时,基于部门内第一次Paas化热部署落地经验所写,主要内容是如何构建一些热部署代码以及一些避雷经验。 一、设计-领域模型设计 1.首先,确定领域服务所属的领域 2.其次,确定垂直…

图解Linux内核进程调度系统

目录 1.进程调度系统 2.调度类 3.调度策略 4.调度实体 5.调度器 6.CPU运行队列 1.进程调度系统 Linux进程调度是操作系统内核中的一个重要组成部分,它负责决定哪个进程可以在CPU上运行。 进程调度的目标是合理分配CPU资源,提高系统的整体运行效率…

Java Web 学习笔记(二) —— JDBC

目录 1 JDBC 概述2 JDBC 快速入门3 JDBC API 详解3.1 DriverManager3.2 Connection3.3 Statement3.4 ResultSet3.5 PreparedStatement3.5.1 代码模拟 SQL 注入3.5.2 PreparedStatement 的使用3.5.3 PreparedStatement 原理 4 数据库连接池4.1 数据库连接池概述4.2 数据库连接池…

通讯网关软件034——利用CommGate X2ODBC实现Modbus RTU数据转储ODBC

本文介绍利用CommGate X2ODBC实现从Modbus RTU设备读取数据并转储至ODBC数据源。CommGate X2ODBC是宁波科安网信开发的网关软件,软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示,实现从Modbus RTU设备读取数据并转储至ODBC…

性价比最高的护眼台灯是哪一款?盘点五款最具性价比的护眼台灯

现在的孩子,不是以往的孩子那么的无忧无虑,他们要考虑的是学习的成绩,所以很多孩子为了能在父母面前能得到夸奖,就努力的学习,那么台灯就不可缺少,但是如今市场上的台灯太多了,如果你购买的台灯…

HTTParty库

HTTParty是一个流行的Ruby库,用于简化HTTP请求和处理响应。它提供了一个简单的接口,可以轻松地发送HTTP请求,并处理返回的数据。 使用HTTParty,你可以: 发送GET、POST、PUT、DELETE等不同类型的HTTP请求。 设置请求头…

二、GRE VPN

GRE VPN 1、GRE介绍2、GRE基本原理3、GRE报文格式4、报文在GRE中传输过程5、价值6、Keepalive检测7、GRE应用8、配置GRE隧道8.1、配置绑定GRE协议的接口8.2、配置Tunnel接口8.3、配置Tunnel路由 9、GRE配置举例9.1、GRE静态路由示例9.1.1、路由器运行动态路由协议实现互通9.1.2…

STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式)

STM32-HAL库08-TIM的输出比较模式(输出PWM的另一种方式) 一、所用材料: STM32F103C6T6最小系统板 STM32CUBEMX(HAL库软件) MDK5 示波器或者逻辑分析仪 二、所学内容: 通过定时器TIM的输出比较模式得到预…

分析外贸SEO推广流程?网站谷歌SEO优化方法?

外贸SEO推广详细教程?外贸企业站如何做谷歌SEO推广? 外贸SEO推广是国际贸易领域中的一项重要战略,通过优化网站内容和结构,提高搜索引擎排名,从而增加在线可见性,吸引更多国际客户。顺风船将深入分析外贸S…

可回馈式直流电子负载在光伏储能行业的应用

可回馈式直流电子负载在光伏储能行业的应用非常广泛,光伏储能系统主要由光伏阵列、逆变器和储能电池组成直流电子负载作为一个重要的测试设备,可以对光伏储能系统进行性能评估和负载模拟。可回馈式直流电子负载可以用于光伏阵列的性能评估,通…

【Proteus仿真】【Arduino单片机】RGB彩灯

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器,使用WS2812 RGB彩灯等。 主要功能: 系统运行后,RGB彩灯花样显示。 二、软件设计 /* 作者:嗨小易(…

【WIFI】关于MTK的射频参数文件CFG_WIFI_Default.h介绍

代码路径: vendor/mediatek/proprietary/custom/<project-name>/cgen/cfgdefault/CFG_WIFI_Default.h 先看下面这张图片,这是修改了国家码 2.4Ghz 5Ghz的配置参数 简单举例: 修改了国家码US改了那2个参数,可以看到一个改了0x55代表U,一个改了0x53代表S 加起…

Elasticsearch 8.X 如何生成 TB 级的测试数据 ?

1、实战问题 我只想插入大量的测试数据&#xff0c;不是想测试性能&#xff0c;有没有自动办法生成TB级别的测试数据&#xff1f;有工具&#xff1f;还是说有测试数据集之类的东西&#xff1f;——问题来源于 Elasticsearch 中文社区https://elasticsearch.cn/question/13129 2…

2023年11月实时获取地图边界数据方法,省市区县街道多级联动【附实时geoJson数据下载】

首先&#xff0c;来看下效果图 在线体验地址&#xff1a;https://geojson.hxkj.vip&#xff0c;并提供实时geoJson数据文件下载 可下载的数据包含省级geojson行政边界数据、市级geojson行政边界数据、区/县级geojson行政边界数据、省市区县街道行政编码四级联动数据&#xff0…

JVS低代码表单引擎助你打造高效表单设计流程

在日常的设计表单过程中&#xff0c;常常会有需要录入一大段文字的场景&#xff0c;例如评论、留言、产品介绍、内容说明等场景&#xff0c;那么简单的文本框组件就不满足了&#xff0c;这里JVS提供了 两种描述类型的组件&#xff0c;多行文本框和富文本组件&#xff0c;如下图…