1. 引言
很多同學瞭解r-nacos特性後最開始只將r-nacos用於開發測試環境。
經過一段時間的使用後,部分同學有打算生產環境也從nacos遷移到r-nacos。
那麼如何平衡地從nacos遷移到r-nacos呢?
r-nacos 簡介:
r-nacos是一個用rust實現的nacos服務。相較於java nacos來說,是一個提供相同功能,啟動更快、佔用系統資源更小(初始記憶體小於10M)、效能更高、執行更穩定的服務。
r-nacos設計上完全相容最新版本nacos面向client sdk 的協議(包含1.x的http OpenApi,和2.x的grpc協議), 支援使用nacos服務的應用平遷到 r-nacos。
2. 遷移計劃
2.1 待遷移內容分析
遷移的目標已明確,在設計遷移計劃前,我們需要先分析待遷移的資料。
從nacos遷移到r-nacos主要涉及4類資料:
- nacos鑑權使用者資料
- 名稱空間資料
- 配置資料
- 服務例項資料
nacos使用者資料、名稱空間資料與配置資料是持久化資料,需要事先完成設定與遷移。
服務例項資料是動態資料,切換後應該會自動註冊,不需要事先遷移。
2.2 遷移階段與步驟
我們可以把遷移分為3個階段:
- 遷移前準備階段;
- 遷移階段;
- 遷移後收尾階段;
一、遷移前準備
- 部署r-nacos,用於遷移前做資料遷移與資料錄入。(如果nacos與r-nacos在同一臺機器,可以用臨時埠號啟動r-nacos,等遷移時再更新埠號重啟)
- 在r-nacos控制檯錄入應用依賴的使用者資訊,完成使用者資料初始化。
- 在r-nacos控制檯錄入名稱空間資料;
- 從nacos控制檯按名稱空間全量匯出資料(每個名稱空間會匯出一個檔案);然後分別把這部分配置資料透過r-nacos控制檯匯入對應名稱空間中,完成配置資料遷移。
二、遷移中
資料遷移完成後即可開始切流遷移。
把應用請求流量切到r-nacos中,這一步不同的場景需要用不同的處理方式:
- 應用直接請求nacos服務場景:r-nacos需要和nacos在同一個機器替換它;需要先關閉nacos,再把r-nacos的埠改成原nacos埠啟動,完成切換。
- 應用請求nginx後反向代理到nacos場景:更新nginx配置,把nacos反向代理地址更新為r-nacos地址,然後重新增加配置完成切換。
切流遷移完成後,注意觀察應用與r-nacos的表現是否符合預期。
注意:就算目標是要開啟鑑權,這個階段r-naocs也不要啟介面鑑權 (RNACOS_ENABLE_OPEN_API_AUTH=false
),以防應用使用原nacos分配舊token請求被攔截。
三、遷移後收尾
完成遷移穩定執行一小段時間後,可以將nacos移除,只保留r-nacos。
如果需要對介面開啟鑑權,則走以下操作:
a) 等應用舊token都過期(預設過期時間是5小時)都重新從r-nacos獲取新token之後,再開啟介面鑑權配置重啟r-nacos(r-nacos可以秒級重啟,應用幾乎無感)。
b) 也可以分批重啟應用強行其使用r-nacos token,之後再開啟介面鑑權配置重啟r-nacos。
至此完成從nacos遷移到r-nacos
3. 遷移案例
前面講的是遷移操作步驟可能比較抽象,這裡再補充兩個具體遷移場景案例讓讀者更有體感。
3.1 應用服務直鏈單節點nacos的場景遷移方案
部署圖:
nacos持久化內容:
nacos使用情況:
- 在10.0.24.9部署一臺nacos,使用預設埠號8848,8948提供服務;
- nacos上設定兩個名稱空間pre,prod分別對預發、生產環境提供服務
- 有3個應用,每個應用2個例項使用nacos服務; 總共兩套環境,其中一套環境共有3個配置檔案,3個服務,6個例項;
- 應用使用的使用者名稱:
xxx_app_id
,密碼:a07a6deb5e56
目標:
在同一臺機器中部署r-nacos替換nacos提供服務,使用systemd方式部署
3.1.1 遷移步驟——遷移前
步驟1 、 在10.0.24.9使用臨時埠8858部署r-nacos。
這裡假設使用linux systemd方式部署。具體部署方式參考r-nacos說明文件,這裡不展開。
關鍵配置項如下:
# r-nacos監聽http埠,這裡使用臨時埠8858,後面切流時調整回來
RNACOS_HTTP_PORT=8858
# r-nacos監聽grpc埠,grpc埠這裡不配置,預設值:HTTP埠+1000
# RNACOS_GRPC_PORT=9858
# r-nacos獨立控制檯埠,這個沒有埠衝突,可以直接使用正式埠
RNACOS_HTTP_CONSOLE_PORT=10848
RNACOS_ENABLE_OPEN_API_AUTH=false
注:如果是docker啟動方式,配置埠不用改,只需改對應對外對映的埠號即可
步驟2 、初始化使用者資訊
訪問http://10.0.24.9:10848/rnacos/
進入控制檯。
增加應用依賴使用者,使用者名稱:xxx_app_id
,密碼: `a07a6deb5e56
步驟3、初始化名稱空間
初始化名稱空間 pre、prod
步驟4、遷移配置資訊
- 從nacos匯出配置
分別匯出pre、prod名稱空間下的配置
匯出的檔名格式為:nacos_config_export_20240721230938.zip
注意:每次匯出後記得改下檔名增加名稱空間標記,以防匯入時選錯檔案。
- 把配置匯入r-nacos
分別把上一步nacos匯出的配置檔案包匯出到r-nacos pre、prod名稱空間下的配置。
a) 進入r-nacos控制檯->配置列表頁,選擇對應名稱空間
b) 上傳匯入配置檔案
匯入後:
上面圖中操作的是pre名稱空間,prod名稱空間也操作一遍,這裡不展開。
3.1.2 遷移步驟——遷移中
步驟5、 完成資料初始化後關閉r-nacos,先把臨時埠更新正式埠,方便後面可以直接啟動r-nacos。
關閉r-nacos服務
systemctl stop rnacos
關鍵配置項如下:
properties
# r-nacos監聽http埠
RNACOS_HTTP_PORT=8848
# r-nacos監聽grpc埠,grpc埠這裡不配置,預設值:HTTP埠+1000
# RNACOS_GRPC_PORT=9848
# r-nacos獨立控制檯埠
RNACOS_HTTP_CONSOLE_PORT=10848
# 切換過程中不開啟介面鑑權
RNACOS_ENABLE_OPEN_API_AUTH=false
步驟6、關閉nacos
# 切換到nacos目錄,執行以下命名關閉nacos
./bin/shutdown.sh
步驟7、啟動r-nacos
配置資訊在關閉nacos前已準備好,直接啟動r-nacos服務:
systemctl start rnacos
3.1.3 遷移步驟——遷移後
步驟8、切流完成,觀察應用與r-nacos確認其是否正常工作。
應用服務可透過上游應用頁面訪問看看是否正常。
r-nacos可能透過監控頁面查詢其是否被應用訪問。
步驟9、開啟r-nacos介面鑑權 (可選)
切流完成後過5個小時之後,開啟r-nacos介面鑑權。
關鍵配置項如下:
properties
# r-nacos監聽http埠
RNACOS_HTTP_PORT=8848
# r-nacos監聽grpc埠,grpc埠這裡不配置,預設值:HTTP埠+1000
# RNACOS_GRPC_PORT=9848
# r-nacos獨立控制檯埠
RNACOS_HTTP_CONSOLE_PORT=10848
# 開啟介面鑑權
RNACOS_ENABLE_OPEN_API_AUTH=true
重啟r-nacos服務:
systemctl start rnacos
至此,完成從nacos到r-nacos的遷移
3.2 應用服務透過nginx連結nacos場景遷移方案
部署圖:
nacos內容和前一個場景一樣,部署時中間多用了nginx代理提供服務。
透過nginx連結nacos,那麼切換時只需要把nginx配置中原nacos地址切換為r-naocs地址,然後透過 nginx -s reload
重新載入配置規則即可完成切流。
3.2.1 遷移步驟——遷移前
步驟和前一個場景第1、2、3、4步一致,這裡不展開。
3.2.2 遷移步驟——遷移中
步驟5、更新nginx配置,把原nacos地址切換為r-naocs地址。
原nginx配置
# nacos http
server {
listen 8848;
listen [::]:8848;
server_name localhost;
location /nacos {
proxy_set_header Host $proxy_host;
proxy_pass http://10.0.24.9:8848;
}
}
# nacos grpc
server {
listen 9848;
listen [::]:9848;
server_name localhost;
location /nacos {
grpc_pass grpc://10.0.24.9:9848;
}
}
更新後的nginx配置
# nacos http
server {
listen 8848;
listen [::]:8848;
server_name localhost;
location /nacos {
proxy_set_header Host $proxy_host;
proxy_pass http://10.0.24.9:8858;
}
}
# nacos grpc
server {
listen 9848;
listen [::]:9848;
server_name localhost;
location /nacos {
grpc_pass grpc://10.0.24.9:9858;
}
}
執行nginx -s reload
重新載入配置規則即可完成切流。
切換後:
3.2.3 遷移步驟——遷移後
步驟和前一個場景第8、9步一致,這裡不展開。
總結
對於nacos遷移到r-nacos,分析待遷移資料項與劃分好遷移各個階段需要做的事項,可以設計出合適的遷移方案。
遷移可分在遷移前、遷移中、遷移後三個階段,本文結合樣例場景給出了較具體操作步驟。
如果上面的案例和自己的實際情況一致,可以考慮應用請求nacos前加一層nginx反向代理,之後再按案例2遷移即可。