分佈式 | 使用 Arthas 熱更新 dble

作者:鮑鳳其

愛可生 dble 團隊開發成員,主要負責 dble 需求開發,故障排查和社區問題解答。少說廢話,放碼過來。

本文來源:原創投稿
*愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。

  • https://github.com/alibaba/arthas
  • https://github.com/alibaba/arthas/blob/master/README_CN.md
  • https://www.cnkirito.moe/arthas-redefine/
  • https://manuals.jrebel.com/jrebel/standalone/maven.html
  • https://manuals.jrebel.com/jrebel/advanced/launch-quick-start.html#quick-start
關於 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 classLoaderHashclassLoaderHash   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.classredefine 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

通過此方式,可以更方便的通過腳本管理整個流程。


相關推薦:

分佈式 | Prepare Statement 協議遊標可行性

分佈式 | DBLE 分片算法之 hash 分片

分佈式 | Global 表 Left Join 拆分表實現原因探究


社區近期動態




本文關鍵字: #dble# #更新# #arthas#
  點一下“閱讀原文”瞭解更多資訊

本文分享自微信公衆號 - 愛可生開源社區(ActiontechOSS)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章