Redis 集群实操:强大的数据“分身术”

目录

Redis Cluster集群模式

1、介绍

2、架构设计

3、集群模式实操

4、故障转移

5、常用命令


Redis Cluster集群模式

1、介绍

redis3.0版本推出的Redis Cluster 集群模式,每个节点都可以保存数据和整个集群状态,每个节点都和其他所有节点连接。Cluster 一般由多个节点组成,节点数量至少为 6 个才能保证组成完整高可用的集群,其中三个为主节点,三个为从节点。三个主节点会分配槽,处理客户端的命令请求,而从节点可用在主节点故障后,顶替主节点。

2、架构设计

  1. Redis 集群是一种分布式架构,数据被分片存储在多个节点上。
  2. 每个节点可以同时处理读写请求,这样可以有效分担负载。
  3. 数据通过哈希槽进行分片,整个集群最多支持 16384 个哈希槽。每个键在写入时会通过哈希函数计算出其对应的哈希槽,进而确定存储在哪个节点上。7c5a96567da4481f9c342d9fea904382.gif

图片来源:最通俗易懂的 Redis 架构模式详解 - 墨天轮

3、集群模式实操

3.1、环境准备

Redis集群需要至少3个主节点和3个从节点组成,这样在主节点出现故障时,可以通过从节点提供持久化数据访问,保证系统的可用性。所以我们这里准备三台Linux服务器,6个节点来做这个实验。

10.211.55.526379
6380
10.211.55.536379  
6380
10.211.55.546379
6380

三台均需下载安装redis

精简版
[root@iycms ~]# wget http://download.redis.io/releases/redis-7.2.6.tar.gz
[root@iycms /]# tar -zxvf /root/redis-7.2.6.tar.gz  -C /usr/
[root@iycms /]# cd /usr/redis-7.2.6/
[root@iycms redis-7.2.6]# make

创建配置文件存放目录、数据存放目录(所有服务器均需要)

mkdir -p /usr/redis-7.2.6/redis_63{79,80}/conf
mkdir -p /var/redis/63{79,80}/{pid,log}

编写集群配置文件(所有服务器均需,注意端口号修改)

vim /usr/redis-7.2.6/redis_6379/conf/redis.conf
#录入以下信息
#快速修改::%s/6379/6380/g
#绑定端口
port 6379 
#绑定地址 
bind 0.0.0.0  
#守护模式启动
daemonize yes  
#pid存放地址
pidfile /var/redis/6379/run/redis_6379.pid
#log存放地址
logfile /var/redis/6379/log/redis_6379.log
数据存储目录
dir /var/redis/6379 
#是否以集群模式启动 
cluster-enabled yes  
#生成的集群配置文件名
cluster-config-file nodes-6379.conf  
#超时时间,超过即下线
cluster-node-timeout 5000  
#AOF模式
appendonly yes
#关闭保护模式
protected-mode no

3.2、启动集群

每台服务器执行

[root@master ~]# /usr/redis-7.2.6/src/redis-server /usr/redis-7.2.6/redis_6379/conf/redis.conf 
[root@master ~]# /usr/redis-7.2.6/src/redis-server /usr/redis-7.2.6/redis_6380/conf/redis.conf 

启动查看进程可以看到cluster

[root@master ~]# ps -ef | grep redis
root        8833       1  0 13:09 ?        00:00:00 /usr/redis-7.2.6/src/redis-server 0.0.0.0:6379 [cluster]
root        8840       1  0 13:09 ?        00:00:00 /usr/redis-7.2.6/src/redis-server 0.0.0.0:6380 [cluster]
root        8848    8466  0 13:10 pts/1    00:00:00 grep --color=auto redis

查看集群配置文件


[root@master ~]# vim /var/redis/6379/nodes-6379.conf a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 :0@0,,tls-port=0,shard-id=3e19853b240c5212b80b60093d61c05e4944dc81 myself,master - 0 0 0 connected
vars currentEpoch 0 lastVoteEpoch 0#a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9:0@0代表唯一标识符。
#connected表示节点已经成功加入集群

3.3、加入集群

查看集群所有节点cluster nodes

[root@master ~]# /usr/redis-7.2.6/src/redis-cli 
127.0.0.1:6379> cluster nodes
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 :6379@16379 myself,master - 0 0 0 connected

很明显现在各个节点虽然启动了,但是没有加入到同一集群,现在我们需要创建并加入集群

[root@master ~]# /usr/redis-7.2.6/src/redis-cli --cluster create 10.211.55.52:6379 10.211.55.52:6380 10.211.55.53:6379 10.211.55.53:6380 10.211.55.54:6379 10.211.55.54:6380 --cluster-replicas 1
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 10.211.55.53:6380 to 10.211.55.52:6379
Adding replica 10.211.55.54:6380 to 10.211.55.53:6379
Adding replica 10.211.55.52:6380 to 10.211.55.54:6379
M: a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 10.211.55.52:6379slots:[0-5460] (5461 slots) master
S: 80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380replicates c7a60dbe6b19408bcd2fe4025d692217ac056727
M: 58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379slots:[5461-10922] (5462 slots) master
S: a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380replicates a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9
M: c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379slots:[10923-16383] (5461 slots) master
S: d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380replicates 58614a8515f84090c6ba38d9755148b985c136cb
Can I set the above configuration? (type 'yes' to accept): 
#填入yes

--cluster-replicas 1 选项告诉 Redis 每个主节点应该有一个从节点。

在这里从节点的分配不是静态的。在集群运行过程中,如果主节点出现故障,其从节点可能会被提升为主节点

3.3.1、查看下集群的所有节点及其他信息

哈希槽、主从关系

127.0.0.1:6379> cluster nodes
a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380@16380 slave a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 0 1734374444589 1 connected
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 10.211.55.52:6379@16379 master - 0 1734374445631 1 connected 0-5460
c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379@16379 master - 0 1734374445000 5 connected 10923-16383
d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380@16380 slave 58614a8515f84090c6ba38d9755148b985c136cb 0 1734374445525 3 connected
80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380@16380 slave c7a60dbe6b19408bcd2fe4025d692217ac056727 0 1734374444896 5 connected
58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379@16379 myself,master - 0 1734374444000 3 connected 5461-10922

3.3.2、查询哈希槽分配

[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -h 10.211.55.52 -p 6379 cluster slots
1) 1) (integer) 02) (integer) 54603) 1) "10.211.55.52"2) (integer) 63793) "a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9"4) (empty array)4) 1) "10.211.55.53"2) (integer) 63803) "a5bffa3f5c7a47fae9d3436614d0ba6a91692447"4) (empty array)
2) 1) (integer) 54612) (integer) 109223) 1) "10.211.55.53"2) (integer) 63793) "58614a8515f84090c6ba38d9755148b985c136cb"4) (empty array)4) 1) "10.211.55.54"2) (integer) 63803) "d7110c436b1f345a07cb85a59050298576172820"4) (empty array)
3) 1) (integer) 109232) (integer) 163833) 1) "10.211.55.54"2) (integer) 63793) "c7a60dbe6b19408bcd2fe4025d692217ac056727"4) (empty array)4) 1) "10.211.55.52"2) (integer) 63803) "80c0cb2658770e28900e0f331001f3e6aa4b8f46"4) (empty array)

3.4、向集群加入数据并查询

注意:写数据的时候要注意连接到正确的地址,否则会提示

(error) MOVED 5798 10.211.55.53:6379

这是MOVED重定向

加上参数-c即可处理(-c无所谓你的Redis是否是集群模式)

/usr/redis-7.2.6/src/redis-cli -c -h 127.0.0.1 -p 6379

[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -h 127.0.0.1 -p 6379
127.0.0.1:6379> set name zhangjj
-> Redirected to slot [5798] located at 10.211.55.53:6379
OK

3.4.1、查看录入的数据

 /usr/redis-7.2.6/src/redis-cli -c -h 10.211.55.54 -p 6379 get name

[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -h 10.211.55.54 -p 6379 get name  
"zhangjj"
[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -h 10.211.55.53 -p 6379 get name  
"zhangjj"

4、故障转移

已知10.211.55.52:6379是10.211.55.53:6380的主节点。现杀掉52的6379

[root@master ~]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:16379           0.0.0.0:*               LISTEN      9047/redis-server 0 
tcp        0      0 0.0.0.0:16380           0.0.0.0:*               LISTEN      9040/redis-server 0 
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN      793/cupsd           
tcp        0      0 0.0.0.0:6379            0.0.0.0:*               LISTEN      9047/redis-server 0 
tcp        0      0 0.0.0.0:6380            0.0.0.0:*               LISTEN      9040/redis-server 0 
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      794/sshd: /usr/sbin 
tcp6       0      0 ::1:631                 :::*                    LISTEN      793/cupsd           
tcp6       0      0 :::22                   :::*                    LISTEN      794/sshd: /usr/sbin 
[root@master ~]# kill -9 9047

查看变化

10.211.55.53:6380自动升为主节点

[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -p 6380
127.0.0.1:6380> cluster nodes
c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379@16379 master - 0 1734376636144 5 connected 10923-16383
58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379@16379 master - 0 1734376635721 3 connected 5461-10922
a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380@16380 master - 0 1734376634660 7 connected 0-5460
80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380@16380 myself,slave c7a60dbe6b19408bcd2fe4025d692217ac056727 0 1734376624000 5 connected
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 10.211.55.52:6379@16379 master,fail - 1734376579470 1734376577355 1 disconnected
d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380@16380 slave 58614a8515f84090c6ba38d9755148b985c136cb 0 1734376636778 3 connected

再次重启10.211.55.52:6379查看变化

10.211.55.52:6379成为了10.211.55.53:6380的从节点

[root@master ~]# /usr/redis-7.2.6/src/redis-server /usr/redis-7.2.6/redis_6379/conf/redis.conf 
[root@master ~]# /usr/redis-7.2.6/src/redis-cli -c -p 6380
127.0.0.1:6380> cluster nodes
c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379@16379 master - 0 1734376823031 5 connected 10923-16383
58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379@16379 master - 0 1734376823450 3 connected 5461-10922
a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380@16380 master - 0 1734376822512 7 connected 0-5460
80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380@16380 myself,slave c7a60dbe6b19408bcd2fe4025d692217ac056727 0 1734376818000 5 connected
a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9 10.211.55.52:6379@16379 slave a5bffa3f5c7a47fae9d3436614d0ba6a91692447 0 1734376822926 7 connected
d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380@16380 slave 58614a8515f84090c6ba38d9755148b985c136cb 0 1734376822410 3 connected

5、常用命令

命令描述案例
create创建Redis集群redis-cli --cluster create 10.211.55.52:7000 10.211.55.52:7001 10.211.55.53:7002 --cluster-replicas 1(创建包含三个主节点和三个从节点的集群)
check检查Redis集群状态redis-cli --cluster check 10.211.55.52:7000(检查集群中所有节点的槽位分配和状态)
info查看Redis集群的简易信息redis-cli --cluster info 10.211.55.52:7000(查看集群的节点数、槽位分配等基本信息)
fix修复Redis集群中的槽位分配问题redis-cli --cluster fix 10.211.55.52:7000 --cluster-search-multiple-owners(修复被多个节点拥有的槽位问题)
reshard在Redis集群中迁移槽位redis-cli --cluster reshard 10.211.55.52:7000 --cluster-from 10.211.55.52:7001 --cluster-to 10.211.55.53:7002 --cluster-slots 100(从节点7001迁移100个槽位到节点7002)
rebalance平衡Redis集群中的槽位分配redis-cli --cluster rebalance 10.211.55.52:7000 --cluster-threshold 1.5(根据权重和阈值条件平衡集群中的槽位分配)
add-node向Redis集群中添加新节点redis-cli --cluster add-node 10.211.55.53:7003 10.211.55.52:7000 --cluster-slave --cluster-master-id <master-node-id>(将新节点7003作为从节点添加到集群,并指定其主节点ID)
del-node从Redis集群中删除节点redis-cli --cluster del-node 10.211.55.52:7000 <node-id>(从集群中删除指定ID的节点,注意从节点可以直接删除,有槽位分配的主节点不能直接删除)
set-timeout设置Redis集群的cluster-node-timeout时间redis-cli --cluster set-timeout 10.211.55.52:7000 5000(将集群的节点超时时间设置为5000毫秒)
call在Redis集群的所有节点上执行命令redis-cli --cluster call 10.211.55.52:7000 FLUSHALL(在所有节点上执行FLUSHALL命令,清空所有节点的数据)

至此验证测试完成。

学习地址:Redis 超详细的手动搭建Cluster集群步骤 - 云崖先生 - 博客园

Redis 超详细的手动搭建Cluster集群步骤 - 云崖先生 - 博客园

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

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

相关文章

C# 从控制台应用程序入门

总目录 前言 从创建并运行第一个控制台应用程序&#xff0c;快速入门C#。 一、新建一个控制台应用程序 控制台应用程序是C# 入门时&#xff0c;学习基础语法的最佳应用程序。 打开VS2022&#xff0c;选择【创建新项目】 搜索【控制台】&#xff0c;选择控制台应用(.NET Framew…

猫咪睡眠:萌态背后的奥秘与启示

猫咪的睡眠&#xff0c;犹如一本充满趣味与奥秘的小书&#xff0c;每一页都写满了它们独特的习性与本能。 猫咪堪称 “睡眠大师”&#xff0c;睡眠时间之长令人咋舌&#xff0c;一天中大约有 12 - 16 个小时在梦乡中度过&#xff0c;幼猫和老年猫甚至能睡更久。它们似乎深谙放…

基于前端技术UniApp和后端技术Node.js的电影购票系统

文章目录 摘要Abstruct第一章 绪论1.1 研究背景与意义1.2 国内外研究现状 第二章 需求分析2.1 功能需求分析2.2 非功能性需求分析 第二章系统设计3.1 系统架构设计3.1.1 总体架构3.1.2 技术选型 3.2 功能架构 第四章 系统实现4.1 用户端系统实现4.1.1 用户认证模块实现4.1.2 电…

用adb命令给APP做压力测试,有什么不同?

压力测试 app做压力测试目的是模拟用户在使用软件时随意向软件发出指令&#xff0c;例如操作app的点击&#xff0c;滑动&#xff0c;返回等一系列随机事件&#xff0c;来检测app的承受能力 第一步&#xff1a;手机安装包需要待测的app 第二步&#xff1a;输入adb start-ser…

2023年西南大学数学建模C题天气预报解题全过程文档及程序

2023年西南大学数学建模 C题 天气预报 原题再现&#xff1a; 天气现象与人类的生产生活、社会经济、军事活动等方方面面都密切相关&#xff0c;大到国家&#xff0c;小到个人&#xff0c;都受到极端天气的影响。2022年6月&#xff0c;全球陆地地区出现了自1850年代末人类有系…

Android 10 Launcher3 删除谷歌搜索

命令行获取页面 手机处于launcher首页 adb shell dumpsys window | findstr mCurrentFocus 输出 mCurrentFocusWindow{9afb34d u0 com.android.launcher3/com.android.launcher3.Launcher} 找到源码路径 packages/apps/Launcher3/ Android10源码 搜索控件 grep -r -n Apps…

LabVIEW机械故障诊断中的传感器选择

在机械设备故障诊断中&#xff0c;传感器是关键设备&#xff0c;用于采集设备运行状态的各种数据。常见的传感器类型和选择方法如下&#xff1a; 1. 振动传感器 用于检测设备运行中的振动特征&#xff0c;常见于旋转机械和轴承故障诊断。 加速度传感器&#xff1a;检测高频振…

JVM和数据库面试知识点

JVM内存结构 主要有几部分&#xff1a;堆、栈、方法区和程序计数器 堆是JVM中最大的一块内存区域&#xff0c;用于存储对象实例&#xff0c;一般通过new创建的对象都存放在堆中。堆被所有的线程共享&#xff0c;但是它的访问时线程不安全的&#xff0c;通常通过锁的机制来保证线…

电子发票汇总改名,批量处理电子发票问题

今天给大家推荐一个财务方面工作的软件。可以帮你解决很多财务。发票方面的问题。 电子发票汇总改名 批量处理电子发票问题 这个软件安装之后。会在桌面上分成三个小软件&#xff0c;分别是修改单位信息、自定义命名规则和电子发票汇总改名。 你可以在这个软件里提取PDF或者of…

用 Python 从零开始构建 LLaMA 3

文章结尾有最新热度的文章,感兴趣的可以去看看。 本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身 文章有点长(字),期望您能坚…

移植 OLLVM 到 LLVM18,修复控制流平坦化报错

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 前言 把 OLLVM 移植到 LLVM18 后&#xff0c;发现 -fla&#xff08;控制流平坦化&#xff09;并不能正常使用。 关于移植过程可以参考这篇文章 【移植 OLLVM…

MyBatis通过注解配置执行SQL语句原理源码分析

文章目录 前置准备流程简要分析配置文件解析加载 Mapper 接口MapperAnnotationBuilder解析接口方法注解parseStatement 方法详解MapperBuilderAssistant 前置准备 创建一个mybatis-config.xml文件&#xff0c;配置mapper接口 <mappers><!--注解配置--><mapper…

入侵他人电脑,实现远程控制(待补充)

待补充 在获取他人无线网网络密码后&#xff0c;进一步的操作是实现入侵他人电脑&#xff0c;这一步需要获取对方的IP地址并需要制作自己的代码工具自动化的开启或者打开对方的远程访问权限。 1、获取IP地址&#xff08;通过伪造的网页、伪造的Windows窗口、hook&#xff0c;信…

mac 安装graalvm

Download GraalVM 上面链接选择jdk的版本 以及系统的环境下载graalvm的tar包 解压tar包 tar -xzf graalvm-jdk-<version>_macos-<architecture>.tar.gz 移入java的文件夹目录 sudo mv graalvm-jdk-<version> /Library/Java/JavaVirtualMachines 设置环境变…

[SZ901]JTAG高速下载设置(53Mhz)

SZ901最高支持JTAG 53MHz的时钟频率&#xff0c;下载bit文件和固化程序的速度提升非常明显。 首先设置参数 1&#xff0c;将JTAG0 分频系数修改为3 2&#xff0c;设置参数&#xff0c;更新参数。&#xff08;完成&#xff09; 打开VIVADO VIVADO 正常识别FPGA&#xff0c;速…

蓝桥杯刷题——day8

蓝桥杯刷题——day8 题目一题干解题思路代码 题目二题干解题思路代码 题目一 题干 N 架飞机准备降落到某个只有一条跑道的机场。其中第i架飞机在 Ti时刻到达机场上空&#xff0c;到达时它的剩余油料还可以继续盘旋 Di个单位时间&#xff0c;即它最早可以于 Ti时刻开始降落&am…

深度科普文:细数倾斜摄影数据的缺点

1. 引言 写这篇文章的起因是最近遇到一个使用倾斜摄影数据应标的三维可视化项目&#xff0c;业主认为倾斜摄影数据加载很卡&#xff0c;要求能浏览场景的时候能立刻显示出当前的场景最精细的模型&#xff0c;如下图1所示。其实这个问题遇到的次数还真不少&#xff0c;作为乙方…

React:闭包陷阱产生和解决

在 React 中&#xff0c;闭包陷阱是一个常见的问题&#xff0c;尤其是在处理异步操作、事件处理器、或是定时器时。理解闭包的工作原理以及它在 React 中如何与状态和渲染交互&#xff0c;可以帮助你避免陷入一些常见的错误。 一、闭包陷阱的产生 1、什么是闭包陷阱&#xff1…

【开源免费】基于SpringBoot+Vue.JS在线宠物用品交易网站(JAVA毕业设计)

本文项目编号 T 092 &#xff0c;文末自助获取源码 \color{red}{T092&#xff0c;文末自助获取源码} T092&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

【Git 常用操作:pull push】

Git 基本概念 Git 是一个先进的开源的分布式版本控制系统&#xff0c;常用于管理工作内容、项目代码等功能。 Git 工作流程 图片来源&#xff1a;https://www.runoob.com/git/git-basic-operations.html 说明&#xff1a; workspace&#xff1a;工作区staging area&#xff…