MSHA SDK的常见问题以及解决方案。

本文介绍MSHA SDK的常见问题以及解决方案。

MSHA SDK日志在哪里?

MSHA SDK日志打印目录:~/logs/msha/sdk.$appName/ 和~/logs/msha/bridge.$appName/

MSHA SDK日志目录如下图所示:

image

image

image

您需要重点关注的日志文件:

  • sdk.log:SDK启动日志,包括全局路由规则拉取、数据层MySQL日志等。

  • sdk_error.log:SDK基础包异常日志。

  • bridge.log:SDK模块包启动日志,单独引入的msha-bridge-xxx包的日志打印位置。

  • bridge_error.log:SDK模块包异常日志。

MSHA SDK所需的配置信息在哪里?

  1. 多活实例配置信息推送位置:在多活实例配置的管控命令通道对应命名空间中。基线生效后,可以在配置列表看到推送信息。

  2. MSHA SDK配置信息目录:~/nacos/config/fixed-$nacos地址_8848-$nacos命名空间_nacos/snapshot-tenant/$nacos命名空间/MSHA_GROUP/

MSHA SDK配置信息目录如图所示:其中文件列表和管控命令通道中应当一致

image

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

image

MSHA SDK接入后,如何判断是否生效?

  1. SDK是否生效:查看本地是否生成了MSHA SDK日志目录。

    1. 未生成:SDK未生效。

    2. 已生成:查看sdk.log,打印出init msha Default SDK Service Factory 等初始化日志,说明SDK已生效。

  2. 数据层模块是否生效:触发数据库读写后,查看MSHA SDK日志中是否打印初始化信息。

    1. MySQL数据源:检查sdk.log,打印出Driver::connect 或者 MshaConnection关键字,说明SDK已生效。

    2. 其它数据源:检查bridge.log,搜索数据源的host,打印出相关日志,说明SDK已生效。

  3. 服务层模块是否生效:触发服务调用后,抓包查看服务寻址情况。

    1. consumer端安装arthas。执行:curl -O https://arthas.aliyun.com/arthas-boot.jar

    2. 选择进程后,执行watch com.aliyun.msha.bridge.rpc.base.unitcell.impl.RPCUnitCellMshaService getFilterResult "{params,returnObj,throwExp}" -x 3 '1==1'

    3. 不传路由标,进行服务调用,从arthas抓到server列表为空。

    4. 携带路由标,进行服务调用,从arthas抓到server列表有地址。

  4. 消息层模块是否生效:发送跨单元消息,查看MSHA SDK日志。

    1. 查看sdk_mq_standard.log,对跨单元消息、异常消息等会有结果打印。

数据库模块未启用,请开启模块

  1. 问题发生的原因:MSHA SDK未读取到数据库模块信息。

    1. 启动参数中-Dmsha.namespaces对应的多活实例,未勾选MySQL模块。

    2. 多活实例已勾选模块,但MSHA SDK未读取到配置。

  2. 如何解决:

    1. 检查多活实例,勾选MySQL模块,并点击“基线生效”,等待生效成功后,重启应用。

    2. 检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.router.control.metadata配置。

      1. 未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。

        1. 没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。点击“基线生效”,生效成功后重启应用。

        2. 有:检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。

      2. 已拉取到:打开文件,查看文件内容。

        1. 未加密内容:检查是否包含MySQL模块。

        2. 加密内容:复制内容 + 多活实例ID,联系我们查看配置。

    3. 上述都无法解决问题:检查sdk_error.log,查看是否有ERROR日志,联系我们并提供日志。

Can't find unit by local region[xxx] and zone xxx

  1. 问题发生的原因:MSHA SDK未读取到LDC信息。

    1. 本地未拉取到配置信息。

    2. ACK部署/本地部署,无法自动获取地域信息。

  2. 如何解决:

    1. 手动增加启动参数-Dregion-id-Dzone-id 。region-id取本机所在地域,例如:cn-beijing。zone-id可以任选,例如:cn-beijing-a。

    2. 检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.router.control.metadata配置。

      1. 未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。

        1. 没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。点击“基线生效”,生效成功后重启应用。

        2. 有:检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。

get demotion metadata fail, caused by null xxx with metadata

  1. 问题发生的原因:MSHA SDK未读取到数据源信息。

    1. 本地未拉取到配置信息。

  2. 如何解决:

    1. 检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.$数据源类型_attribute.$数据源标识(包含host\port\实例ID等)配置。

      1. 未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。

        1. 没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。找到数据源所属的数据保护规则,点击“推送全量规则”,等待保护规则的生效状态为“生效”后再次触发数据库调用。

        2. 有:

          1. 检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。

          2. 检查MSHA控制台的推送标识、应用中配置文件中数据源的url、以及配置中心文件名。host\port\db\实例ID这些元素,三者需要保持一致。

NoClassDefFoundError: Could not initialize class com.ali.unit.router.driver.Driver

  1. 问题发生的原因:MSHA SDK包未引入。

    1. 配置了driver-class-name: com.ali.unit.router.driver.Driver,但是未引入msha-router-all包。

    2. 引入了msha-router-all包,但存在版本冲突等,实际部署后未生效。

  2. 如何解决:

    1. 引入msha-router-all包。

      <dependency>
        <groupId>com.aliyun.msha</groupId>
        <artifactId>msha-router-all</artifactId>
        <version>x.y.z</version>
      </dependency>
    2. 在部署后的环境中,执行 jar -tf xxx.jar,查看是否包含com.ali.unit.router.driver.Driver 类。

NoClassDefFoundError: Could not initialize class net.sf.cglib.proxy.Enhancer

  1. 问题发生的原因:cglib版本冲突。

  2. 如何解决:

    1. 显示指定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

  1. 问题发生的原因:MSHA SDK无法上报监控指标到MSHA后端。

  2. 如何解决:

    1. 查看sdk_report.log,以排查连接失败的原因,一般是网络问题。

    2. 本地部署时,指标上报无法连接属于正常现象,可以忽略。

    3. 该报错不影响业务逻辑,仅会导致无法在MSHA控制台查看监控图表。

ClassNotFoundException: com.oceanbase.jdbc.Driver

该报错属于正常现象,使用MySQL数据源时,MSHA SDK会按照顺序依次查找几个特定的driver,以实现兜底。该报错仅在刚启动时打印一次,可以忽略。

No pool class find

  1. 问题发生的原因:Jedis模块初始化失败。

  2. 如何解决:查看依赖,需要存在以下两个类中的一个,redis.clients.util.Pool 或者 redis.clients.jedis.util.Pool

get tenant encrypt key error null

  1. 问题发生的原因:MSHA SDK未读取到配置文件。

  2. 如何解决:

    1. 检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.router.control.global.define配置。

      1. 未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。

        1. 没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。点击“基线生效”,生效成功后重启应用。

        2. 有:检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。

No redis active unit instance found

  1. 问题发生的原因:MSHA SDK未读取到当前中心单元信息。

    1. 本地未拉取到配置信息。

  2. 如何解决:

    1. 检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.router.control.metadata配置。

      1. 未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。

        1. 没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。点击“基线生效”,生效成功后重启应用。

        2. 有:检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。

Write fail, It's under delay and the dts delay strategy is forbidden write

该报错属于正常现象,由于数据保护规则配置了“禁止写入”,且目前正处于切流期间,因此触发MSHA SDK的禁写拦截。

切流后,数据库未切换到备库怎么办?

  1. 问题发生的原因:MSHA SDK未生效、或者未读取到数据源信息。

    1. SDK未生效,读写主库其实也没经过SDK。

    2. 本地未拉取到数据源配置信息。

  2. 如何解决:

    1. 检查MSHA控制台的切流单,查看节点是否有报错。

    2. 检查本地的MSHA SDK配置目录,MSHA SDK所需的配置信息在哪里?,查看是否拉取到com.ali.unit.$数据源类型_attribute.$数据源标识(包含host\port\实例ID等)配置。

      1. 未拉取到:检查启动参数中-Dmsha.nacos.server.addr对应命名空间中是否有该文件。

        1. 没有:确认启动参数-Dmsha.nacos.server.addr和多活实例配置的管控命令通道配置的一致。找到数据源所属的数据保护规则,点击“推送全量规则”,等待保护规则的生效状态为“生效”后再次触发数据库调用。

        2. 有:

          1. 检查~/logs/nacos/config.log ,一般是网络或者鉴权等原因,导致本机无法连上远程配置中心。

          2. 检查MSHA控制台的推送标识、应用中配置文件中数据源的url、以及配置中心文件名。host\port\db\实例ID这些元素,三者需要保持一致。

    3. 检查MSHA SDK日志文件,查看是否有报错信息。