美文网首页开源分布式中间件DBLE
分布式 | 使用 Arthas 热更新 dble

分布式 | 使用 Arthas 热更新 dble

作者: 爱可生开源社区 | 来源:发表于2020-12-28 09:50 被阅读0次

    作者:鲍凤其
    爱可生 dble 团队开发成员,主要负责 dble 需求开发,故障排查和社区问题解答。少说废话,放码过来。
    本文来源:原创投稿
    *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。


    关于 dble 小版本修改代码的热更新,主要调研了两种工具:

    • arthas
    • jrebel

    使用 arthas 更新小版本时,需要运维人员直接操作变更的 class 文件并修改,需要一套运维规范。
    使用 jrebel 后,jrebel 可以对 dble 的 jar 包配置一个 class 目录,jrebel 自动监听 class 目录中 class 文件的变化,监听到变化后自动加载类,此外该软件需要付费。
    在进行小版本升级时,需要控制 dble 的版本号,因此每次热更新时需要替换 Versions.class 文件维护 dble 的版本号,经测试,发现 jrebel 对静态类的支持并不友好,实际测试没有生效,相比较而言 arthas 则可以生效。因此下面主要对 arthas 在 dble 中的使用进行说明。

    前置环境

    • jre,使用 dble 的 jre 即可
    • 搭建好的 3.20.10.0 版本 dble 环境

    *arthas 使用

    安装

    下载地址:https://github.com/alibaba/arthas/releases,下载最新版本即可,以下测试使用的是 3.4.5 版本

    $ cd /opt/arthas
    $ wget https://github.com/alibaba/arthas/releases/download/arthas-all-3.4.5/arthas-bin.zip
    $ unzip arthas-bin.zip
    

    其他安装方式请参考:https://arthas.aliyun.com/doc/install-detail.html

    使用

    执行下面的语句后,会进入 arthas 的交互界面:

    $ java -jar arthas-boot.jar <dble_pid>
    

    下面以在 dble 中简单修改一行日志为例:

    在 3.20.10.0 版本的 dble 中,当输入"optimize a; " 这种 dble 不认识的语句时,日志中会输出 “Unsupported statement:optimize a” 这样的日志,如下图:

    下面我们通过 arthas 修改这个日志输出,以下操作都是在 arthas 的命令行界面操作。

    jad 反编译

    $ jad --source-only com.actiontech.dble.server.ServerQueryHandler > /tmp/ServerQueryHandler.java
    

    下面是反编译文件里面截取的相关代码片段:

    case 254: {
        LOGGER.info("Unsupported statement:" + sql);
        this.service.writeErrMessage(1149, "Unsupported statement");
        return;
    }
    

    sc 查找类加载器

    $ sc -d com.actiontech.dble.server.ServerQueryHandler | grep classLoaderHash
    classLoaderHash   18b4aac2
    

    mc 内存编译

    在编译之前可以将之前反编译源码文件里的代码修改掉,比如修改为如下片段:

    case 254: {
        LOGGER.info("Unsupported statement test test test test test:" + sql);
        this.service.writeErrMessage(1149, "Unsupported statement");
        return;
    }
    

    下面我们通过 mc 命令将修改后的反编译源码文件编译为 class 文件。mc 命令中 -c 后面的值 18b4aac2 即 sc 查找到的 ServerQueryHandler 类加载器的 hash 值。

    redefine 热更新代码

    其实在这里我们也可以通过在本地修改对应版本的源文件,本地编译好后上传到 /tmp/com/actiontech/dble/server/ 路径下,再执行 redefine,效果是一样的:

    $ redefine /tmp/com/actiontech/dble/server/ServerQueryHandler.class
    redefine success, size: 1, classes:
    com.actiontech.dble.server.ServerQueryHandler
    

    到此为止,ServerQueryHandler 类的更新就结束了。下面我们来看下效果:

    以上方式是通过 arthas 的交互界面的方式完成的,arthas 也可以通过非交互方式来执行命令:

    $ java -jar arthas-boot.jar <dble_pid> -c "redefine /tmp/com/actiontech/dble/server/ServerQueryHandler.class" > /dev/null
    

    通过此方式,可以更方便的通过脚本管理整个流程。

    相关文章

      网友评论

        本文标题:分布式 | 使用 Arthas 热更新 dble

        本文链接:https://www.haomeiwen.com/subject/jmobnktx.html