前情回顧:
- 《Spring Cloud Alibaba基礎教程:使用Nacos實現服務註冊與發現》
- 《Spring Cloud Alibaba基礎教程:支援的幾種服務消費方式》
- 《Spring Cloud Alibaba基礎教程:使用Nacos作為配置中心》
- 《Spring Cloud Alibaba基礎教程:Nacos配置的載入規則詳解》
- 《Spring Cloud Alibaba基礎教程:Nacos配置的多環境管理》
- 《Spring Cloud Alibaba基礎教程:Nacos配置的多檔案載入與共享配置》
通過之前幾篇關於Nacos的博文,對於Nacos分別作為服務註冊中心以及配置中心時,與Spring Cloud體系結合的基礎使用方法已經介紹完畢了。下面我們再用幾篇博文從生產部署的角度,介紹Nacos的相關內容。本文我們將具體說說Nacos的資料儲存以及生產配置的推薦。
資料持久化
在之前的教程中,我們對於Nacos服務端自身並沒有做過什麼特殊的配置,一切均以預設的單機模式執行,完成了上述所有功能的學習。但是,Nacos的單機執行模式僅適用於學習與測試環境,對於有高可用要求的生產環境顯然是不合適的。那麼,我們是否可以直接啟動多個單機模式的Nacos,然後客戶端指定多個Nacos節點就可以實現高可用嗎?答案是否定的。
在搭建Nacos叢集之前,我們需要先修改Nacos的資料持久化配置為MySQL儲存。預設情況下,Nacos使用嵌入式資料庫實現資料的儲存。所以,如果啟動多個預設配置下的Nacos節點,資料儲存是存在一致性問題的。為了解決這個問題,Nacos採用了集中式儲存的方式來支援叢集化部署,目前只要支援MySQL的儲存。
配置Nacos的MySQL儲存只需要下面三步:
第一步:安裝資料庫,版本要求:5.6.5+
第二步:初始化MySQL資料庫,資料庫初始化檔案:nacos-mysql.sql
,該檔案可以在Nacos程式包下的conf
目錄下獲得。執行完成後可以得到如下圖所示的表結構:
第三步:修改conf/application.properties
檔案,增加支援MySQL資料來源配置,新增(目前只支援mysql)資料來源的url、使用者名稱和密碼。配置樣例如下:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=
到這裡,Nacos資料儲存到MySQL的配置就完成了,可以嘗試繼續用單機模式啟動Nacos。然後再根據之前學習的Nacos配置中心的用法來做一些操作,配合MySQL工具就可以看到資料已經寫入到資料庫中了。下一篇,我們將繼續
深入思考
關於Nacos資料的持久化實現,與其他的中介軟體相比,在實現上並沒有採用分散式演算法來解決一致性問題,而是採用了比較常規的集中化儲存來實現。由於採用單一資料來源的方式,直接解決了分散式一致性問題,所以從學習成本的角度上來說,Nacos的實現原理會更容易被理解和接受。但是,從部署的負責度和硬體投入成本上來說,與etcd、consul、zookeeper這些通過演算法方式解決一致性問題的中介軟體相比,就顯得不足了。
同時,在引入MySQL的儲存時,由於多了一箇中介軟體的存在,整個Nacos系統的整體可用性一定是會所有下降的。所以為了彌補可用性的下降,在生產上MySQL的高可用部署也是必須的,成本再次提高。不論如何提高,可用性都難以達到100%,所以這種方式,不論如何提升儲存的可用性,理論上都會對Nacos叢集的自身可用性造成微小的下降。
以上思考主要從理論上,粗略討論的,並沒有經過詳細的成本評估與可用性計算。所以,對於實際應用場景下,可能這些成本的增加和可用性的降低並沒有那麼多大的影響。同時,Spring Cloud Alibaba下使用的各開源元件都有對應的商業產品,在沒有足夠運維人力的團隊下,使用對應的商業產品可能從各方面都會更加划算。
參考資料
程式碼示例
本文介紹內容的客戶端程式碼,示例讀者可以通過檢視下面倉庫中的alibaba-nacos-config-client
專案:
- Github:https://github.com/dyc87112/SpringCloud-Learning/
- Gitee:https://gitee.com/didispace/SpringCloud-Learning/
如果您對這些感興趣,歡迎star、follow、收藏、轉發給予支援!