当前位置: 首页 > news >正文

Redis集群_cluster

cluster集群

  • cluster翻译就是集群,所以cluster集群也叫做redis集群
  • 相比于哨兵模式,cluster集群能支持扩容,并且无需额外的节点来监控状态,所以使用这种模式集群的系统会用的更多些
  • redis cluster采用的是去中心化网络拓扑架构,所有节点既是数据储存节点也是控制节点
  • 引入槽(slot),通过crc+hashslot哈希算法支持多个主节点(分片),每个主节点分别负责储存一部分数据,这样理论上支持无限主节点的水平扩容以便支持海量吞吐量
  • 内置类似哨兵(sentinal)高可用机制,能够实现自动故障转移,保证每个主节点(分片)的高可用

哈希槽

通过某cluster集群是由六台redis服务器组成的,那么每台服务器上也会被平均分配一定数量的的哈希槽,此外,cluster集群里也支持主从复制,即分配到一定数量哈希槽的redis服务器也可以携带一个或多个从节点。

在这里插入图片描述

cluster集群

搭建cluster集群

这里搭建三主三从的cluster集群

新建自定义目录并且加777权限

mkdir -p /root/redis/clusterchmod -R 777 /root/redis/cluster
创建三主三从的配置文件

配置文件位置放到上面创建的目录下

1.cluster-m1.conf

port 6379
dir /redisConfig
logfile cluster-m1.log
cluster-enabled yes
cluster-config-file nodes-6379.conf

解释:

第一行:端口

第二、三行:指定了该节点的日志目录和文件名

第四行:开启cluster集群模式

第五行:自动生成cluster相关配置文件

2.cluster-m2.conf

port 6380
dir /redisConfig
logfile cluster-m2.log
cluster-enabled yes
cluster-config-file nodes-6380.conf

3.cluster-m3.conf

port 6381
dir /redisConfig
logfile cluster-m3.log
cluster-enabled yes
cluster-config-file nodes-6381.conf

4.cluster-s1.conf

port 16379
dir /redisConfig
logfile cluster-s1.log
cluster-enabled yes
cluster-config-file nodes-16379.conf

5.cluster-s2.conf

port 16380
dir /redisConfig
logfile cluster-s2.log
cluster-enabled yes
cluster-config-file nodes-16380.conf

6.cluster-s3.conf

port 16381
dir /redisConfig
logfile cluster-s3.log
cluster-enabled yes
cluster-config-file nodes-16381.conf
启动6个节点的容器
docker run -itd --name redis-m1 -v /root/redis/cluster:/redisConfig:z -p 6379:6379 redis:latest redis-server /redisConfig/cluster-m1.conf

由于通过redis-server启动redis服务器时传入了cluster-m1.conf的配置文件,因此redis-m1自动加入了该集群,此时集群中只有这一个节点

继续将其他节点启动加入集群

docker run -itd --name redis-m2 -v /root/redis/cluster:/redisConfig:z -p 6380:6380 redis:latest redis-server /redisConfig/cluster-m2.confdocker run -itd --name redis-m3 -v /root/redis/cluster:/redisConfig:z -p 6381:6381 redis:latest redis-server /redisConfig/cluster-m3.confdocker run -itd --name redis-s1 -v /root/redis/cluster:/redisConfig:z -p 16379:16379 redis:latest redis-server /redisConfig/cluster-s1.confdocker run -itd --name redis-s2 -v /root/redis/cluster:/redisConfig:z -p 16380:16380 redis:latest redis-server /redisConfig/cluster-s2.confdocker run -itd --name redis-s3 -v /root/redis/cluster:/redisConfig:z -p 16381:16381 redis:latest redis-server /redisConfig/cluster-s3.conf

全部启动,但还未配置主从关系

在这里插入图片描述

进入其中一个节点查看生成的配置文件
[root@localhost cluster]# docker exec -it redis-m1 /bin/bash
root@9d29016966fe:/data# cd /redisConfig/
root@9d29016966fe:/redisConfig# cat nodes-6379.conf
863340d68ac280317d410f2c0fc8f863fb9a74f4 :0@0 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0

从第一行可以看出主节点只连接到自身

确定每个节点的ip
docker inspect redis-m1|grep IPAddress
节点名称ip地址端口
redis-m1172.17.0.26379
redis-m2172.17.0.36380
redis-m3172.17.0.46381
redis-s1172.17.0.516379
redis-s2172.17.0.616380
redis-s3172.17.0.716381

进入redis-m1容器中,执行命令

docker exec -it redis-m1 /bin/bash

用以下命令连接节点

redis-cli -p 6379 cluster meet 172.17.0.3 6380
redis-cli -p 6379 cluster meet 172.17.0.4 6381
redis-cli -p 6379 cluster meet 172.17.0.5 16379
redis-cli -p 6379 cluster meet 172.17.0.6 16380
redis-cli -p 6379 cluster meet 172.17.0.7 16381

使用cluster info查看

root@9d29016966fe:/redisConfig# redis-cli
127.0.0.1:6379> cluster info
cluster_state:fail
cluster_slots_assigned:0
cluster_slots_ok:0
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:0
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:43
cluster_stats_messages_pong_sent:55
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:103
cluster_stats_messages_ping_received:55
cluster_stats_messages_pong_received:48
cluster_stats_messages_received:103

因为还没有分配槽,所以状态时fail

给主节点分配槽

命令

redis-cli -h 172.17.0.2 -p 6379 cluster addslots n

使用脚本批量执行

vi /root/redis/cluster/setHashSlots.sh
#!/bin/bash
for i in $(seq 0 5460)
do
/usr/local/bin/redis-cli -h 172.17.0.2 -p 6379 cluster addslots $i
done

进入对应容器节点执行

bash /redisConfig/setHashSlots.sh

然后redis-m2分配

#!/bin/bash
for i in $(seq 5461 10922)
do
/usr/local/bin/redis-cli -h 172.17.0.3 -p 6380 cluster addslots $i
done

redis-m3分配

#!/bin/bash
for i in $(seq 10923 16383)
do
/usr/local/bin/redis-cli -h 172.17.0.4 -p 6381 cluster addslots $i
done

以此修改sh文件执行即可

等三个主节点分配完槽之后,查看redis-m1状态

root@9d29016966fe:/data# redis-cli
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:5
cluster_my_epoch:1
cluster_stats_messages_ping_sent:796
cluster_stats_messages_pong_sent:788
cluster_stats_messages_meet_sent:5
cluster_stats_messages_sent:1589
cluster_stats_messages_ping_received:788
cluster_stats_messages_pong_received:801
cluster_stats_messages_received:1589
获取nodes的id,设置主从关系

在redis-m1上执行

127.0.0.1:6379> cluster nodes
788bb0674543fda50fb9bfabbc4dd598c041e4f6 172.17.0.7:16381@26381 master - 0 1726305277000 5 connected
8211c4e11468743394dc102778a8985708d88925 172.17.0.4:6381@16381 master - 0 1726305278355 2 connected 10923-16383
3c429e47ee9e8cb79457cc9f1556ca5df2a5df92 172.17.0.3:6380@16380 master - 0 1726305276000 4 connected 5461-10922
863340d68ac280317d410f2c0fc8f863fb9a74f4 172.17.0.2:6379@16379 myself,master - 0 1726305276000 1 connected 0-5460
b2adb4177ef4c28715b9aca9b965668a0c6407d1 172.17.0.6:16380@26380 master - 0 1726305278000 0 connected
997c06402f48db3c3925c8d820af5f1695347c36 172.17.0.5:16379@26379 master - 0 1726305279380 3 connected

设置主从关系命令,到从节点中执行

cluster replicate 主节点nodeid

进入redis-s1

docker exec -it redis-s1 /bin/bashredis-cli -p 16379#从节点一对应主节点一的nodeid
cluster replicate 863340d68ac280317d410f2c0fc8f863fb9a74f4

依次将其他从节点也执行

设置完进入主节点一看主从关系

[root@localhost cluster]# docker exec -it redis-m1 /bin/bash
root@9d29016966fe:/data# redis-cli
127.0.0.1:6379> cluster nodes
788bb0674543fda50fb9bfabbc4dd598c041e4f6 172.17.0.7:16381@26381 slave 8211c4e11468743394dc102778a8985708d88925 0 1726305959000 2 connected
8211c4e11468743394dc102778a8985708d88925 172.17.0.4:6381@16381 master - 0 1726305957000 2 connected 10923-16383
3c429e47ee9e8cb79457cc9f1556ca5df2a5df92 172.17.0.3:6380@16380 master - 0 1726305956000 4 connected 5461-10922
863340d68ac280317d410f2c0fc8f863fb9a74f4 172.17.0.2:6379@16379 myself,master - 0 1726305958000 1 connected 0-5460
b2adb4177ef4c28715b9aca9b965668a0c6407d1 172.17.0.6:16380@26380 slave 3c429e47ee9e8cb79457cc9f1556ca5df2a5df92 0 1726305958000 4 connected
997c06402f48db3c3925c8d820af5f1695347c36 172.17.0.5:16379@26379 slave 863340d68ac280317d410f2c0fc8f863fb9a74f4 0 1726305959588 1 connected
在cluster集群中读写数据
root@9d29016966fe:/data# redis-cli -c
127.0.0.1:6379> set name yohoo
-> Redirected to slot [5798] located at 172.17.0.3:6380
OK

解释:

-c是为了避免因为槽导致的设置数据失败

在到其他节点去读

root@2564e5d44d2e:/data# redis-cli -p 16379 -c
127.0.0.1:16379> get name
-> Redirected to slot [5798] located at 172.17.0.3:6380
"yohoo"

相关文章:

Redis集群_cluster

cluster集群 cluster翻译就是集群,所以cluster集群也叫做redis集群相比于哨兵模式,cluster集群能支持扩容,并且无需额外的节点来监控状态,所以使用这种模式集群的系统会用的更多些redis cluster采用的是去中心化网络拓扑架构&…...

jdk相关介绍

JDK,全称Java Development Kit,是Java语言开发的基础工具包。它包含了Java运行时环境(JRE)以及用于开发Java应用程序的各种工具和库。JDK为Java程序员提供了编译、调试和运行Java应用程序所需的全部环境。 JDK的主要组成部分包括&…...

【GoMate框架案例】讯飞大模型RAG智能问答挑战赛top10 Baseline

【RAG框架】GoMate:RAG Framework within Reliable input,Trusted output 【项目链接】:https://github.com/gomate-community/GoMate 一、赛题背景 RAG(检索增强生成)是一种结合了检索模型和生成模型的技术,它通过检…...

2024/9/15 408“回头看”之应用层小总结(下)

域名系统DNS: 本地域名服务器 本地域名服务器起着代理的作用,会将报文转发到根域名服务器、顶级域名服务器、权限域名服务器。 递归查询: 迭代查询: 文件传送协议FTP: FTP客户和FTP服务器之间使用的是tcp连接。 控制连接使用21端口&…...

经纬恒润高压电池管理系统,助力新能源汽车飞速发展

随着新能源汽车行业的快速发展,电池管理系统作为关键技术之一,其重要性日益凸显。经纬恒润自主研发的高压电池管理系统(Battery Management System,BMS),凭借卓越的性能与先进的技术,在新能源汽…...

一文速通calcite结合flink理解SQL从文本变成执行计划详细过程

文章目录 你可以学到啥测试代码背景知识SQL转变流程图问题 你可以学到啥 SQL如何一步步变成执行计划的有哪些优化器,哪些优化规则calcite 和flink 如何结合的 测试代码 EnvironmentSettings settings EnvironmentSettings.inBatchMode(); TableEnvironment tabl…...

spring-TransactionTemplate 编程式事务

TransactionTemplate 是 Spring 框架提供的用于管理事务的一种方式。它提供了一种编程式的事务管理方法,允许开发者在代码中显式地控制事务的开始、提交或回滚。与使用 Transactional 注解相比,TransactionTemplate 提供了更多的灵活性和控制力。 为什么…...

中考全国45套(全国教育发达地区中考试卷)

文章目录 获取方式 为什么选择这份资源? 权威性与全面性:我们精心搜集了全国教育发达地区的最新中考试卷,确保每一套试卷都代表了该地区的教学水平和考试趋势。这不仅涵盖了丰富的知识点,还融入了各地独特的命题风格,让…...

嵌入式Linux学习笔记(5)-进程间常见通讯方式(c语言实现)

一、概述 进程间通信(IPC,InterProcess Communication)是指在多个进程之间进行数据传输和共享的机制。在操作系统中,进程是运行中的程序的实例,每个进程都有自己的内存空间和资源。 进程间通信可以用于在不同的进程之间…...

【移动端】菜单的自动展开与收回

前言 为了满足手机上菜单栏随用户移动,菜单的自动展示与隐藏,特此记录 基本原理 实现逻辑 window.addEventListener(‘scroll’, debouncedScrollHandler) – 监听文档视图滚动事件 document.querySelector(‘.header’) – 选择器匹配元素 创建show和h…...

Java获取Object中Value的方法

在Java中,获取对象(Object)中的值通常依赖于对象的类型以及我们希望访问的属性。由于Java是一种静态类型语言,直接从一个Object类型中访问属性是不可能的,因为Object是所有类的超类,但它本身不包含任何特定…...

集群聊天服务器项目【C++】(二)Json的简单使用

在上一章中,简单介绍了本项目的内容、技术栈、需求和目标等,详细介绍了环境配置,如果还没有配置成功,请参考我的上一篇博客环境配置 今天主要介绍Json库是什么以及简单的使用。 1.为什么要使用Json 我们在网络传输数据时&#…...

班迪录屏和这三款录屏工具,一键操作,太方便了!

嘿,小伙伴们!今天我要跟大家分享几款超棒的录屏工具,它们绝对是我们在工作和学习中不可或缺的好帮;这些工具功能强大且操作简单,下面就让我来详细介绍一下它们的使用体验和好用之处吧! 班迪录屏工具使用体…...

DAY60Bellman_ford 算法

队列优化算法 请找出从城市 1 到城市 n 的所有可能路径中,综合政府补贴后的最低运输成本。 如果能够从城市 1 到连通到城市 n, 请输出一个整数,表示运输成本。如果该整数是负数,则表示实现了盈利。如果从城市 1 没有路径可达城市…...

Dubbo SPI源码

文章目录 Dubbo SPI使用方式AOP功能源码剖析SPI注解1.获取加载器2.获取拓展实例对象3.创建拓展类的实例对象 Dubbo SPI Dubbo 的 SPI(Service Provider Interface)机制是一种强大的扩展机制,它允许开发者在运行时动态地替换或增加框架的功能。…...

《C++代码高度优化之双刃剑:避免过度优化引发的“暗雷”》

在 C编程的世界里,追求高效性能的代码是每个开发者的目标之一。高度优化的 C代码可以带来显著的性能提升,让程序在运行速度、内存占用等方面表现出色。然而,正如一把双刃剑,过度优化可能会引入难以察觉的错误,给程序带…...

javascript网页设计案例

设计一个具有良好用户体验的 JavaScript 网页涉及多个方面,如用户界面(UI)、用户体验(UX)、交互设计等。以下是一些示例案例,展示了如何使用 JavaScript 创建功能丰富且吸引人的网页设计。 1. 响应式导航菜…...

初阶数据结构【TOP】- 11.普通二叉树的介绍 - 1. (细致,保姆~~!)

文章目录 前言一、普通二叉树的链式结构二、 造树三、普通二叉树的遍历四、遍历完整代码五、总结 前言 本篇文章笔者将会对普通二叉树部分进行细致的讲解 , 本篇主要包括以下内容: 二叉树链式结构的介绍 ,二叉树的遍历. 笔者会一步一步分析带学者领略递归的美好~~ 一、普通二叉…...

【pyenv】pyenv安装版本超时的解决方案

目录 1、现象 2、分析现象 3、手动下载所需版本 4、存放到指定路径 5、重新安装 6、pip失败(做个记录,未找到原因) 7、方法二修改环境变量方法 7.1 设置环境变量 7.2 更新 7.3 安装即可 8、方法三修改XML文件 前言:研…...

【新片场-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

条件运算符

C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...