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

news2024/12/22 23:36:19

目录

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:6379
   slots:[0-5460] (5461 slots) master
S: 80c0cb2658770e28900e0f331001f3e6aa4b8f46 10.211.55.52:6380
   replicates c7a60dbe6b19408bcd2fe4025d692217ac056727
M: 58614a8515f84090c6ba38d9755148b985c136cb 10.211.55.53:6379
   slots:[5461-10922] (5462 slots) master
S: a5bffa3f5c7a47fae9d3436614d0ba6a91692447 10.211.55.53:6380
   replicates a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9
M: c7a60dbe6b19408bcd2fe4025d692217ac056727 10.211.55.54:6379
   slots:[10923-16383] (5461 slots) master
S: d7110c436b1f345a07cb85a59050298576172820 10.211.55.54:6380
   replicates 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) 0
   2) (integer) 5460
   3) 1) "10.211.55.52"
      2) (integer) 6379
      3) "a73ec6b05ad9dd04ec11e7af585b0e42e443a5e9"
      4) (empty array)
   4) 1) "10.211.55.53"
      2) (integer) 6380
      3) "a5bffa3f5c7a47fae9d3436614d0ba6a91692447"
      4) (empty array)
2) 1) (integer) 5461
   2) (integer) 10922
   3) 1) "10.211.55.53"
      2) (integer) 6379
      3) "58614a8515f84090c6ba38d9755148b985c136cb"
      4) (empty array)
   4) 1) "10.211.55.54"
      2) (integer) 6380
      3) "d7110c436b1f345a07cb85a59050298576172820"
      4) (empty array)
3) 1) (integer) 10923
   2) (integer) 16383
   3) 1) "10.211.55.54"
      2) (integer) 6379
      3) "c7a60dbe6b19408bcd2fe4025d692217ac056727"
      4) (empty array)
   4) 1) "10.211.55.52"
      2) (integer) 6380
      3) "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.coloradmin.cn/o/2263950.html

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

相关文章

数据结构day5:单向循环链表 代码作业

一、loopLink.h #ifndef __LOOPLINK_H__ #define __LOOPLINK_H__#include <stdio.h> #include <stdlib.h>typedef int DataType;typedef struct node {union{int len;DataType data;};struct node* next; }loopLink, *loopLinkPtr;//创建 loopLinkPtr create();//…

植物大战僵尸杂交版v3.0.2最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于12月21日更新了植物大战僵尸杂交版3.0.2版本&#xff01;&#xff01;&#xff01;&#xff0c;有b站账户的记得要给作者三连关注一下呀&#xff01; 不多废话下载链接放上&#xff1a; 夸克网盘链接&#xff1a;&#xff1a;https://pan.quark.cn/s/5c…

Unity 圆形循环复用滚动列表

一.在上一篇垂直循环复用滚动列表的基础上&#xff0c;扩展延申了圆形循环复用滚动列表。实现此效果需要导入垂直循环复用滚动列表里面的类。 1.基础类 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using …

京东大数据治理探索与实践 | 京东零售技术实践

01背景和方案 在当今的数据驱动时代&#xff0c;数据作为关键生产要素之一&#xff0c;其在商业活动中的战略价值愈加凸显&#xff0c;京东也不例外。 作为国内领先的电商平台&#xff0c;京东在数据基础设施上的投入极为巨大&#xff0c;涵盖数万台服务器、数 EB 级存储、数百…

android:sharedUserId 应用进程声明介绍

背景 adb install 安装系统软件报错,原因是签名不一致,进程改变。 代码分析 AndroidManifest.xml 定义的 android:sharedUserId 应用归属进程不同,从phone切换到system。 初始配置 <manifest xmlns:android="http://schemas.android.com/apk/res/android"c…

Liveweb视频融合共享平台在果园农场等项目中的视频监控系统搭建方案

一、背景介绍 在我国的大江南北遍布着各种各样的果园&#xff0c;针对这些地处偏僻的果园及农场等环境&#xff0c;较为传统的安全防范方式是建立围墙&#xff0c;但是仅靠围墙仍然无法阻挡不法分子的有意入侵和破坏&#xff0c;因此为了及时发现和处理一些难以察觉的问题&…

交换机链路聚合(手动负载分担模式)(eNSP)

目录 交换机SW_C配置: 交换机-PC划分vlan: 交换机-交换机端口聚合: 交换机SW_D配置: 交换机-PC划分vlan: 交换机-交换机端口聚合: 验证: 链路聚合的端口清除: 交换机端口聚合的存在意义主要有以下几点: 增加带宽 提高冗余性和可靠性 实现负载均衡 降低成本 …

玩转树莓派Pico(19): 迷你气象站5——软件整合

一、前言 各个模块都已经测试了&#xff0c;硬件也组装完成&#xff0c;到了软件整合的步骤了。 目前我仅按照自己的经验来整合&#xff0c;肯定要踩坑的。以后除了多去开源网站看看大佬的代码&#xff0c;还要继续揣摩《无线电》杂志里的文章。很多文章对我来说比较高深&#…

30. 多进程编程

一、什么是进程 进程&#xff08;process&#xff09;则是一个执行中的程序。每个进程都拥有自己的地址空间、内存、数据栈以及其它用于跟踪执行的辅助数据。操作系统管理其上所有进程的执行&#xff0c;并为这些进程合理分配时间。进程也可以通过派生新的进程来执行其它任务&a…

Unity Post请求发送fromdata数据content-type

wwwfrom 的 headers["Content-Type"]修改 错误代码&#xff1a; WWWForm form new WWWForm(); if (form.headers.ContainsKey("Content-Type")) {string boundary string.Format("--{0}", DateTime.Now.Ticks.ToString("x"));form…

aosp15 - Activity生命周期切换

本文探查的是&#xff0c;从App冷启动后到MainActivity生命周期切换的系统实现。 调试步骤 在com.android.server.wm.RootWindowContainer#attachApplication 方法下断点&#xff0c;为了attach目标进程在com.android.server.wm.ActivityTaskSupervisor#realStartActivityLock…

SAP PP ECN CSAP_MAT_BOM_MAINTAIN

刚开始的时候ECN总是加不上&#xff0c; 参考kimi给出的案例 点击链接查看和 Kimi 智能助手的对话 https://kimi.moonshot.cn/share/cth1ipmqvl7f04qkggdg 效果 加上了 FUNCTION ZPBOM_PLM2SAP. *"------------------------------------------------------------------…

GitLab的安装和使用

1.GitLab 环境说明 系统版本 CentOS 7.2 x86_64 软件版本 gitlab-ce-10.8.4 GitLab 是一个用于仓库管理系统的开源项目&#xff0c;使用Git作为代码管理工具&#xff0c;并在此基础上搭建起来的web服务。可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能…

开放词汇目标检测(Open-Vocabulary Object Detection, OVOD)综述

定义 开放词汇目标检测&#xff08;Open-Vocabulary Object Detection, OVOD&#xff09;是一种目标检测任务&#xff0c;旨在检测和识别那些未在训练集中明确标注的物体类别。传统的目标检测模型通常只能识别有限数量的预定义类别&#xff0c;而OVOD模型则具有识别“开放词汇…

JaxaFx学习(三)

目录&#xff1a; &#xff08;1&#xff09;JavaFx MVVM架构实现 &#xff08;2&#xff09;javaFX知识点 &#xff08;3&#xff09;JavaFx的MVC架构 &#xff08;4&#xff09;JavaFx事件处理机制 &#xff08;5&#xff09;多窗体编程 &#xff08;6&#xff09;数据…

【C++】小乐乐求和问题的高效求解与算法对比分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;问题描述与数学模型1.1 题目概述1.2 输入输出要求1.3 数学建模 &#x1f4af;方法一&#xff1a;朴素循环求和法2.1 实现原理2.2 分析与问题2.3 改进方案2.4 性能瓶颈与结论…

基于Spring Boot的找律师系统

一、系统背景与意义 在现代社会&#xff0c;法律服务的需求日益增长&#xff0c;但传统寻找律师的方式往往存在信息不透明、选择困难等问题。基于Spring Boot的找律师系统旨在解决这些问题&#xff0c;通过线上平台&#xff0c;用户可以轻松搜索、比较和选择合适的律师&#x…

【Spring】方法注解@Bean,配置类扫描路径

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 引入 一&#xff1a;Bean方法注解 1&#xff1a;方法注解要搭配类注解使用 2&#xff1a;执行结果 …

深度学习0-前置知识

一、背景 AI最大&#xff0c;它的目的是通过让机器模仿人类进而超越人类&#xff1b; ML次之&#xff0c;它是AI的一个分支&#xff0c;是让机器模仿人类的一种方法。开发人员用大量数据和算法“训练”机器&#xff0c;让机器自行学会如何执行任务&#xff0c;它的成功取决于…

前端面试题整理-前端异步编程

1. 进程、线程、协程的区别 在并发编程领域&#xff0c;进程、线程和协程是三个核心概念&#xff0c;它们在资源管理、调度和执行上有着本质的不同。 首先&#xff0c;进程是操作系统进行资源分配和调度的独立单位&#xff08;资源分配基本单位&#xff09;&#xff0c;每个进…