数据库中间件-He3Proxy

什么是数据库中间件?

随着互联网行业的蓬勃发展,业务访问量、数据量激增,传统数据库的单库、大表已成为业务发展的瓶颈,进而衍生出数据库主从实例、分库分表等方案,为减少数据库层变动对业务开发带来的复杂性,一种连接应用与数据库桥梁的工具孕育而生,即数据库中间件,它可以简单读写分离、分库分表等操作,并隐藏底层的实现细节,让应用层能够像操作单库单表一样操作多个数据库集群,主流的数据库中间件设计可以分为两类。

  • 服务端代理:中间件做为一个能独立部署运行的服务,应用层通过连接驱动与中间件建立连接,中间件负责与底层多数据库实例交互,负责处理读写分离、分库分表等逻辑,并将执行结果返回给应用层;典型代表如MyCat。
    • 优点:与应用开发语言无关、可支持多语言,对业务完全透明、无侵入;
    • 缺点:实现较复杂、难度大,性能损耗较大,需要考虑中间件自身的资源消耗及高可用等;
  • 客户端代理:此种模式实现一般是在连接池或数据库驱动上进行二次开发封装,驱动内部与多数据库实例建立连接,同样实现读写分离、分库分表等操作处理,并将结果聚合返回;典型代表如sharding-jdbc。
    • 优点:实现简单,天然去中心化不需要单独部署,性能损耗较低;
    • 缺点:驱动与开发语言绑定、不支持多语言,对应用有一定侵入、中间件版本升级代价较高;
中间件模式分类

为什么要自研数据库中间件?

近年来随着云计算产业日益成熟,加之云原生概念迅速普及并大力发展,云原生架构的运用不再局限于应用开发领域,基础软件领域也面临重构。在数据库领域中,各大云服务商也都推出了自己的云原生数据库,一般是一主多从的架构,如Aurora、PolarDB等,最近我们也开源了自研项目-云原生数据库He3DB,基于存算分离架构,提供高性能、高可用性、极致弹性、大容量、低成本等能力,因此云原生数据库对中间件的需求重点不再是分库分表,而更多的关注读写分离、数据读一致性、数据库集群管控能力等方面,通过中间件辅助将云原生数据库的核心能力更好的发挥出来,使用户能像使用单机一样使用云原生数据库,享受到成本更低、性能更好的体验。

He3Proxy从诞生之初其核心目标就是辅助He3DB,将其核心能力最大化、最优化、帮助其完善周边生态,因此除中间件基础功能外,He3Proxy需要结合He3DB架构、特性做特定开发,为用户提供更好的使用体验。这也是我们选择自研数据库中间件的主要原因。

技术选型及技术难点

当然自研也不代表我们要从零开始造轮子,由于人力、时间等因素限制,基础功能部分想借助已有开源软件来补充;He3DB是基于PostgreSQL改造开发而来,并且我们期望用户能像使用单机一样使用云原生数据库,因此中间件选择以服务端代理的方式提供,在技术选型时调研了PG生态常用的服务端代理模式的中间件工具,如下图所示:

中间件调研

其中与PG原生结合性更好的当属pgpool-Ⅱ,它提供了较好的PG兼容性及DB集群运维能力;ShardingSphere作为热度最高的开源中间件项目之一,也提供了对PG数据库的支持,并且在可观测性、数据分片等方面能力突出;但He3Proxy最终选择基于kingshard开发,kingshard无论在功能还是知名度方面相比以上两个项目都有不小的差距,并且kingshard是基于MySQL的中间件,读到这里你可能会越来越疑惑那为什么选择kingshard,回看自研中间件目的是为了服务于He3DB,我们不需要分库分表能力,我们只想找一个轻量级的底座框架进行衍生开发,对我们而言ShardingSphere、pgpool-Ⅱ工程过于庞大复杂,做为基础底座开发不太合适;并且Go语言原生支持高并发编程,执行效率、性能等方面卓越,与云原生生态体系结合更好,团队在Go语言技术储备较好,且团队去年有kingshard相关开发改造的经验,综合考虑kingshard更适合做He3Proxy的底座。

前面介绍客户端代理、服务端代理优缺点时提到服务端代理的实现难度更大,下面简单介绍下实现服务端代理模式的中间件需要解决哪些问题:

  • 通信协议:中间件要实现数据库通信协议,如PG、MySQL协议
  • 解析器:中间件要具备SQL语法解析能力,以便实现读写分离等功能
  • 负载均衡:中间件要具备主从架构下多个读节点的负载均衡能力,提高读节点资源利用率
  • 读一致性:对应用层提供读一致性数据
  • 数据库集群管理能力:当数据库节点故障、升级等发生时,中间件能对应用屏蔽异常,保证业务稳定性
  • ......

He3Proxy功能及愿景

He3Proxy秉承“连接·增强·智能”的目标,致力于打造成一款功能强劲、性能卓越的中间件项目,并以开源的方式共建生态,回馈用户。

He3Proxy架构图

如上是He3Proxy的功能架构图,目前已具备基础功能:

  • 支持PG协议连接。
  • 支持SQL读写分离。
  • 支持连接池管理,可复用已有后端数据库链接,减少建立链接时的性能损耗。
  • 支持多个slave,slave之间通过权值进行负载均衡。
  • 支持多个slave,slave之间通过节点负载情况进行负载均衡。
  • 支持显式事务内先读操作的负载均衡。
  • 支持强制读主库。
  • 支持所有请求均主库执行。
  • 支持配置proxy到后端数据库的最大连接数限制。
  • 支持SQL黑名单机制。
  • 支持通过配置hba文件,实现数据库安全访问权限控制。
  • 支持热加载配置文件,动态修改He3Proxy配置项。
  • 支持session读一致性,并根据节点负载情况进行负载均衡。(开发测试中)

并规划在未来提供更多能力(包括但不限于):

  • 支持读一致性,节点LSN信息维护到DB粒度
  • 支持根据冷热数据分布情况进行读节点选择
  • 整体性能调优,目标性能损耗15%以内
  • 支持注册中心(优先etcd)
  • 支持性能监控,如SQL执行时长、节点负载等
  • 支持对He3DB的管理功能,如节点扩缩容、故障切换等
  • 支持He3DB集群灰度升级
  • 支持流量管控,愿景DB订购参数不再是CPU、Mem、Disk而是所需的TPS、QPS
  • 支持Web页面管理中间件功能
posted @ 2024-04-27 14:43  每天进步多一点  阅读(14)  评论(0编辑  收藏  举报