天天看點

将powerjob-server 3.4更新為4.0版本

背景說明

應同僚邀請,寫篇文章記錄下如何将powerjob-server 3.4版本更新為4.0版本。

首先,我們先看下官方文檔中給出的版本變更說明和更新指南。

  • 版本變更說明(https://www.yuque.com/powerjob/guidence/uyf17o#lznVx)
将powerjob-server 3.4更新為4.0版本

可以看到,powerjob 3.x.x到4.x.x版本,主要是worker端的包名變更了、資料庫增加了一些字段和表。

  • 更新指南(https://www.yuque.com/powerjob/guidence/dd5hpe#lU4oI):
将powerjob-server 3.4更新為4.0版本

簡單來說,powerjob 3.x.x和4.x.x是兩個不相容的版本。是以,官方的建議是,另外部署一套powerjob-server 4.0叢集,使用新的資料庫,再逐個更新worker端程式代碼并連接配接到新的powerjob-server 4.0叢集。

當然,其中有一些細節問題,包括:

1)  将原有powerjob-server 3.4資料庫中的資料拷貝到新資料庫,并進行資料格式的轉換。這樣就不用重新配置那些定時任務、聯系人資訊之類的,并且保證資料格式與新版本服務端相容。

2)  在資料庫中,臨時将定時任務的狀态置為關閉。這是防止定時任務被重複排程。

當然,按照官方的說明,進行不停機更新應該是可行的。而我采用的是原地停機更新,原因是:

1)  我這邊目前有接入powerjob的worker端應用是可以停機維護的,并不影響正常業務的進行。

2)  我這邊目前暫未大規模使用powerjob,是以接入powerjob的worker端應用的數量是有限的,一次性更新這些worker端應用是可能的。

3)  基于前面兩個原因,原地停機更新powerjob-server端的話,相較于不停機更新方案來說,操作方面會簡單很多,因為不用額外給新的powerjob-serve 4.0叢集配置新的域名、使用新的資料庫,也不涉及在資料庫中臨時關閉定時任務。

如果你那邊有很多應用有使用powerjob,并且不能停應用,推薦還是采用不停機更新。就操作步驟上麻煩些,需要多花點時間,并沒什麼太難的地方。

原地停機更新方案

下面介紹下我這邊如何原地停機更新到powerjob-server 4.0版本和更新worker端應用。基本就是,先停掉所有應用,再重建資料庫,再啟動新版本應用。下面是具體步驟。

 1、停應用

先停所有worker端(即用戶端)應用,再停powerjob-server 3.4應用。這樣,更新過程中都不會有powerjob中的定時任務被排程。由于我這邊應用程式都部署在k8s中,是以具體的操作指令類似下面這樣。

停用戶端應用,所有用戶端應用都要停掉:

kubectl scale deploy example-app --replicas=0 -n=prod

停server端應用:

kubectl scale sts powerjob-server --replicas=0 -n=prod

2、導出資料

從powerjob-server庫中導出資料。這裡隻導出資料,不導出表結構。我這邊是使用Workbench來操作的,就将set-gtid-purged屬性設為OFF,勾選上complete-insert,再選擇"Dump Data Only",就可以開始導出了。換成使用mysqldump或其它工具也是差不多的。

将powerjob-server 3.4更新為4.0版本

3、重建資料庫

1)  先删除原有的powerjob-server的資料庫。

2)  再建立一個空的powerjob-server的資料庫,庫名保持跟原有的相同,字元集為utf8mb4。

3)  導入表結構:使用workbench将powerjob-server 4.0版本的表結構導入到新建立的庫中。這個表結構其實是我在其它地方另外部署一個powerjob-server 4.0叢集,等它運作起來生成表結構後,再把它的表結構導出來拿到這裡使用的。

4)  導入資料:使用workbench将第2步中導出的原庫中的資料導入到新庫中。

4、部署powerjob-server 4.0版本

現在就可以部署新的powerjob-server 4.0版本了。我這邊是容器化部署,除了版本改成v4.0.0、編譯後的jar包目錄路徑變為powerjob-server/powerjob-server-starter/target/外,其它配置方面、域名等都是沿用原來3.4版本的,沒有變化。

5、轉換資料

該操作步驟,就是調用powerjob-server的api接口,讓它自動進行資料格式轉換。你需要先查一下powerjob資料庫的app_info表中各個應用的id是什麼,然後針對每一個id都執行下面兩條curl指令,具體含義的話官網中有說明:

curl http://powerjob-server-address:7700/migrate/v4/job?appId=1

curl http://powerjob-server-address:7700/migrate/v4/workflow?appId=1

繼續閱讀