
新一轮油气资源评价数据库是建立在国家层面上的数据库,数据库设计首先立足于国家能源政策和战略制定的宏观要求,还要结合油气资源评价的工作特征和各个评价项目及资源的具体情况。使用当前最流行和最成熟的数据库技术进行数据库的总体结构设计。
数据库的设计以《石油工业数据库设计规范》为指导标准,以《石油勘探开发数据》为设计基础,借鉴前人的优秀设计理念和思路,参考国内外优秀的资源评价数据库和油气资源数据库的设计技术优势,结合本轮资源评价的具体特点,按照面向对象的设计和面向过程的设计相结合的设计方法,进行数据库的数据划分设计。
油气资源评价数据库要满足新一轮全国油气资源评价工作的常规油气资源评价、煤层气资源评价、油砂资源评价、油页岩资源评价四个油气资源评价的数据需求。进行数据库具体数据内容设计。
并且,数据库的设计要为油气资源评价的快速、动态评价和远程评价工作的需求保留足够数据扩展接口,数据库具有良好开放性、兼容性和可扩充性。
(一)数据划分
数据库内存放的数据将支持资源评价的整个过程。为了能更好地管理库中数据,需要对整个过程中将用到的数据进行分类管理。具体分类方式如下(图4-11):
图4-11 数据分类示意图
1.按照应用类型划分
按照数据在资源评价过程中的应用类型划分,可以划分为基础数据、参数数据和评价结果数据。
基础数据是指从勘探生产活动及认识中直接获取的原始数据,这些数据一般没有经过复杂的处理和计算过程。如分析化验数据、钻井地质数据、盆地基础数据等。这些数据是整个评价工作的基础。
参数数据是指在评价过程中各种评价方法和软件直接使用的参数数据。
评价结果数据是指资源评价中产生的各种评价结果数据,如资源量结果数据、地质评价结果数据等。
2.按照评价对象划分
本次评价共分为大区、评价单元、计算单元三个层次,在研究中又使用了盆地、一级构造单元,在评价对象总体考虑中按照评价对象将数据划分为大区、评价单元、计算单元等类型。
3.按照获取方式划分
按照获取方式可以将数据分为直接获取、研究获取、间接获取几类。
4.按照存储类型划分
按照存储类型可以将数据划分为结构化数据和非结构化数据。
结构化数据是指能够用现有的关系数据库系统直接管理的数据,进一步又可以分为定量数据和定性数据两类。
非结构化数据是指不能用现有的关系数据库系统直接管理和 *** 作的数据,它必须借助于另外的工具管理和 *** 作。如图件数据、文档数据等。
库中数据类型的划分共分六个层次逐次划分,包括:数据存储类型→资源类型→评价对象→应用→获取方式→数据特征。
对于结构化存储的数据在应用层分为三类:基础数据、中间数据和结果数据,基础数据中包含用于类比的基础数据、用于统计分析的基础数据和直接用于公式运算的基础数据;结构化存储的数据在获取方式上可以继续划分,其中,用于公式运算的数据可以细化为专家直接录入、由地质类比获取、通过生产过程获取、通过地质研究过程获取及其他方式。中间数据可以从以下方式获取:标准、统计、类比、参数的关联。结果数据的获取有两种方式:公式运算结果和通过钻井、地质、综合研究等提交的文字报告。
对于非结构化存储的数据在应用层分为两类:图形数据和文档数据。
图形数据在获取方式上可以继续划分成四种方式:通过工程测量数据获取(如地理图件、井位坐标数据等)、通过地质研究过程获取(如沉积相图、构造区划图等)、由综合研究获取(如综合评价图等)、其他方式。
图形数据在表现方式上又可以进一步分为有坐标意义的图形(如构造单元划分图、地理图、井位图等)、数值图(如产烃率曲线图、酐洛根热降解图等)和无坐标含义图(如剖面图)等。
文档数据是指评价过程中产生的各种报告、项目运行记录等。
(二)数据库结构
从业务需求上,根据数据用途、数据类型和数据来源,可将本次的油气资源评价数据库分为三级:基础库、参数库、成果库(图4-12)。其结构如下:
图4-12 数据库结构示意图
1.基础库
基础库是油气资源评价工作的最基础的原始数据,有实测数据(物探数据、测井数据、钻井数据、开发数据等)、实验数据和经验数据等。
确定基础数据实际上是一项涉及油田勘探、开发等领域的多学科的复杂工作,是油气资源评价工作的研究过程和研究成果在数据库中的具体表现方式。在设计数据库的过程中,需要与参数研究专家经过多次反复,才能最终确定基础数据库,确保基础数据库能满足目前所有评价工作中计算的需要。
2.参数库
参数库用于存储油气资源评价工作所用到的参数数据,评价软件,直接从参数库中提取参数数据,用于计算。参数数据由基础数据汇总而来,也可以由专家根据经验直接得到。
本次评价中所涉及的参数大致可以分为以下几类:①直接应用的参数;②通过标准或类比借用的参数;③通过研究过程或复杂的预处理得到的参数。
3.成果库
成果库用于存储资源评价结果,包括各种计算结果、各种文档、电子表格、图片、图册等数据。
数据库的体系结构采用分布式多层数据库结构,包括三个组成部分:应用服务层、应用逻辑层和数据服务层。
数据库体系结构如图4-13所示。
图4-13 体系结构结构图
(1)应用服务层:应用服务层包含复杂的事务处理逻辑,应用服务层主要由中间件组件构成。中间件是位于上层应用和下层服务之间的一个软件层,提供更简单、可靠和增值服务。并且能够实现跨库检索的关键技术。它能够使应用软件相对独立于计算机硬件和 *** 作系统平台,把分散的数据库系统有机地组合在一起,为应用软件系统的集成提供技术基础,中间件具有标准程序接口和协议,可以实现不同硬件和 *** 作系统平台上的数据共享和应用互 *** 作。而在具体实现上,中间件是一个用API定义的分布式软件管理框架,具有潜在的通信能力和良好的可扩展性能。中间件包含系统功能处理逻辑,位于应用服务器端。它的任务是接受用户的请求,以特定的方式向应用服务器提出数据处理申请,通过执行相应的扩展应用程序与应用服务层进行连接,当得到应用服务器返回的处理结果后提交给应用服务器,再由应用服务器传送回客户端。根据国内各大石油公司具体的需求开发相应的地质、油藏、生产等应用软件功能程序模块和各种算法模块。
(2)应用逻辑层:逻辑数据层是扩展数据服务层逻辑处理层,针对当前的底层数据库的数据结构,根据具体的需求,应用各种数据库技术,包括临时表、视图、存储过程、游标、复制和快照等技术手段从底层数据库中提取相关的数据,构建面向具体应用的逻辑数据库或者形成一个虚拟的数据库平台。逻辑数据层包含底层数据库的部分或全部数据处理逻辑,并处理来自应用服务层的数据请求和访问,将处理结果返回给逻辑数据层。
形成一个虚拟的数据库平台我们可以应用数据库系统中的多个技术来实现。如果系统中的一个节点中的场地或分片数据能够满足当前虚拟数据库,可以在应用服务层中使用大量的查询,生成一个以数据集结果为主的虚拟数据库平台,并且由数据集附带部分数据库的管理应用策略。或者对节点上的数据库进行复制方法进行虚拟数据库的建立。对与需要对多个节点上的数据库进行综合筛选,则要对各个节点上的数据库进行复制,合并各个复制形成一个应用逻辑层,从而建立一个虚拟数据平台。
(3)数据服务层:即数据库服务器层,其中包含系统的数据处理逻辑,位于不同的 *** 作系统平台上,不同数据库平台(异构数据库),具体完成数据的存储、数据的完整性约束。也可以直接处理来自应用服务层的数据请求和访问,将处理结果返回给逻辑数据层或根据逻辑数据层通过提交的请求,返回数据信息和数据处理逻辑方法。
(三)数据建设标准
1.评价数据标准
系统数据库中的数据格式、大小、类型遵从国家及行业标准,参考的标准如表4-23。
表4-23 数据库设计参考标准
续表
系统中数据的格式及单位参考《常规油气资源评价实施方案》、《煤层气资源评价实施方案》、《油砂资源评价实施方案》、《油页岩资源评价实施方案》及数据字典。
2.图形图件标准
对于地质研究来说,地质类图件是比较重要的。各种地质评价图形遵循以下标准(表4-24)。
表4-24 系统图形遵循的相关标准
系统对图形的要求为必须为带有地理坐标意义的、满足上述标准体系要求的矢量图形,且采用统一的地理底图。图形格式采用:MapGIS图形交换格式、GeoInfo图形格式、ArcInfo图形交换格式、MapInfo图形交换格式和GeoMap图形交换格式。
图件的比例尺要求:
全国性图件:1∶400万或1:600万
大区图件:1:200万
盆地图件:1:40万或1:50万
评价单元图件:1:10万或1:20万
图件的内容要求符合《常规油气资源评价实施方案》、《煤层气资源评价实施方案》、《油砂资源评价实施方案》和《油页岩资源评价实施方案》的规定。
(四)数据内容
数据库中存储的数据包括常规油气相关数据、煤层气相关数据、油砂相关数据和油页岩相关数据;还有可采系数研究涉及的数据,包括研究所需基础数据和研究成果数据;以及趋势预测相关数据。
随着时间和业务的发展,数据库中的数据量增长是不可控的,库和表中的数据会越来越大,随之带来的是更高的 磁盘 、 IO 、 系统开销 ,甚至 性能 上的瓶颈,而单台服务器的 资源终究是有限 的。
因此在面对业务扩张过程中,应用程序对数据库系统的 健壮性 , 安全性 , 扩展性 提出了更高的要求。
以下,我从数据库架构、选型与落地来让大家入门。
数据库会面临什么样的挑战呢?
业务刚开始我们只用单机数据库就够了,但随着业务增长,数据规模和用户规模上升,这个时候数据库会面临IO瓶颈、存储瓶颈、可用性、安全性问题。
为了解决上述的各种问题,数据库衍生了出不同的架构来解决不同的场景需求。
将数据库的写 *** 作和读 *** 作分离,主库接收写请求,使用多个从库副本负责读请求,从库和主库同步更新数据保持数据一致性,从库可以水平扩展,用于面对读请求的增加。
这个模式也就是常说的读写分离,针对的是小规模数据,而且存在大量读 *** 作的场景。
因为主从的数据是相同的,一旦主库宕机的时候,从库可以 切换为主库提供写入 ,所以这个架构也可以提高数据库系统的 安全性 和 可用性 ;
优点:
缺点:
在数据库遇到 IO瓶颈 过程中,如果IO集中在某一块的业务中,这个时候可以考虑的就是垂直分库,将热点业务拆分出去,避免由 热点业务 的 密集IO请求 影响了其他正常业务,所以垂直分库也叫 业务分库 。
优点:
缺点:
在数据库遇到存储瓶颈的时候,由于数据量过大造成索引性能下降。
这个时候可以考虑将数据做水平拆分,针对数据量巨大的单张表,按照某种规则,切分到多张表里面去。
但是这些表还是在同一个库中,所以库级别的数据库 *** 作还是有IO瓶颈(单个服务器的IO有上限)。
所以水平分表主要还是针对 数据量较大 ,整体业务 请求量较低 的场景。
优点:
缺点:
四、分库分表
在数据库遇到存储瓶颈和IO瓶颈的时候,数据量过大造成索引性能下降,加上同一时间需要处理大规模的业务请求,这个时候单库的IO上限会限制处理效率。
所以需要将单张表的数据切分到多个服务器上去,每个服务器具有相应的库与表,只是表中数据集合不同。
分库分表能够有效地缓解单机和单库的 性能瓶颈和压力 ,突破IO、连接数、硬件资源等的瓶颈。
优点:
缺点:
注:分库还是分表核心关键是有没有IO瓶颈 。
分片方式都有什么呢?
RANGE(范围分片)
将业务表中的某个 关键字段排序 后,按照顺序从0到10000一个表,10001到20000一个表。最常见的就是 按照时间切分 (月表、年表)。
比如将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的优点在于加入和删除节点时只会影响到在哈希环中相邻的节点,而对其他节点没有影响。
所以使用一致性哈希在集群扩容过程中可以减少数据的迁移。
好了,这次分享到这里,我们日常的实践可能只会用到其中一种方案,但它不是数据库架构的全貌,打开技术视野,才能更好地把存储工具利用起来。
老规矩,一键三连,日入两千,点赞在看,年薪百万!
本文作者:Jensen
7年Java老兵,小米主题设计师,手机输入法设计师,ProcessOn特邀讲师。
曾涉猎航空、电信、IoT、垂直电商产品研发,现就职于某知名电商企业。
技术公众号 【架构师修行录】 号主,专注于分享日常架构、技术、职场干货,Java Goals:架构师。
交个朋友,一起成长!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)