超详细,多图文介绍redis集群方式并搭建redis伪集群

超多图文,对新手友好度极好。敲命令的过程中,难免会敲错,但为了截好一张合适的图,一旦出现一点问题,为了好的演示效果,就要从头开始敲。且看且珍惜。

再认识redis集群前,若想先知道redis单机版的可查看,springboot整合redis。好了,下面开始了。

每个redis实例可称为一个节点,安装redis并以默认端口启动是节点,不关闭,以另一个端口启动,是一个新节点。在另一台机器安装redis并启动,也是一个新节点。

节点分为主节点 (master) ,从节点 (slave) ,数据从主节点向多个从节点上同步 。

redis3.0开始支持集群,redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点是相互通信的(PING-PONG机制)。

@[toc]

一,集群方式

1,主从模式

一个master可以拥有多个slave,但是一个slave只能对应一个master。这样,当某个slave挂了不影响其他slave的读和master的读和写,重新启动后会,数据会从master上同步过来。

在主从模式下,因为只有一个主节点可以写,而主,从节点都可以读,所以通常主节点负责写,从节点负责读。

redis主从模式_lgx211

但是,当唯一的master挂了以后,虽然这样并不影响slave的读,但redis也不再提供写服务,需要将master重启后,redis才重新对外提供写服务。

2,Sentinel模式

sentinel模式是建立在主从模式的基础上,避免单个master挂了以后,redis不能提供写服务。因为从节点上备份了主节点的所有数据,那么当master挂了以后,sentinel会在slave中选择一个做为master,并修改它们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master,比如之前配置的密码。此时,客户端就不是直接连接Redis,而是连接sentinel的ip和port,由sentinel来提供具体Redis服务。


Sentinel模式_lgx211

把之前挂了的master重新启动后,它将不再是master而是做为slave接收新的master的同步数据。

3,Cluster模式

Cluster模式是建立在Sentinel模式的基础上的,当数据多到需要动态扩容的时候,前面两种就不行了,需要对数据进行分片,根据一定的规则把redis数据分配到多台机器。


Cluster模式_lgx211

该模式就支持动态扩容,可以在线增加或删除节点,而且客户端可以连接任何一个主节点进行读写,不过此时的从节点仅仅只是备份的作用。至于为何能做到动态扩容,主要是因为Redis 集群没有使用一致性hash, 而是使用的哈希槽。Redis 集群会有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,而集群的每个节点负责一部分hash槽。

那么这样就很容易添加或者删除节点, 比如如果我想新添加个新节点, 我只需要从已有的节点中得部分槽到过来;如果我想移除某个节点,就只需要将该节点的槽移到其它节点上,然后将没有任何槽的A节点从集群中移除即可。由于从一个节点将哈希槽移动到另一个节点并不会停止服务,所以无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。

需要注意的是,该模式下不支持同时处理多个key(如MSET/MGET),因为redis需要把key均匀分布在各个节点上,并发量很高的情况下同时创建key-value会降低性能并导致不可预测的行为。

二,搭建集群

这里就直接搭建较为复杂的Cluster模式集群,也是企业级开发过程中使用最多的。

1,准备工作

Linux可以连接外网,有wget(用于在线下载redis),系统安装好gcc环境,(不然编译redis会报错)。

2,下载、解压、移到指定目录,编译Redis
wget http://download.redis.io/releases/redis-5.0.4.tar.gz
tar xzf redis-5.0.4.tar.gz
mv redis-5.0.4  /usr/local/redis
cd /usr/local/redis/redis-5.0.4
make
make install

安装完成,在/usr/local/bin/目录下就会看见

在这里插入图片描述

3,建redis各节点目录
mkdir /usr/local/redis-cluster
cd /usr/local/redis-cluster
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
mkdir bin

最终目录结构如下


在这里插入图片描述
4,redis集群的运行脚本

把之前安装好的redis的src目录下运行脚本拷贝过来,每个redis版本的运行脚本有细微差异,请以你自己的版本为准,就是下图绿色部分。

cd /usr/local/redis/redis-5.0.4/src
cp  mkreleasehdr.sh redis-benchmark redis-check-aof  redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis-cluster/bin
在这里插入图片描述

最终效果如下图所示


在这里插入图片描述
5,批量复制redis实例
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9001
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9002
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9003
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9004
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9005
cp /usr/local/redis/redis-5.0.4/* /usr/local/redis-cluster/9006

最终效果图如下所示


在这里插入图片描述
6,逐个修改redis配置

以 9001 的为例子,其余五个类似。

cd /usr/local/redis-cluster/9001
vi redis.conf

在这里插入图片描述

打开配置文件,按 i 进入编辑模式,按照出现的顺序,主要需要修改的地方是

  • bind 192.168.119.128(绑定当前电脑的 IP,这是我虚拟机的,你绑定成你虚拟机的ip)
  • port 9001(因为我这是一台机器运行6个redis实例,所以要启动6个实例,得为它配置6个不同的端口,若你是6台机器,默认的端口就行,无需更改)
  • daemonize yes(这是设置是否后台启动 Redis,默认 no ,但是生产环境肯定要默认就开启 Redis,所以这里设置为 yes 。)
  • pidfile /var/run/redis_9001.pid(_9001这个一定要和第一个配置的端口一样)
  • dir /usr/local/redis-cluster/9001/data/(数据文件存放位置,我换成指定目录下存放)
  • appendonly yes
  • cluster-enabled yes(启动集群模式)
  • cluster-config-file nodes9001.conf(9001这个也要和之前的端口对应)
  • cluster-node-timeout 15000(超时时间)
    在这里插入图片描述

    完成以上修改,Esc退出编辑模式,输入:wq 保存并退出。 类似同样的操作操作再来五次。

若是对redis的配置文件有兴趣,我在学习的过程中找到个详细的翻译版,可点击链接进去学习。

redis配置中文翻译

7,逐个启动redis节点
cd /usr/local/redis-cluster
/usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9002/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9003/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9004/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9005/redis.conf 
/usr/local/bin/redis-server /usr/local/redis-cluster/9006/redis.conf

运行效果如图所示


在这里插入图片描述

现在检查一下是否成功开启,如下图所示,都开启成功。

ps -el | grep redis
在这里插入图片描述
8,搭建集群

此时的节点虽然都启动成功了,但他们还不在一个集群里面,不能互相发现,测试会报错:(error) CLUSTERDOWN Hash slot not served

/usr/local/redis-cluster/bin/redis-cli -h 192.168.119.128 -p 9001
keys *
set name mafly

如下图所示


在这里插入图片描述

解决报错,如果你是redis5.0以前的,你需要安装集群所需的ruby相关依赖

yum install ruby
yum install rubygems
cd /usr/local/redis-cluster/
gem install redis

这步若安装报错,请查看Could not find a valid gem 'redis'

如果你是redis5.0及之后的,无需安装ruby依赖,redis安装目录里内置了集群命令行工具 redis-trib ,它是一个 Ruby 程序, 这个程序通过向实例发送特殊命令来完成创建新集群, 检查集群, 或者对集群进行重新分片工作。

redis-cli --cluster create 192.168.119.128:9001 192.168.119.128:9002 192.168.119.128:9003 192.168.119.128:9004 192.168.119.128:9005 192.168.119.128:9006 --cluster-replicas 1

--cluster-replicas 1 这个指的是从机的数量,表示我们希望为集群中的每个主节点创建一个从节点。

红色选框是给三个主节点分配的共16384个槽点。

黄色选框是主从节点的分配情况。

蓝色选框是各个节点的详情。


在这里插入图片描述
9,测试

现在通过客户端命令连接上,通过集群命令看一下状态和节点信息等

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9001
cluster info
cluster nodes

效果图如下,集群搭建成功。


在这里插入图片描述

现在往9001这个主节点写入一条信息,我们可以在9002这个主节点取到信息,集群间各个节点可以通信。

现在往9001这个主节点写入一条信息,我们可以在9002这个主节点取到信息,集群间各个节点可以通信。

 set name lgxget name
在这里插入图片描述

三,故障转移

1,故障转移机制详解
  1. 集群中的节点会向其它节点发送PING消息(该PING消息会带着当前集群和节点的信息),如果在规定时间内,没有收到对应的PONG消息,就把此节点标记为疑似下线。

  2. 当被分配了slot槽位的主节点中有超过一半的节点都认为此节点疑似下线(就是其它节点以更高的频次,更频繁的与该节点PING-PONG),那么该节点就真的下线。

  3. 其它节点收到某节点已经下线的广播后,把自己内部的集群维护信息也修改为该节点已事实下线。

  4. 节点资格审查:然后对从节点进行资格审查,每个从节点检查最后与主节点的断线时间,如果该值超过配置文件的设置,那么取消该从节点的资格。

  5. 准备选举时间:这里使用了延迟触发机制,主要是给那些延迟低的更高的优先级,延迟低的让它提前参与被选举,延迟高的让它靠后参与被选举。(延迟的高低是依据之前与主节点的最后断线时间确定的)

  6. 选举投票:当从节点获取选举资格后,会向其他带有slot槽位的主节点发起选举请求,由它们进行投票,优先级越高的从节点就越有可能成为主节点,当从节点获取的票数到达一定数值时(如集群内有N个主节点,那么只要有一个从节点获得了N/2+1的选票即认为胜出),就会替换成为主节点。

  7. 替换主节点:被选举出来的从节点会执行slaveof no one把自己的状态从slave变成master,然后执行clusterDelSlot操作撤销故障主节点负责的槽,并执行 clusterAddSlot把这些槽分配给自己,之后向集群广播自己的pong消息,通知集群内所有的节点,当前从节点已变为主节点。

  8. 接管相关操作:新的主节点接管了之前故障的主节点的槽信息,接收和处理与自己槽位相关的命令请求。

2,故障转移测试

这是之前集群中具体节点的情况,我简化成如下,可以向上回看图片中的集群信息。


原先集群_lgx211

这里关闭该9001端口的进程,即模拟该主节点挂掉。

 netstat -tunlp | grep 9001kill 15705
在这里插入图片描述

登录挂掉的redis节点,会被拒绝服务,通过还在正常运行的某个主节点进入,然后再次查看集群中的信息

/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9001/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9002cluster nodes
在这里插入图片描述

简而言之,就是之前的集群信息变成了如下所示


故障转移后集群_lgx211

现在,我重启刚才挂掉的主节点,重新查看集群内部的节点情况,具体情况如下图所示。

cd /usr/local/redis-cluster//usr/local/bin/redis-server /usr/local/redis-cluster/9001/redis.conf/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.128 -p 9002cluster nodes
在这里插入图片描述

简而言之,现在集群内的节点情况如下

恢复后集群_lgx211


喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

Hue Load Balance配置

个人博客地址:Hue Load Balance配置 | 一张假钞的真实世界 直接上配置: server {server_name 192.168.72.31;listen 8001;charset utf-8;proxy_connect_timeout 600s;proxy_read_timeout 600s;proxy_send_timeout 600s;location / {proxy_set_header H…

992. K 个不同整数的子数组

目录 一、题目二、思路2.1 解题思路2.2 代码尝试2.3 疑难问题 三、解法四、收获4.1 心得4.2 举一反三 一、题目 二、思路 2.1 解题思路 2.2 代码尝试 class Solution { public:int subarraysWithKDistinct(vector<int>& nums, int k) {//需要有数据结构来存储数组…

领域驱动设计:事件溯源架构简介

概述 事件溯源架构通常由3种应用设计模式组成,分别是:事件驱动(Event Driven),事件溯源(Event Source)、CQRS(读写分离)。这三种应用设计模式常见于领域驱动设计(DDD)中,但它们本身是一种应用设计的思想,不仅仅局限于DDD,每一种模式都可以单独拿出来使用。 E…

PT2035 TWS 蓝牙耳机双触控双输出 IC

1. 产品概述 PT2035 是一款支持入耳检测的蓝牙耳机专用触摸芯片&#xff0c;该芯片具有宽工作电压、低功耗、高抗 干扰能力的特性。 2. 主要特性 工作电压范围&#xff1a; 2.4~5.5V 待机电流约 2.5uAV DD3V/CMOD5nF 入耳有效&#xff0c;无触摸时工作电流约 8uAV DD3…

AI编程界的集大成者——通义灵码AI程序员

一、引言 随着软件行业的快速发展和技术的进步&#xff0c;人工智能&#xff08;AI&#xff09;正在成为软件开发领域的一个重要组成部分。近年来&#xff0c;越来越多的AI辅助工具被引入到开发流程中&#xff0c;旨在提高效率、减少错误并加速创新。在这样的背景下&#xff0…

Rocky Linux 8.5 6G内存 静默模式(没图形界面)安装Oracle 19C

Oracle19c 下载地址 Database Software Downloads | Oraclehttps://www.oracle.com/database/technologies/oracle-database-software-downloads.html#db_ee 目录 一、准备服务器 1、服务器可以克隆、自己装 2、修改主机名 3、重启 4、关闭selinux 5、关闭防火墙 5.1、…

另辟蹊径:多维度解析 STM32 微控制器

开篇&#xff1a;STM32 的广泛影响力 在嵌入式系统的广阔天地中&#xff0c;STM32 系列微控制器宛如一颗璀璨的明星&#xff0c;散发着耀眼的光芒。它凭借出色的性能、丰富的资源以及高性价比&#xff0c;在工业、医疗、消费电子等众多领域广泛应用&#xff0c;成为无数开发者…

DeepSeek 使用窍门与提示词写法指南

一、通用提示词技巧 窍门分类技巧说明示例提示词明确需求用“角色任务要求”明确目标作为健身教练&#xff0c;为30岁上班族设计一周减脂计划&#xff0c;需包含饮食和15分钟居家训练结构化提问分步骤、分模块提问第一步&#xff1a;列出Python爬虫必备的5个库&#xff1b;第二…

全监督、半监督、弱监督、无监督

全监督、半监督、弱监督、无监督 全监督学习&#xff08;Fully Supervised Learning&#xff09; 数据标注&#xff1a;使用的数据集包含大量的输入数据&#xff08;特征&#xff09;以及与之对应的准确标注信息&#xff08;标签&#xff09;。学习目标&#xff1a;通过学习输…

c#实现485协议

在C#中实现RS-485协议通信,需要结合串口(SerialPort)操作和硬件收发控制(如RTS信号切换)。以下是详细的步骤和示例代码: 1. RS-485通信原理 物理层:RS-485是差分信号标准,支持多点通信(半双工)。 收发控制:通过控制RTS(Request to Send)或DTR引脚切换发送/接收模式…

删除变慢问题

问题&#xff1a; 有一个场景&#xff0c;每天都会删除数据&#xff0c;SQL为delete from xxx where record_date < DATE_SUB(now(), INTERVAL ? DAY) limit 1000 &#xff0c;一直循环执行&#xff0c;当执行到最后一次满足条件的时候&#xff0c;就会很慢 原理分析 索引与…

lua基础语法学习

lua基础语法学习 文章目录 lua基础语法学习1. 基础2. 输入输出3. 分支结构与循环结构4. 函数5. 元表与元方法6. 面向对象 1. 基础 注释 --单行注释--[[ 多行注释 --]]标识符 标识符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上 0 个或多个字母&#xff0c;下划线&…

使用DeepSeek实现自动化编程:类的自动生成

目录 简述 1. 通过注释生成C类 1.1 模糊生成 1.2 把控细节&#xff0c;让结果更精准 1.3 让DeepSeek自动生成代码 2. 验证DeepSeek自动生成的代码 2.1 安装SQLite命令行工具 2.2 验证DeepSeek代码 3. 测试代码下载 简述 在现代软件开发中&#xff0c;自动化编程工具如…

【SpringBoot】数据访问技术spring Data、 JDBC、MyBatis、JSR-303校验

Spring Boot 数据访问技术及特性 目录标题 Spring Boot 数据访问技术及特性摘要1. 引言2. Spring Data架构与原理2.1 Spring Data概述2.2 Spring Data核心组件2.3 Spring Boot与Spring Data的集成机制 3. Spring Boot与JDBC的整合3.1 JDBC整合流程3.2 数据源自动配置3.3 JdbcTe…

【时序预测】深度时序预测算法的对比与核心创新点分析

时间序列预测是机器学习和深度学习领域的重要研究方向&#xff0c;广泛应用于金融、交通、能源、医疗等领域。近年来&#xff0c;随着深度学习技术的发展&#xff0c;各种基于深度学习的时间序列预测算法层出不穷。这些算法在模型架构、训练方式和应用场景上各有特色。本文将对…

JVM线程分析详解

java线程状态&#xff1a; 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。运行(RUNNABLE)&#xff1a;Java线程中将就绪&#xff08;ready&#xff09;和运行中&#xff08;running&#xff09;两种状态笼统的称为“运行”。 线程对象创建…

android智能指针android::sp使用介绍

android::sp 是 Android 中的智能指针&#xff08;Smart Pointer&#xff09;的实现&#xff0c;用于管理对象的生命周期&#xff0c;避免手动管理内存泄漏等问题。它是 Android libutils 库中重要的一部分&#xff0c;常用于管理继承自 android::RefBase 的对象。 与标准库中…

spring整合mybatis详细步骤

spring整合mybatis的全部过程(整合方式一 &#xff1a;简单版) 1.在pom.xml中导入mybatis相应的jar包&#xff1a; (2) < dependency > < groupId >org.mybatis</ groupId > < artifactId >mybatis</ artifactId > < version >3.5.3&…

2025年Linux主力系统选择指南:基于最新生态的深度解析(附2025年发行版对比速查表)

Linux发行版生态在2025年持续演进&#xff0c;既有经典系统的迭代升级&#xff0c;也有新兴项目的崛起。本文结合最新行业动态&#xff0c;从个人用户到企业场景&#xff0c;梳理主力系统选择策略&#xff0c;助你找到最适合的Linux发行版。 一、新手友好型&#xff1a;平滑过渡…

ai-2、机器学习之线性回归

机器学习之线性回归 1、机器学习2、线性回归2.1、梯度下降法 3、python下调用scikit-learn 1、机器学习 2、线性回归 ####所以y可以当成我们需要的结果&#xff0c;根据公式可以求的y一撇的值更小&#xff0c;所以更接近需要的结果&#xff0c;所以y一撇拟合性更好 2.1、梯度下…