如何平穩地從nacos遷移到r-nacos?

拾玄發表於2024-07-22

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類資料:

  1. nacos鑑權使用者資料
  2. 名稱空間資料
  3. 配置資料
  4. 服務例項資料

nacos使用者資料、名稱空間資料與配置資料是持久化資料,需要事先完成設定與遷移。
服務例項資料是動態資料,切換後應該會自動註冊,不需要事先遷移。

2.2 遷移階段與步驟

我們可以把遷移分為3個階段:

  1. 遷移前準備階段;
  2. 遷移階段;
  3. 遷移後收尾階段;

一、遷移前準備

  1. 部署r-nacos,用於遷移前做資料遷移與資料錄入。(如果nacos與r-nacos在同一臺機器,可以用臨時埠號啟動r-nacos,等遷移時再更新埠號重啟)
  2. 在r-nacos控制檯錄入應用依賴的使用者資訊,完成使用者資料初始化。
  3. 在r-nacos控制檯錄入名稱空間資料;
  4. 從nacos控制檯按名稱空間全量匯出資料(每個名稱空間會匯出一個檔案);然後分別把這部分配置資料透過r-nacos控制檯匯入對應名稱空間中,完成配置資料遷移。

二、遷移中

資料遷移完成後即可開始切流遷移。

把應用請求流量切到r-nacos中,這一步不同的場景需要用不同的處理方式:

  1. 應用直接請求nacos服務場景:r-nacos需要和nacos在同一個機器替換它;需要先關閉nacos,再把r-nacos的埠改成原nacos埠啟動,完成切換。
  2. 應用請求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使用情況:

  1. 在10.0.24.9部署一臺nacos,使用預設埠號8848,8948提供服務;
  2. nacos上設定兩個名稱空間pre,prod分別對預發、生產環境提供服務
  3. 有3個應用,每個應用2個例項使用nacos服務; 總共兩套環境,其中一套環境共有3個配置檔案,3個服務,6個例項;
  4. 應用使用的使用者名稱: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、遷移配置資訊

  1. 從nacos匯出配置

分別匯出pre、prod名稱空間下的配置

匯出的檔名格式為:nacos_config_export_20240721230938.zip

注意:每次匯出後記得改下檔名增加名稱空間標記,以防匯入時選錯檔案。

  1. 把配置匯入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遷移即可。

相關文章