本文介绍MSHA SDK的常见问题以及解决方案。
get demotion metadata fail, caused by null xxx with metadata
NoClassDefFoundError: Could not initialize class com.ali.unit.router.driver.Driver
NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer
reporter client metaData failed,please check reporter-remote-ip connectedness
Write fail, It's under delay and the dts delay strategy is forbidden write
MSHA SDK日志在哪里?
MSHA SDK日志打印目录:~/logs/msha/sdk.$appName/ 和~/logs/msha/bridge.$appName/ 。
MSHA SDK日志目录如下图所示:



您需要重点关注的日志文件:
sdk.log:SDK启动日志,包括全局路由规则拉取、数据层MySQL日志等。
sdk_error.log:SDK基础包异常日志。
bridge.log:SDK模块包启动日志,单独引入的msha-bridge-xxx包的日志打印位置。
bridge_error.log:SDK模块包异常日志。
MSHA SDK所需的配置信息在哪里?
多活实例配置信息推送位置:在多活实例配置的管控命令通道对应命名空间中。基线生效后,可以在配置列表看到推送信息。
MSHA SDK配置信息目录:~/nacos/config/fixed-$nacos地址_8848-$nacos命名空间_nacos/snapshot-tenant/$nacos命名空间/MSHA_GROUP/
MSHA SDK配置信息目录如图所示:其中文件列表和管控命令通道中应当一致

MSHA SDK配置拉取日志目录:~/logs/nacos/config.log

MSHA SDK接入后,如何判断是否生效?
SDK是否生效:查看本地是否生成了MSHA SDK日志目录。
未生成:SDK未生效。
已生成:查看sdk.log,打印出init msha Default SDK Service Factory 等初始化日志,说明SDK已生效。
数据层模块是否生效:触发数据库读写后,查看MSHA SDK日志中是否打印初始化信息。
MySQL数据源:检查sdk.log,打印出Driver::connect 或者 MshaConnection关键字,说明SDK已生效。
其它数据源:检查bridge.log,搜索数据源的host,打印出相关日志,说明SDK已生效。
服务层模块是否生效:触发服务调用后,抓包查看服务寻址情况。
在consumer端安装arthas。执行:curl -O https://arthas.aliyun.com/arthas-boot.jar
选择进程后,执行watch com.aliyun.msha.bridge.rpc.base.unitcell.impl.RPCUnitCellMshaService getFilterResult "{params,returnObj,throwExp}" -x 3 '1==1'
不传路由标,进行服务调用,从arthas抓到server列表为空。
携带路由标,进行服务调用,从arthas抓到server列表有地址。
消息层模块是否生效:发送跨单元消息,查看MSHA SDK日志。
查看sdk_mq_standard.log,对跨单元消息、异常消息等会有结果打印。
数据库模块未启用,请开启模块
问题发生的原因:MSHA SDK未读取到数据库模块信息。
启动参数中-Dmsha.namespaces对应的多活实例,未勾选MySQL模块。
多活实例已勾选模块,但MSHA SDK未读取到配置。
如何解决:
检查多活实例,勾选MySQL模块,并点击“基线生效”,等待生效成功后,重启应用。
检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.router.control.metadata配置。
未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。
没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。点击“基线生效”,生效成功后重启应用。
有:检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。
已拉取到:打开文件,查看文件内容。
未加密内容:检查是否包含MySQL模块。
加密内容:复制内容 + 多活实例ID,联系我们查看配置。
上述都无法解决问题:检查sdk_error.log,查看是否有ERROR日志,联系我们并提供日志。
Can't find unit by local region[xxx] and zone xxx
问题发生的原因:MSHA SDK未读取到LDC信息。
本地未拉取到配置信息。
ACK部署/本地部署,无法自动获取地域信息。
如何解决:
手动增加启动参数-Dregion-id 和 -Dzone-id 。region-id取本机所在地域,例如:cn-beijing。zone-id可以任选,例如:cn-beijing-a。
检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.router.control.metadata配置。
未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。
没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。点击“基线生效”,生效成功后重启应用。
有:检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。
get demotion metadata fail, caused by null xxx with metadata
问题发生的原因:MSHA SDK未读取到数据源信息。
本地未拉取到配置信息。
如何解决:
检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.$数据源类型_attribute.$数据源标识(包含host\port\实例ID等)配置。
未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。
没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。找到数据源所属的数据保护规则,点击“推送全量规则”,等待保护规则的生效状态为“生效”后再次触发数据库调用。
有:
检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。
检查MSHA控制台的推送标识、应用中配置文件中数据源的url、以及配置中心文件名。host\port\db\实例ID这些元素,三者需要保持一致。
NoClassDefFoundError: Could not initialize class com.ali.unit.router.driver.Driver
问题发生的原因:MSHA SDK包未引入。
配置了driver-class-name: com.ali.unit.router.driver.Driver,但是未引入msha-router-all包。
引入了msha-router-all包,但存在版本冲突等,实际部署后未生效。
如何解决:
引入msha-router-all包。
<dependency> <groupId>com.aliyun.msha</groupId> <artifactId>msha-router-all</artifactId> <version>x.y.z</version> </dependency>在部署后的环境中,执行 jar -tf xxx.jar,查看是否包含com.ali.unit.router.driver.Driver 类。
NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer
问题发生的原因:cglib版本冲突。
如何解决:
显示指定cglib版本,MSHA SDK使用的版本为
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2.2</version> </dependency>重要可以选择排掉MSHA依赖的cglib,指定为业务需要的版本。也可以排掉业务依赖的版本,使用MSHA依赖的版本。
注意,cglib需要搭配asm包一起使用,版本之间有对应关系,如cglib 3.1对应的是asm 4.2。
reporter client metaData failed,please check reporter-remote-ip connectedness
问题发生的原因:MSHA SDK无法上报监控指标到MSHA后端。
如何解决:
查看sdk_report.log,以排查连接失败的原因,一般是网络问题。
本地部署时,指标上报无法连接属于正常现象,可以忽略。
该报错不影响业务逻辑,仅会导致无法在MSHA控制台查看监控图表。
ClassNotFoundException: com.oceanbase.jdbc.Driver
该报错属于正常现象,使用MySQL数据源时,MSHA SDK会按照顺序依次查找几个特定的driver,以实现兜底。该报错仅在刚启动时打印一次,可以忽略。
No pool class find
问题发生的原因:Jedis模块初始化失败。
如何解决:查看依赖,需要存在以下两个类中的一个,redis.clients.util.Pool 或者 redis.clients.jedis.util.Pool 。
get tenant encrypt key error null
问题发生的原因:MSHA SDK未读取到配置文件。
如何解决:
检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.router.control.global.define配置。
未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。
没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。点击“基线生效”,生效成功后重启应用。
有:检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。
No redis active unit instance found
问题发生的原因:MSHA SDK未读取到当前中心单元信息。
本地未拉取到配置信息。
如何解决:
检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.router.control.metadata配置。
未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。
没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。点击“基线生效”,生效成功后重启应用。
有:检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。
Write fail, It's under delay and the dts delay strategy is forbidden write
该报错属于正常现象,由于数据保护规则配置了“禁止写入”,且目前正处于切流期间,因此触发MSHA SDK的禁写拦截。
切流后,数据库未切换到备库怎么办?
问题发生的原因:MSHA SDK未生效、或者未读取到数据源信息。
SDK未生效,读写主库其实也没经过SDK。
本地未拉取到数据源配置信息。
如何解决:
检查MSHA控制台的切流单,查看节点是否有报错。
检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.$数据源类型_attribute.$数据源标识(包含host\port\实例ID等)配置。
未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。
没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。找到数据源所属的数据保护规则,点击“推送全量规则”,等待保护规则的生效状态为“生效”后再次触发数据库调用。
有:
检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。
检查MSHA控制台的推送标识、应用中配置文件中数据源的url、以及配置中心文件名。host\port\db\实例ID这些元素,三者需要保持一致。
检查MSHA SDK日志文件,查看是否有报错信息。