首页 > 数据库 >数据库中间件-He3Proxy

数据库中间件-He3Proxy

时间:2024-04-27 14:56:35浏览次数:18  
标签:原生 负载 数据库 中间件 支持 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页面管理中间件功能

标签:原生,负载,数据库,中间件,支持,He3Proxy
From: https://www.cnblogs.com/lgx5/p/18162042

相关文章

  • access数据库批量更新中无法使用replace,出现“表达式中 'replace' 函数未定义”的替代
    如果我们想要批量修改数据库table_name表中aa字段中数据,将“|bbbb”删除sql的批量更新中,通用语法是:UPDATEtable_nameSETaa=REPLACE(aa,'|bbbb','')但是,如果是access数据库,就可能出现以下的报错信息:MicrosoftJETDatabaseEngine错误'80040e14'表达式中'replace'函......
  • 陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密
    陈畅亮搞的专利在Windows上利用加解密DLL模块对数据库连接字符串进行加解密  这种专利权人是公司,个人是发明人,专利年费是申请人先垫付,然后公司报销了,这个专利本身就不属于员工的这个是公司是专利权人, 使用权是公司,如果想要维持权利的话,需要缴纳年费,专利发明现在一个市......
  • 在数据库的查询与更新中,CHARINDEX与instr的区别?
    在数据库和字符串处理的领域中,CHARINDEX和INSTR是两个常用的函数,它们都用于查找子字符串在主字符串中的位置。尽管这两个函数在功能上有所重叠,但它们之间存在一些关键的区别,这些区别可能会影响开发者在选择使用哪一个函数时的决策。首先,CHARINDEX是SQLServer中的一个内置函数,它......
  • 数据库——一些复健(主要是约束和索引相关练习)
    重要的是练习,写作业时写的絮絮叨叨就忽略吧。  强化学习2                    【练习9.1】在stusys数据库中创建course1表,以列级完整性约束方式定义主键。  【练习9.2】在stusys数据库中创建course2表,以表级完整性约束方式定义主键。  ......
  • mysql 数据库时区问题
    当数据库时区设置为国际时区时jdbc-url中添加以下配置serverTimezone=GMT%2B0Java服务中设置东八区TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));使用mybatis红的mapper.xml<resultMapid="BaseResultMap"type="cn.xs.qxj.mtk.pojo.XpCallInfo"......
  • 实验三 数据库完整性
    第1关:定义s表完整性createtables(snochar(2)PRIMARYKEY,snamevarchar(10)notnull,statusint,cityvarchar(10)DEFAULT'天津');第2关:定义p表完整性usedemo;#代码开始#定义p表;pno主码,pname非空、color只能取红、蓝、绿createtablep(......
  • 二十三、数据库性能优化方案
    数据库的优化方案核心本质有三种:减少数据量、用空间换性能、选择合适的存储系统,这也对应了开篇讲解的慢的三个原因:数据总量、高负载、查找的时间复杂度。 一、减少数据量数据序列化存储、数据归档、中间表生成、分库分表。二、用空间换性能该类型的两个方案都是用来应对......
  • Spring Boot应用中如何动态指定数据库,实现不同用户不同数据库的场景
    当在SpringBoot应用程序中使用SpringDataJPA进行数据库操作时,配置Schema名称是一种常见的做法。然而,在某些情况下,模式名称需要是动态的,可能会在应用程序运行时发生变化。比如:需要做数据隔离的SaaS应用。所以,这篇博文将帮助您解决了在SpringBoot应用程序中如何设置动态S......
  • 1、oracle数据库-导入导出
    Oracle数据库的导入导出主要有三种方式:使用pl、sql开发工具导入导出dmp文件方式:这是最常用的导入导出方式,生成的dmp文件是二进制的,可以跨平台操作,并且包含权限信息,也支持大字段数据,使用最广泛。在导出语法中,可以通过指定“full=y”和“ignore=y”参数来进行整个数据库的......
  • 【Qt 专栏】Qt:SQLite数据库操作示例
    转载自:https://blog.csdn.net/qq_40344790/article/details/129521573作者:DevFrank(CSDNC/C++ 优质创作者)1. sqlite介绍SQLite 是一种轻量级的嵌入式关系型数据库管理系统,它是一个开源的、零配置的、自包含的、事务性的SQL数据库引擎。SQLite的设计目标是简单、高效、可......