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

Redis7.2.3集群安装,新增节点,删除节点,分配哈希槽,常见问题

概念:

【Redis】高可用之三:集群(cluster) - 知乎

实操:

Redis集群三种模式

主从模式

    优势:

  • 主节点可读可写

  • 从节点只能读(从节点从主节点同步数据)

    缺点:

  • 当主节点挂掉时,此时只提供读服务,没有写入能力,需要人工切换从节点为主节点

哨兵模式

    优势:

  • 基于主从模式基础上,增加哨兵节点实现自动故障转移,解决了主从模式的缺点
  • 当主节点故障时,哨兵节点会通过Raft算法将故障主节点下的从节点选举为主节点

    缺点:

  • 由于始终只有一个主节点,所以写操作性能受限

  • 数据存储能力受单机限制

集群模式

    优势:

  • 基于哨兵模式基础上,增加数据分片提高存储能力与写操作性能,解决了哨兵模式的缺点
  • 引入哈希槽概念,将16384 个哈希槽( 编号0-16383),分配给每个主节点集群的每个节点负责一部分哈希槽

  • 多个主节点和从节点提高读写性能

    缺点:

  • 主节点下不能有太多从节点,会影响性能

安装版本

  • 虚拟机VMware Fusion13.5.0免费版
  • CentOS7
  • Redis7.2.3

集群安装

  • 在虚拟机下安装2台个CentOS7的系统,可参考:在MacOS上使用VMware虚拟机安装CentOS 7操作系统-CSDN博客
  • 用2台机器通过伪节点的方式安装6个redis节点,每个机器运行3个redis节点(同一机器下每个节点端口不同)
  • 192.168.79.135(hadoop001)占用端口5001,5002,5003
  • 192.168.79.136(hadoop002)占用端口5001,5002,5003
  • Redis源码安装包下载并解压(两个机器都需操作)
mkdir /usr/local/redis
cd /usr/local/redis
wget http://download.redis.io/releases/redis-7.2.3.tar.gz
tar -xzvf redis-7.2.3.tar.gz
  • 需要c语言环境,安装gcc(两个机器都需操作)
yum install gcc-c++
  •  编译源码,安装redis执行程序(两个机器都需操作)
cd /usr/local/redis/redis-7.2.3
make
make install PREFIX=/usr/local/redis/redis-cluster
  • 创建各Redis节点目录,文件夹用端口命名方便区分(两个机器都需操作)
cd /usr/local/redis/
mkdir redis-cluster
cd /usr/local/redis/redis-cluster
mkdir redis-5001
mkdir redis-5002
mkdir redis-5003
  • 拷贝配置文件redis.conf到每个节点bin目录并修改为相应的文件名(两个机器都需操作)
cp /usr/local/redis/redis-7.2.3/redis.conf /usr/local/redis/redis-cluster/bin/redis-5001.conf
cp /usr/local/redis/redis-7.2.3/redis.conf /usr/local/redis/redis-cluster/bin/redis-5002.conf
cp /usr/local/redis/redis-7.2.3/redis.conf /usr/local/redis/redis-cluster/bin/redis-5003.conf
  • 修改每个节点文件目录下的redis.conf配置文件(例如:redis-5001.conf文件),修改为如下(两个机器都需操作)
#建议 bind 0.0.0.0
#bind绑定本机ip,则只能本机ip访问
#学习阶段建议注释bind完全放开访问限制(比如三方客户端也想访问)
#bind 0.0.0.0#关闭保护模式
protected-mode no#修改对应的端口,每个机器的节点端口都不同,本文分别占用5001,5002,5003
#可以参考文件目录文件夹名称,例如redis-5001目录下的在此为5001
port 5001#启动集群模式
cluster-enabled yes#集群节点信息文件,这里500x最好和port对应上
#可以参考文件目录文件夹名称,例如redis-5001目录下的在此为nodes-5001.conf
cluster-config-file nodes-5001.conf#节点离线的超时时间
cluster-node-timeout 5000#如果要设置密码需要增加如下配置:
#设置redis访问密码
requirepass 123456#设置集群节点间访问密码,跟上面一致,理论上可以不一致,但为了降低维护成本直接设置为一致比较方便
#当集群中从节点访问主节点时需要此密码,所以需要与requirepass
masterauth 123456#修改启动进程号存储位置
#可以参考文件目录文件夹名称,例如redis-5001目录下的在此为redis_5001.pid
pidfile /var/run/redis_5001.pid#指定数据文件存放位置,必须要指定不同的目录位置,不然会丢失数据
#可以参考文件目录文件夹名称,例如redis-5001目录
dir /usr/local/redis/redis-cluster/redis-5001#修改为后台启动
daemonize yes#启动AOF文件
appendonly yes
  • 启动所有节点(两个机器都需操作)
cd /usr/local/redis/redis-cluster/bin
./redis-server redis-5001.conf
./redis-server redis-5002.conf
./redis-server redis-5003.conf
  • 各节点启动完成后,此时还没有建立集群关系,都是独立运行状态,需要建立集群关系
  • 建立集群关系前为了方便维护,修改各个机器的hosts建立ip映射(两个机器都需操作)
echo "192.168.79.135 hadoop001" >> /etc/hosts
echo "192.168.79.136 hadoop002" >> /etc/hosts
  • 建立集群关系,执行如下命令(两个机器都需操作)
cd /usr/local/redis/redis-cluster/bin
./redis-cli -a 123456 --cluster create --cluster-replicas 1 hadoop001:5001 hadoop001:5002 hadoop001:5003 hadoop002:5001 hadoop002:5002 hadoop002:5003

        --replicas 1:代表给每个主机点下配置一个从节点

  • 然后会显示各个节点之间的建立的主从关系,如果觉得没问题 输入yes回车即可

  • yes回车过后显示如下,则代表成功

新增集群节点

  • 首先需要新增两个节点,所以在两个机器都需要操作,新建redis-5004节点相关文件,修改相关端口值为5004,并启动5004节点
# 创建5004节点目录
cd /usr/local/redis/redis-cluster/
mkdir redis-5004# 复制一份redis.conf文件
cp /usr/local/redis/redis-cluster/bin/redis-5001.conf  /usr/local/redis/redis-cluster/bin/redis-5004.conf# 修改5004节点的redis.conf文件,将端口相关的值从5003修改为5004
# -------------------------------
# port 5004
# cluster-config-file nodes-5004.conf
# pidfile /var/run/redis_5004.pid
# dir /usr/local/redis/redis-cluster/redis-5004
# -------------------------------
cd /usr/local/redis/redis-cluster/bin
vi redis-5004.conf# 启动新节点5004
cd /usr/local/redis/redis-cluster/bin
./redis-server redis-5004.conf

新增主节点

  • 将新节点添加到集群中成为主节点(新节点刚启动后,还处于独立运行状态)
# 第一个ip端口 127.0.0.1:5004 是要新增的节点
# 第二个IP端口 127.0.0.1:5001 是现有集群中的一个节点,-a 123456是需要密码
cd /usr/local/redis/redis-cluster/bin
./redis-cli --cluster add-node hadoop001:5004 hadoop001:5001 -a 123456# 查看集群节点状态
cd /usr/local/redis/redis-cluster/bin
# 登录一个节点
./redis-cli -h 127.0.0.1 -p 5001 -a 123456 -c
  • 然后执行cluster nodes查到节点状态如下图,但此时新节点的槽为0,后续需要根据需要从其它主节点迁移槽过来

新增从节点

  • 将新节点添加到集群中成为从节点(新节点刚启动后,还处于独立运行状态)
# 第一个ip端口 hadoop002:5004 是要新增的从节点ip端口
# 第二个IP端口 hadoop001:5004 是上一步新增的主节点ip端口,-a 123456是需要密码
# 3a20354e215cbd9c282011383ad3d0486afe8aa4是主节点id,也就是此从节点要关联的主节点id
cd /usr/local/redis/redis-cluster/bin
./redis-cli --cluster add-node hadoop002:5004 hadoop001:5004 --cluster-slave --cluster-master-id "3a20354e215cbd9c282011383ad3d0486afe8aa4" -a 123456# 查看集群节点状态
cd /usr/local/redis/redis-cluster/bin
# 登录一个节点
./redis-cli -h 127.0.0.1 -p 5001 -a 123456 -c
  • 然后执行cluster nodes查到节点状态如下图,发现从节点添加成功

分配哈希槽(slot)

  • 分配哈希槽是从现有集群中的其它主节点迁移一部分哈希槽到新主节点
  • 分配哈希槽
# 分配哈希槽# 方法一
# 通过交互方式,可以指定多个源主节点,并根据输入的哈希槽迁移数量,自动从指定源头主节点均匀分配要迁出的哈希槽
# 127.0.0.1:5001 可以是集群中随便一个可以访问的节点,-a 123456是需要密码
cd /usr/local/redis/redis-cluster/bin
./redis-cli -a 123456 --cluster reshard 127.0.0.1:5001# 方法二
# 执行命令时直接指定迁移信息,省去了交互部分,直接yes即可
# --cluster-from 要迁出槽主节点id
# --cluster-to 要迁入槽主节点id
# --cluster-slots 要迁移的槽数量
# 执行后会提示 Do you want to proceed with the proposed reshard plan (yes/no)? 
# 输入yes即可
cd /usr/local/redis/redis-cluster/bin
./redis-cli -a 123456 --cluster reshard 127.0.0.1:5001 --cluster-from bc14f675c94efc6009569d5da7c43b15be672fa0 --cluster-to a1a94648f505b665bfa7ca907cf4068bbd508e95 --cluster-slots 1365
  • 具体执行过程中需要根据提示输入相应信息,如下图(方式一 样例)

  • 需要注意,如果执行操作是将主节点迁出所有哈希槽给目标主节点,此时迁出哈希槽为0的主节点和此主节点下从节点都会变更为目标主节点的从节点
  • (***慎用***)还有一个命令是rebalance是可以重新均匀分配全部哈希槽,比如当集群删除节点缩容后,想重新均匀分配哈希槽,可能会长时间阻塞客户端请求,所以尽量不要使用,如果非得迁移哈希槽,尽可能指定数量和迁出迁入节点
# 自动均匀分配哈希槽
cd /usr/local/redis/redis-cluster/bin
./redis-cli -a 123456 --cluster rebalance hadoop001:5002
  • 执行效果如下图

  删除节点

        删除节点时操作顺序,迁移要删除的主节点哈希槽->删除从节点->删除主节点

  • 首先需要先将要删除的主节点哈希槽迁移至其它主节点,迁移哈希槽参考,上面的分配哈希槽内容
  • 然后就是先删除从节点再删除主节点既可
# 删除从节点
# hadoop002:5004 是集群中要删除的从节点IP端口,-a 123456是需要密码
# 1f3a8532d72c1bea6f1b45ea74adc97d28843b95 是从节点的节点id
cd /usr/local/redis/redis-cluster/bin
./redis-cli --cluster del-node hadoop002:5004 1f3a8532d72c1bea6f1b45ea74adc97d28843b95 -a 123456# 删除主节点
# hadoop001:5004 是集群中要删除的主节点IP端口,-a 123456是需要密码
# 3a20354e215cbd9c282011383ad3d0486afe8aa4 是主节点的节点id
cd /usr/local/redis/redis-cluster/rbin
./redis-cli --cluster del-node hadoop001:5004 3a20354e215cbd9c282011383ad3d0486afe8aa4 -a 123456
  • 删除节点执行效果如下图

  •  如果节点还存在哈希槽的情况下,删除节点会报错

测试

  • 集群故障测试

  • 通过redis-cli连接redis并插入数据测试

  • 模拟集群里的一个主节点故障,通过kill -9杀掉了192.168.79.136下的5001节点

  • Java代码连接测试

        Java通过Lettuce访问Redis主从,哨兵,集群-CSDN博客

常见问题

  • 如果在没安装gcc的情况下执行redis源码的编译安装(make install)报错,之后安装gcc以后再执行编译安装(make install)会报 jemalloc/jemalloc.h: No such file or directory 错误,需执行make distclean 清理之前编译出错的缓存,再编译安装即可
  • 在虚拟机下建议降系统都配置为静态ip,防止每次重启ip可能会变,导致突然访问不了机器,参考:MacOS下VMware Fusion配置静态IP-CSDN博客
  • 执行创建集群命令后最后一直处于 Waiting for the cluster to join.. 状态,则说明节点之间有无法通信的情况,检查节点端口以及集群总线端口是否打开,依次检查方式,检查网络ping ip,检查端口nc -zv ip 端口,如果无法访问确定访问ip端口是否正确和防火墙是否打开
  • 在服务器防火墙中需要打开每个redis节点的端口以及集群总线端口(例如:节点端口5001,则集群总线端口默认为+10000也就是15001),参考:linux防火墙查看状态firewall、iptable - 简书
  • 需要注意 redis.config文件中的bind IP 配置是否正确,学习阶段可以配置 bind 0.0.0.0 为完全放开
  • 各节点下的redis.config的masterauth(主节点访问密码)和requirepass(访问密码)都要设置,最好为一致方便维护,因为slave的masterauth和master的requirepass是对应的,容易弄错后发现slave无法从master同步数据,甚至在master节点挂掉时,slave节点无法升级为master,导致无法到达故障转移的目的(redis集群某主节点宕机,其从节点未自动接管(故障转移未生效)问题解决_zoeezym的博客-CSDN博客)
  • 创建集群时报:[ERR] Node xxx is not empty. Either the node already knows other nodes (check with CLUSTER NODES)... ,可能是之前创建集群失败导致残留文件,清除所有节点目录(目录以各节点的redis.config配置的dir 路径为准)的 appendonlydir,dumm.rdb,node.conf 再重新执行

参考

redis集群搭建 - 知乎

Redis集群环境的搭建 - 知乎

Redis集群之主从、哨兵、分片集群,SpringBoot整合Redis集群_小道仙97的博客-CSDN博客

Redis三种集群模式介绍及搭建_redis 集群_0307.quē的博客-CSDN博客

笔记(十):redis集群_redis集群从节点读取数据吗-CSDN博客

redis cluster集群常见错误问题记录_redis集群模式常见问题_金麟十三少的博客-CSDN博客

Redis-Cluster集群操作--添加节点、删除节点_redis集群添加节点-CSDN博客

redis集群缩容

Redis-集群搭建(cluster集群、集群创建、节点配置、节点添加、节点删除、槽位分配)_redis cli连接集群节点_JolyouLu的博客-CSDN博客

相关文章:

Redis7.2.3集群安装,新增节点,删除节点,分配哈希槽,常见问题

概念: 【Redis】高可用之三:集群(cluster) - 知乎 实操: Redis集群三种模式 主从模式 优势: 主节点可读可写 从节点只能读(从节点从主节点同步数据) 缺点: 当主节点…...

并行计算机系统结构基础

一、并行计算机系统结构 1.并行性 并行性:计算机系统在同一时刻或者同一时间间隔内 进行多种运算或操作 并行性包括两方面的含义 同时性:两个或两个以上的事件在同一时刻发生并发性:两个或两个以上的事件在同一时间间隔 内发生 从处理数…...

Ubuntu开启永久开启串口权限方法

sudo gedit /etc/udev/rules.d/70-ttyusb.rules//不存在就创建 在该文件中添加如下一行 KERNEL“ttyUSB*”, MODE“0777” 重启系统 sudo reboot...

zTree设置默认选中节点(当前组织默认选中)

/* 节点点击事件 */function onClick(e, treeId, treeNode) {var zTree $.fn.zTree.getZTreeObj("treeDemo"),nodes zTree.getSelectedNodes(),v "";//存储组织名称idd"";//存储组织IDnodes.sort(function compare(a,b){return a.id-b.id;});…...

结合 Django 和 Vue.js 打造现代 Web 应用

概要 在 Web 开发的世界里,Django 和 Vue.js 分别是后端和前端两个非常流行的框架。Django 以其强大的后端能力、快速开发以及安全性而著称,而 Vue.js 因其简洁、灵活和易于上手在前端开发领域广受欢迎。 本篇文章将详细介绍如何将 Django 与 Vue.js 结…...

【Linux网络】ssh服务与配置,实现安全的密钥对免密登录

目录 一、SSH基础 1、什么是ssh服务器 2、对比一下ssh协议与telnet协议 3、常见的底层为ssh协议的软件: 4、拓展 二、SSH软件学习 1、ssh服务软件学习 2、sshd公钥传输的原理: 3、ssh命令学习: 4、学习解读sshd服务配置文件&#x…...

自建ES7.10集群,使用OSS快照恢复数据测试

一、云上集群创建仓库 前置条件 创建云OSS bucket lcsc-es-snapshot,并获取到access_key_id,secret_access_key信息 授予oss bucket lcsc-es-snapshot相关方完全控制权限 创建一个名称为my_backup的仓库。 云上集群创建仓库。PUT _snapshot/my_backup/ {"type": &qu…...

电源线虚接,导致信号线发烫

音频板的信号是经过隔直电容接到音频板的。...

【23真题】难!985难度第一梯队!

今天分享的是23年华南理工大学811的信号与系统试题及解析 本套试卷难度分析:22年华南理工大学811考研真题,我也发布过,若有需要,戳这里自取!本套试题难度中等偏上,只有十道大题,考察大家的综合…...

计算机网络———ipv6简解

文章目录 1.前言:2. ipv6简单分析:2.1.地址长度对比2.2. ipv6包头分析2.3. ipv6地址的压缩表示:2.3. NDP:2.4. ipv6地址动态分配: 1.前言: 因特网地址分配组织)宣布将其最2011年2月3日,IANA (In…...

SQL之开窗函数

文章目录 主要内容一.介绍1.特点2.作用 二.语法及示例1.语法代码如下(示例): 2.示例代码如下(示例):代码如下(示例):代码如下(示例): 总结 主要内容 SQL的开窗函数是SQL语言中非常强…...

OpenAI与微软合作,构建 ChatGPT 5 模型;10天准确天气预报

🦉 AI新闻 🚀 OpenAI与微软合作,构建 ChatGPT 5 模型,下一代人工智能或拥有超级智能 摘要:OpenAI首席执行官 Sam Altman 在接受采访时表示,OpenAI正在与微软合作构建下一代人工智能模型 ChatGPT 5&#x…...

git简明指南

目录 安装 创建新仓库 检出仓库 工作流 安装 下载 git OSX 版 下载 git Windows 版 下载 git Linux 版 创建新仓库 创建新文件夹,打开,然后执行 git init 以创建新的 git 仓库。 检出仓库 执行如下命令以创建一个本地仓库的克隆版本&…...

软件测试面试-如何定位线上出现bug

其实无论是线上还是在测试出现bug,我们核心的还是要定位出bug出现的原因。 定位出bug的步骤: 1,如果是必现的bug,尽可能的复现出问题,找出引发问题的操作步骤。很多时候,一个bug的产生,很多时…...

5、鸿蒙项目远程调试

一、注册华为账号, 如果是华为手机,并注册了账号可能跳过此步骤,如果使用邮箱注册,此邮箱一定是要正确的邮箱,此处需要使用邮箱获取验证码 注册地址:‎ 1、进入注册页面,输入手机号等信息后点…...

什么是原生IP与广播IP?如何区分?为什么需要用原生IP?

在代理IP中,我们常常听到原生IP与广播IP,二者有何区别?如何区分呢?下面为大家详细讲解。 一、什么是原生IP 原生IP地址是互联网服务提供商(ISP)直接分配给用户的真实IP地址,无需代理或转发。此…...

下载文件时的文件名中文乱码问题,文件名丢失

涉及到的java代码如下,下载的时候文件名为中文 package com.example.springboot.service.impl;import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringU…...

ios swift sqlite3 简单使用

一.创建Person类 import UIKitclass Person: NSObject {var name:String? nilvar sex:String? nilvar age:String? niloverride func setValue(_ value: Any?, forUndefinedKey key: String) {}} 二.在使用的地方导入sqlite.3头文件,例如方法都在viewcontr…...

长古诗(一)

春江花月夜 【作者】张若虚 【朝代】 春江潮水连海平,海上明月共潮生。 滟滟随波千万里,何处春江无月明! 江流宛转绕芳甸,月照花林皆似霰; 空里流霜不觉飞,汀上白沙看不见。 江天一色无纤尘&#x…...

VC++ 预编译头学习

头文件的作用,就是把自己的 所有内容直接“粘贴”到相应的 #include 语句处。 编译器在编译你的程序的时候,所做 的第一件事,也就是展开所有的 #include 语句和 #define 语句。 头文件的出现,给书写程序带来了很大方便。 到了 Windows 时代后,慢慢 就呈现出一些问题。 几…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage)&#xff1a…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

从实验室到产业:IndexTTS 在六大核心场景的落地实践

一、内容创作&#xff1a;重构数字内容生产范式 在短视频创作领域&#xff0c;IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色&#xff0c;生成的 “各位吴彦祖们大家好” 语音相似度达 97%&#xff0c;单条视频播放量突破百万…...