Sharding-Sphere的应用性能监控实践

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

本文转自公众号:码路圈   欢迎关注!

640?wx_fmt=jpeg

640?wx_fmt=jpeg

陈清阳


中国电信甜橙金融技术创新中心

高级工程师

多年JAVA及常用互联网中间件开发及运维经验



Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它为分布式数据存储提供了多种形式的解决方案。其中的Sharding-JDBC产品在甜橙金融的技术架构中得到了广泛应用,并且在业内已成为最重要的解决方案之一。在使用Sharding-JDBC的过程中,少不了性能测试与运维性能监控的工作。作为Sharding-Sphere开源项目的重要支持者,甜橙金融技术创新中心团队很荣幸的参与并负责解决Sharing-JDBC的应用性能监控问题。本文将针对这个问题,进行Sharding-Sphere与APM之间结合的实践探索。

——前言




1

Sharding-Opentracing简介

Sharding-Opentracing是Sharding-Sphere为大家提供的基于Opentracing规范的APM工具包。它采用发布 - 订阅式的组件通信机制实现了对核心链路方法的跟踪记录,包括sql解析路由方法、sql执行方法和结果归并方法。

Opentracing(https://github.com/opentracing)规范的产生,目的是为了解决不同的分布式追踪系统API不兼容的问题。它是一个轻量级的标准化层,位于应用程序/类库和追踪或日志分析程序之间。

Sharding-Sphere使用Opentracing进行方法的追踪,使得系统开发人员可以方便的添加或替换追踪系统的实现。使用ShardingJDBCTracer类可以方便的完成Tracer的注入。


public final class ShardingJDBCTracer {      /**    * 通过读取系统属性进行注册    * -Dshardingjdbc.opentracing.tracer.class=*****         */   public static void init() {...}      /**    * 通过方法参数进行注册    */   public static void init(final Tracer tracer) {...}   } final class ShardingJDBCTracer {
   
   /**
    * 通过读取系统属性进行注册
    * -Dshardingjdbc.opentracing.tracer.class=*****     
    */

   public static void init() {...}
   
   /**
    * 通过方法参数进行注册
    */

   public static void init(final Tracer tracer) {...}
   
}

然后通过事件监听器订阅核心方法事件,完成方法拦截实现方法追踪。目前实现的事件监听器如下:

  • SqlRoutingEventListener     

    Sql路由事件追踪

  • ExecuteEventListener           

    Sql执行事件追踪

  • MergeEventListener               

    Sql执行结果合并事件追踪


2

基于Opentracing规范的性能追踪——SkyWalking实践

SkyWalking(https://github.com/apache/incubator-skywalking)是由国人大神吴晟创建的一款开源的针对分布式系统的APM系统,它提供了Opentracing标准的支持。下面我们通过SkyWalking来看看如何在你的应用中使用Sharding-Opentracing工具包。

在应用系统中引入相关依赖包

<dependency>  <groupId>io.shardingsphere</groupId>  <artifactId>sharding-opentracing</artifactId>  <version>3.0.0.M2-SNAPSHOT</version></dependency><dependency>  <groupId>org.apache.skywalking</groupId>  <artifactId>apm-toolkit-opentracing</artifactId>  <version>5.0.0-beta</version></dependency>
  <groupId>io.shardingsphere</groupId>
  <artifactId>sharding-opentracing</artifactId>
  <version>3.0.0.M2-SNAPSHOT</version>
</dependency>
<dependency>
  <groupId>org.apache.skywalking</groupId>
  <artifactId>apm-toolkit-opentracing</artifactId>
  <version>5.0.0-beta</version>
</dependency>

SkyWalking的apm-toolkit-opentracing包中的SkyWalkingTracer实现了Tracer接口,在应用系统启动时完成Tracer的注入。

ShardingJDBCTracer.init(new SkywalkingTracer()); SkywalkingTracer());

通过简单的两步就完成了SkyWalking的接入。通过SkyWalking的Trace视图可以查看业务请求的调用链信息,包括Sharding-JDBC在sql路由,sql执行和结果归并的执行信息。其中sql执行是采用多条sql并行执行的策略,这里也可以看到每个线程的执行情况。

640?wx_fmt=png

通过SkyWalking的Span Info视图可以看到每个追踪Span的相关参数信息。包括路由库信息、sql解析语句与执行入参等。

640?wx_fmt=png


3

基于字节码增强的性能追踪——Pinpoint实践

上面我们了解了如何使用实现了Opentracing规范的APM框架进行Sharding-JDBC的性能监控,那么对于没有实现Opentracing规范,采用字节码增强技术的APM框架,我们又该如何入手了?针对这种采用字节码增强技术的APM框架,我们的策略是编写对应的插件,实现对Sharding-Sphere核心方法的增强。接下来我们看看如何在Pinpoint框架中实现一个针对Sharding-Sphere组件的插件。

实现Interceptor接口,完成组件方法拦截器。在组件方法执行前开启追踪,在组件方法执行后结束追踪,这里展示结果归并方法追踪的实现。

public class ResultSetMergeInterceptor implements AroundInterceptor1 {      private final TraceContext traceContext;   private final MethodDescriptor descriptor;   private final PLogger logger = PLoggerFactory.getLogger(getClass());      public ResultSetMergeInterceptor(TraceContext traceContext, MethodDescriptor descriptor) {       this.traceContext = traceContext;       this.descriptor = descriptor;   }      @Override   public void before(Object target, Object arg0) {       if (logger.isDebugEnabled()) {           logger.beforeInterceptor(target, new Object[]{arg0});       }       final Trace trace = traceContext.currentTraceObject();       if (trace == null) {           return;       }       trace.traceBlockBegin();   }      @Override   public void after(Object target, Object arg0, Object result, Throwable throwable) {       if (logger.isDebugEnabled()) {           logger.afterInterceptor(target, new Object[]{arg0}, result, throwable);       }         final Trace trace = traceContext.currentTraceObject();       if (trace == null) {           return;       }           try {           SpanEventRecorder recorder = trace.currentSpanEventRecorder();           recorder.recordServiceType(ShardingSphereConstants.SHARDING_SPHERE_MERGE);           recorder.recordApi(descriptor);           recorder.recordException(throwable);       } finally {           trace.traceBlockEnd();       }   }}
}
实现ProfilerPlugin和TransformTemplateAware接口,完成插件标识和转换模版注册。其中需要通过TransformTemplate的transform方法来完成追踪方法和方法拦截器的绑定关系。例如ShardingPreparedStatement类的merge方法与上面实现的ResultSetMergeInterceptor进行绑定。
public class ShardingSpherePlugin implements ProfilerPlugin, TransformTemplateAware {      private final PLogger logger = PLoggerFactory.getLogger(this.getClass());      private static final String SHARDINGSPHERE_SCOPE = "SHARDINGSPHERE_SCOPE";      private TransformTemplate transformTemplate;      @Override   public void setup(ProfilerPluginSetupContext context) {       ShardingSphereConfig config = new ShardingSphereConfig(context.getConfig());       logger.debug("[ShardingSphere] pluginEnable={}", config.isPluginEnable());       if (config.isPluginEnable()) {           addSqlRouteTransformer();           addSqlExecutorTransformer();           addResultMergeTransformer();       }   }      @Override   public void setTransformTemplate(TransformTemplate transformTemplate) {       this.transformTemplate = transformTemplate;   }      private void addResultMergeTransformer() {       TransformCallback transformCallback = new TransformCallback() {           @Override           public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {               InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);               InstrumentMethod method = target.getDeclaredMethod("merge", "io.shardingsphere.core.merger.MergeEngine");               method.addScopedInterceptor("com.navercorp.pinpoint.plugin.shardingsphere.interceptor.ResultSetMergeInterceptor", SHARDINGSPHERE_SCOPE);               return target.toBytecode();           }       };       transformTemplate.transform("io.shardingsphere.core.jdbc.core.statement.ShardingPreparedStatement", transformCallback);       transformTemplate.transform("io.shardingsphere.core.jdbc.core.statement.ShardingStatement", transformCallback);   }   } class ShardingSpherePlugin implements ProfilerPlugin, TransformTemplateAware {
   
   private final PLogger logger = PLoggerFactory.getLogger(this.getClass());
   
   private static final String SHARDINGSPHERE_SCOPE = "SHARDINGSPHERE_SCOPE";
   
   private TransformTemplate transformTemplate;
   
   @Override
   public void setup(ProfilerPluginSetupContext context) {
       ShardingSphereConfig config = new ShardingSphereConfig(context.getConfig());
       logger.debug("[ShardingSphere] pluginEnable={}", config.isPluginEnable());
       if (config.isPluginEnable()) {
           addSqlRouteTransformer();
           addSqlExecutorTransformer();
           addResultMergeTransformer();
       }
   }
   
   @Override
   public void setTransformTemplate(TransformTemplate transformTemplate) {
       this.transformTemplate = transformTemplate;
   }
   
   private void addResultMergeTransformer() {
       TransformCallback transformCallback = new TransformCallback() {
           @Override
           public byte[] doInTransform(Instrumentor instrumentor, ClassLoader classLoader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws InstrumentException {
               InstrumentClass target = instrumentor.getInstrumentClass(classLoader, className, classfileBuffer);
               InstrumentMethod method = target.getDeclaredMethod("merge", "io.shardingsphere.core.merger.MergeEngine");
               method.addScopedInterceptor("com.navercorp.pinpoint.plugin.shardingsphere.interceptor.ResultSetMergeInterceptor", SHARDINGSPHERE_SCOPE);
               return target.toBytecode();
           }
       };
       transformTemplate.transform("io.shardingsphere.core.jdbc.core.statement.ShardingPreparedStatement", transformCallback);
       transformTemplate.transform("io.shardingsphere.core.jdbc.core.statement.ShardingStatement", transformCallback);
   }
   
}


完整插件代码请参考:

https://github.com/beckhampu/pinpoint/tree/sharding-sphere-1.7.2/plugins

通过Pinpoint的CallTree效果图,我们可以清楚的看到一次业务过程中Sharding-JDBC核心方法的调用效果。

640?wx_fmt=jpeg


至此,关于Sharding-Sphere与APM的相关实践就介绍到这里。希望自己的一得之见可以让大家有所收获。如果大家有什么想法、意见和建议,欢迎留言与我交流。在这里也呼吁大家一起贡献自己的力量,让Sharding-Sphere发展的更好。


Sharding-Sphere

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

亦步亦趋,开源不易,您对我们最大支持,就是在github上留下一个star。

项目地址:

https://github.com/sharding-sphere/sharding-sphere/

https://gitee.com/sharding-sphere/sharding-sphere/

更多信息请浏览官网:

http://shardingsphere.io/

或加入Sharding-Sphere官方讨论群  

640?wx_fmt=jpeg

感谢您的支持与关注

我们将不忘初心,不负众望!


640?wx_fmt=png
ShardingsphereShardingParsingRuleRegistry 加载报错定位 问题 在使用 shardingsphere 时,在执行sql查询语句时报了一个异常: ### Cause: java.lang.NullPointerException at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.ses... 阅读详情

相关推荐

解决 ShardingSphere 第一次请求慢的喷血日子

学习起因:整合了 ShardingSphere 的项目第一次访问的时候很慢,第二次访问的时候速度就快了,然后老大让我去一探究竟,然后下面就是探索的血泪史。 通过 Arthas 生成火焰图,定位到慢在ShardingSphere sql 解析,第一次请求使用 ANTLR 解析 SQL 耗时较长,而第二次请求由于缓存原因耗时很小 curl -O https://arthas.aliyun.com/arthas-boot.jar java -jar arthas-boot.jar profiler s.

闲狗的博客 8102

SpringBoot+ShardingSphere5.1.2+mybatisPlus实现自动分库分表 自动创建表(分表条件有英文字符 无法通过**匹配)

ShardingSphere是Apache下开源,遵循Database Plus,允许您将任何数据库转换为分布式数据库系统。

baidu_41639534的博客 2826

ShardingSphere 可观测 SQL 指标监控

ShardingSphere并不负责如何采集、存储以及展示应用性能监控的相关数据,而是将SQL解析与SQL执行这两块数据分片的最核心的相关信息发送至应用性能监控系统,并交由其处理。换句话说,ShardingSphere仅负责产生具有价值的数据,并通过标准协议递交至相关系统。

small_dog_的博客 952

Apache ShardingSphere-JDBC 性能监控实战

‍在业务系统越来越复杂的今天,用户对系统的运行性能越来越重视,需要对系统运行中的相关指标进行监控,实时获取监控指标信息,对相关问题进行监控预警,并结合业务分析定位出现的异常。我们知道 APM(应用性能监控)是通过对系统可观察性数据进行采集、存储和分析,进行系统的性能监控与诊断,主要功能包括性能指标监控、调用链分析,应用拓扑图等。一般通过 Metrics(指标监控)、Tracing(链路跟踪)、和 ...

ShardingSphere官微 1328

shardingsphere配置druid监控数据库配置

Druid Shardingsphere 数据库监控

weixin_43925597的博客 1253

Sharding-Sphere应用性能监控实践

1. Sharding-Opentracing简介 Sharding-Opentracing是Sharding-Sphere为大家提供的基于Opentracing规范的APM工具包。它采用发布 - 订阅式的组件通信机制实现了对核心链路方法的跟踪记录,包括sql解析路由方法、sql执行方法和结果归并方法。 Opentracing(https://github.com/opentracing)规范的产生,目的是为了解决不同的分布式追踪系统API不兼容的问题。它是一个轻量级的标准化层,位于应用程序/类库和追踪

weixin_42073629的博客 785

翼支付在Sharding-Sphere项目工作介绍

天翼电子商务有限公司(以下简称“翼支付”)是中国电信股份有限公司的全资子公司,作为中国电信旗下唯一的互联网金融平台公司,它是国内首家电信运营商支付公司,是中国人民银行核准...

ShardingSphere官微 417

迎接PMC新成员 | 欢迎张小虎正式加入Sharding-Sphere

今天,Sharding-Sphere正式迎来了一位新朋友 — 来自翼支付技术创新中心的张小虎同学。对此,我们表示热烈欢迎!张小虎翼支付高级总监运维技术中心、技术创新中心经...

ShardingSphere官微 538

Sharding-Sphere的分享

Sharding-Sphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar这3款相互独立的产品组成。他们均提供标准化的数据分片、读写分离、柔性事务和数据治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。官网:http://shardingsphere.apache.org/index_zh.html。

hanyue99s的博客 695

【开源软件评选】快来给 Apache ServiceComb 打电话领纪念品啦

近年来,国内开发者对Apache软件基金会热情悄然升级,当前已有 ServiceComb、CarbonData、Sharding-Sphere、Skywalking等...

微服务技术与实践专栏 175

「攻略手册」:ShardingSphere 与 Java 应用性能优化

笔者曾经写过一篇文章,介绍 ShardingSphere 在具体代码细节上的优化案例,但文章中没有介绍如何发现「代码优化点」。本文将结合之前笔者在 ShardingSphere 相关性能问题排查、优化经验,简要地介绍 ShardingSphere 性能问题排查、优化应如何入手。由于 ShardingSphere 本身也是 Java 应用,本文的经验同样也适用于与 ShardingSphere 无关...

ShardingSphere官微 1466

监控与调试:性能优化的利器 — ShardingSphere

ShardingSphere提供了丰富的监控和调试功能,帮助开发者实时监控数据库性能、调优SQL执行、优化数据库连接池、改进分片策略,并通过动态配置调整数据库的读写负载。ShardingSphere提供了多种监控和调试工具,帮助开发者实时跟踪和优化性能,识别瓶颈,进行故障排查,从而提升系统的稳定性和响应速度。然而,读写分离的效率也取决于配置和负载均衡策略。ShardingSphere提供了SQL执行的性能分析工具,可以帮助开发者查看SQL的执行情况,并识别慢查询、资源消耗大的SQL。

秋元的博客 1351

Apache ShardingSphere知识点表格总结及配置示例

ShardingSphere知识点汇总表格总结,以及给出各类配置示例和使用的注意事项

小蜜蜂1010的博客 2886

Apache ShardingSphere 可观测性体系

Apache ShardingSphere 可观测性体系提供全面的监控能力,包含指标(Metrics)、追踪(Tracing)和日志(Logging)三层架构。该体系支持Prometheus、Jaeger等主流工具集成,通过配置YAML或DistSQL即可快速启用。关键功能包括:SQL执行指标监控、分布式链路追踪、多维度日志管理,并提供生产级告警规则和Grafana看板模板。最佳实践涵盖性能调优、故障诊断、多租户隔离等场景,同时给出采样率控制、敏感数据脱敏等企业级解决方案,帮助用户构建完整的数据库中间件可观

csdn_tom_168的博客 796

ShardingSphere 功能详细介绍

ShardingSphere 是一个功能丰富的分布式数据库中间件,能够帮助开发者构建高可扩展、高可用的分布式数据库系统。其核心功能包括分库分表、数据库路由、SQL 重写、读写分离、事务管理等,支持多种数据库类型,并且能够灵活配置和扩展。ShardingSphere 适用于需要横向扩展的应用场景,尤其在大规模数据处理和高并发系统中非常有用。

专注于技术分享 1218

ShardingSphere-Proxy 应用性能监控集成 Skywalking 部署

背景ShardingSphereSkyworking 可以监控很多组件,本次在生产环境搭建 Skyworking 监控 ShardingSphere-proxy 可以查看相关链路,分析 SQL 执行。01安装部署wget https://mirrors.bfsu.edu.cn/apache/skywalking/8.6.0/apache-skywalking-apm-es7-8.6.0.tar...

ShardingSphere官微 693

Shardingsphere踩坑

项目中使用shardingsphere作为数据库中间件,之前用过4.x,发现现在最新版本是5.x,决定尝个鲜。按照官方文档配置后一直报以下错误。 Inline sharding algorithm expression cannot be null 配置完全是按照官方文档配的。 网上搜索半天也没有类似的文章,看来没法偷懒了,只能自己翻源码了! 经过读源码,找到shardingsphere读取配置的代码, 是在shardingsphere-sharding-spring-boot-starter

zsh2050的专栏 6906
上一篇: Sharding-Sphere的新一代Zookeeper注册中心实现剖析
下一篇: 翼支付在Sharding-Sphere项目工作介绍
ShardingSphere
博客等级 码龄7年 439粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值