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

news2024/11/15 11:29:28

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  # 安装redis

2.# 设定主配置文件
[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 	# 节点加入集群的超时时间单位是ms

3.# 将修改好的主配置文件拷贝到其他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:6379
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 24ee61e1ee3ad2a8b509922f5aaae1370212566e 172.25.254.64:6379
   slots: (0 slots) slave
   replicates fd0a38707dcfcc5f74e61857bbf101bbb16f6b6f
M: fd0a38707dcfcc5f74e61857bbf101bbb16f6b6f 172.25.254.24:6379
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 3f0d0fe71de65370bde9cc742c9555e31079aec4 172.25.254.34:6379
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 17d0bdc6b738484dc026d55509ed947c55c6c6cf 172.25.254.44:6379
   slots: (0 slots) slave
   replicates 3f0d0fe71de65370bde9cc742c9555e31079aec4
S: ce9f76a54d24c5c7d73838e46f6d6631b8aa35b3 172.25.254.54:6379
   slots: (0 slots) slave
   replicates 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.coloradmin.cn/o/2079782.html

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

相关文章

查看exe文件所需要依赖库的方法

Windows 1.dumpbin /dependendsv [file_path]; 2.Qt windeployqt.exe打包 在exe的同一目录下生成需要的文件和库;如果不是qt程序结果如下:

发那科机床设备数据 转IEC61850项目案例

目录 1 案例说明 1 2 VFBOX网关工作原理 1 3 准备工作 2 4 网关采集发那科机床数据 2 5 用IEC61850协议转发数据 5 6 网关使用多个逻辑设备和逻辑节点的方法 7 7 案例总结 8 1 案例说明 设置网关采集发那科机床数据把采集的数据转成IEC61850协议转发给其他系统。 2 VFBOX网关…

Google Search Console:完整教程

Google 提供了各种工具来收集和分析网站数据,其中最有价值的工具之一是 Google Search Console (GSC)。前身为 Google Webmaster Tools,它为 SEO 提供了对网站性能的宝贵见解。自 2015 年推出以来,该平台取得了长足的发…

分库分表学习笔记(一)

图源(鹅厂技术架构师公众号) MySQL执行顺序: FROM:确定数据来源。JOIN:执行表之间的连接操作。WHERE:过滤记录。GROUP BY:对记录进行分组。HAVING:对分组结果进行过滤。SELECT&#…

如何用Java SpringBoot+Vue搭建美容美发管理系统?实战解析

🎓 作者:计算机毕设小月哥 | 软件开发专家 🖥️ 简介:8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 🛠️ 专业服务 🛠️ 需求定制化开发源码提…

47.【C语言】指针(重难点)(J)

目录 26.自制排序函数(★★) *分析 *代码 往期推荐 26.自制排序函数 *分析 之前在42.【C语言】冒泡排序写过一个排序函数&#xff0c;可以将此自制一个类似qsort的函数 画圈的地方是需要修改的 #include <stddef.h> void bubble_sort(void* base, size_t num,size_t w…

Mac Cocos2d-x工程通过xcode编译时,提示无法找到SDK的解决办法

经过对整个macOS的升级&#xff0c;发现原来的Cocos2d-x4.0可编译的工程&#xff0c;无法运行。 Xcode错误提示 mac cocos2d-x 4 Showing All Messages unable to find sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.…

2024年不可错过的7款最佳UI和UX设计工具推荐

在数字产品的成功中&#xff0c;用户界面 (UI) 和用户体验 (UX) 都起着至关重要的作用。UI 和 UX 是网页设计中相互补充的两个重要方面。UI 主要关注用户界面的设计&#xff0c;而 UX 则涵盖用户与产品或服务互动时的整体体验。在本文中&#xff0c;我们将深入探讨 UX 和 UI 的…

vc矩阵计算(转置,点乘,逆矩阵)

vc计算矩阵的转置,矩阵的点乘,矩阵的逆矩阵,参考网上的例子 矩阵点乘的例子: 矩阵逆矩阵计算例子: #include "stdafx.h" #include <math.h> //#include<complex.h> #include <iostream> #include <complex> #include <cstdli…

短视频SDK解决方案,代码逻辑结构清晰,接入便捷

美摄科技凭借其在多媒体处理领域的深厚积累&#xff0c;推出了高效、易用的短视频SDK解决方案&#xff0c;为开发者及内容创作者提供了一站式的短视频创作与编辑工具&#xff0c;让每一份灵感都能轻松转化为引人入胜的视觉盛宴。 一、技术领先&#xff0c;打造极致体验 美摄科…

非局部均值降噪算法(NLM)原理及实现

文章目录 一、概述二、算法原理三、算法流程四、MATLAB实现五、C实现参考文献 一、概述 在日常生活中&#xff0c;最常见的 CT 图像噪声是高斯白噪声。目前&#xff0c;针对高斯白噪声的处理方法&#xff0c;主要有空间域中的以平滑为基本思想的均值滤波、高斯滤波、局部滤波等…

案例研究丨MaxKB+Ollama:深圳市公共信用中心探索信用服务创新

深圳市公共信用中心隶属于深圳市市场监督管理局&#xff0c;主要负责对外提供深圳市企业公共信用信息报告查询和深圳市企业注册登记档案查询等服务。作为深圳市信用信息的权威发布机构&#xff0c;深圳市公共信用中心一直致力于为公众提供准确、及时的信用信息服务。 深圳信用…

2024年医疗行业关键词:精益管理

随着医疗技术的飞速发展、患者需求的日益多元化以及医疗资源的日益紧张&#xff0c;精益管理作为一种高效、科学的管理模式&#xff0c;正逐步成为医疗行业转型升级的关键驱动力。具体表现如深圳天行健企业管理咨询公司下文所述&#xff1a; 1. 优化服务流程 首先&#xff0c;…

Windows电脑本地安装跨平台文生音乐AI应用MusicGPT详细教程

文章目录 前言1. 本地部署2. 使用方法介绍3. 内网穿透工具下载安装4. 配置公网地址5. 配置固定公网地址 前言 今天和大家分享一下在Windows系统电脑上本地快速部署一个文字生成音乐的AI创作服务MusicGPT&#xff0c;并结合cpolar内网穿透工具实现随时随地远程访问使用进行AI音…

(一) 初入MySQL 【认识和部署】

前置资源 一、数据库概述 1.1、数据库基本概念 数据(Data) 描述事物的符号记录称为数据。数字、文字、图形、图像、声音、档案记录等都是数据。数据是以“记录”的形式按照统一的格式进行存储的&#xff0c;而不是杂乱无章的。 相同格式和类型的数据统一存放在一起&#xff0…

阿里云OSS文件存储

文章目录 参考准备创建bucketendpoint 和 bucket域名的访问路径AccessKey和OSS的开发文档 Springboot整合OSS引入依赖AliyunOssConfigAliyunOssPropertiesapplicatioin.yml简单上传和下载使用签名URL进行临时授权访问生成以PUT方法访问的签名URL来上传文件通过签名URL临时授权简…

WIFI 配网

配网:指的是外部向WiFi模块提供SSID和密码&#xff0c;以便Wi-Fi模块可以连接指定的热点 常见的配网方式有:-键配网smart config、SoftAP配网、蓝牙配网、屏幕配网。 1.0 一键配网 2.0 蓝牙配网 一键配网的模式对应的厂加模式 3.0 状态机WIFI模组物联网 4.0 创建枚举结构体 ty…

女性权益之镜:印度侵害事件分析

1.项目背景 近年来&#xff0c;印度社会关于女性权利的讨论日益频繁&#xff0c;然而&#xff0c;女性受侵害的违法事件仍层出不穷&#xff0c;这些事件不仅威胁到女性的生命安全&#xff0c;还深刻影响了社会的稳定与发展&#xff0c;尽管印度政府在法律和政策层面采取了一系…

实现并发网络服务器

一&#xff0c;网络服务器 1.单循环网络服务器 —— 同一时刻只能处理一个客户端任务 2.并发服务器 —— 同一时刻能处理多个客户端任务 二&#xff0c;并发服务器 1.多线程 2.IO多路复用 3.多进程 三&#xff0c;IO模型 1.阻塞IO 阻塞IO&#xff08;Blocking IO&…

IO进程day03(获取文件属性、目录操作、库Lib)

目录 【1】获取文件属性 1》stat函数 2》获取文件类型 3》获取文件权限 练习&#xff1a;编程实现“ls -l 文件名” 的功能 4》stat、fstat、lstat的区别 【2】目录操作 【3】库 Lib 1》文件分类 1> 头文件&#xff1a; 以 .h结尾的文件 2> 源文件&#xff1a…