首页 > 数据库 >Redis中的集群(一)

Redis中的集群(一)

时间:2024-04-08 23:35:30浏览次数:19  
标签:127.0 0.1 Redis CLUSTER 集群 7000 节点

集群

概述

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能

节点

一个Redis集群通常由多个节点(node)组成,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,则必须将各个独立的节点连接起来,构成一个包含多个节点的集群。连接各个节点的工作可以使用CLUSTER MEET命令来完成,该命令的格式如下:

CLUSTER MEET <ip> <port>

向一个节点node发送CLUSTER MEET命令,可以让node节点与ip和port所指定的节点进行握手(handshake),当握手成功时,node节点就会将ip和port所指定的节点添加到node节点当前所在的集群中。

例子

举个例子。假设现在有三个独立的节点127.0.0.1:7000、127.0.0.1:7001、127.0.0.1:7002,首先使用客户端连接上节点7000,通过发送CLUSTER NODES命令可以看到,集群目前只包含7000自己一个节点

E:\redis>redis-cli -c -p 7000
127.0.0.1:7000> CLUSTER NODES
851197a1532c90ca60d91be5a6b95d3efc5a966f :7000 myself,master - 0 0 0 connected 246 5305 7629 11537 12291

通过向节点7000发送以下命令,我们可以将节点7001添加到节点7000所在的集群里面:

a29240fa8cb8b2ba154e9cb81faf5a3070c71966 127.0.0.1:7001 slave 352302bf0156372441c069247f984427cff506ff 0 1712586652533 1 connected
352302bf0156372441c069247f984427cff506ff 127.0.0.1:7000 myself,master - 0 0 1 connected 246 5305 7629 11537 12291

继续向节点7000发送以下命令,我们可以将节点7002也添加到节点7000和节点7001所在的集群里面:

127.0.0.1:7000> CLUSTER MEET 127.0.0.1 7002
OK
127.0.0.1:7000> CLUSTER NODES
ceb9e23e93e0aae13e5333f50d39336a97e5cba3 127.0.0.1:7002 slave 352302bf0156372441c069247f984427cff506ff 0 1712586757161 1 connected
a29240fa8cb8b2ba154e9cb81faf5a3070c71966 127.0.0.1:7001 slave 352302bf0156372441c069247f984427cff506ff 0 1712586756148 1 connected
352302bf0156372441c069247f984427cff506ff 127.0.0.1:7000 myself,master - 0 0 1 connected 246 5305 7629 11537 12291

现在,这个集群里面包含了7000、7001和7002三个节点,握手流程如图。

1.三个独立的节点

在这里插入图片描述

2.节点7000和7001进行握手

在这里插入图片描述

3.握手成功的7000与7001处于同一个集群

在这里插入图片描述

4.节点7000与节点7002进行握手

在这里插入图片描述

5.握手成功的三个节点处于同一个集群

在这里插入图片描述

启动节点

一个节点就是一个运行在集群模式下的Redis服务器,Redis服务器在启动时会根据cluster-enable配置选项是否为yes来决定是否开启服务器的集群模式,如图所示。节点(运行在集群模式下的Redis服务器)会继续使用所有在单机模式中使用的服务器组件,比如说:

  • 1.节点会继续使用文件事件处理器来处理命令请求和返回命令回复
  • 2.节点会继续使用时间事件处理器来执行serverCron函数。而serverCron函数又会调用集群模式特有的clusterCron函数。clusterCron函数负责执行在集群模式下需要执行的常规操作,例如向集群中的其他节点发送Gossip消息,检查节点是否断线,或者检查是否需要对下线节点进行自动故障转移等。
  • 3.节点会继续使用数据库来保存键值对数据,键值对依然会是各种不同类型的对象
  • 4.节点会继续使用RDB持久化模块和AOF持久化模块来执行持久化工作
  • 5.节点会继续使用发布与订阅模块来执行PUBLISH、SUBSCRIBE等命令
  • 6.节点会继续使用复制模块来进行节点的复制工作
  • 7.节点会继续使用Lua脚本来执行客户端输入的Lua脚本。
    除此之外,节点会继续使用redisServer结构来保存服务器的状态,使用redisClient结构来保存客户端的状态,至于那些只有在集群模式下才会用到的数据,节点将它们保存到了cluster.h/clusterNode结构、cluster.h/clusterLink结构,以及cluster.h/clusterState结构里面
    在这里插入图片描述

集群数据结构

cclusterNode结构保存了一个节点的当前状态,比如节点的创建时间、节点的名字、节点当前的配置纪元、节点的IP地址和端口号等等。每个节点都会使用一个clusterNode结构来记录自己的状态,并为集群中的所有其他节点(包括主节点和从节点)都创建一个相应的clusterNode结构,以此来记录其他节点的状态:

struct clusterNode {
// 创建节点的时间
mstime_t ctime;

// 节点的名字,由40个十六进制字符组成
// 例如ceb9e23e93e0aae13e5333f50d39336a97e5cba3
char name[REDIS_CLUSTER_NAMELEN];

// 节点标识
// 使用各种不同的标识值记录节点的角色(比如主节点或者从节点)
// 以及节点目前所处的状态(比如在线或者下线)
int flags;

// 节点当前的配置纪元,用于实现故障转移
uint64_t configEpoch;

// 节点的IP地址
char ip[REDIS_IP_STR_LEN];

// 节点的端口号
int port;

// 保存连接节点所需的有关信息
clusterLink *link;
// ...
};

clusterNode结构的link属性是一个clusterLink结构,该结构保存了连接节点所需的有关信息,比如套接字描述符,输入缓冲区和输出缓冲区:

typedef struct clusterLink {
// 连接的创建时间
mstime_t ctime;
// TCP 套接字描述符
int fd;
// 输出缓冲区,保存着等待发送给其他节点的消息(message)
sds sndbuf;
// 输入缓冲区,保存着从其他节点接收到的消息
sds rcvbuf;
// 与这个连接相关联的节点,如果没有的话就为NULL
struct clusterNode *node;
}clusterLink;

标签:127.0,0.1,Redis,CLUSTER,集群,7000,节点
From: https://blog.csdn.net/Cover_sky/article/details/137527300

相关文章

  • 深入理解PHP+Redis实现布隆过滤器(亿级大数据处理和黑客攻防必备)
    布隆过滤器极简概括英文名称BloomFilter,用于判断一个元素是否在一个大数据集合中,如果检测到存在则有可能存在,如果不存在则一定不存在。Redis官网对于布隆过滤器的说明:https://redis.io/docs/data-types/probabilistic/bloom-filter/使用场景防止缓存穿透:用于快速判断某个商......
  • 什么是Redis?Redis为什么这么快?Redis相比Memcached有哪些共同点和区别?
    (1)什么是Redis?简述它的优缺点?Redis为什么这么快?Redis本质上是一个Key-Value类型的内存数据库,把整个数据库加载在内存当中操作,定期通过异步操作把数据库中的数据复制到硬盘中。(异步操作,一种非阻塞执行任务的方式,其中任务的执行与结果的返回不会阻碍原者继续执行后续操作。)优点......
  • 手把手带你,在K8S集群中删除处于 "terminating" 状态命名空间。
    1.背景背景:在Kubernetes集群中,有时侯想要删掉某个长时间不用命名空间以释放资源却发现删不掉,经过反复删除发现想要删除命名空间处在Terminating状态,强制删除也无济于事。作者也遇到这样事情,我又是如何删除掉呢?#kubectlgetnsNAMESTATUSAGEdefaul......
  • Redis 有哪些数据类型?
    5种基础数据类型,分别是:String、List、Set、Zset、Hash。 结构类型结构存储的值结构的读写能力String字符串可以是字符串、整数或浮点数对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;List列表一个链表,链表上的每个节点都包含一个字符......
  • 全国首/个!天翼云上海临港国产单池万卡液冷算力集群启用!
    3月22日,中国电信宣布,天翼云上海临港国产万卡算力池正式启用,八家合作伙伴宣布将作为首批用户入驻临港国产算力池。这是国内首/个投入正式运营的国产单池万卡液冷算力集群,也是业内领先的全国产化云智一体公共智算中心。通过中国电信天翼云打造的人工智能公共算力服务平台,将以公共普......
  • SpringBoot拦截器注入stringredistemplate出现Consider defining a bean of type 'org
    问题自定义拦截器需要注入StringRedisTemplate来通过token获取redis中的数据自定义拦截器代码@ComponentpublicclassLoginInterceptorimplementsHandlerInterceptor{@AutowiredprivateStringRedisTemplatestringRedisTemplate;@Overridepublicb......
  • redis自学(30)搭建主从架构
    搭建主从架构单节点redis的并发能力是有上限的,要进一步提高redis的并发能力,就需要搭建主从集群,实现读写分离。  搭建主从的注意事项(仅注意,是否需要修改看实际情况)端口修改  目录修改  也可以通过命令的方式修改文档  声明绑定实例ip   开启主从......
  • Kafka 集群架构
    Kafka集群架构设计旨在提供高吞吐量、低延迟、容错性和可扩展性的消息传递服务。以下是Kafka集群架构的关键组成部分及其工作原理:核心组件BrokerBroker是Kafka集群中的一个独立服务器实例。每个Broker负责维护一部分Topic的Partition,并提供消息的接收、存储、检索和转发......
  • Hadoop集群下的wordcount运行出错类型及解决方法
    1、启动wordcont程序显示异常:原因:2、显示服务器连接不成功:原因:虚拟机配置问题,导致yarn服务没有启动3、运行结果不正确:原因:暂未发现,求解答......
  • redis的Streams详细介绍
    Redis的Streams是一个日志类型的数据结构,它在Redis5.0中被引入,用于存储并取回消息。这种数据结构让Redis可以成为消息队列系统和流处理系统。它是一个持久化、可复制、基于磁盘的、具有时间序列信息的日志系统。Streams主要的命令包括:**XADDkeyIDfieldvalue[fieldval......