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通信协议和集群通信算法相关推荐

  1. Redis~集群(分布理论、一致性哈希分区、虚拟槽分区、节点握手、集群通信、集群伸缩、请求路由、故障转移、集群维护)

    文章目录 分布理论 集群的分布式存储 简单哈希 一致性哈希分区 虚拟槽分区 Redis集群功能限制 节点握手 分配槽 集群通信 Gossip消息 集群伸缩 集群扩容 集群收缩 请求路由 MOVED重定 ...

  2. CentOS7下安装Redis伪集群(基于Redis官方Cluster集群模式版本redis-5.0.10)

    文章目录 Redis简介 什么是redis redis的优点 Redis集群都有哪些模式 主从复制(Master-Slave Replication) 哨兵模式(Sentinel) Redis官方 C ...

  3. Redis几种集群模式

    此文由转载 https://blog.csdn.net/wy0123/article/details/79583506 现在越来越多的项目都会利用到redis,多实例redis服务比单实例要复杂的多, ...

  4. redis学习之集群部署

    redis学习之集群部署 1.Redis主从架构 1.1.主从复制原理 1.2.主从复制优缺点 1.3.redis主从架构搭建,配置从节点步骤 1.4.校验结果 1.5.数据部分复制 2.Redis哨 ...

  5. redis高可用集群

    一.redis集群方案比较 主从哨兵模式 redis3.0之前的版本实现集群一般采用的方案是借助哨兵sentinel工具来监控master节点的状态,如果master主节点异常,则会做主从切换,将一台 ...

  6. 部署Redis高可用集群

    目录 部署Redis高可用集群 Redis集群环境 拓扑结构 IP地址 环境准备 工作原理 创建Redis集群 部署管理主机 redis-trib.rb脚本 redis服务器开启集群功能 管理主机创建 ...

  7. redis 04:Redis高可用集群

    文章目录 一.Redis集群方案比较 二.Redis高可用集群搭建 三.Java操作redis集群 四.Redis集群原理分析 五.集群伸缩 5.1 集群扩展 5.1 缩容集群 六.总结 以下参考了图 ...

  8. Redis高可用集群部署和集群扩展

    文章目录 一.前言 二.集群配置 2.1 说明 2.2 配置 2.3 启动redis 2.4 集群操作 2.5 验证集群 2.5.1 springboot配置文件 2.5.2 代码测试 2.5.3 集 ...

  9. Redis开发及集群

    Redis开发 中文网站:http://www.redis.net.cn/ 1.     Redis 简介 REmote DIctionaryServer(Redis) 是一个由Salvatore S ...

  10. Redis主从复制和集群配置系列之四

    非常感谢  http://blog.csdn.net/dc_726/article/details/48552531 Redis技术学习 https://www.itkc8.com 全面剖析Redis ...

最新文章

  1. 洗礼灵魂,修炼python(85)-- 知识拾遗篇 —— 深度剖析让人幽怨的编码
  2. Swift 单元测试
  3. 结构化异常捕获空指针异常
  4. Python Web部署方式总结
  5. java m4a文件拼接_面试官:为啥不提倡字符串拼接?看阿里java开发手册怎么说
  6. dataframe 列名重新排序
  7. 多重继承与虚继承编程实验
  8. TCP/IP 三次握手和四次挥手
  9. DOCKER基础技术:LINUX NAMESPACE(上)
  10. 汽车行业如何进行数字化转型
  11. 清华郝景芳:中国教育还欠缺什么?如何弥补当下教育的不足? (公号回复“郝景芳”下载PDF典藏版)
  12. 49种软件验收测试方法大分享,快来看
  13. 数千 npm 账号使用域名过期的邮箱,涉及 8494 个包
  14. 杭州电子科技大学计算机科学与技术专业排名,杭州电子科技大学计算机科学与技术研究生专业排名...
  15. 一、Linux 教程-基础
  16. 打印绕圈矩阵(C语言风格的代码)
  17. LSB利器-zsteg
  18. LDO稳压器详解(一)-参数概念
  19. Oracle笔记之期末总复习
  20. 单位转换html代码,JavaScript实现长度单位转换

热门文章

  1. 全球光伏多晶硅价格上涨 中美贸易纠纷不断
  2. php 判断字数,php 如何统计中文字数
  3. PS:PS将彩色相片变成纯黑白色
  4. 内网穿透的几种方式-免费与收费(钉钉、Frp、花生壳、nat123)
  5. 相关系数——皮尔逊相关系数的公式及其理解
  6. 联想计算机一键恢复出厂设置,联想电脑Win7系统怎么一键恢复出厂设置步骤?...
  7. 如何在BIOS中设置RAID?
  8. c java python sql是什么意思_讲解:COIT12206、program、Java、Python、c/c++Python|SQL
  9. 200个英语常用词根词缀
  10. a指定许可服务器无效,错误的hostid与许可证服务器