当前位置: 首页 > 科技观察

向过去学习-你好,我是EverDB!

时间:2023-03-15 18:21:48 科技观察

大家好,我是EverDB!当我们第一次见面时,让我先自我介绍一下。我的正式名称是“安我分布式数据库系统”,不过朋友们更喜欢叫我“EverDB”。我是G线分布式家族的一员,肩负着分布式架构下实现数据库高可用和可扩展的重任。我的出生我的出生来得正是时候。在这个金融科技创新的时代,对数据库的大并发、高频访问和可扩展性的需求与日俱增,中心化数据库架构的局限和约束也逐渐显现。为满足业务发展需要,根据金融业务特点和分布式数据库产品特点,GBank技术人员采用了双轨并行策略。在推出分布式数据库产品的同时,他们会和合作伙伴一起打造一个具有自主知识产权的分布式数据库Database方案,我就这样诞生了。技术架构目前主流的分布式数据库技术方案有两种:一种是以中间层为核心,基于开源数据库自动分库分表的架构。MySQL、PostgreSQL等开源数据库都经过了长时间的生产磨练,产品功能比较稳定。中间层是需要独立打磨的部分,让分库分表对应用透明。国内在这个领域也有比较知名的产品,比如阿里的Cobar和TDDL,后来社区在Cobar的基础上改进了MyCAT,360开源了Atlas,我哥——万里开源了GreatDB。另一种是结合关系模型和NoSQL设计的NewSQL技术方案。它采用了sql在nosql之上的设计理念,保留了关系型数据库的SQL特性和事务特性,借鉴了NoSQL数据库的强扩展性设计理念,但是这个技术方案的开发时间比较短,而且在不断进化的过程。国内也有相应的数据库产品,比如PingCAP开源的TiDB,蚂蚁金服的商业数据库OceanBase。两种架构各有优势,在G线都有广泛的应用空间。在架构上,我属于第一种技术方案。但是,我不重复别人,我也不想重复自己!以上就是我完整的技术架构,由多个技术组件组成的分布式阵容,可谓进、攻、退、守。EDB-Grid:是我的核心组件,具有全局调度能力,负责全局的事务管理,分布式执行计划的生成和调度,集群的扩缩容,数据节点的自动切换。数据节点:是我的数据存储层,基于MySQL社区版,支持MySQL主从架构和MGR架构,主要负责数据存储、本地事务管理、本地结果集计算等。配置节点:基于在Zookeeper的实现上,它负责元数据的存储、同步以及运行状态下的配置管理。EDB-Control:是仪表盘和运维管理控制台,负责我的全生命周期管理。EDB-Bridge:一个数据同步工具,负责将我的数据增量同步到其他异构数据库。逃逸库:基于传统中心化数据库(目前为MySQL)的异构热备份,通过EDB-Bridge组件实时从我同步增量数据,用于增强新技术引入时的抗风险能力。当我在运营中不幸遇到“黑天鹅事件”时,可以通过逃库来提供核心业务能力,这是运营的安全带。没错,我就是通过多个组件的配合,实现了整个分布式数据库的调度、存储、计算、管理、数据迁移等能力!技术特点为了满足业务需求和集群的安全可靠性要求,练了一门武功,是时候大显身手了。一、数据分片分片(sharding)是我修炼过的核心武功。这里的Sharding主要是指watch的横向拆分。根据业务表的特点,可以分为全局表、普通表和分片表。全局表就像一个“数据字典”,它是系统中所有表都可能依赖的表。特点是数据量小,变化频率低,一个表可能与其他表产生关联查询;普通表是数据量比较小的表大的表,不经常变化,不和分表产生关联查询;分片表是数据量大或事务访问频率高的表,需要进行数据分片以分散数据部署或事务访问面。全局表会在集群中进行广播,使得联表查询尽可能在单个节点上完成,避免跨节点join,提高SQL执行效率和数据库性能。分片表主要支持四种分片算法:hash、mod、list、range。为了有效分散数据分布,hash和mod是常用的分片算法。当然你也可以自定义分片算法。EDB-Grid通过对分片键应用分片算法,将数据分布到集群中的不同节点,这种分布式部署对应用程序是透明的,就像使用单机数据库一样。在分布式数据库应用中,shardkey的选择至关重要。那么如何选择分片键呢?当然,应该选择离散性较好的字段作为shardingkey,不同的shardingtable尽量选择相同的shardingkey。是不是有点眼熟?同样的优化原理,通过避免分片表的跨节点连接,提高了SQL执行效率和数据库性能。2.SQL执行优化那么,你可能会问:“当从应用程序接收到一条SQL语句时,EverDB是如何处理的?”OK,我简单介绍一下SQL语句的处理流程和遵循的优化原则。收到应用SQL后,我会先分析SQL语法,然后生成分布式执行计划。在这个过程中,我会遵循一些优化原则,比如查询计算下推,跨节点并行计算,必要的SQL重写,提高执行效率等,最后根据执行计划合并并行计算的结果,返回合并结果到应用程序端。比如下图,这是一条排序分页的SQL。通过优化原理,按需改写SQL,然后将改写后的SQL并行发送到相关数据节点执行,最后合并数据节点返回的结果集。然后limit,得到最终的结果集返回给应用程序。3、通讯协议用什么client和我通讯?忘了告诉你,我是完美兼容MySQL通信协议的,可以兼容大部分常用的MySQL语法和函数,所以你只需要使用MySQL客户端,像单机一样使用就可以了像MySQL一样跟我说话!4.分布式事务众所周知,事务是关系型数据库非常重要的特性,也是大部分金融业务场景必备的功能需求。支持事务,需要实现事务的四个ACID特性,即原子性、一致性、隔离性、持久性。在分布式数据库中,当事务中的SQL存在跨节点操作,需要保证ACID特性时,称为分布式事务。由于涉及多节点操作,分布式事务的实现要比单机事务困难得多。当然,我支持分布式事务。简单的说,它是基于XA事务协议,使用两阶段提交(2PC)方式实现的。具体的实现细节这里不再赘述。分布式事务可以最大程度保证数据库操作的原子性,但是由于事务提交时需要多个数据节点协同,会出现“木桶效应”,事务的执行时间会依赖于数据执行效率最低的节点。当事务执行时间长时,事务间发生锁冲突或死锁的概率会增加。因此,对于事务的使用,建议遵循“能用事务就不用事务,能用小事务就不用大事务”的原则。5、数据库安全众所周知,数据是银行业务运营的核心资产,是企业的核心竞争力。敏感数据信息泄露,将直接影响客户利益,损害银行声誉,降低银行在同行业中的竞争力。因此,企业级的数据安全建设是重要且必要的。而我在数据库安全方面也有一些实践,主要是访问安全、安全审计、数据安全三个方面:通过支持账号密码访问、设置黑白名单、数据库表授权、访问时间段、流量控制、危险操作防御,登录失败保护增强,通讯ssl加密,实现访问安全;可对操作类型、操作对象、操作用户进行安全审计;支持数据加密,多副本数据多机房部署,增强数据安全性。6.所有组件的高可用对于高可用问题,如果设计的不好,那么DBA可能会受到波及,一定是伤痕累累。当然,这也会损害客户体验和银行的声誉。所以我也充分考虑了这一点,通过双机房部署、全组件冗余设计、自动故障检测、自动切换来实现整个集群的高可用。配置组件的高可用采用Zookeeper原生的高可用方案;EDB-Grid调度组件基本为无状态组件,通过F5或LVS实现负载均衡、故障感知、故障转移;数据节点通过MySQL增强的半同步复制技术实现数据的多副本,使用raft-like协议实现master节点的故障检测、leader选举、自动failover;而EDB-Control组件通过keepalived保证其高可用。另外我也支持读写分离,正在实践数据的动态扩容。同时,在安全性和可控性方面,我与国产ARM平台的适配也在紧锣密鼓地进行中。7.重要概念在EverDB领域,有几个重要概念是应该理解的,这样我们才有共同语言,对吧?DataServerDataServer与数据节点上的MySQLServer一一对应。不管是主库(Master)还是从库(Slave),都是EverDB的一个DataServer。这些服务器的地址和端口记录在EverDB的Grid层中。DataServer是Grid调度和切换的物理对象。DataSourceDataSource是EverDB中的一个逻辑概念。它将一个MySQL主从复制(或MGR)集群对应到Grid层的一个DataSource。对于应用程序,它隐藏了数据节点的复杂高可用配置。PartitionSchemePartitionScheme是EverDB实现分布式水平扩展和负载均衡的核心。它定义了分片策略并由多个数据源组成。EDB-Grid通过在分片键上应用分片策略,自动将分片表的数据分布到不同的DataSources中。通过这种方式,分片配置对应用程序变得简单和透明。DataSpaceDataSpace定义了EverDB中表与数据库(Schema)、DataSource、PartitionScheme的映射规则,表示数据对象与数据存储位置的对应关系。非碎片表可以通过名称映射到数据源;碎片表可以通过名称映射到PartitionScheme。总结一下EverDB中表的精彩旅程:首先,通过DataSpace中定义的名称匹配规则,将表映射到一个PartitionScheme或DataSource。如果是映射到PartitionScheme,那么就会按照PartitionScheme定义的分片规则,分散到不同的DataSource中。然后根据DataSource的定义,将表存储到特定的MySQL高可用集群中。通过以上四个层次的组合关系,逻辑概念层层落到物理节点上。这个怎么样?是不是很有趣?我的理想应该是远大的,理想依然存在。如果他们成真了怎么办?我还很年轻,还有很多能力需要培养,包括功能的丰富性、性能的提升、安全性的加固、服务的稳定性等等。所以我的理想是做一个简单、健壮、灵活的分布式数据库在部署上,在运维上智能化。如果你问我,我的旅程在哪里?我期待着冲破云霄!图文作者:李超、李潇潇、王丽丽、陈硕、郑皓光(左起)