暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

电科金仓KFS产品性能调优方法与思路

原创 KFS补给站 2024-11-08
137

一、概述

1.1什么是性能

性能是一种指标,表明软件系统对于其及时性要求的符合程度。及时性用响应时间或者吞吐量来衡量。
响应时间是对请求做出响应所需要的时间。对于单个事务可以是事务完成所需要的时间;对于用户任务,则是端对端的时间。例如,一个在线系统要求在用户按下回车键后的 0.5 秒内产生结果。
系统吞吐量是指特定时间内能够处理的请求数量。例如,对电话交换机的要求则是每秒钟能够处理 1000000 次呼叫。
软件性能的及时性包括两个重要方面:响应性和可扩展性。
响应性是系统实现其响应时间或者吞吐量目标的能力。
可扩展性则是系统在对其软件功能的要求增加的情况下,继续实现其响应时间或吞吐量目标的能力

1.2实时同步工具性能指标

实时同步响应时间:即一条数据在源端数据库写入,到目标端数据库中可以查询到该数据的时间间隔,其大小=源端解析时间+传输时间+目标端入库时间。
实时同步吞吐量:即单位时间内,同步工具可以同步的增量数据量大小。

二、同步原理概述

在分析实时同步中的性能问题之前,我们先来了解KFS同步的一些基本原理以及流程,以便后续分析性能瓶颈。

KFS源端工作流:

KFS源端的工作流分为两个阶段:解析,存储
解析阶段,KFS从源端的数据库日志中抽取增量数据,经过解析模块解析为数据库事物信息后存放在内存中。
存储阶段,将内存中的事务信息封装为统一的中间件存储在磁盘中。

KFS目标端工作流:

KFS目标端工作流分为三个阶段:传输,反向解析,入库.
传输阶段: 通过网络将源端封装的kufl中间数据传输至目标端
反向解析:阶段,KFS将本地的KUFL中反序列化成为KUFLEvent,同时解析为DBMSEvent存储在内存队列queue中。
入库阶段,将内存队列中的增量数据加载到目标数据库

三、性能瓶颈判断

3.1性能诊断工具

KFS在安装完成后,可以使用fsrepctl perf命令进行同步过程中的性能诊断。
使用方式为:
在服务ONLINE状态下,执行fsrepctl –service xxx perf,其中xxx为服务名。
对于源端和目标端服务,该命令的输出结果会存在差异。

源端
图片.png

目标端
图片.png

Perf结果解析:
Stage:表示当前服务的工作阶段。
源端的工作阶段有:binlog-to-q(源端解析))和q-to-kufl(源端存储),目标端的工作阶段有:
remote-to-kufl(传输)、kufl-to-q(目标端解析)、q-to-dbms(入库)。详细参考第2节“同步原理概述”。

Seqno:表示对应阶段正在处理的事务seqno号,一个seqno对应数据库中的一个事务。
Latency:表示对应阶段当前的延迟时间,单位秒。
Events:表示对应阶段运行至今所处理的事务frag数量,一个seqno中可能包含1个或多个frag。
Extraction:表示对应阶段的抽取动作消耗的时间。
Filtering:表示对应阶段的过滤动作消耗的时间。
Applying:表示对应阶段的应用动作消耗的时间。
Other:其他时间消耗,可忽略。
Total:该阶段的所消耗的总时间。

由于Filtering过程较为简单,即利用cpu对内存中的事务进行计算,通常不存在瓶颈,因此本文省略对该阶段的分析。

3.2性能诊断流程

根据同步原理以及fsrepctl perf性能诊断工具所诊断的结果,综合分析,即可知道性能每个阶段的矩阵图,从整体到局部逐级分解,可以快速定位问题瓶颈点
根据同步原理以及perf结果,我们可以得到一个如下所示的动作矩阵图:
源端

Stage(阶段) Extraction Applying
binlog-to-q 从事务日志获取增量 将增量放入内存队列
q-to-kufl 从内存队列中获取增量 1.将增量写入KUFL 2.更新数据库中的中间表断点

目标端

Stage(阶段) Extraction Applying
remote-to-kufl 通过网络从源端KUFL获取增量 将增量写入本地KUFL
kufl-to-q 从本地KUFL获取增量 将增量写入内存队列
q-to-dbms 从内存队列中获取增量 将增量加载到目标端数据库

由上图可以快速的知道每个阶段的每个动作所进行的操作,根据perf结果中的Latency信息确认,Latency最大的阶段即为当前瓶颈所处的阶段

3.3 问题动作定位

根据KFS工作原理和经验来看,filter和other动作基本不会存在瓶颈,主要关注extraction和applying,通过下图所示的分析流程图,可以知道运行过程中大致的问题是什么。

源端分析流程图:
图片.png

目标端分析流程图:
图片.png

四、性能优化

由3.3.3章节可以得出对应的性能问题,本章节将对各个问题的有哪些优化手段进行详细说明。

4.1网络问题优化

对于KFS来说,网络问题的优化方式通常有2种:
1.改善网络质量,增大带宽
2.将存在网络问题的组件集中部署,例如,源端数据库和源端KFS集中部署,目标端数据库和目标端KFS集中部署。

4.2KFS所在机器CPU问题

此问题一般是当前的硬件环境下,KFS的解析效率已经达到极限,那么解决这个方法,可以从两个方面入手:
1.增强相关的硬件性能,如增加cpu主频。
2.减少解析的量,通过配置底层过滤在日志中将无需解析的表过滤。
property=replicator.extractor.dbms.lowLevelFilter=true
property=replicator.extractor.dbms.tablePatterns=public.,mytest.

4.3JVM内存不足

配置方法
通过调整flysync.ini中的repl_java_mem_size参数完成。
参数单位为m,配置时无需加单位。

所需内存大小计算方式
源端:该服务设置的大事务分片数平均每条数据大小(该源端关联的目标端数量+1)
目标端:该服务对应的源端设置的大事务分片数*平均每条数据大小

4.4频繁更新中间表断点问题

在源端flysync.ini中配置:
property=replicator.pipeline.master.syncKUFLWithExtractor=false

该参数配置后,KFS将不在向源端数据库中更新断点,断点信息全部存储在KUFL当中,需要注意的是,若KUFL也被清除,那么KFS再次启动时将无法获取断点,从当前最新位置启动。

4.5磁盘写入效率低

此问题暂时没有较好的解决手段,只能通过增强相关硬件的方式处理。
如使用SSD盘。

4.6网络带宽问题

同4.1优化思路。

4.7数据库加载慢

该问题通常和业务相关,因此优化手段也需要根据业务不同而变化。

首先,有以下通用配置可以先检查是否可以调整。

  1. 批量入库
    property=replicator.applier.dbms.optimizeRowEvents=true
    property=replicator.applier.dbms.maxRowBatchSize=20
    大小通常设置为500~2000即可,可根据实际内存调整。
  2. Jdbc插入优化(仅限KESV8数据源)
    property=replicator.datasource.global.connectionSpec.urlOptions=socketTimeout=60&preferQueryMode=extendedForPrepared&
    reWriteBatchedInserts=true
  3. 内存队列缓冲池大小
    property= replicator.global.buffer.size=100
    大小通常设置为10~200,可根据实际内存调整。

除了上述通用参数之外,还有以下和业务强相关的场景。

  1. 小事务较多,无法进行批量
  2. 数据集中在某些表上,分布不均匀,导致入库效率低
  3. update、delete较多,并且执行慢
  4. 存在跑批类型的数据

对于问题1,2,我们考虑采用多通道并行入库的方式进行。
配置方法如下:
1)在flysync.ini文件中增加以下内容:

svc_parallelization_type=memory
channels=4
property=replicator.store.parallel-queue.partitionerClass=com.kingbase.flysync.replicator.storage.parallel.ShardListPartitioner

同时,在目标端原有的过滤器后面追加新的过滤器:
shardbytable
2)找到static文件同级目录下的shard.list文件。在最下面添加:

public_a1=0
public_a2=1
public_a3=2
public_a4=3
(*)=0
public_a1=0 含义为:public.a1表走通道0
public_a2=1 含义为:public.a2表走通道1
public_a3=2 含义为:public.a3表走通道2
public_a4=3 含义为:public.a4表走通道3
(*)=0 含义为:其他未配置的表默认走通过0

对于问题3,确定是否存在索引,若没有则需要增加索引。
对于问题4,考虑从方案层面不同步此类数据。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论