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

Redis Cluster Gossip Protocol: MEET

返回目录

CLUSTER MEET

过程说明

client Node A Node B cmd: cluster meet B_ip B_port [B_cport] Invalid node address specified: ip:port OK alt [ip or port or cport is invalid] clusterCron message1: MEET message2: PONG handshake completed clusterCron message3: PING message4: PONG handshake completed client Node A Node B

注意:B_ip 不能使用域名

Node A 收到client发送的meet命令后:
  1. 如果 B_cport 不存在,则 B_cport = B_port + 10000
  2. 检查 B_ip, B_port, B_cport 的合法性
  3. 在自己的cluster节点字典中查找是否存在这样的节点
    • 处于handshake状态 &&
    • ip == B_ip &&
    • port == B_port &&
    • cport == B_cport
      如果存在,说明相同的节点已经处于handshake阶段,不需要重复handshake,返回OK给client。
  4. 新建实体B:
    • 生成一个随机节点ID
    • 设置创建时间为当前时间
    • 添加标记: NODE_HANDSHAKE | NODE_MEET
    • 设置传入的 ip, port, cport
  5. 把实体B加入到自己的cluster节点字典
  6. 返回OK给client

clusterCron: 一个专门处理cluster间通信的周期性调度。

消息说明

以下执行步骤只挑选了主要的步骤。

message1:A meet B

Node A 在ClusterCron时:

  1. 检查B是否存在NODE_MEET标记,没有则返回
  2. 判断跟B的handshake是否已经timeout:
    当前时间 - 节点的创建时间 > max(cluster-node-timeout, 1000)
    cluster-node-timeout 是配置项)
  3. 如果timeout了,从cluster节点字典中删除B的信息并返回
  4. 检查是否存在指向Node B的link,如果没有则创建一个(方向为TO)
  5. 连通后发送message1(MEET)给Node B
  6. 从实体B中移除NODE_MEET标记

message2:B pong A

Node B在收到message1后:

  1. 如果没有配置 cluster-announce-ip,则从socket中查找自己的ip
  2. 新建实体A
    • 生成一个随机节点ID
    • 设置创建时间为当前时间
    • 通过socket查找Node A的ip
    • 添加标记: NODE_HANDSHAKE
    • 设置传入的 ip, port, cport
  3. 把实体A加入到cluster节点字典
  4. 处理消息中的gossip部分
  5. 回复message2(PONG)给Node A
  6. 到此,在Node B看来,还没有完成跟Node A的handshake,所以不会直接使用message1中Node A的ID,也不会更新A的slots分布

Node A在收到message2后:

  1. message2中获取Node B的ID,更新实体B。因为之前新建实体B时用的是随机ID,而这次message2中带的才是真正的ID,所以需要更新
  2. 移除实体B中的HANDSHAKE标记
  3. 根据message2中的信息设置实体B为master或者slave
  4. 到此,在A看来,已完成跟B的handshake过程。但此时A还没有获取B中的slots分布。handshake完成后的下一次ping/pong才会更新slots。

message3:B ping A

Node B 在ClusterCron时:

  1. 检查是否存在指向Node A的link,没有则创建一个(方向为TO)
  2. 连通后发送message3(PING)给Node A

Node A在收到message3后:

  1. 更新currentEpoch和configEpoch
  2. 如果没有配置 cluster-announce-ip,则从socket中查找自己的ip
  3. 回复message4(PONG)给Node B
  4. 更新实体B中slots的分布
  5. 处理gossip和extension部分

message4: A pong B

Node B在收到message4后:

  1. message4中获取Node A的ID,更新实体A。因为之前新建实体A时用的是随机ID,而这次message4中带的才是真正的ID,所以需要更新
  2. 移除实体A中的HANDSHAKE标记
  3. 根据message4中的信息设置实体B为master或者slave
  4. 到此,在B看来,已完成跟A的handshake过程。但此时B还没有获取A中的slots分布。handshake完成后的下一次ping/pong才会更新slots。

至此:
5. 当Node A和Node B都完成了handshake过程后,就会进入相互ping/pong/update等的阶段
6. 而Node B可以从Node A的ping/pong中获取到Node A的slots分布,从而更新到实体A
7. 只有handshake成功后的下一次ping/pong才会真正的更新自己cluster节点字典中的实体。

Demo

Node A的日志
# Step 1
# Node A向Node B发送message1(MEET),fe4d****这个ID是实体B随机生成的
3383:M 22 Nov 2022 15:02:45.098 . Connecting with Node fe4d416c13a24d5dc03a6fff25181d3ae15f95ad at 127.0.0.1:17000
# -----------------# Step 3
# Node A收到Node B回复的message2(PONG)
3383:M 22 Nov 2022 15:02:45.099 . --- Processing packet of type pong, 2256 bytes
3383:M 22 Nov 2022 15:02:45.099 . pong packet received: fe4d416c13a24d5dc03a6fff25181d3ae15f95ad
# 根据message2里面Node B的真实ID,更新实体B
3383:M 22 Nov 2022 15:02:45.099 . Renaming node fe4d416c13a24d5dc03a6fff25181d3ae15f95ad into 737418730813700da2f51ddeb8bdc8e3fd2a7805
# 在Node A看来,跟Node B的handshake过程结束
3383:M 22 Nov 2022 15:02:45.099 . Handshake with node 737418730813700da2f51ddeb8bdc8e3fd2a7805 completed.
# -----------------# Step 5
# Node A收到Node B发送来的message3(PING)
3383:M 22 Nov 2022 15:02:45.201 - Accepting cluster node connection from 127.0.0.1:56990
3383:M 22 Nov 2022 15:02:45.201 . --- Processing packet of type ping, 2256 bytes
# Node A 修正自己的IP
3383:M 22 Nov 2022 15:02:45.201 # IP address for this node updated to 127.0.0.1
# Node A根据message3,做一系列操作,包括更新实体B中的slots
3383:M 22 Nov 2022 15:02:45.201 . ping packet received: 737418730813700da2f51ddeb8bdc8e3fd2a7805
# Node A回复message4给Node B(日志没显示)
# -----------------# Step 8
# Node A再次收到Node B发送来的PING
3383:M 22 Nov 2022 15:02:45.303 . --- Processing packet of type ping, 2256 bytes
3383:M 22 Nov 2022 15:02:45.303 . ping packet received: 737418730813700da2f51ddeb8bdc8e3fd2a7805
# Node A回复PONG给Node B(日志没显示)
# -----------------
Node B的日志
# Step 2
# Node B收到NodeA发送来的message1
3372:M 22 Nov 2022 15:02:45.099 - Accepting cluster node connection from 127.0.0.1:44968
3372:M 22 Nov 2022 15:02:45.099 . --- Processing packet of type meet, 2256 bytes
# Node B修正自己的IP
3372:M 22 Nov 2022 15:02:45.099 # IP address for this node updated to 127.0.0.1
# 因为message1中Node A的ID在Node B的cluster节点字典中不存在对应的实体,所以received打印的是NULL
3372:M 22 Nov 2022 15:02:45.099 . meet packet received: NULL
# Node B回复message2给Node A(日志没显示)
# -----------------# Step 4
# Node B在clusterCron时向NodeA发送message3(PING)
3372:M 22 Nov 2022 15:02:45.201 . Connecting with Node ba747dfdcd40d974294054f1d7ca023678ff9874 at 127.0.0.1:16000
# -----------------# Step 6
# Node B收到Node A回复的message4(PONG)
3372:M 22 Nov 2022 15:02:45.204 . --- Processing packet of type pong, 2256 bytes
3372:M 22 Nov 2022 15:02:45.204 . pong packet received: ba747dfdcd40d974294054f1d7ca023678ff9874
# Node B根据message4中Node A的真实ID,更新实体A
3372:M 22 Nov 2022 15:02:45.204 . Renaming node ba747dfdcd40d974294054f1d7ca023678ff9874 into ea017e0f83612b1b32179b4277becba349db5590
# 在Node B看来,跟Node A的handshake过程结束
3372:M 22 Nov 2022 15:02:45.204 . Handshake with node ea017e0f83612b1b32179b4277becba349db5590 completed.
# -----------------# Step 7
# Node B在clusterCron时再次向Node A发送PING消息
3372:M 22 Nov 2022 15:02:45.303 . Pinging node ea017e0f83612b1b32179b4277becba349db5590
# -----------------# Step 9
# Node B收到Node A回复的PONG
3372:M 22 Nov 2022 15:02:45.303 . --- Processing packet of type pong, 2256 bytes
# Node B根据PONG,做一系列操作,包括更新实体A中的slots
3372:M 22 Nov 2022 15:02:45.303 . pong packet received: ea017e0f83612b1b32179b4277becba349db5590

相关文章:

Redis Cluster Gossip Protocol: MEET

返回目录 CLUSTER MEET 过程说明 #mermaid-svg-dp95n6LRjBO1mCKE {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-dp95n6LRjBO1mCKE .error-icon{fill:#552222;}#mermaid-svg-dp95n6LRjBO1mCKE .error-text{fill:#…...

TcpConnection的读写操作【深度剖析】

文章目录 前言一、TcpConnection的读二、TcpConnection的写三、TcpConnection的关闭 前言 今天总结TcpConnection类的读写事件。 一、TcpConnection的读 当Poller检测到套接字的Channel处于可读状态时,会调用Channel的回调函数,回调函数中根据不同激活…...

k8s面试题

1 简述etcd及其特点 ETCD是高可用分布式的键值存储系统 特点 1)强一致性:即使部分节点故障,etcd仍能正常工作,并保持数据一致 (强一致性:分布式系统中,更新操作,所有节点读取的数据都是最新的,一致的) 2)高可用:etcd支持数据多副本复制,一个节点挂,其他节点接…...

OpenCV 4.x 版本的新特性都有哪些?

文章大纲 V 4. 0DNNV 4.0 - 4. 8cheatsheetvideo analysis参考文献与学习路径2016年的时候我快研究生毕业了,那时候OpenCV 2.4.x 版本非常的流行,当时3.x 的版本刚发布,很多人都没有用习惯。 我写过一遍笔记: OpenCV 3.0 3.1版本的改进家里还有一本书:《OpenCV 3 计算机视…...

Redisson—分布式集合

7.1. 映射(Map) 基于Redis的Redisson的分布式映射结构的RMap Java对象实现了java.util.concurrent.ConcurrentMap接口和java.util.Map接口。与HashMap不同的是,RMap保持了元素的插入顺序。该对象的最大容量受Redis限制,最大元素数…...

93、Redis 之 使用连接池管理Redis6.0以上的连接 及 消息的订阅与发布

★ 使用连接池管理Redis连接 从Redis 6.0开始,Redis可支持使用多线程来接收、处理客户端命令,因此应用程序可使用连接池来管理Redis连接。 上一章讲的是创建单个连接来操作redis数据库,这次使用连接池来操作redis数据库 Lettuce连接池 支持…...

doris动态分区开启历史分区

举例说明: CREATE TABLE tbl1 (k1 DATE,... ) PARTITION BY RANGE(k1) () DISTRIBUTED BY HASH(k1) PROPERTIES ("dynamic_partition.enable" "true","dynamic_partition.time_unit" "DAY","dynamic_partition.sta…...

Linux用户与权限(认知root用户、修改权限控制 - chmod、修改权限控制 - chown)

目录 1. 认知root用户 1.1 什么是root用户(超级管理员) 1.2 用户切换命令 1.3 sudo命令 1.3.1 为普通用户配置sudo认证 2. 用户、用户组管理 2.1 理解用户、用户组的概念 2.2 掌握用户、用户组管理的相关命令 2.2.1 用户组管理 2.2.2 …...

处理conda安装工具的动态库问题——解决记录 libssl.1.0.0 系统中所有openssl位置全览 whereis openssl

处理conda安装工具的动态库问题——解决记录 处理conda安装工具的动态库问题——解决记录 - 简书 解决libssl.so.1.0.0: cannot open shared object file: No such file or directory问题 - 简书 openssl 默认版本问题(Anaconda相关)_anaconda openssl-…...

如何在Go中格式化字符串

由于字符串通常由书面文本组成,在很多情况下,我们可能希望通过标点符号、换行和缩进来更好地控制字符串的外观,以使其更易于阅读。 在本教程中,我们将介绍一些处理go字符串的方法,以确保所有输出文本的格式正确。 字…...

C程序设计内容与例题讲解 -- 第四章--选择结构程序设计第二部分(第五版)谭浩强

前言:在前面我们学习了选择结构和条件判断,用if语句实现选择结构,关系运算符和关系表达式,逻辑运算符和逻辑表达式等知识。今天我们将接着上一篇未讲完的继续讲解。 鸡汤:种一棵树最好的时间是十年前,其次是现在!加油各…...

接雨水问题

接雨水问题 问题背景 LeetCode 42. 接雨水 接雨水问题是一个经典的计算雨水滞留量的问题,通常使用柱状图来表示不同高度的柱子。在下雨的情况下,柱子之间的凹陷部分能够存储雨水,问题的目标是计算这些柱子所能接收的雨水总量。 相关知识 …...

小谈设计模式(9)—工厂方法模式

小谈设计模式(9)—工厂方法模式 专栏介绍专栏地址专栏介绍 工厂方法模式角色分类抽象产品(Abstract Product)具体产品(Concrete Product)抽象工厂(Abstract Factory)具体工厂&#x…...

Android etc1tool之png图片转换pkm 和 zipalign简介

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、etc1tool2.1、用法 三、zipalign3.1 使用 四…...

Spring Boot快速入门:构建简单的Web应用

SpringBoot Spring Boot是一个用于简化Spring应用程序开发的框架,它通过提供开箱即用的配置和一组常用的功能,使得构建高效、可维护的应用变得非常容易。在本篇博客中,我们将一步步地介绍如何快速入门Spring Boot,并构建一个简单的…...

JAVA 泛型、序列化和复制

泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。比如我们要写一个排序方法,能够对整型数组、字符串数组甚至其他任何类型的数组进行排序&a…...

以太网基础学习(二)——ARP协议

一、什么是MAC地址 MAC地址(英语:Media Access Control Address),直译为媒体访问控制位址,也称为局域网地址(LAN Address),MAC位址,以太网地址(Ethernet Addr…...

【Java-LangChain:使用 ChatGPT API 搭建系统-4】评估输入-分类

第三章,评估输入-分类 如果您正在构建一个允许用户输入信息的系统,首先要确保人们在负责任地使用系统,以及他们没有试图以某种方式滥用系统,这是非常重要的。 在本章中,我们将介绍几种策略来实现这一目标。 我们将学习…...

嵌入式Linux应用开发-驱动大全-第一章同步与互斥③

嵌入式Linux应用开发-驱动大全-第一章同步与互斥③ 第一章 同步与互斥③1.4 Linux锁的介绍与使用1.4.1 锁的类型1.4.1.1 自旋锁1.4.1.2 睡眠锁 1.4.2 锁的内核函数1.4.2.1 自旋锁1.4.2.2 信号量1.4.2.3 互斥量1.4.2.4 semaphore和 mutex的区别 1.4.3 何时用何种锁1.4.4 内核抢占…...

树的存储结构以及树,二叉树,森林之间的转换

目录 1.双亲表示法 2.孩子链表 3.孩子兄弟表示法 4.树与二叉树的转换 (1)树转换为二叉树 (2)二叉树转换成树 5.二叉树与森林的转化 (1)森林转换为二叉树 以下树为例 1.双亲表示法 双亲表示法定义了…...

【AI视野·今日NLP 自然语言处理论文速览 第四十二期】Wed, 27 Sep 2023

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 27 Sep 2023 Totally 50 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Attention Satisfies: A Constraint-Satisfaction Lens on Factual Errors of Language Models Authors Mert …...

华为云云耀云服务器L实例评测|部署个人在线电子书库 calibre

华为云云耀云服务器L实例评测|部署个人在线电子书库 calibre 一、云耀云服务器L实例介绍1.1 云服务器介绍1.2 应用场景1.3 支持镜像 二、云耀云服务器L实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置 三、部署 calibre3.1 calibre 介绍3.2 Docker 环境搭建3.3 c…...

代码随想录刷题 Day28

216.组合总和III 和前一个题一样,照着自己就能写出来,就多了一个判断结果是不是等于n的逻辑。有两个地方可以剪纸,一个是当和已经大于要找的时候直接返回,另一个是当剩余元素少于三个的时候直接返回(第一层递归是少于…...

【生命周期】

生命周期 1 引出生命周期2 分析生命周期3 总结生命周期 1 引出生命周期 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta …...

【C语言 模拟实现memcpy函数、memcpy函数】

C语言程序设计笔记---027 C语言之模拟实现memcpy函数、memcpy函数1、介绍memcpy函数1.1、模拟实现memcpy函数 2、介绍memmove函数2.1、模拟实现memmove函数 3、结语 C语言之模拟实现memcpy函数、memcpy函数 前言&#xff1a; 通过C语言内存函数的知识&#xff0c;这篇将对memc…...

opencv视频文件的读取,处理与保存

文章目录 opencv视频文件的读取&#xff0c;处理与保存一、视频文件的读取&#xff1a;1、cv::VideoCapture是OpenCV库中用于处理视频输入的类&#xff0c;它提供了一种简单的方法来从摄像头&#xff0c;视频文件、或图像序列中读取帧&#xff1b;&#xff08;1&#xff09;打开…...

java - 七大比较排序 - 详解

前言 本篇介绍了七大比较排序&#xff0c;直接插入排序&#xff0c;希尔排序&#xff0c;冒泡排序&#xff0c;堆排序&#xff0c;选择排序&#xff0c;快速排序&#xff0c;归并排序&#xff0c;一些简单思想代码实现&#xff0c;如有错误&#xff0c;请在评论区指正&#xf…...

项目集成七牛云存储sdk

以PHP为例 第一步&#xff1a;下载sdk PHP SDK_SDK 下载_对象存储 - 七牛开发者中心 sdk下载成功之后&#xff0c;将sdk放入项目中&#xff0c;目录选择以自己项目实际情况而定。 注意&#xff1a;在examples目录中有各种上传文件的参考示例&#xff0c;这里我们主要参考的是…...

docker-compose一键启动neo4j

下载镜像 docker pull neo4j:3.5.22-community 编写配置文件 参考文档 编写docker-compose.yml文件 version: "3"services:neo4j:image: neo4j:3.5.22-communitycontainer_name: neo4j restart: alwaysports:- 7474:7474- 7687:7687environment:- NEO4J_AUTH:ne…...

深入剖析@ConfigurationProperties注解

当我们构建Spring Boot应用程序时&#xff0c;配置属性通常是不可或缺的一部分。Spring Boot提供了多种方式来管理这些属性&#xff0c;其中之一是使用ConfigurationProperties注解。这篇博客将详细解释ConfigurationProperties注解以及如何使用它来管理和映射配置属性。 什么…...

wordpress访问后台/seo研究中心培训机构

编辑&#xff1a;业余草来源&#xff1a;https://www.xttblog.com/?p4978世上无难事&#xff0c;只怕有心人&#xff01;今天我们来说说线程池&#xff01;线程池简介使用线程池&#xff0c;一般会使用JDK提供的几种封装类型&#xff0c;即&#xff1a;newFixedThreadPool、ne…...

wordpress post id/深圳网站建设推广

>0️⃣python数据结构与算法学习路线 >学习内容&#xff1a; >- 基本算法&#xff1a;枚举、排序、搜索、递归、分治、优先搜索、贪心、双指针、动态规划等... >- 数据结构&#xff1a;字符串(string)、列表(list)、元组(tuple)、字典(dictionary)、集合(set)、数组…...

团购网站做二级域名/独立站seo优化

注意&#xff1a;单击此处https://urlify.cn/AJbIRb下载完整的示例代码&#xff0c;或通过Binder在浏览器中运行此示例显示收缩(shrinkage)是如何改善分类效果。sphx_glr_plot_lda_001import numpy as npimport matplotlib.pyplot as pltfrom sklearn.datasets import make_blo…...

哪里有网站建设哪家好/seo报告

主要的加载顺序是 servletcontext-------->context-param---------->listener---->filter----->servlet 而同一个类别之间的实际情况调用顺序要根据鬼影的mapping的顺序进行调用。 转载于:https://www.cnblogs.com/mengzhongyunying/p/8668311.html...

响应式网站免费/昆明网络推广优化

PAGEPAGE ii淮北师范大学科学型计算器的开发与实现学 院 计算机科学与技术专 业 计算机科学与技术(师范)学 生 姓 名学 号指导教师姓名年 月 日科学型计算器的开发与实现作 者&#xff1a;指导教师&#xff1a;摘 要&#xff1a;目前&#xff0c;科学计算器的应用非常广泛&…...

网站商城建设合同免费下载/推广普通话宣传语100字

现在采用后置多摄组合的手机太常见了&#xff0c;好像没有后置多摄都不好意思说是一台手机。手机上的后置多摄组合有什么用&#xff1f;购机时应该怎么选择&#xff1f;我们一起通过文章来了解一下。多摄方案有什么优势&#xff1f;近年来&#xff0c;手机后置多摄几乎已经演变…...