探秘OceanBase通信协议层-如何实现像访问传统数据库一样访问分布式数据库 (探秘森林深处的秘密)

文章编号:11091 更新时间:2024-03-16 分类:互联网资讯 阅读次数:

资讯内容

Part1前言

探秘OceanBase通信协议层如何实现像

OceanBase是由阿里巴巴和蚂蚁金服完全自主研发的分布式关系型数据库,拥有极致的在线伸缩和负载均衡、高可用和强一致的技术能力。在使用OceanBase时,除了关注SQL功能和性能之外,理解OceanBase的通信协议层也至关重要。OceanBase通信协议层是数据库内核和客户端应用的桥梁。这个桥梁的设计就是通用,是客户端无需为了OceanBase做改动而可以直接访问。OceanBase同时兼容Oracle模式和MySQL模式的2.1版本,本文将系统性的介绍客户端如何使用和区分各种模式。

OceanBase作为分布式数据库,不同于传统的单机或主备数据库。在通信协议层上,首要的区别是节点间的通信,传统数据库大多不设计节点间的通信。客户端方面,OceanBase同时兼容MySQL和Oracle租户模式是一大特色和亮点。和传统数据库最大的不同是,数据库是分布式,副本的主被打散分布在不同的Server上,因此在客户端访问OceanBase时,也和传统数据库不同。

OceanBase作为分布式数据库在通信协议实现上更加复杂,但是对于客户端而言,所有的复杂被完美的通过OBProxy和OceanBase内核包装起来,可以像访问传统数据库一样访问分布式数据库。如何做到像访问传统数据库一样访问分布式数据库?待本文为您逐一解答。

Part2框架介绍

OceanBase的通信协议主要包含两个方面:与客户端的通信,以及集群内部的通信。同时依赖于网络通信底层的Libeasy库。OceanBase兼容MySQL协议,内部实现为ObMysql。集群内部通信方式为RPC。OceanBase网络传输框架—Libeasy应用和协议层透过网络和其他的客户端或者服务器通信,那么需要一个Listener来监听网络特定网络端口的请求,同时请求处理后需要将结果response通过端口发送给客户端和服务器。这个过程是不确定的,比如客户端可能一直没有发送请求,那么实现Listener监听端口的线程,要么轮循查询是否有新请求(效率低,浪费CPU时间片)要么选择消息通知的方式。消息通知的方式就需要多个线程(任务)来接收对应的消息。

目前最好的方式是通过系统APIepoll()来注册感兴趣和关心的事件,然后等待通知,通知收到后知道事件发生,同时也了解到事件发生的具体队列,可以直接去队列取数据。在此基础上的标准事件库可以大大简化代码量并提高效率。比如Libev/Libevent等等。Libev是Linux上的事件驱动框架—POSIXeventLibray。Libev的目的就是实现对不同操作系统API层的封装,提供一种框架来实现多路复用和异步I/O。

在说通信协议之前首先要明确OceanBase的通信是构建在Libeasy库之上的,Libeasy是构建在libev库之上的,对异步I/O,网络事件进行了更好的封装。Libeasy是sharednothing的库,同时使用协程来管理任务调度,减少线程用户模式到内核模式的contextswitch非常的高效。所以它很适合与分布式结合。基本上网络框架都是基于callback的方式。在此不作展开,可以参考libev或者netty的设计。

在此不作过多的涉入。OceanBase是原生的分布式数据库,多副本采用Paxos协议形成一个Leader多个Follower的设计。数据副本按照Leader、Follower方式分布在多台服务器上。客户端写/强读操作需要访问分区副本的Leader。


大家为什么都说说OceanBase4.0开启了国产数据库新的里程碑?

OceanBase 4.0重新审视数据库与分布式系统两个领域最基础的设计,全新推出业内首个单机分布式一体化架构。在单机部署时,自适应日志流技术将只触发一个日志流,用户操作不需要分布式事务,不损失性能。需要分布式部署时,自适应日志流技术将会为每台机器触发专属的日志流。实现多机性能自动扩展。可以说OceanBase 4.0打破了分布式技术的不可能,实现了首个单机分布式体化架构,真正做到可以像单机数据库一样使用。

针对这一现状,有这么一群人从开始放弃了在互联网大厂的高薪工作,历经十余年在分布式数据库的深耕取得了一个又一个突破。从0到1开创原生分布式数据库,坚持自主研发,坚持长期主义,坚持开放,从根本上去解决海量数据管理的问题。历经12年时间,OceanBase4.0通过海量的业务场景打磨,产品不断选代,使用成本得到极大降低,部署更加便捷。OceanBase4.0开启了国产数据库新的里程碑。可单机可分布,可大可小,跟火影忍者一样,可合体可分散。

一、十年积累,厚积薄发:OceanBase发展回顾

在科技互联网时代,芯片和操作系统是大家熟知的技术高峰,而数据库由于概念难懂,大众对其认知并不深刻。实际上数据库在我们的生产和生活中发挥着重要的作用,大到银行要存放所有客户的信息,小到我们身边的一个小超市要存储每件商品的信息,这些都离不开数据库在背后作为支撑。然而,国内企业的数据库大多数都是采用国外的Oracle和IBM的传统关系型数据库,仅Oracle一家在全球市场占据了超过50%的份额。根据科技日报发布的制约我国工业发展的35项技术中,数据库管理系统名列其中,由此可见数据库也是我国亟待解决得“卡脖子”技术之一。

二、曾经的分布式。是为了处理海量业务场景应运而生

面对当今数据爆炸的时代,数据库是实现海量数据管理最核心的底座。以OceanBase为代表的分布式数据库的应运而生有着其强大的时代背景。首先是数据需求鼓励升级,移动支付和大数据带来的数据体量增长和数据形态变化,要求数据库底层能够处理选代升级的新技术。随着国内信息终端规模的扩大和网上购物的高覆盖率给数据库发展提供了沃土,反过来要求数据库具备处理海量业务的能力。还有一点值得一提的是各监管机构、政策制定方均重点布局针对数据库分布式转型、应用创新战略重点行业用户逐步增强数据库应用创新意识,防范潜在安全风险,这进一步标志着分布式数据库的产业持续壮大。

三、而现如今的单机分布式一体化架构,引领行业发展

一个产品雄厚的技术实力是必不可少的支撑,但是最终还是要面向客户需求的。Oceanbase4.0真正实现在单机性能、灵活性,成本和故障恢复等方面全面的突破。可以说OceanBase4.0开启了国产数据库新的里程碑。可单机部署,可分布,可大可小,可扩容可缩容

一个产品雄厚的技术实力是必不可少的支撑,但是最终还是要面向客户需求的。我们国家的一大特点就是中小企业特比多。那么针对这种情况,可单机可分布,可大可小,可合体可分散的特性就非常便于中小企业的灵活部署。在以往使用传统分布式数据库为实现分布式特性,往往付出很多额外的代价,使得业务在仅需要单机部署时,功能和性能大打折扣。典型场景如在业务修改的数据仅涉及到单机时,仍需要付出分布式事务的开销,导致整体性能低下。或无法支持大事务,业务使用场景受限等。

与oracle等国外数据库相比,没有大的技术创新,也不会出现弯道技术上的超车。 最大的贡献:越来越普遍。 不要小看“一般”这个词,它代表了一个公司的技术能力、质量体系、服务能力都达到了很高的水平。 也可以逐步服务于各行业的一些核心业务。 综上所述,这个领域的中国人在路上。 从技术上讲,这并不意味着国产数据库一定落后很多。 国内数据库的重点是先服务国内重要客户,先蚕食国外数据库的市场,从而拥有主动权和话语权。 现在是什么阶段,就像过去一样,国产手机正在逐渐赶超国外手机厂商。 现在,你可以先用小米一代。 来日本久一点吧。

在成本上比传统数据库低50-70%大大降低中小企业的替换成本近年来数字经济迅猛发展,中小企业更加迫切的需要进行数字化转型。如何降低数字化进程中的成本,不仅是中小企业考虑的重要问题,也是OceanBase力求达到的目的。基于LSM-Tree的高压缩引擎,OceanBase 4.0实现存储成本降低70%-90%;以支付宝为例,用OceanBase原生分布式数据库替代Oracle数据库之后,单副本数据可以做到Oracle的1/7,其计算资源投入也降低为原来的1/12,相比Oracle,仅存储一项,相比Oracle节省存储成本约20亿元,相当于每账户成本节省了90%。

首次将故障恢复时间从30秒降低到8秒现在的数据中心对业务的连续性有苛刻要求,但是故障往往是不可避免的。一旦发生了故障就需要启动备份机制,确保业务的连续性。OceanBase4.0首次实现了RTO<8s,真正将故障恢复时间从分钟级(30s)降低到秒级(8s),帮助业务系统更快恢复,最大程度减少业务影响,给业务带来持续可用的能力。

数据库架构选型与落地,看这篇就够了

随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的 磁盘 、 IO 、 系统开销 ,甚至 性能 上的瓶颈,而单台服务器的 资源终究是有限 的。

因此在面对业务扩张过程中,应用程序对数据库系统的 健壮性 , 安全性 , 扩展性 提出了更高的要求。

以下,我从数据库架构、选型与落地来让大家入门。

数据库会面临什么样的挑战呢?

业务刚开始我们只用单机数据库就够了,但随着业务增长,数据规模和用户规模上升,这个时候数据库会面临IO瓶颈、存储瓶颈、可用性、安全性问题。

为了解决上述的各种问题,数据库衍生了出不同的架构来解决不同的场景需求。

将数据库的写操作和读操作分离,主库接收写请求,使用多个从库副本负责读请求,从库和主库同步更新数据保持数据一致性,从库可以水平扩展,用于面对读请求的增加。

这个模式也就是常说的读写分离,针对的是小规模数据,而且存在大量读操作的场景。

因为主从的数据是相同的,一旦主库宕机的时候,从库可以 切换为主库提供写入 ,所以这个架构也可以提高数据库系统的 安全性 和 可用性 ;

优点:

缺点:

在数据库遇到 IO瓶颈 过程中,如果IO集中在某一块的业务中,这个时候可以考虑的就是垂直分库,将热点业务拆分出去,避免由 热点业务 的 密集IO请求 影响了其他正常业务,所以垂直分库也叫 业务分库 。

优点:

缺点:

在数据库遇到存储瓶颈的时候,由于数据量过大造成索引性能下降。

这个时候可以考虑将数据做水平拆分,针对数据量巨大的单张表,按照某种规则,切分到多张表里面去。

但是这些表还是在同一个库中,所以库级别的数据库操作还是有IO瓶颈(单个服务器的IO有上限)。

所以水平分表主要还是针对 数据量较大 ,整体业务 请求量较低 的场景。

优点:

缺点:

四、分库分表

在数据库遇到存储瓶颈和IO瓶颈的时候,数据量过大造成索引性能下降,加上同一时间需要处理大规模的业务请求,这个时候单库的IO上限会限制处理效率。

所以需要将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。

分库分表能够有效地缓解单机和单库的 性能瓶颈和压力 ,突破IO、连接数、硬件资源等的瓶颈。

优点:

缺点:

注:分库还是分表核心关键是有没有IO瓶颈 。

分片方式都有什么呢?

RANGE(范围分片)

将业务表中的某个 关键字段排序 后,按照顺序从0到一个表,到一个表。最常见的就是 按照时间切分 (月表、年表)。

比如将6个月前,甚至一年前的数据切出去放到另外的一张表,因为随着时间流逝,这些表的数据被查询的概率变小,银行的交易记录多数是采用这种方式。

优点:

缺点:

HASH(哈希分片)

将订单作为主表,然后将其相关的业务表作为附表,取用户id然后 hash取模 ,分配到不同的数据表或者数据库上。

优点:

缺点:

讲到这里,我们已经知道数据库有哪些架构,解决的是哪些问题,因此, 我们在日常设计中需要根据数据的特点,数据的倾向性,数据的安全性等来选择不同的架构 。

那么,我们应该如何选择数据库架构呢?

虽然把上面的架构全部组合在一起可以形成一个强大的高可用,高负载的数据库系统,但是架构选择合适才是最重要的。

混合架构虽然能够解决所有的场景的问题,但是也会面临更多的挑战,你以为的完美架构,背后其实有着更多的坑。

1、对事务支持

分库分表后(无论是垂直还是水平拆分),就成了分布式事务了,如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价(XA事务);如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担(TCC、SAGA)。

2、多库结果集合并 (group by,order by)

由于数据分布于不同的数据库中,无法直接对其做分页、分组、排序等操作,一般应对这种多库结果集合并的查询业务都需要采用数据清洗、同步等其他手段处理(TIDB、KUDU等)。

3、数据延迟

主从架构下的多副本机制和水平分库后的聚合库都会存在主数据和副本数据之间的延迟问题。

4、跨库join

分库分表后表之间的关联操作将受到限制,我们无法join位于不同分库的表(垂直),也无法join分表粒度不同的表(水平), 结果原本一次查询就能够完成的业务,可能需要多次查询才能完成。

5、分片扩容

水平分片之后,一旦需要做扩容时。需要将对应的数据做一次迁移,成本代价都极高的。

6、ID生成

分库分表后由于数据库独立,原有的基于数据库自增ID将无法再使用,这个时候需要采用其他外部的ID生成方案。

一、应用层依赖类(JDBC)

这类分库分表中间件的特点就是和应用强耦合,需要应用显示依赖相应的jar包(以Java为例),比如知名的TDDL、当当开源的 sharding-jdbc 、蘑菇街的TSharding等。

此类中间件的基本思路就是重新实现JDBC的API,通过重新实现 DataSource 、 PrepareStatement 等操作数据库的接口,让应用层在 基本 不改变业务代码的情况下透明地实现分库分表的能力。

中间件给上层应用提供熟悉的JDBC API,内部通过 sql解析 、 sql重写 、 sql路由 等一系列的准备工作获取真正可执行的sql,然后底层再按照传统的方法(比如数据库连接池)获取物理连接来执行sql,最后把数据 结果合并 处理成ResultSet返回给应用层。

优点

缺点

二、中间层代理类(Proxy)

这类分库分表中间件的核心原理是在应用和数据库的连接之间搭起一个 代理层 ,上层应用以 标准的MySQL协议 来连接代理层,然后代理层负责 转发请求 到底层的MySQL物理实例,这种方式对应用只有一个要求,就是只要用MySQL协议来通信即可。

所以用MySQL Navicat这种纯的客户端都可以直接连接你的分布式数据库,自然也天然 支持所有的编程语言 。

在技术实现上除了和应用层依赖类中间件基本相似外,代理类的分库分表产品必须实现标准的MySQL协议,某种意义上讲数据库代理层转发的就是MySQL协议请求,就像Nginx转发的是Http协议请求。

比较有代表性的产品有开创性质的Amoeba、阿里开源的Cobar、社区发展比较好的 Mycat (基于Cobar开发)等。

优点

缺点

JDBC方案 :无中心化架构,兼容市面上大多数关系型数据库,适用于开发高性能的轻量级 OLTP 应用(面向前台)。

Proxy方案 :提供静态入口以及异构语言的支持,适用于 OLAP 应用(面向后台)以及对分片数据库进行管理和运维的场景。

混合方案 :在大型复杂系统中存在面向C端用户的前台应用,也有面向企业分析的后台应用,这个时候就可以采用混合模式。

JDBC 采用无中心化架构,适用于 Java 开发的高性能的轻量级 OLTP 应用;Proxy 提供静态入口以及异构语言的支持,适用于 OLAP 应用以及对分片数据库进行管理和运维的场景。

ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由 Sharding-JDBC 、 Sharding-Proxy 和 Sharding-Sidecar (计划中)这3款相互独立的产品组成,他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。

ShardingSphere提供的核心功能:

Sharding-Proxy

定位为透明化的 数据库代理端 ,提供封装了 数据库二进制协议的服务端版本 ,用于完成对 异构语言的支持 。

目前已提供MySQL版本,它可以使用 任何兼容MySQL协议的访问客户端 (如:MySQL Command Client, MySQL Workbench, Navicat等)操作数据,对DBA更加友好

向 应用程序完全透明 ,可直接当做MySQL使用。

适用于任何兼容MySQL协议的客户端。

Sharding-JDBC

定位为 轻量级Java框架 ,在Java的JDBC层提供的额外服务。 它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为 增强版的JDBC驱动,完全兼容JDBC和各种ORM框架 。

以电商SaaS系统为例,前台应用采用Sharding-JDBC,根据业务场景的差异主要分为三种方案。

分库(用户)

问题解析:头部企业日活高并发高,单独分库避免干扰其他企业用户,用户数据的增长缓慢可以不分表。

拆分维度:企业ID分库

拆分策略:头部企业单独库、非头部企业一个库

分库分表(订单)

问题解析:订单数据增长速度较快,在分库之余需要分表。

拆分维度:企业ID分库、用户ID分表

拆分策略:头部企业单独库、非头部企业一个库,分库之后用户ID取模拆分表

单库分表(附件)

问题解析:附件数据特点是并发量不大,只需要解决数据增长问题,所以单库IO足以支撑的情况下分表即可。

拆分维度:用户ID分表

拆分策略:用户ID取模分表

问题一:分布式事务

分布式事务过于复杂也是分布式系统最难处理的问题,由于篇幅有限,后续会开篇专讲这一块内容。

问题二:分布式ID

问题三:跨片查询

举个例子,以用户id分片之后,需要根据企业id查询企业所有用户信息。

sharding针对跨片查询也是能够支持的,本质上sharding的跨片查询是采用同时查询多个分片的数据,然后聚合结果返回,这个方式对资源耗费比较大,特别是对数据库连接资源的消耗。

假设分4个数据库,8个表,则sharding会同时发出32个SQL去查询。一下子消耗掉了32个连接;

特别是针对单库分表的情况要注意,假设单库分64个表,则要消耗64个连接。如果我们部署了2个节点,这个时候两个节点同时查询的话,就会遇到数据库连接数上限问题(mysql默认100连接数)

问题四:分片扩容

随着数据增长,每个片区的数据也会达到瓶颈,这个时候需要将原有的分片数量进行增加。由于增加了片区,原先的hash规则也跟着变化,造成了需要将旧数据做迁移。

假设原先1个亿的数据,hash分64个表,现在增长到50亿的数据,需要扩容到128个表,一旦扩容就需要将这50亿的数据做一次迁移,迁移成本是无法想象的。

问题五:一致性哈希

首先,求出每个 服务器的hash值 ,将其配置到一个 0~2^n 的圆环上 (n通常取32)

其次,用同样的方法求出待 存储对象的主键 hash值 ,也将其配置到这个圆环上。

然后,从数据映射到的位置开始顺时针查找,将数据分布到找到的第一个服务器节点上。

一致性hash的优点在于加入和删除节点时只会影响到在哈希环中相邻的节点,而对其他节点没有影响。

所以使用一致性哈希在集群扩容过程中可以减少数据的迁移。

好了,这次分享到这里,我们日常的实践可能只会用到其中一种方案,但它不是数据库架构的全貌,打开技术视野,才能更好地把存储工具利用起来。

老规矩,一键三连,日入两千,点赞在看,年薪百万!

7年Java老兵,小米主题设计师,手机输入法设计师,ProcessOn特邀讲师。

曾涉猎航空、电信、IoT、垂直电商产品研发,现就职于某知名电商企业。

技术公众号 【架构师修行录】 号主,专注于分享日常架构、技术、职场干货,Java Goals:架构师。

交个朋友,一起成长!

oceanbase支持以下哪些类型的数据库负载

阿里开发的分布式关系型(SQL)数据库。 OceanBasea是阿里开发的分布式关系型(SQL)数据库,其目标是支持数百TB的数据量以及数十万TPS、数百万QPS的访问量,无论是数据量还是访问量,即使采用非常昂贵的小型机甚至是大型机,单台关系数据库系统都无法承受。

标签: OceanBase分布式数据库通信协议

本文地址: https://yihaiquanyi.com/article/bf456a843901fc8168e1.html

上一篇:这个高喊我不懂法的副书记谁提拔的这个高度...
下一篇:深度分析各种技术的应用场景与发展趋势深度...

发表评论