【Redis】内存数据库Redis进阶(Redis分片集群)

news2024/12/22 20:45:06

目录

    • 分布式缓存 Redis 四大问题
    • 搭建Redis分片集群
    • 分片原理
      • 散列插槽(插槽原理)
      • 集群伸缩
        • 需求设定
        • 配置集群伸缩
      • 故障转移
        • 自动故障转移
        • 手动故障转移
    • RedisTemplate访问分片集群

分布式缓存 Redis 四大问题

基于 Redis 集群解决单机 Redis 存在的四大问题:
在这里插入图片描述
主从 和 哨兵 可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

  • 海量数据存储问题

  • 高并发写的问题

使用分片集群可以解决上述问题

搭建Redis分片集群

  分片集群需要的节点数量较多,这里搭建一个最小的分片集群,包含 3 个 master 节点,每个 master 包含一个 slave 节点,结构图:
在这里插入图片描述
在同一台虚拟机中开启 6 个 Redis 实例,模拟分片集群,信息:

IPPORT角色
192.168.150.1017001master
192.168.150.1017002master
192.168.150.1017003master
192.168.150.1018001slave
192.168.150.1018002slave
192.168.150.1018003slave

准备实例和配置:

# 进入/tmp目录
cd /tmp
# 删除之前的7001、7002、7003这几个目录,避免配置干扰,重新创建出7001、7002、7003、8001、8002、8003目录
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 192.168.150.101
# 保护模式
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

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

# 进入/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

# 或者(推荐这种方式):
printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown

  虽然服务启动了,但是目前每个服务之间都是独立的,没有任何关联。需要执行命令来创建集群,在 Redis 5.0 之前创建集群比较麻烦,5.0 之后集群管理命令都集成到了 redis-cli 中。

(1)Redis 5.0之前

Redis 5.0 之前集群命令都是用 Redis 安装包下的 src/redis-trib.rb来实现的。因为redis-trib.rb是有Ruby语言编写的所以需要安装Ruby环境。

# 安装依赖
yum -y install zlib ruby rubygems
gem install redis

然后通过命令来管理集群:

# 进入redis的src目录
cd /tmp/redis-6.2.4/src
# 创建集群
./redis-trib.rb create --replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

(2)Redis 5.0以后

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

redis-cli --cluster create --cluster-replicas 1 192.168.150.101:7001 192.168.150.101:7002 192.168.150.101:7003 192.168.150.101:8001 192.168.150.101:8002 192.168.150.101:8003

命令说明:

  • redis-cli --cluster或者./redis-trib.rb:代表集群操作命令。
  • create:代表是创建集群。
  • --replicas 1或者--cluster-replicas 1 :指定集群中每个 master 的副本个数为 1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前 n 个就是 master,其它节点都是 slave 节点,随机分配到不同 master。

在这里插入图片描述
在这里插入图片描述
查看集群状态:

redis-cli -p 7001 cluster nodes

在这里插入图片描述
测试尝试连接7001节点,存储一个数据:

# 连接
redis-cli -p 7001
# 存储数据
set num 123
# 读取数据
get num
# 再次存储
set a 1

# 报错
# (error) MOVED 15495 192.168.150.101:7003

集群操作时,需要给redis-cli加上-c参数才可以:

redis-cli -c -p 7001
# 读取数据
get num

redis-cli -c参数:连接集群结点时使用,此选项可防止 moved 和 ask 异常。

分片原理

分片集群特征:

  • 集群中有多个 master,每个 master 保存不同数据。

  • 每个 master 都可以有多个 slave 节点。

  • master 之间通过 ping 监测彼此健康状态。

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

散列插槽(插槽原理)

  Redis 会把每一个 master 节点映射到 0~16383 共 16384 个插槽(hash slot)上,查看集群信息时就能看到。
在这里插入图片描述
在这里插入图片描述
查看集群状态:

redis-cli -p 7001 cluster nodes

在这里插入图片描述

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

  • key中包含"{}",且“{}”中至少包含1个字符,“{}”中的部分是有效部分。
  • key中不包含“{}”,整个key都是有效部分。

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

在 7001 这个节点执行set a 1时,对 a 做 hash 运算,对 16384 取余,得到的结果是 15495,因此要存储到 103 节点。到了 7003 后,执行 get num 时,对 num 做 hash 运算,对16384取余,得到的结果是 2765,因此需要切换到 7001 节点。

在这里插入图片描述
Redis如何判断某个 key 应该在哪个实例?

  • 将 16384 个插槽分配到不同的实例。
  • 根据 key 的有效部分计算哈希值,对 16384 取余。
  • 余数作为插槽,寻找插槽所在实例即可。

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

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

集群伸缩

redis-cli --cluster提供了很多操作集群的命令,可以通过redis-cli --cluster help 查看,例如添加节点命令 add-node

需求设定

向集群中添加一个新的 master 节点,并向其中存储 num = 10

  • 启动一个新的 Redis 实例,端口为 7004。
  • 添加 7004 到之前的集群,并作为一个 master 节点。
  • 给 7004 节点分配插槽,使得 num 这个 key 可以存储到 7004 实例。

这里需要两个新的功能:

  • 添加一个节点到集群中。
  • 将部分插槽分配到新插槽。

配置集群伸缩

# 创建一个文件夹
mkdir 7004

# 拷贝配置文件
cp redis.conf /7004

# 修改配置文件
sed /s/6379/7004/g 7004/redis.conf

# 启动
redis-server 7004/redis.conf
# 添加节点 add-node: new_host:new_port existing_host:existing_port
redis-cli --cluster add-node  192.168.150.101:7004 192.168.150.101:7001

# 通过命令查看集群状态:
redis-cli -p 7001 cluster nodes

7004 加入了集群,并且默认是一个 master 节点,可以看到 7004 节点的插槽数量为 0,因此没有任何数据可以存储到 7004 上。

在这里插入图片描述

转移插槽配置:

# 将num存储到7004节点,因此需要先看看num的插槽是多少
192.168.150.101:7003> get num
-> Redirected to slot [2765] located at 192.168.150.101:7001  # num的插槽为 2765
"123"

将 0~3000 的插槽从 7001 转移到 7004

[root@localhost tmp]redis-cli --cluster help
...
reshard     host:port
			--cluster-from <arg>
			--cluster-to <arg>
			--cluster-slots <arg>
			...

[root@localhost tmp]redis-cli --cluster reshard 192.168.150.101:7001

[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move(from 1 to 16384)? 3000   # 询问要移动多少个插槽,计划是3000个
What is the receiving node ID?  # 哪个node来接收这些插槽,配置是7004,那么7004节点的id是多少呢

前面一串就是 7004 节点的 id
在这里插入图片描述

继续询问,你的插槽是从哪里移动过来的?

  • all:代表全部,也就是三个节点各转移一部分
  • 具体的id:目标节点的id
  • done:没有了

在这里插入图片描述

命令查看结果

# # 通过命令查看集群状态
[root@localhost tmp]redis-cli -p 7001 cluster node

在这里插入图片描述

故障转移

之前 7001、7002、7003 都是 master,我们计划让 7002 宕机。

自动故障转移

# 直接停止一个redis实例,例如7002
redis-cli -p 7002 shutdown
  1. 首先是该实例与其它实例失去连接

  2. 然后是疑似宕机
    在这里插入图片描述

  3. 最后是确定下线,自动提升一个 slave 为新的 master
    在这里插入图片描述

  4. 当 7002 再次启动,就会变为一个 slave 节点
    在这里插入图片描述

手动故障转移

 &emsp利用 cluster failover 命令可以手动让集群中的某个 master 宕机,切换到执行 cluster failover 命令的这个 slave 节点,实现无感知的数据迁移。
在这里插入图片描述
这种 failover 命令可以指定三种模式:

  • 缺省:默认的流程,如图 1~6 步。
  • force:省略了对 offset 的一致性校验。
  • takeover:直接执行第 5 步,忽略数据一致性、忽略 master 状态和其它 master 的意见。

例子:在 7002 这个 slave 节点执行手动故障转移,重新夺回 master 地位

步骤如下:

  1. 利用 redis-cli 连接7002这个节点
  2. 执行cluster failover命令
redis-cli -p 7002
> cluster failover
OK

在这里插入图片描述

RedisTemplate访问分片集群

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

【Redis】内存数据库Redis进阶(Redis哨兵集群)

  1. 引入 Redis 的 starter 依赖
  2. 配置分片集群地址
  3. 配置读写分离

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

spring:
  redis:
    cluster:
      nodes:
        - 192.168.150.101:7001
        - 192.168.150.101:7002
        - 192.168.150.101:7003
        - 192.168.150.101:8001
        - 192.168.150.101:8002
        - 192.168.150.101:8003

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

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

相关文章

如何在CSDN上转发别人的文章

很多小伙伴可能跟我一样&#xff0c;看到一些优秀发文章或内容&#xff0c;想转发到自己的CSDN账号上&#xff0c;但是在CSDN上找了半天没找到CSDN转发的功能。鉴于我成功转发文章到CSDN上后&#xff0c;网上关于转发文章到CSDN的教程写的比较简单&#xff0c;我整理了一份比较…

HTTP——五、与HTTP协作的Web服务器

HTTP 一、用单台虚拟主机实现多个域名二、通信数据转发程序 &#xff1a;代理、网关、隧道1、代理2、网关3、隧道 三、保存资源的缓存1、缓存的有效期限2、客户端的缓存 一台 Web 服务器可搭建多个独立域名的 Web 网站&#xff0c;也可作为通信路径上的中转服务器提升传输效率。…

如何制作Windows10安装U盘

如何制作Windows10安装U盘 有新电脑的时候&#xff0c;我们会用安装U盘装系统&#xff0c;可是要怎么制作&#xff1f; 工具/原料 一台可以使用并且能上网的电脑 一个至少4.7GB的U盘 方法/步骤 1 2 选择官网 3 点击“立即下载工具”下载制作工具 4 插入U盘&#xff…

Linux常用命令——dpkg-divert命令

在线Linux命令查询工具 dpkg-divert Debian Linux中创建并管理一个转向列表 补充说明 dpkg-divert命令是Debian Linux中创建并管理一个转向&#xff08;diversion&#xff09;列表&#xff0c;其使得安装文件的默认位置失效的工具。 语法 dpkg-divert(选项)(参数)选项 -…

C#使用libmodbus库与工业设备进行读写测试

一.编译libmodbus库供C#使用 如何编译&#xff1f;请移步&#xff1a;https://blog.csdn.net/weixin_42205408/article/details/119530811 上面博主的文章除了所写的modbus.cs内的代码有点问题外&#xff08;可能上面博主和我的Win 10 64位 Visual Studio 2019平台不一样吧&a…

IDEA社区版插件汇总

1. Smart Tomcat 顾名思义就是配置tomcat的&#xff0c;跟专业版配置小猫类似。 2. Database Navigator 类似专业版的数据库管理工具。 3. Spring Boot Assistant SpringBoot开发插件。&#xff08;可以识别springboot主配置文件&#xff0c;以及代码提示&#xff0c;我这个版本…

深度学习与计算机相结合:直播实时美颜SDK的创新之路

时下&#xff0c;实时美颜技术就成为了直播主们的得力工具&#xff0c;它可以在直播过程中即时处理视频画面。而支持实时美颜功能的SDK更是推动了这项技术的发展&#xff0c;让直播主和普通用户都能轻松使用美颜功能。 一、美颜技术的演进 早期的美颜技术主要依赖于简单的图…

TPC-DS 标准介绍、工具下载地址

目录 一、TPC-DS标准介绍 1. DMS介绍 2. TCP-DS概念 二、数据库模型 1. 数据库模型介绍 2. 数据库模型包含内容 三、数据生成器 1. 数据生成器介绍 2. 数据生成器包含内容 四、查询集合 1. 查询集合介绍 2. 查询集合包含的88个标准化查询和17个基准统计函数 五、性…

外卖多门店小程序开源版开发

外卖多门店小程序开源版开发 外卖多门店小程序开源版的开发可以按照以下步骤进行&#xff1a; 确定需求&#xff1a;明确外卖多门店小程序的功能和特点&#xff0c;包括用户注册登录、浏览菜单、下单支付、订单管理等。技术选型&#xff1a;选择适合开发小程序的技术框架&…

Red Hat 安装MySQL 8.0与 Navicat

目录 Red Hat 安装 MySQL 8.0 1、更新软件包列表 2、安装MySQL服务器和客户端 3、启动MySQL服务 4、确保MySQL服务器正在运行 5、root 用户的密码 6、登录MySQL&#xff0c;输入mysql密码 7、MySQL默认位置 Red Hat 安装 Navicat 1、下载 Navicat 2、执行命令 Red H…

Django笔记之使用原生SQL查询数据库

Django 提供了两种方式来执行原生 SQL 代码。 一种是使用 raw() 函数&#xff0c;一种是 使用 connection.cursor()。 但是官方还是推荐在使用原生 SQL 之前&#xff0c;尽量的先去探索一下 QuerySet 提供的各种 API。 目前而言&#xff0c;官方文档提供的各种 API 是能够满…

修改cuda软链接(实操演示)

文章目录 1 找到已存在的CUDA软链接2 确认当前软链接真实路径3 删除现有软链接4 创建新的软链接5 验证新的软链接 要修改CUDA的软链接&#xff0c;需要找到已经存在的软链接并重新创建它指向新的目录。 1 找到已存在的CUDA软链接 首先&#xff0c;需要找到之前创建的CUDA软链…

编程:必备技能还是浪费时间?

当下&#xff0c;学习编程正变得越来越受欢迎&#xff0c;许多人都在探讨这个话题&#xff0c;但仍有很多人产生疑问&#xff1a;学习编程是否有必要&#xff1f;我们可以从学习编程的好处和应用领域来进行分析。好处方面&#xff0c;乔布斯曾说&#xff1a;“人人都应该学习编…

安装企业级高负载web服务器tomcat,并部署应用

web服务器Tocamt 1.Tocmat简介2.Tocmat安装1.安装jdk2.部署Tomcat1.配置环境变量2.启动tocmat3.Tomcat web管理功能 3.部署jpress应用 1.Tocmat简介 Tomcat是Apache软件基金会&#xff08;Apache Software Foundation&#xff09;的Jakarta 项目中的一个核心项目&#xff0c;由…

【小白篇】Vscode配置Python和C++环境

文章目录 一、配置python环境二、配置C环境2.1 安装MinGW编译器2.2 安装C/C扩展2.3 配置C/C环境&#xff08;1&#xff09;配置编译器&#xff08;2&#xff09;配置构建任务&#xff08;3&#xff09;配置调试设置 2.4 测试例子2.5 注意事项 三、插件Reference 一、配置python…

MongoDB文档--基本概念

阿丹&#xff1a; 不断拓展自己的技术栈&#xff0c;不断学习新技术。 基本概念 MongoDB中文手册|官方文档中文版 - MongoDB-CN-Manual mongdb是文档数据库 MongoDB中的记录是一个文档&#xff0c;它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包…

网络安全【黑客技术】自学

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成…

windows mysql5.7 开启binlog

查看binlog是否开启 show variables like %log_bin%; 找到安装目录的mysql配置文件 my.ini 编辑 my.ini文件 log-bin D:\Program Files\mysql\logs\log-bin binlog_format ROW server_id 2 按照 log-bin D:\Program Files\mysql\logs\log-bin 创建文件 重启mysql服务 重启…

医疗知识图谱问答 —— 数据同步

前言 前面的文章已经介绍了 neo4j 服务的本地安装&#xff0c;以及数据的增删改查操作方法。那么这里就要进入 python 项目&#xff0c;来完成医疗知识的构建&#xff0c;问答机器人的代码实现。但篇幅较长&#xff0c;本文就主要介绍知识图谱的构建吧。 环境 Anaconda3 Pyth…