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

Redis高可用-Cluster(集群)

Redis cluster

cluster 为无中心,分布式 sharding,高可用技术架构。

在哨兵 sentinel 机制中,可以解决 redis 高可用的问题,即当 master 故障后可以自动将 slave 提升为 master 从而可以保证 redis 服务的正常使用。

但是无法解决 redis 单机写入的瓶颈问题,即单机的redis 写入性能受限于单机的内存大小、并发数量、网卡速率等因素,因此 redis 官方在 redis 3.0 版本之后推出了无中心架构的 redis cluster 机制,在无中心的 redis 集群汇中,其每个节点保存当前节点数据和整个集群状态,每个节点都和其他所有节点连接,特点如下:

1:所有 Redis 节点使用(PING 机制)互联
2:集群中某个节点的失效,是整个集群中超过半数的节点监测都失效才算真正的失效
3:客户端不需要 proxy 即可直接连接 redis,应用程序需要写全部的 redis 服务器 IP。
4:redis cluster 把所有的 redis node 映射到 0-16383 个槽位(slot)上,读写需要到指定的 redis node 上进行操作,因此有多少个 reids node 相当于 redis 并发扩展了多少倍。
5:Redis cluster 预先分配 16384 个(slot)槽位,当需要在 redis 集群中写入一个 key -value 的时候,会使用 CRC16(key) mod 16384 之后的值,决定将 key 写入值哪一个槽位从而决定写入哪一个 Redis 节点上,从而有效解决单机瓶颈

架构

服务器服务备注
192.168.37.17redis启动集群配置
192.168.37.27redis启动集群配置
192.168.37.37redis启动集群配置
192.168.37.47redis启动集群配置
192.168.37.57redis启动集群配置
192.168.37.67redis启动集群配置

先决条件

1.每个 redis node 节点采用相同的硬件配置、相同的密码
2.每个节点必须开启的参数
cluster-enabled yes #必须开启集群状态,开启后 redis 进程会有 cluster 显示
cluster-config-file nodes-6380.conf #此文件有 redis cluster 集群自动创建和维护,不需要任何手动操作
3.所有 redis 服务器必须没有任何数据
4.先启动为单机 redis 且没有任何 key value

需要使用到集群管理工具 redis-trib.rb,这个工具是 redis 官方推出的管理 redis 集群的工具,集成在redis 的源码 src 目录下,是基于 redis 提供的集群命令封装成简单、便捷、实用的操作工具,redis-trib.rb 是 redis 作者用 ruby 开发完成的

redis requires Ruby version >= 2.3.0。所以进行编译安装。

[root@node17 src]# pwd
/usr/local/srcwget https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.5.tar.gz
tar -xvf ruby-2.5.5.tar.gz 
cd ruby-2.5.5/
./configure
make -j 2
make install
gem install redis
#如果命令执行出错,可能是确实必要的安装包

修改一下配置文件,只需将密码修改为 redis 的密码即可

[root@node1 redis-4.0.14]# vi /usr/local/lib/ruby/gems/2.5.0/gems/redis-4.1.2/lib/redis/client.rb
[root@node1 redis-4.0.14]# cat /usr/local/lib/ruby/gems/2.5.0/gems/redis-4.1.2/lib/redis/client.rb | grep ":password "
:password => 123456,

创建集群

[root@node17 src]# pwd
/usr/local/src/redis-4.0.14/src使用 redis 集群管理工具启动 redis 集群, create 代表创建集群, replicas 代表每个redis 主节点有几个从节点,最后添加所有的 redis 服务
地址, 提示输入时,输入 yes 即可./redis-trib.rb create --replicas 1 192.168.37.17:6379 192.168.37.27:6379 192.168.37.37:6379 192.168.37.47:6379 192.168.37.57:6379 192.168.37.67:6379
[root@node17 src]# pwd
/usr/local/src/redis-4.0.14/src[root@node17 src]# ./redis-trib.rb
Usage: redis-trib <command> <options> <arguments ...>create          host1:port1 ... hostN:portN--replicas <arg>check           host:portinfo            host:portfix             host:port--timeout <arg>reshard         host:port--from <arg>--to <arg>--slots <arg>--yes--timeout <arg>--pipeline <arg>rebalance       host:port--weight <arg>--auto-weights--use-empty-masters--timeout <arg>--simulate--pipeline <arg>--threshold <arg>add-node        new_host:new_port existing_host:existing_port--slave--master-id <arg>del-node        host:port node_idset-timeout     host:port millisecondscall            host:port command arg arg .. argimport          host:port--from <arg>--copy--replacehelp            (show this help)For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.
#只需要提供任意一个工作node就可以了

集群维护

查看集群状态

[root@node17 src]# redis-cli -a 123456 -h 192.168.37.17 CLUSTER INFO
Warning: Using a password with '-a' option on the command line interface may not be safe.
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:6
cluster_my_epoch:1
cluster_stats_messages_ping_sent:2310
cluster_stats_messages_pong_sent:2214
cluster_stats_messages_fail_sent:8
cluster_stats_messages_sent:4532
cluster_stats_messages_ping_received:2214
cluster_stats_messages_pong_received:2077
cluster_stats_messages_fail_received:2
cluster_stats_messages_received:4293

查看集群node关系

[root@node17 src]# redis-cli -a 123456 -h 192.168.37.17 CLUSTER nodes
Warning: Using a password with '-a' option on the command line interface may not be safe.
b93be4cd9708c56a817e534c1bd65f1517dfcd2c 192.168.37.27:6379@16379 master - 0 1568095447000 2 connected 5461-10922
1be5a9efbaeb1e7b2aaac884a51eeeee9044199a 192.168.37.37:6379@16379 master - 0 1568095443324 3 connected 10923-16383
3be2728c5f006018bc497eec0748a69294170bf9 192.168.37.47:6379@16379 slave 1be5a9efbaeb1e7b2aaac884a51eeeee9044199a 0 1568095445337 4 connected
ad5851cba2caac6c76cfdd6bf1bbb8c457fb8ece 192.168.37.57:6379@16379 slave 7ba0fcaa8136efed36a1025e09e38a9ea2ea422e 0 1568095444331 5 connected
0bc30fd51b6a49b1f5545de2828e51ba92498b44 192.168.37.67:6379@16379 slave b93be4cd9708c56a817e534c1bd65f1517dfcd2c 0 1568095447355 6 connected
7ba0fcaa8136efed36a1025e09e38a9ea2ea422e 192.168.37.17:6379@16379 myself,master - 0 1568095445000 1 connected 0-5460

集群运行时间长久之后,难免由于硬件故障、网络规划、业务增长等原因对已有集群进行相应的调整, 比如增加 Redis node 节点、减少节点、节点迁移、更换服务器等。增加节点和删除节点会涉及到已有的槽位重新分配及数据迁移。

集群动态添加节点

准备两台服务器,安装好redis服务。

服务器服务备注
192.168.37.77redis启动集群配置
192.168.37.87redis启动集群配置

将两台服务器添加到集群

redis-trib.rb  add-node  new_host:new_port existing_host:existing_port./redis-trib.rb add-node 192.168.37.77:6379 192.168.37.67:6379
./redis-trib.rb add-node 192.168.37.87:6379 192.168.37.67:6379查看集群状态
[root@node17 src]# redis-cli -a 123456 -h 192.168.37.17 CLUSTER nodes[root@node17 src]# redis-cli -a 123456 -h 192.168.37.17 CLUSTER INFO

默认添加的节点都是master,希望node87作为node77的从服务器。

查看87号的复制信息
[root@node87 ~]# redis-cli -a 123456 -h 192.168.37.87 info replication查看77号的ID
[root@node87 ~]# redis-cli -a 123456 -h 192.168.37.87 cluster nodes
04306861ad7bd776e92e54788c453bfa9adbfd4d 192.168.37.77:6379@16379 master - 0 1568098060056 7 connected设置87号为77号的从
[root@node87 ~]# redis-cli -a 123456 -h 192.168.37.87  cluster replicate 04306861ad7bd776e92e54788c453bfa9adbfd4d

查看集群状态

[root@node17 src]# ./redis-trib.rb info  192.168.37.67:6379
192.168.37.77:6379 (04306861...) -> 0 keys | 0 slots | 1 slaves.
192.168.37.27:6379 (b93be4cd...) -> 0 keys | 5462 slots | 1 slaves.
192.168.37.37:6379 (1be5a9ef...) -> 0 keys | 5461 slots | 1 slaves.
192.168.37.17:6379 (7ba0fcaa...) -> 0 keys | 5461 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.

可以看到,主从已经配置OK,但是77还没有分配slots。

下面将重新分配槽位,使用reshard命令,需要清空所有节点数据。然后再重新分配。因此需要提前备份redis数据。

[root@node17 ~]# ./redis-trib.rb reshard 192.168.37.77:6379平均分配输入:4096
输入:all
输入:yes验证当前集群状态
[root@node17 src]# ./redis-trib.rb info 192.168.37.17:6379
192.168.37.17:6379 (7ba0fcaa...) -> 0 keys | 4096 slots | 1 slaves.
192.168.37.27:6379 (b93be4cd...) -> 0 keys | 4096 slots | 1 slaves.
192.168.37.77:6379 (04306861...) -> 0 keys | 4096 slots | 1 slaves.
192.168.37.37:6379 (1be5a9ef...) -> 0 keys | 4096 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.

集群动态删除节点

添加节点的时候是先添加 node 节点到集群,然后分配槽位,删除节点的操作与添加节点的操作正好相反,是先将被删除的 Redis node 上的槽位迁移到集群中的其他 Redis node 节点上,然后再将其删除。

如果一个 Redis node 节点上的槽位没有被完全迁移,删除该 node 的时候会提示有数据且无法删除。

删除节点的场景一般是服务器到了3年的服务年限。超过厂商质保期,磁盘开始故障。

被迁移Redis服务器必须保证没有数据

./redis-trib.rb reshard 192.168.37.17:6379How many slots do you want to move (from 1 to 16384)? 4096 #迁移 master 上的多少个槽位What is the receiving node ID? 886338acd50c3015be68a760502b239f4509881c #接收槽位的服务器Source node #1: f4cfc5cf821c0d855016488d6fbfb62c03a14fda #从哪个服务器迁移 4096 个槽位
Source node #2: done #写 done,表示没有其他 master 了Do you want to proceed with the proposed reshard plan (yes/no)? yes #是否继续查看迁移后状态
[root@node17 src]# ./redis-trib.rb info 192.168.37.17:6379
192.168.37.17:6379 (7ba0fcaa...) -> 0 keys | 0 slots | 0 slaves.
192.168.37.27:6379 (b93be4cd...) -> 0 keys | 4096 slots | 1 slaves.
192.168.37.77:6379 (04306861...) -> 0 keys | 8192 slots | 2 slaves.
192.168.37.37:6379 (1be5a9ef...) -> 0 keys | 4096 slots | 1 slaves.
[OK] 0 keys in 4 masters.
0.00 keys per slot on average.

slots迁移后,可以在集群中删除节点了

./redis-trib.rb  del-node        host:port node_id./redis-trib.rb del-node  192.168.37.77:6379 882e6ed6bd9a6a0d01e95bc1c19e826405853ec5
./redis-trib.rb del-node  192.168.37.87:6379 882e6ed6bd9a6a0d01e95bc1c19e826405853ec5

集群维护之Master宕机

当前架构是三主三从,互为跨主机master slave模式,测试master宕机后是否自动切换至slave

master上测试添加数据

[root@node77 ~]# redis-cli -a 123456 -h 192.168.37.77 set name mage
OK

slave上查看

[root@node57 ~]# redis-cli -a 123456 -h 192.168.37.57 get name
(error) MOVED 5798 192.168.37.77:6379 #slave 不提供读写,只提供数据备份即 master 选举

master停止redis服务

[root@node17 src]# ./redis-trib.rb info 192.168.37.27:6379
192.168.37.27:6379 (b93be4cd...) -> 0 keys | 4096 slots | 1 slaves.
192.168.37.57:6379 (ad5851cb...) -> 1 keys | 8192 slots | 0 slaves.
192.168.37.37:6379 (1be5a9ef...) -> 0 keys | 4096 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.可以看到57已经从slave升级为master,且master可读写

重启master后,maser77成为了57的从服务器。

集群维护之导入现有Redis数据

./redis-trib.rb import 方法,但是不太好用

其他方案

redis-migrate-tool

官方网址

https://www.oschina.net/p/redis-migrate-tool

使用介绍

https://my.oschina.net/u/3023401/blog/2251461

相关文章:

Redis高可用-Cluster(集群)

Redis cluster cluster 为无中心&#xff0c;分布式 sharding&#xff0c;高可用技术架构。 在哨兵 sentinel 机制中&#xff0c;可以解决 redis 高可用的问题&#xff0c;即当 master 故障后可以自动将 slave 提升为 master 从而可以保证 redis 服务的正常使用。 但是无法解…...

Spring Boot编程训练系统:数据管理与存储

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了编程训练系统的开发全过程。通过分析编程训练系统管理的不足&#xff0c;创建了一个计算机管理编程训练系统的方案。文章介绍了编程训练系统的系统分析部分&…...

报告解读 | 创意经济2024:如何在变革中抢占先机?

在科技飞速发展的今天&#xff0c;创意行业正面临前所未有的变化。《Skillshare Trendshare 2024》报告揭示了多项趋势&#xff0c;为创意人士提供了深刻的洞察和实用的建议。本文将为您详细解读这些趋势&#xff0c;助您在创意领域脱颖而出。 1. 人工智能&#xff08;AI&…...

Flume1.9.0自定义Sink组件将数据发送至Mysql

需求 1、将Flume采集到的日志数据也同步保存到MySQL中一份&#xff0c;但是Flume目前不支持直接向MySQL中写数据&#xff0c;所以需要用到自定义Sink&#xff0c;自定义一个MysqlSink。 2、日志数据默认在Linux本地的/data/log/user.log日志文件中&#xff0c;使用Flume采集到…...

如何在 Ubuntu 24.04 上安装和配置 Fail2ban ?

确保你的 Ubuntu 24.04 服务器的安全是至关重要的&#xff0c;特别是如果它暴露在互联网上。一个常见的威胁是未经授权的访问尝试&#xff0c;特别是通过 SSH。Fail2ban 是一个强大的工具&#xff0c;可以通过自动阻止可疑活动来帮助保护您的服务器。 在本指南中&#xff0c;我…...

uniapp如何i18n国际化

1、正常情况下项目在代码生成的时候就已经有i18n的相关依赖&#xff0c;如果没有可以自行使用如下命令下载&#xff1a; npm install vue-i18n --save 2、创建相关文件 en文件下&#xff1a; zh文件下&#xff1a; index文件下&#xff1a; 3、在main.js中注册&#xff1a…...

C++__day1

1、思维导图 2、如果登录失败&#xff0c;提示用户登录失败信息&#xff0c;并且提示错误几次&#xff0c;且重新输入&#xff1b;如果输入错误三次&#xff0c;则退出系统 #include <iostream> using namespace std;int main() {string id , pswd;string user"admi…...

Emacs进阶之插入时间信息(一百六十三)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…...

Java线程池:ThreadPoolExecutor原理解析

一、线程池的基本概念 1.1 线程池的定义 线程池是一组预先创建的线程&#xff0c;这些线程可以重复使用来执行多个任务&#xff0c;避免了频繁创建和销毁线程的开销。线程池的核心思想是通过复用一组工作线程&#xff0c;来处理大量的并发任务&#xff0c;减少系统资源消耗&a…...

二叉树、哈夫曼报文大全

1、泛型链树 #include <iostream> #include<Windows.h> #include<string> #include<stack> #include<queue> using namespace std; void menu() {cout << "**********" << endl;cout << "-1.添加" <&…...

NotePad++中安装XML Tools插件

一、概述 作为开发人员&#xff0c;日常开发中大部的数据是标准的json格式&#xff0c;但是对于一些古老的应用&#xff0c;例如webservice接口&#xff0c;由于其响应结果是xml&#xff0c;那么我们拿到xml格式的数据后&#xff0c;常常会对其进行格式化&#xff0c;以便阅读。…...

聊天服务器(7)数据模块

目录 Mysql数据库代码封装头文件与源文件 Mysql数据库代码封装 业务层代码不要直接写数据库&#xff0c;因为业务层和数据层的代码逻辑也想完全区分开。万一不想存储mysql&#xff0c;想存redis的话&#xff0c;就要改动大量业务代码。解耦合就是改起来很方便。 首先需要安装m…...

VS2022编译32位OpenCV

使用环境 Visual Studio 2022 OpenCV: 4.7.0 cmake: 3.30.2一、使用CMake工具生成vs2022的openCV工程解决方案 打开cmake&#xff0c;选择opencv的源代码目录&#xff0c;创建一个文件夹&#xff0c;作为VS工程文件的生成目录 点击configure构建项目&#xff0c;弹出构建设置…...

WP网站如何增加文章/页面的自定义模板

通过Wordpress我们后台在发布文章或者页面的时候其实可以看到有些主题 他有选择使用的页面模板&#xff0c;可以自定义模板&#xff0c;但是有些主题却没有选择主题这个功能&#xff0c;那这个自定义模板的功能是如何实现的呢&#xff1f;以下分两种情况&#xff1a;Page页面和…...

【Linux网络编程】简单的UDP网络程序

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信编程技术&#xff0c;它允许两个或多个程序在网络上相互通信&…...

LabVIEW中坐标排序与旋转 参见附件snippet程序

LabVIEW中坐标排序与旋转 参见附件snippet程序LabVIEW中坐标排序与旋转 参见附件snippet程序 - 北京瀚文网星科技有限公司 在LabVIEW中处理坐标排序的过程&#xff0c;尤其是按顺时针或逆时针排列坐标点&#xff0c;常见的应用包括处理几何形状、路径规划等任务。下面我将为您…...

SPIRiT-Diffusion:基于自一致性驱动的加速MRI扩散模型|文献速递-基于深度学习的病灶分割与数据超分辨率

Title 题目 SPIRiT-Diffusion: Self-Consistency Driven Diffusion Model for Accelerated MRI SPIRiT-Diffusion&#xff1a;基于自一致性驱动的加速MRI扩散模型 01 文献速递介绍 磁共振成像&#xff08;MRI&#xff09; 在临床和研究领域被广泛应用。然而&#xff0c;其…...

jwt封装教程

使用步骤&#xff1a; 1.导入jwt相关依赖 2.创建jwt工具类方便使用 3.通过工具类提供的方法进行生成jwt 4.通过工具类解析jwt令牌获取封装的数据 5.设定拦截器&#xff0c;每次执行请求的时候都需要验证token 6.注册拦截器 1.jwt依赖 <dependency><groupId>io.json…...

postman变量和脚本功能介绍

1、基本概念——global、collection、environment 在postman中&#xff0c;为了更好的管理各类变量、测试环境以及脚本等&#xff0c;创建了一些概念&#xff0c;包括&#xff1a;globals、collection、environment。其实在postman中&#xff0c;最上层还有一个Workspaces的概…...

【AI新领域应用】AlphaFold 2,原子级别精度的蛋白质3D结构预测,李沐论文精读(2021Nature封面,2024诺贝尔奖)

文章目录 AlphaFold 2 —— 原子级别精度的蛋白质3D结构预测背景&#xff08;2024诺奖与AI学习资料&#xff09;1、摘要、导论、写作技巧2、方案&#xff1a;模型&#xff0c;编码器&#xff0c;解码器3、实验&#xff1a;数据集&#xff0c;训练&#xff0c;结果 AlphaFold 2 …...

Figma汉化:提升设计效率,降低沟通成本

在UI设计领域&#xff0c;Figma因其强大的功能而广受欢迎&#xff0c;但全英文界面对于国内设计师来说是一个不小的挑战。幸运的是&#xff0c;通过Figma汉化插件&#xff0c;我们可以克服语言障碍。以下是两种获取和安装Figma汉化插件的方法&#xff0c;旨在帮助国内的UI设计师…...

前端知识点---this的用法 , this动态绑定(Javascript)

文章目录 this动态绑定 , this的用法01. 全局作用域下的 this02. 函数中的 this2.1 普通函数调用2.2 构造函数调用2.3 箭头函数中的 this 03对象方法调用04. 事件处理中的 this05. 动态绑定的方式5.1 call 方法5.2 apply 方法5.3 bind 方法 06类中的 this07. 总结 this动态绑定…...

web——upload-labs——第五关——大小写绕过绕过

先上传一个 先尝试直接上传一个普通的一句话木马 不行 可以看到&#xff0c;.htaccess文件也被过滤了&#xff0c;我们来查看一下源码 第五关的源码没有把字符强制转换为小写的语句&#xff1a; $file_ext strtolower($file_ext); //转换为小写 直接通过Burpsuite抓包修改文…...

String类型

String类 在Java中&#xff0c;String 类是一个非常核心且常用的类&#xff0c;它用于表示文本值&#xff0c;即字符序列或者说字符串。 1.1 类的声明 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence 解释&#xff1a…...

Ubuntu24.04安装和配置Redis7.4

Ubuntu24.04安装和配置Redis7.4 #切换到root用户 sudo su -#更新源 apt update apt upgrade#安装 lsb-release、curl 和 gpg &#xff0c;以便能够添加 Redis 仓库 apt install lsb-release curl gpg#导入 Redis 的 GPG 密钥 curl -fsSL https://packages.redis.io/gpg | gpg …...

权限相关知识

1.Linux权限的概念 在说Linux权限的概念之前我来问大家一个问题&#xff0c;你们觉得什么是权限&#xff1f; 权限平时的体现呢&#xff0c;就比如不是校长的亲戚就不能逛办公室&#xff0c;没充会员的爱奇艺看不了VIP影视剧&#xff0c;没成会员的的蛋糕店拿不到会员价等等等…...

【时间之外】IT人求职和创业应知【37】-AIGC私有化

目录 新闻一&#xff1a;2024智媒体50人成都会议暨每经20周年财经媒体峰会召开 新闻二&#xff1a;全球机器学习技术大会在北京召开 新闻三&#xff1a;区块链技术在金融领域的应用取得新突破 不知不觉的坚持了1个月&#xff0c;按照心理学概念&#xff0c;还要坚持2个月&am…...

深入理解 source 和 sh、bash 的区别

1 引言 在日常使用 Linux 的过程中&#xff0c;脚本的执行是不可避免的需求之一&#xff0c;而 source、sh、bash 等命令则是执行脚本的常用方式。尽管这些命令都能运行脚本&#xff0c;但它们之间的执行方式和效果却有着显著的区别。这些区别可能会影响到脚本的环境变量、工作…...

k8clone二进制工具迁移k8s中的无状态应用

1 概述 k8clone是一个简便的Kubernetes元数据克隆工具&#xff0c;它可以将Kubernetes元数据&#xff08;对象&#xff09;保存为本地压缩包&#xff0c;在恢复时可将这些元数据恢复到目标集群中&#xff08;已存在的资源不会被覆盖&#xff09;。它不依赖远程存储&#xff0c…...

VPI photonics的一些使用经验(测相位 快速搜索)持续更新

1.使用FuncSinEl模块的注意事项&#xff1a; 2.在VPI player&#xff08;示波器&#xff09;测电信号相位时候&#xff0c;可以使用正则表达式&#xff0c;快速搜索。 比如我要搜索以30开头的数据&#xff0c;输入&#xff1a; ^30 其他的正则表达式不适用&#xff0c;比如以…...