技术干货 | 人大金仓KFS基于分区索引的分片入库技术解析

news2025/1/17 23:10:09

8dc01618c30c0a07a5c725e0db777cd0.gif

在之前的文章《技术干货:人大金仓KFS精准过滤和分片并行入库技术解析》中,KFS利用分片并行入库技术,解决了某金融POC数据同步项目中数据入库持续积压问题。经过优化后,在200并发的压测场景中,整体同步性能指标从压测30分钟延迟10-20分钟,变为准实时同步,延迟2秒以内。

分片并行入库技术的核心原理是将原本需要顺序入库的数据,以事务为单位进行拆分,然后并行入库

a0e1bd4184a542411338d9e8ca111a4a.jpeg

引入分片并行入库特性后的入库逻辑

aa60ff47a020a34234947293a732b470.jpeg

举例:在原本单车道的路上,每辆汽车载客一人,为了提高通行效率修建为双车道或者多车道(双车道的目的地是同一个城市的不同站),将汽车按照随机或者轮询的方式分配到不同的车道上,从而提高通行效率。

但在另外一个金融项目中,由于客户的业务逻辑非常复杂,数据库表之间的关联盘根错节,为了配置“分片并行入库”,现场人员耗费了几天时间在表关联的梳理上。然而在成功配置“分片并行入库”方案后,整体的同步性能依然无法满足客户诉求。

1

问题深度定位

分片并行入库方案中,为了解决数据一致性问题,引入了Critical数据区的概念。在复杂的数据同步场景中,对整体性能和易用性带来了比较大的冲击。

1.1

 “Critical数据区”的性能瓶颈

KFS“Critical数据区”把需要处理具有多表关联事务的表标记为“Critical”,当处理“Critical”表的事务数据时,需要保证数据串行入库。比如下图所示的9个事务,假设每个事务入库需要1秒,如果使用3个通道并行入库,在不考虑数据有序性的情况下每个通道平均分得3个事务,总共需要3秒执行完成。

b911f5743b38dfd06892bbf8b6cbe3d2.jpeg

但是,如果表D被标记为“Critical”,处理所有事务就需要分为三个阶段:

阶段一:在处理事务5前,要等待所有通道中的数据处理完成;

阶段二:串行处理事务5,此时退化成单通道模型;

阶段三:事务5处理完成后,恢复成多通道模型,并行处理事务6~9。

0f254d4bb0bc9277da20a2b769b6e680.jpeg

举例:将“Critical”表事务比喻成一辆大货车,普通表事务比喻成一辆小轿车,在通过一个三车道的隧道时,普通小轿车可以并行通过,但是一旦大货车过此隧道时,整个隧道就只能允许大货车单独通过,并且在大货车进入隧道中时设置等待指示,不允许小轿车进入。等待大货车出隧道后,才允许小轿车并行通过。

上述整个事务处理中,事务1~4分3个通道并行处理,需要2次共耗时2秒,处理事务5单独耗时1秒,事务6~9分3个通道并行处理,需要2次共耗时2秒。所以整体耗时5秒,相比无“Critical”时耗时增加了60%。

实际上现场业务相对复杂,“Critical”表的事务频繁出现,导致了数据入库时并行和串行交替切换,即使配置了“分片并行入库”方案,性能提升效果也不好。

1.2

复杂业务场景中的新问题

引入分片并行入库技术后,KFS在应付简单业务的数据同步压测场景中游刃有余,但是在实际的复杂业务中还存在一些问题,比如:

(1)对同一张表的同一行数据先后做不同的操作可能引起数据不一致,例如:

  • 事务1:将表1中key=1数据的key修改为2

  • 事务2:将表1中key=2数据的key修改为3

如果两个事务被分配在不同分片中,就有可能出现事务2先执行导致最终数据修改失败。

举例:车队中有两辆车的乘客是一家人,并且希望父母和孩子能够在同一个车道到到达同一个站点,由先到站的父母带着后到站的孩子一起去旅行。如果这两辆车没有被分配到一个车道,就有可能导致孩子先到站并且后续父母和孩子没有到达一个站点,导致孩子无人接收,发生孩子丢失的悲剧。

(2)多表关联交叉事务如果分配在不同通道同时执行,可能产生死锁。

举例:车队中有两辆车分别有2位乘客,前面一辆车的的乘客为A孩子的父亲和B孩子;后面一辆车的乘客为B孩子的父亲和A孩子;原本计划到站后互相交换孩子,继续各自的旅程。如果这两辆车没有被分配到一个车道,就会出现两个父亲互相带着别人的孩子在错误的站点等待自己孩子的情形,谁也无法将孩子交还给对方,谁也无法领回自己的孩子。

(3)具有外键约束的表,如果分配在不同通道执行,可能产生数据入库异常。比如针对主外键依赖的两张表,总是希望被依赖表中的数据先插入,依赖表的数据后插入,才能不违反外键约束。如果有外键约束的两张表分配在不同通道,就可能导致依赖表的数据先插入,从而引发数据入库报错。

举例:车队中有两辆车的乘客是一家人,并且希望父母先到,孩子后到,由先到站的父母带着后到站的孩子一起去旅行。如果这两辆车没有被分配到一个车道,就有可能导致孩子先到站无人接收,发生孩子丢失的悲剧。

(4)由单通道改为多通道后,原本需要串行执行的事务被人为的并行起来。多个通道执行数据入库的性能不同,多分区如何记录断点,以及分区断点恢复也是一个棘手问题。

2

实战演练,终结行业痛点

针对以上问题,KFS 引入了“基于分区索引分片入库”方案,在完美解决以上问题的前提下,相较于无差别分片并行入库还没有性能损失。

以下我们将通过实际测试结果来验证在不同场景下“基于分区索引分片入库”方案和其他方案的性能差异。

2.1

模拟测试场景中的效果

2.1.1 测试模型

在数据库中建立5张表,使用Jmeter工具并行压测不同的事务数据,分别测试以下几种场景的性能:

(1)多表纯INSERT开启和关闭分片并行入库的性能对比;

(2)多表混合事务开启和关闭分片并行入库的性能对比;

2.1.2 测试环境

  • 硬件:X86、8核CPU、16GB内存、1TB NVME硬盘

  • 操作系统:CentOS 7.6

  • JDK:1.8

  • KES版本:V8R6

2.1.3 测试结果

  • 多表INSERT事务场景下入库性能对比

    5张表并发插入10万条insert数据(一条insert一个事务),可以看到纯INSERT小事务模型下,新引入的“基于分区索引分片入库”方案和之前无差别“分片并行入库”方案性能基本持平,相比较原始的单线程入库性能提升到3倍左右。

2f45234d08a42c8177cc009a0d3b804d.png

  • 多表混合事务场景下入库性能对比

    5张表并发执行增、删、改操作(约包含18%比例的多表混合事务,混合事务中包含1至5条SQL),合计50万条数据,可以看到由于多表混合事务的影响,之前无差别“分片并行入库”方案性能较原始的单线程入库性能已无多少优势,而新引入的“基于分区索引分片入库”方案较比原始的单线程入库性能提升到2.4倍左右。

d6ca2a107753a2c3a344d59c1abf4fb1.png

2.1.4 总结

“基于分区索引分片入库”方案,可以在不损失无差别分片并行入库方案性能的前提下,弥补无差别分片并行入库方案的缺陷。

2.2

客户问题解决效果

在配置了“基于分区索引分片入库”方案后,实际业务场景的表现效果和模拟测试基本一致,开启4通道并行入库后,入库性能基本达到了单通道的2倍多,原先的并发24小时业务延迟持续拉大,变为了准实时同步。

b8757d9f12581d3f910eff41a64510a8.png

3

极致性能背后的黑科技

3.1

关键技术

基于分区索引分片入库方案

引入Critical数据区概念的分片并行入库技术最大的问题是需要预先清楚业务场景,才能将正确的表放入Critical数据区中。针对实际业务动态变化的场景,可能出现因配置遗漏导致数据不一致性。本次,我们使用了一种基于分区索引自动分区的关键技术,在不降低性能的前提下,很好的解决了这些问题。

3.1.1 使用分区索引来指导事务分片

自动分区技术解决的关键问题是:维护未提交事务的信息。其核心原理为:分发事务时,根据分区索引确认分发的具体通道,最大限度的减少触发Critical数据区。

2d6911d77313c40c3d752412c0a1beb1.png

分区索引中仅记录了未提交的事务。数据同步过程中存在相互依赖的事务和总事务数量比起来,占比很小。

因此仅需要很小的内存空间,就解决掉了使用“Critical数据区的分片并行入库技术”中存在的需要客户自行配置Critical表的易用性问题。使分片并行入库技术向产品化更进了一步。

3.1.2使用分区屏障来解决分区失效问题

分区索引方案中当入库器写数据库速度不足(比如数据库性能瓶颈)时,一旦出现多表关联事件,会导致后续事件全部发送到同一分区,从而引发多分区机制的失效

为了解决多分区失效问题,又配套引入分区屏障机制,当某个分区队列满时,对此分区设置一个屏障,后续准备发送到此分区的数据暂时阻塞。入库器在写出事务,更新分区索引时,会自动检查当前分区的使用容量,如果使用容量小于某阈值(例如50%),则移除此分区上的屏障,允许后续事务被分发至次分区。

e8867bbc059856b41a95735f9d8f6a30.jpeg

使用了分区屏障机制后,有效解决了数据集中分发至某一分区时导致分区失效的连锁反应。

4

结语

在使用了分区索引和分区屏障技术后,KFS的并行分区入库技术走向成熟。KFS并行分区入库技术目前已成功被运用到多个关键项目中,帮助客户极大的缩短数据集成时间,提升业务系统的运行效率。

KFS作为一款自主研发的国产数据同步软件,深耕于各种国产化数据改造项目。面对每一次数据同步的性能挑战,奋力创新,更多黑科技已经蓄势待发,让我们拭目以待!

f791761cf9656df4049ad278a5c0eacb.png

供稿:产品研发中心

编辑:四喜

校对:日尧

0b9915b03594a3d9cecf92d010d6bef7.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117056.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于BP神经网络、RBF神经网络以及PSO优化的RBF神经网络进行数据的预测(Matlab代码实现)

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

IT30--IT之职能部门(3年之约已满)

IT作为一个职能部门,肯定跟业务不同,具体有哪些事情要做,我们一一道来。 年终规划的二三事 组织体系规划及梳理 预算编制 今天我们先来说说组织体系规划。 1 从愿景使命价值观到行动及思考方法 无论是企业还是部门,软文件建设肯…

【信息检索与数据挖掘期末笔记】(六)Link Analysis

Web图 将Web当做有向图 节点:网页 边:超链接 PageRank 不同网页的重要性是不同的,在web-graph中,节点之间的连接性有巨大的差异。我们根据链接结果来对网页进行排序 想法:用链接来投票 如果有更多的链接指向一个网…

Linux Shell 编程,Shell 变量详解

Linux Shell 编程,Shell 变量详解1.第一个shell脚本2.Shell 变量初探3.位置参数变量4.预定义变量1.第一个shell脚本 打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 hello.sh,扩展名为 sh(sh代表shell&#xff09…

【算法】面试题 - 链表(附讲解视频)

链表相关面试题876. 链表的中间结点206. 反转链表86. 分隔链表160. 相交链表141. 环形链表问题:快慢指针为什么一定会相遇142. 环形链表 II问题:如何确认入口237. 删除链表中的节点19. 删除链表的倒数第 N 个结点21. 合并两个有序链表23. 合并K个升序链表…

【记忆增强深度条件展开网络】

Memory-augmented Deep Conditional Unfolding Network for Pan-sharpening (面向全色锐化的记忆增强深度条件展开网络) 全色锐化旨在为遥感系统获取高分辨率的多光谱图像,基于深度学习的方法已经取得了显著的成功。然而,大多数…

使用iServer rest api如何实现构建巷道效果

作者:刘大 背景 在实际生产环境中,特别是在采矿,公路建设项目上,我们往往会接触下图所示的巷道,那么在Web端如何快速通过线数据构建巷道模型呢?下面我们来详细说下 使用方式 第一步: 在iServe…

反垃圾邮件系统|基于Springboot+vue 实现反垃圾邮件系统

作者主页:编程指南针 作者简介:Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容:Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

servlet(二)文件的上传

servlet实现文件的上传 文件上传是一个web应用常见的功能 比如:QQ头像,就使用了上传。 邮箱中也有附件的上传和下载功能。 OA系统中审批有附件材料的上传。 1.1前端需要有个form表单标签 methodpost请求 (因为post请求是没有长度限制,get…

Computer Graphics From Scratch - Chapter 7

系列文章目录 简介:Computer Graphics From Scratch-《从零开始的计算机图形学》简介 第一章: Computer Graphics From Scratch - Chapter 1 介绍性概念 第二章:Computer Graphics From Scratch - Chapter 2 基本光线追踪 第三章:Computer Gr…

新生儿喝奶后不要马上放回床上睡觉,为宝宝健康着想,先做1件事

看到一个问题,题主问,新生儿喝完奶能马上放回床上睡觉吗?可以吗?也许每个人都认为照顾新生儿是一件非常简单的事情,因为新生儿几乎整天都在睡觉。当他们饿的时候,他们会让他们的宝宝吃牛奶。他们吃饱了就要…

博客搭建教程(一):静态博客 GitHub + Gridea

同步blog文章 注册一个 Github 账号并创建仓库 注册Github账号 如果你没有 Github 的账号,那么可以进入 官网 开始注册(注意一下用户名的填写,如果不使用自定义域名,用户名将会是你的 Github 分配给你的域名,例如你的…

D. George and Interesting Graph(最大匹配)

Problem - 387D - Codeforces 乔治喜欢图表。最重要的是,他喜欢有趣的图。我们将假设一个有向图是有趣的,如果它符合以下标准。 该图不包含任何多弧。 有一个顶点v(我们称她为中心),这样对于图形u的任何顶点&#xff…

信息网络传播视听节目服务单位的设立与经营

一、行业准入 (一)网络视听业务准入范围 利用公共互联网(含移动互联网)向计算机、手机用户提供视听节目服务(不含交互式网络电视(IPTV)、互联网电视、专网手机电视业务)业务的&…

几个小设置让 mac 更好用

今天在 youtube 上看到一个视频[1],讲新 mac 到手后一定要做的几个设置,有几个之前我不知道的小设置,非常好用,看完马上就用上了。一些常用的就不列了,比如说设置点按、三指拖拽,不知道的可以去搜索了解&am…

【Python数据可视化】使用geoplotlib绘制地理空间数据

geoplotlib前言一、安装geoplotlib包二、读取csv数据使用1.点密度可视化2.直方图3. Voronoi图总结前言 ❤️❤️希望大家能多多点赞。❤️❤️ 需要数据集的可以评论。 Geoplotlib 是地理空间数据可视化的开源Python库,包含了大量的地理空间可视化操作&#xff0c…

131. 分割回文串

131. 分割回文串 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1: 输入:s “aab” 输出:[[“a”,“a”,“b”]…

青少年等级考试【Python通关干货】(二级)

青少年等级考试【Python通关干货】(二级)1.列表类型的概念 2.序列的通用操作 3.可变序列及列表的通用操作 4.列表的特有操作 5.元组类型的概念与操作

激活学习:一种挑战反向传播的生物启发算法

激活学习(activation learning)是一种生物启发的简单本地学习规则构建的前向无监督通用模型,它的核心是构建多层神经网络使得网络输出激活强度能反映输入的相对概率大小。并且,它在一些任务上达到并超过反向传播的表现。激活学习的概念由山东大学教授周洪…

C++11标准模板(STL)- 算法(std::adjacent_difference)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 计算范围内各相邻元素之间…