NoSql数据库 - Redis Cluster集群详解及案例实现

Redis Cluster集群(无中心化设计)

1.1 Redis Cluster 工作原理

在哨兵sentinel机制中,可以解决redis高可用问题,即当master故障后可以自动将slave提升为master,从而可以保证redis服务的正常使用,但是无法解决redis单机写入的瓶颈问题,即单机redis写入性能受限于单机的内存大小、并发数量、网卡速率等因素。

redis 3.0版本之后推出了无中心架构的redis cluster机制,在无中心的redis集群当中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接

Redis Cluster特点如下

  1. 所有Redis节点使用(PING机制)互联

  2. 集群中某个节点的是否失效,是由整个集群中超过半数的节点监测都失效,才能算真正的失效

  3. 客户端不需要proxy即可直接连接redis,应用程序中需要配置有全部的redis服务器IP

  4. redis cluster把所有的redis node 平均映射到 0-16383个槽位(slot)上,读写需要到指定的redisnode上进行操作,因此有多少个redis node相当于redis 并发扩展了多少倍,每个redis node 承担16384/N个槽位

  5. Redis cluster预先分配16384个(slot)槽位,当需要在redis集群中写入一个key -value的时候,会使用CRC16(key) mod 16384之后的值,决定将key写入值哪一个槽位从而决定写入哪一个Redis节点上,从而有效解决单机瓶颈。

Redis Cluster架构

在这里插入图片描述

1.2 创建redis cluster的前提

1.每个redis node节点采用相同的硬件配置、相同的密码、相同的redis版本。

2.每个节点必须开启的参数

  • cluster-enabled yes -----必须开启集群状态,开启后redis进程会有cluster显示

  • cluster-config-file nodes-6380.conf ------此文件有redis cluster集群自动创建和维护,不需要任何手动操作

3.所有redis服务器必须没有任何数据

4.先启动为单机redis且没有任何key value

1.3 Redis Cluster的环境部署

部署架构说明:

在这里插入图片描述

主机名IP角色
redis-node1172.25.254.14master 1
redis-node2172.25.254.24master 2
redis-node3172.25.254.34master 3
redis-node4172.25.254.44slave 1
redis-node5172.25.254.54slaveslave 2
redis-node6172.25.254.64slave 3
redis-node7172.25.254.74master 4(扩容)
redis-node8172.25.254.84slave 4(扩容)

注意:以下案例实现的操作环境都为Rhel9.1

# 配置好以上后,需要将防火墙关闭,以防影响案例的实现
[root@redis-node1 ~]# systemctl stop firewalld.service 
[root@redis-node1 ~]# systemctl mask firewalld.service 
[root@redis-node1 ~]# setenforce 0

1.4 部署redis cluster

以下配置在所有redis-node主机中进行配置

1.# 安装redis
[root@redis-node1 ~]# yum install redis -y  # 安装redis2.# 设定主配置文件
[root@redis-node1 ~]# vim /etc/redis/redis.conf       bind * -::*                 # 开启redis的端口
masterauth "123456" 		# 集群主从认证
requirepass "123456" 		# redis登陆密码 redis-cli 命令连接redis后要用“auth 密码”进行认证
cluster-enabled yes 		# 开启cluster集群功能
cluster-config-file nodes-6379.conf # 指定集群配置文件
cluster-node-timeout 15000 	# 节点加入集群的超时时间单位是ms3.# 将修改好的主配置文件拷贝到其他redis主机中
[root@redis-node1 ~]# for i in 24 34 44 54 64 74 84
> do
> scp /etc/redis/redis.conf root@172.25.254.$i:/etc/redis/redis.conf
> done

测试:

[root@redis-node1 ~]# redis-cli
127.0.0.1:6379> keys *              # 查询所有key
(error) NOAUTH Authentication required.     # 提示需要密码验证
127.0.0.1:6379> auth 123123         # 输入密码进行验证
OK
127.0.0.1:6379> keys *       # 可以在查询key了
(empty array)                # 此时不存在key
127.0.0.1:6379> set name haha    # 尝试写入数据
(error) CLUSTERDOWN Hash slot not served  # 提示哈希槽未提供
127.0.0.1:6379>

1.5 redis-cli (Cluster)参数说明

参数说明
cteate创建集群
check指定master的副本数
info检测集群信息
fix修复集群
reshard在线热迁移集群指定主机的slots数据
rebalance平衡各集群主机的sloat数量
ass-node添加主机
del-node删除主机
import导入外部redis服务器的数据到当前集群

1.6 创建Redis-Cluster

三主三从

1.6.1 Redis-Cluster配置

# 在redis-node1中进行写入
[root@redis-node1 ~]# redis-cli --cluster create -a 123123 \
> 172.25.254.14:6379 172.25.254.24:6379 172.25.254.34:6379 \
> 172.25.254.44:6379 172.25.254.54:6379 172.25.254.64:6379 \
> --cluster-replicas 1            # 启用集群数1

在这里插入图片描述

1.6.2 检测redis的状态

1.检测集群

[root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves.
172.25.254.24:6379 (fd0a3870...) -> 0 keys | 5462 slots | 1 slaves.
172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 172.25.254.14:6379)
M: f4b7f2f48521679edc7744c80782f662c61a2bff 172.25.254.14:6379slots:[0-5460] (5461 slots) master1 additional replica(s)
S: 24ee61e1ee3ad2a8b509922f5aaae1370212566e 172.25.254.64:6379slots: (0 slots) slavereplicates fd0a38707dcfcc5f74e61857bbf101bbb16f6b6f
M: fd0a38707dcfcc5f74e61857bbf101bbb16f6b6f 172.25.254.24:6379slots:[5461-10922] (5462 slots) master1 additional replica(s)
M: 3f0d0fe71de65370bde9cc742c9555e31079aec4 172.25.254.34:6379slots:[10923-16383] (5461 slots) master1 additional replica(s)
S: 17d0bdc6b738484dc026d55509ed947c55c6c6cf 172.25.254.44:6379slots: (0 slots) slavereplicates 3f0d0fe71de65370bde9cc742c9555e31079aec4
S: ce9f76a54d24c5c7d73838e46f6d6631b8aa35b3 172.25.254.54:6379slots: (0 slots) slavereplicates f4b7f2f48521679edc7744c80782f662c61a2bff
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

2.查看集群的状态

[root@redis-node1 ~]# redis-cli -a 123123 --cluster info 172.25.254.14:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves.
172.25.254.24:6379 (fd0a3870...) -> 0 keys | 5462 slots | 1 slaves.
172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 3 masters.
0.00 keys per slot on average.

3.写入数据

[root@redis-node1 ~]# redis-cli -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set name haha
(error) MOVED 9189 172.25.254.24:6379         # 被分配到24(redis-node2)的hash槽位上[root@redis-node2 ~]# redis-cli -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> set name haha
OK

4.读取数据

通过查看当前通过hash分配的写入主机master2查看对应的slave

在这里插入图片描述

去到与master2对应的slave3去查看数据

[root@redis-node6 ~]# redis-cli -a 123123
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> get name     # 查看数据
(error) MOVED 5798 172.25.254.24:6379      # 但是此时发现还是查看不了

原因是:此时我们通过查看master2的集群可以发现,对应的slacve中没有分配hash槽位,只有当master故障后,才会分配到对应的slave hash槽位,这时才能去查看数据

在这里插入图片描述

1.7 集群扩容

四主四从

1.7.1 添加Master

# 添加master
[root@redis-node1 ~]# redis-cli -a 123123 --cluster add-node 172.25.254.74:6379 172.25.254.14:6379

在这里插入图片描述

查看master是否已添加

[root@redis-node1 ~]# redis-cli -a 123123 --cluster info 172.25.254.14:6379
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
172.25.254.14:6379 (f4b7f2f4...) -> 0 keys | 5461 slots | 1 slaves.
172.25.254.74:6379 (2c6ed811...) -> 0 keys | 0 slots | 0 slaves.        # 添加的master成功
172.25.254.24:6379 (fd0a3870...) -> 1 keys | 5462 slots | 1 slaves.
172.25.254.34:6379 (3f0d0fe7...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 1 keys in 4 masters.
0.00 keys per slot on average.

1.7.2 分配槽位

[root@redis-node1 ~]# redis-cli -a 123123 --cluster reshard 172.25.254.14:6379

在这里插入图片描述

1.7.3 添加slave

[root@redis-node1 ~]# redis-cli -a 123123 add-node \
> 172.25.254.84:6379 172.25.254.14:6379 \
> --cluster-slave --cluster-master-id 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e

在这里插入图片描述

1.7.4 查看集群

[root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379

在这里插入图片描述

1.8Redis-Cluster集群的维护

添加节点的时候是先添加node节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反,是先将被删除的Redis node上的槽位迁移到集群中的其他Redis node节点上,然后再将其删除,如果一个Redis node节点上的槽位没有被完全迁移,删除该node的时候会提示有数据且无法删除。

1.移除需要下线的Master对应的Slave

[root@redis-node1 ~]# redis-cli -a 123123 --cluster del-node 172.25.254.84:6379 9dd9585dee4b05c5d733ed28b1f98f555783e394         # 需要移除的Slave对应的IP及ID
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 9dd9585dee4b05c5d733ed28b1f98f555783e394 from cluster 172.25.254.84:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node. 
[root@redis-node1 ~]# redis-cli -a 123123 --cluster check 172.25.254.14:6379  # 查看集群删除的slave是否已经删除

2.移除要下线主机的哈希槽位

[root@redis-node1 ~]# redis-cli -a 123123 --cluster reshard 172.25.254.14:6379

在这里插入图片描述

3.移除master

[root@redis-node1 ~]# redis-cli -a 123123 --cluster del-node 172.25.254.74:6379 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
>>> Removing node 2c6ed8115e3c8bbf8c6ef79fbba14ce7a4d08a5e from cluster 172.25.254.74:6379
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

重新查看集群:

在这里插入图片描述

以上通过对比,可以看出,master和对应的slave已经移除

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

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

相关文章

HIOKI功率分析仪PW3390-03

HIOKI功率分析仪PW3390-03 实现高级别的功率基本精度0.04%rdg.0.05%f.s •200kHz的测量频带,高频也很稳定的振幅和相位精度 •实现机身小型/轻巧化,满足现场和研究室的高精度测量 •50ms高精度高速运算过渡状态的功率,同时并行运算谐波分析、…

Spring优缺点和SpringBoot基础和搭建

前言 Spring框架是一个流行的Java企业级开发框架,旨在简化应用程序开发。它的核心特性包括依赖注入和面向切面编程,提供了灵活性和强大的社区支持。然而,Spring也存在学习曲线陡峭和配置复杂等缺点。 Spring Boot是基于Spring的项目&#x…

观测云核心技术解密:eBPF Tracing 实现原理

前言 eBPF 是一种强大的内核技术,允许在内核中安全地执行自定义代码。通过 eBPF,开发者可以在不修改内核源码的情况下,对内核功能进行扩展和监控。eBPF Tracing 利用这一技术,对系统调用、内核函数等进行跟踪,从而实现…

OpenCV下的无标定校正(stereoRectifyUncalibrated)

OpenCV下的无标定校正(stereoRectifyUncalibrated) 文章目录 1. 杂话2. 无标定校正2.1 先看代码2.2 一点解释2.3 findFundamentalMat参数2.4 stereoRectifyUncalibrated参数 3. 矫正结果 1. 杂话 咱们在之前的帖子里面讲了一些比较常规的标定和校正OpenCV下的单目标定&#xff…

解决bug: RuntimeError: Address already in use,一个linux下pytorch多卡训练tcp端口占用的bug

时间:2024.9.3 1)bug: self._store TCPStore( # type: ignore[call-arg] RuntimeError: Address already in use2)原因分析 linux下pytorch多卡训练深度学习模型,训练中途暂停训练,但仍有进程占用某个端…

OcrLiteNcnn:Windows环境打包及Java调用

目录结构 前言cmake安装源码下载说明Windows源码编译执行“cmake -DCMAKE_BUILD_TYPE=Release ..”执行“cmake --build . --config Release -- -m:6”编译完成识别图片命令行调用Java调用前言 Java实现OCR识别图片中的文字,小编先前整理过一篇在Linux环境中基于“ChineseOcr…

iPhone升级iOS 18后遭遇“白苹果”?别怕,这几招教你轻松应对!

在这个科技日新月异的时代,苹果iOS系统的每一次更新都牵动着亿万果粉的心。iOS 18作为苹果最新的操作系统,不仅带来了全新的功能体验,也难免会遇到一些用户反馈的“小插曲”,比如升级后出现的“白苹果”现象。面对这一状况&#x…

安卓13拦截home功能 监听home键 禁用home键

总纲 android13 rom 开发总纲说明 目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 经常遇

KAN学习Day1——模型框架解析及HelloKAN

说明 最近了解到了一个新东西——KAN,我的毕设导师给推荐的船新框架。我看过很多剖析其原理的文章,发现大家对其持有的观点都各不相同,有的说可以颠覆传统MLP,有的说可以和Transformer同等地位,但是也有人说它训练速度…

缓存解决方案。Redis 和 Amazon ElastiCache 比较

欢迎来到雲闪世界。Redis 和 Amazon ElastiCache 等缓存解决方案是通过将频繁访问的数据存储在内存中来提高应用程序性能的热门选择。让我们从实施简单性、性能、成本和维护方面对它们进行比较。 实施简单 设置 Redis 需要在基础设施或云实例上安装和配置 Redis 服务器。它可…

通过cmd命令的方式转码MP4为webp动图。附带命令解释。

zihao 通过cmd命令的方式转码MP4为webp动图: 均衡大小和z效果的配置(直接拷贝后需要改下路径): ffmpeg -i E:\steam\222.mp4 -vcodec libwebp -filter:v fpsfps24 -lossless 0 -compression_level 5 -q:v 35 -loop 1 -preset def…

C++系列-STL容器之list

STL容器之list list容器的基本结构list容器的特点list容器的优点list容器的缺点 list容器的构造函数list容器的常用接口list赋值操作list大小及空否list访问list迭代器相关list增删查改push and popinsert其它 寄扬州韩绰判官 杜牧〔唐代〕 青山隐隐水迢迢,秋尽江南…

覃嘉仪,艺人经纪人、经纪人、影视经纪人。2002.7.9出生于四川省遂宁市射洪县

覃嘉仪,艺人经纪人、经纪人、影视经纪人。2002.7.9出生于四川省遂宁市射洪县 2020年开始从事宣传工作,2023成为“WP经纪工作室”艺人经纪,现担任孙亦欣、魏逸熙等艺人的经纪人。 2024年涉足于影视行业,并加入嘉林娱乐。2024年在由…

慢慢写材料

有一次,我要公司帮我提供一个材料。当时,我比较着急,于是非常简要、快速的写了一封邮件,发给公司负责人。 结果,两三天后,也没有收到公司的回复。 于是,我又耐心的写了一封新的邮件。说明&#…

华为云CCE集群创建loadBalancer

目录 一、目的 二、创建应用 三、创建服务 loadBalancer 四、域名解析 五、验证 一、目的 1、为CCE容器应用创建loadBalancer服务,并且绑定https协议的域名 2、公网访问域名: https://test.******.com 3、CCE创建用于公网域名访问的loadBalancer,不…

网站安全问题整改

网站安全、政务云、第三方安全检测机构等评测出来的网站web安全问题整改,如果你也正需要做这方面,请联系我吧

快速排序(动图详解)(C语言数据结构)

快速排序: 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为: 任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值&#xff0c…

个人怎么注册商标需要什么条件!

经常会遇到有人问普推知产老杨,个人怎么注册商标需要什么条件,首先会要有个体户执照,没有得先申请一个体工商户的执照才可以申请注册商标,再加身份证正反签字就可以,申请商标类别的类别与个体工商户经营范围无关&#…

APP 数据抓取 - Charles 抓包工具的使用(Charles 端口配置、CA 证书配置、Charles Android 模拟器配置)

前言说明 此文章是我在学习 Charles APP 抓包时编写,内容都是亲测有效,文章内容也有参考其他人,参考文章如下: Android 手机使用 charles 抓 https 请求(保姆级教程)网易 mumu 模拟器安装下载 charles 的…

redroid搭建云手机学习笔记(一)

参考链接 通过Redroid搭建自己的云手机 docker安装 docker官网目前打不开了,通过官网安装的方式无法实现,这里需要借助镜像网站来实现docker的安装 参考链接:https://developer.aliyun.com/mirror/docker-ce # step 1: 安装必要的一些系统…