Redis通信协议和集群通信算法
1. Redis客户端和服务端通信协议
Redis客户端使用RESP(Redis Serialization Protocol)协议与Redis的服务器端进行通信,底层是基于TCP网络通信。RESP的优点:
- 实现容易
- 解析快
- 人类可读
RESP支持数据类型包括:简单字符串(Simple Strings),错误(Errors),整数(Integers),批量字符串(Bulk String)和数组(Arrays)。
- 简单字符串,回复的第一个字节是“+”
- 错误,回复的第一个字节是“ - ”
- 整数,回复的第一个字节是“:”
- 批量字符串,回复的第一个字节是“$”
- 数组,回复的第一个字节是“ *”
客户端将命令作为Bulk Strings的RESP数组发送到Redis服务器,服务器根据命令实现回复一种RESP类型。在RESP中,某些数据的类型取决于第一个字节,协议的不同部分始终以“\ r \ n”(CRLF)结束。
*<number of arguments> CR LF
$<number of bytes of argument 1> CR LF
<argument data> CR LF
...
$<number of bytes of argument N> CR LF
<argument data> CR LF
比如:发送命令 set key1 value1,底层抓包得到的二进制请求是:
*3
$3
set
$4
key1
$6
value1
2. redis cluster 集群通信协议Gossip
redis集群采用去中心化设计,通过 Gossip协议保证最终一致性。Gossip 算法又被称为反熵(Anti-Entropy),最早是在 1987 年发表在 ACM 上的论文 《Epidemic Algorithms for Replicated Database Maintenance》中被提出,特点是:在一个有界网络中,每个节点都随机地与其它节点通信,经过一番杂乱无章的通信,最终所有节点的状态都会达成一致。
Gossip的特点
- 扩展性:允许节点的任意增加和减少,新增加的节点的状态最终会与其他节点一致;
- 容错:任何节点的宕机和重启都不会影响 Gossip 消息的传播,Gossip 协议具有天然的分布式系统容错特性。
- 去中心化:Gossip协议不要求任何中心节点,所有节点都可以是对等的,任何一个节点无需知道整个网络状况,只要网络是连通的,任意一个节点就可以把消息散播到全网。
- 一致性收敛:Gossip 协议系统状态的不一致可以在很快的时间内收敛到一致,消息传播速度达到了 logN。
- 简单性:Gossip 协议的过程极其简单,实现起来几乎没有太多复杂性。
Gossip 的缺陷
- 消息的延迟:Gossip 协议中,节点只会随机向少数几个节点发送消息,消息最终是通过多个轮次的散播而到达全网的,因此会造成不可避免的消息延迟。不适合用在对实时性要求较高的场景下。
- 消息冗余:Gossip 协议规定,节点会定期随机选择周围节点发送消息,而收到消息的节点也会重复该步骤,因此不可避免的存在消息重复发送给同一节点,造成了消息的冗余,同时也增加了收到消息的节点的处理压力。冗余通信会对网路带宽、CUP 资源造成很大的负载,而这些负载又受限于通信频率,该频率又影响着算法收敛的速度。
2.1 Redis cluster中gossip通信
Redis Cluster 中的每个Redis master实例监听两个 TCP 端口,6379(默认)用于服务客户端查询,16379(默认服务端口+10000)用于集群内部通信。集群中节点通信方式如下:
- 每个节点在固定周期内通过特定规则选择几个节点发送 Ping 消息;
- 接收到 Ping 消息后用Pong 消息作为响应。
Redis cluster中消息的种类:
- Meet消息:用于通知新节点加入。消息发送者通知接收者加入到当前集群,Meet 消息通信正常完成后,接收节点会加入到集群中并进行周期性的 Ping、Pong 消息交换;
- Ping 消息:集群内交换最频繁的消息,集群内每个节点每秒向多个其它节点发送 Ping 消息,用于检测节点是否在线和交换彼此状态信息。Ping 消息发送封装了自身节点和部分其它节点的状态数据;
- Pong 消息:当接收到 Ping、Meet 消息时,作为响应消息回复给发送方确认消息正常通信。Pong 消息内部封装了自身状态数据。节点也可以向集群内广播自身的 Pong 消息来通知整个集群对自身状态进行更新;
- Fail 消息:当节点判定集群内另一个节点下线时,会向集群内广播一个 Fail 消息,其他节点接收到 Fail 消息之后把对应节点更新为下线状态。
参考:https://zhuanlan.zhihu.com/p/463455831
Redis通信协议和集群通信算法相关推荐
- Redis~集群(分布理论、一致性哈希分区、虚拟槽分区、节点握手、集群通信、集群伸缩、请求路由、故障转移、集群维护)
文章目录 分布理论 集群的分布式存储 简单哈希 一致性哈希分区 虚拟槽分区 Redis集群功能限制 节点握手 分配槽 集群通信 Gossip消息 集群伸缩 集群扩容 集群收缩 请求路由 MOVED重定 ...
- CentOS7下安装Redis伪集群(基于Redis官方Cluster集群模式版本redis-5.0.10)
文章目录 Redis简介 什么是redis redis的优点 Redis集群都有哪些模式 主从复制(Master-Slave Replication) 哨兵模式(Sentinel) Redis官方 C ...
- Redis几种集群模式
此文由转载 https://blog.csdn.net/wy0123/article/details/79583506 现在越来越多的项目都会利用到redis,多实例redis服务比单实例要复杂的多, ...
- redis学习之集群部署
redis学习之集群部署 1.Redis主从架构 1.1.主从复制原理 1.2.主从复制优缺点 1.3.redis主从架构搭建,配置从节点步骤 1.4.校验结果 1.5.数据部分复制 2.Redis哨 ...
- redis高可用集群
一.redis集群方案比较 主从哨兵模式 redis3.0之前的版本实现集群一般采用的方案是借助哨兵sentinel工具来监控master节点的状态,如果master主节点异常,则会做主从切换,将一台 ...
- 部署Redis高可用集群
目录 部署Redis高可用集群 Redis集群环境 拓扑结构 IP地址 环境准备 工作原理 创建Redis集群 部署管理主机 redis-trib.rb脚本 redis服务器开启集群功能 管理主机创建 ...
- redis 04:Redis高可用集群
文章目录 一.Redis集群方案比较 二.Redis高可用集群搭建 三.Java操作redis集群 四.Redis集群原理分析 五.集群伸缩 5.1 集群扩展 5.1 缩容集群 六.总结 以下参考了图 ...
- Redis高可用集群部署和集群扩展
文章目录 一.前言 二.集群配置 2.1 说明 2.2 配置 2.3 启动redis 2.4 集群操作 2.5 验证集群 2.5.1 springboot配置文件 2.5.2 代码测试 2.5.3 集 ...
- Redis开发及集群
Redis开发 中文网站:http://www.redis.net.cn/ 1. Redis 简介 REmote DIctionaryServer(Redis) 是一个由Salvatore S ...
- Redis主从复制和集群配置系列之四
非常感谢 http://blog.csdn.net/dc_726/article/details/48552531 Redis技术学习 https://www.itkc8.com 全面剖析Redis ...
最新文章
- 洗礼灵魂,修炼python(85)-- 知识拾遗篇 —— 深度剖析让人幽怨的编码
- Swift 单元测试
- 结构化异常捕获空指针异常
- Python Web部署方式总结
- java m4a文件拼接_面试官:为啥不提倡字符串拼接?看阿里java开发手册怎么说
- dataframe 列名重新排序
- 多重继承与虚继承编程实验
- TCP/IP 三次握手和四次挥手
- DOCKER基础技术:LINUX NAMESPACE(上)
- 汽车行业如何进行数字化转型
- 清华郝景芳:中国教育还欠缺什么?如何弥补当下教育的不足? (公号回复“郝景芳”下载PDF典藏版)
- 49种软件验收测试方法大分享,快来看
- 数千 npm 账号使用域名过期的邮箱,涉及 8494 个包
- 杭州电子科技大学计算机科学与技术专业排名,杭州电子科技大学计算机科学与技术研究生专业排名...
- 一、Linux 教程-基础
- 打印绕圈矩阵(C语言风格的代码)
- LSB利器-zsteg
- LDO稳压器详解(一)-参数概念
- Oracle笔记之期末总复习
- 单位转换html代码,JavaScript实现长度单位转换
热门文章
- 全球光伏多晶硅价格上涨 中美贸易纠纷不断
- php 判断字数,php 如何统计中文字数
- PS:PS将彩色相片变成纯黑白色
- 内网穿透的几种方式-免费与收费(钉钉、Frp、花生壳、nat123)
- 相关系数——皮尔逊相关系数的公式及其理解
- 联想计算机一键恢复出厂设置,联想电脑Win7系统怎么一键恢复出厂设置步骤?...
- 如何在BIOS中设置RAID?
- c java python sql是什么意思_讲解:COIT12206、program、Java、Python、c/c++Python|SQL
- 200个英语常用词根词缀
- a指定许可服务器无效,错误的hostid与许可证服务器