私有协议是什么?
PolarDB-X作为阿里巴巴自主研发的云原生分布式数据库,通过将数据拆分到多个基于MySQL发展而来的存储节点DN,每个存储节点DN承担合适的并发、数据存储和计算负载,计算节点处理分布式逻辑,最终得到一个具有稳定可靠、高度扩展性的分布式关系型数据库系统。计算节点和存储节点之间的通信协议,即集群内部通信协议,是系统的重要组成部分。
PolarDB-X的前身为TDDL中间件,通过在应用端上采用Sharding技术,应对高速增长的数据量,由于后端统一为MySQL,中间的通信协议为传统MySQL的查询协议。1.0时代的DRDS+RDS的组合也延续了之前中间件的技术路线,同样采用MySQL的SQL查询协议作为计算节点和存储节点的数据传输协议。
虽然SQL表示查询具有简洁易读,不用关心后端存储的物理实现等优点,但对于进入2.0时代(云原生分布式数据库)的PolarDB-X来说,计算节点和存储节点存在更多的数据交互,存储节点也不仅仅承担存储和处理普通SQL查询的功能,这时传统的SQL查询协议便显得力不从心了。
传统的SQL协议基于一问一答的阻塞式模型,是针对C/S模式的应用而设计的,没有考虑两个节点间承载大量会话的需要。而目前常见的分布式系统,特别是分布式数据库,为了保证事务性,节点间需要维持多条处于不同事物的会话。因此分布式数据库在集群内部往往都会实现一套自己的通信协议,通常都会选择RPC方式实现。
例如OceanBase基于Libeasy库,实现了ObRPC,实现了集群内异步化通信。TiDB则直接使用了gRPC作为和TiKV的通信协议。为了充分发挥PolarDB-X底层存储的高级特性,同时解决传统SQL协议作为内部通信协议的局限性,私有协议应运而生。基于私有协议的加持,可以绕过传统的MySQLServer层的解析和优化开销,直接和底下的InnoDB/X-Engine存储引擎进行高效交互,同时扩展并支持了全局时钟协议交互、Plan计算下推等能力,这也使得PolarDB-X逐步脱离原有中间件的范畴,演变为云原生的分布式数据库。
PolarDB-X的私有协议作为计算节点和存储节点之间的桥梁,主要实现查询下发和结果回传等基础功能,同时针对一些常用的场景进行了特殊优化。私有协议不仅具备传统SQL接口执行SQL查询的功能,还能直接执行自定义的执行计划,使得计算节点和存储节点之间的交互更加灵活可控。同时为了提升网络交互性能,改善高并发多连接场景下稳定性,私有协议设计时也借鉴了RPC的处理思路,采用了异步化协议设计、会话连接解耦、实例级连接池、流量控制等机制,解决了大部分使用传统连接池遇到的问题,使得PolarDB-X的性能和稳定性都有所提升。
私有协议的设计和实现
兼容性扩展性
聊到网络通信协议,首先需要考虑的就是协议兼容性。作为分布式系统,整个系统的变更都不可能是一步完成的,在升级或变配过程中,都可能出现多个不同版本的客户端或服务端。特别是在PolarDB-X中,存在计算节点和存储节点,在进行升级时,每个节点都可能存在升级前后两个版本,若通信协议发生了升级,则需要协议具备向前向后兼容的能力。
PolarDB-X私有协议在设计时充分考虑了这种情况,除了定长的协议头,所有通信协议消息均使用protobuf进行序列化,即使新增了额外的字段,旧版本的节点也能正常工作。考虑到系统的演进,私有协议支持基于SQL语句的查询,实现对SQL接口的完全替换,这部分扩展了MySQL官方的MySQLXprotocol的实现,提供最大的兼容性。如下展示了PolarDB-X私有协议中SQL执行的message定义,在原有StmtExecute基础上,增加了一些额外字段,提升了会话上下文恢复速度,可避免通过额外SQL进行设置。
messageStmtExecute{optionalstringnamespace=3[default="sql"];requiredbytesstmt=1;repeatedPolarx.Datatypes.Anyargs=2;optionalbool