Redis中的集群(一)

集群

概述

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;

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

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

相关文章

电脑开机启动项设置

电脑开机启动项设置 一、Windows 系统&#xff1a; 1、Windows 系统&#xff0c;可以通过【系统配置实用程序】来设置开机启动项&#xff1a; 1&#xff09;、按【WinR】组合键&#xff0c;打开【运行】对话框。 2&#xff09;、输入【msconfig】&#xff0c;点击【确定】或…

4.2C++

写一个char类型的字符数组&#xff0c;对该数组访问越界时抛出异常&#xff0c;并做处理。 #include <iostream>using namespace std; void fun(char (&a)[10],int i) {if(i>10){throw int();}else if(aNULL){throw double();}cout<<"访问了第"&…

K8s学习八(配置与存储_配置)

配置与存储 配置管理 ConfigMap ConfigMap的创建 一般用于去存储 Pod 中应用所需的一些配置信息&#xff0c;或者环境变量&#xff0c;将配置于 Pod 分开&#xff0c;避免应为修改配置导致还需要重新构建 镜像与容器。configmap缩写为cmkubectl create cm -h来查看创建命令…

前端二维码工具小程序产品使用说明书

一、产品概述 前端二维码工具小程序是一款便捷实用的二维码生成与识别工具&#xff0c;通过本小程序&#xff0c;用户可以轻松根据文本或链接生成二维码&#xff0c;并支持扫一扫功能识别二维码内容&#xff0c;同时提供复制识别内容的功能。此外&#xff0c;本小程序还具备美…

在NBA我需要翻译--适配器模式

1.1 在NBA我需要翻译&#xff01; "你说姚明去了几年&#xff0c;英语练出来了哦&#xff0c;我看教练在那里布置战术&#xff0c;他旁边也没有翻译的&#xff0c;不住点头&#xff0c;瞧样子听懂没什么问题了。" "要知道&#xff0c;最开始&#xff0c…

xilinx SATA GTY PHY适配

xilinx sata phy主要是通过transceiver IP 进行移植&#xff0c;xilinx的底层目前主要有gtp gtx gth gty,不同的底层&#xff0c;PHY都需要重新适配 以下开始针对ZCU器件的GTH4底层进行配置 首先可以选择对应的类型 2&#xff0c;设置数据位宽&#xff0c;我这里设置为32位宽…

百度松果菁英班——机器学习实践五:明星图片爬取

飞桨AI Studio星河社区-人工智能学习与实训社区 &#x1f96a;图片爬取 import requests import os import urllib ​ class GetImage():def __init__(self,keyword大雁,paginator1):# self.url: 链接头self.url http://image.baidu.com/search/acjson?self.headers {User…

Win10下VirtualBox启动任何一个虚拟机马上出现蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION)

环境: Win10专业版 VirtualBox5.1.28 问题描述: Win10下VirtualBox启动任何一个虚拟机马上出现蓝屏死机(终止代码:SYSTEM_SERVICE_EXCEPTION),之前都一直没问题 检查下面功能是否开启 已启用 Credential Guard/Device Guard。 已启用 Windows 沙箱 已启用虚拟机平台…

【学习一】液压伺服与比例控制系统介绍

【学习一】液压伺服与比例控制系统介绍 需要具备的前期知识&#xff1a;自动控制、计算机控制系统等 文章目录 【学习一】液压伺服与比例控制系统介绍一、液压伺服与比例控制系统的组成二、液压伺服与比例控制系统的分类1.按系统输入信号的变化规律分类2.按被控物理量的名称分类…

SpringBoot学习笔记二

SpringBoot学习笔记二 1.SpringBoot配置加载顺序1.1 内部配置加载顺序1.2 外部配置加载顺序 2. SpringBoot整合其他框架2.1 SpringBoot整合Test2.2 SpringBoot整合Redis 1.SpringBoot配置加载顺序 1.1 内部配置加载顺序 同理可知&#xff0c;父项目中的confg下的配置优先级最…

图书馆自助借书机怎么借书

图书馆自助借书机借书流程如下&#xff1a; 1. 找到图书馆自助借书机&#xff0c;在机器上选择借书功能。 2. 输入自己的借书卡号或者身份证号码&#xff0c;如果是第一次借书&#xff0c;可能需要进行注册。 3. 输入图书的条形码号码&#xff0c;可以通过扫描条形码或者手动输…

ICLR24_OUT-OF-DISTRIBUTION DETECTION WITH NEGATIVE PROMPTS

摘要 分布外检测&#xff08;OOD Detection&#xff09;的研究对于开放世界&#xff08;open-world&#xff09;学习非常重要。受大模型&#xff08;CLIP&#xff09;启发&#xff0c;部分工作匹配图像特征和提示来实现文本-图像特征之间的相似性。 现有工作难以处理具有与已…