03 | 高可用保证:Nacos 如何有效构建注册中心集群
如何在生產環境部署 Nacos 集群
首先介紹下之前我們在國內某互聯網金融機構在項目中落地的 Nacos 集群架構圖。
下面我們來解讀下 Nacos 集群架構的設計要點:
Nacos 集群的部署過程
第一步,環境準備。
Nacos 因為選舉算法的特殊性,要求最少三個節點才能組成一個有效的集群,關于選舉算法我會在后面課程中進行講解,感興趣的同學可以持續關注。
這里需要準備三臺服務器(虛擬機)。
我為此準備了三個 CentOS 7 節點,符合最低運行要求,其 IP 地址分別為:
192.168.163.131
192.168.163.132
192.168.163.133
在這三個節點上安裝好 JDK1.8,并配置 JAVA_HOME 環境變量,這些操作在上一節我們已經講過,不再贅述。
此外還需要額外部署一臺 MySQL 數據庫用于保存 Nacos 的配置管理、權限控制信息。這里推薦版本為 MySQL5.7 或者 MySQL 8.0。在我這部署版本為 5.7,IP 地址為:192.168.163.100。
第二步,下載安裝 Nacos。
訪問到 https://github.com/alibaba/nacos/releases/ 網址下載 Nacos 1.4.0 版本,上傳到每一臺 CentOS 服務器的 /usr/local 目錄下,執行解壓縮命令,生成 Nacos 目錄
tar -xvf nacos-server-1.4.0.tar.gz。
第三步,配置數據庫。
使用任意 MySQL 客戶端工具連接到 192.168.163.100 MySQL 數據庫服務器,創建名為nacos_config的數據庫,之后使用 MySQL 客戶端執行 /usr/local/nacos/conf/nacos-mysql.sql 文件,完成建表工作。
其中比較重要的表我們有必要了解一下。
第四步,配置 Nacos 數據源。
依次打開 3 臺 Nacos 服務器中的核心配置文件 application.properties,文件路徑如下
/usr/local/nacos/conf/application.properties定位到 36 行 Count of DB “數據源”配置附近,默認數據源配置都被#號注釋,刪除注釋按下方示例配置數據源即可。
### Count of DB: 數據庫總數 db.num=1 ### Connect URL of DB: 數據庫連接,根據你的實際情況調整 db.url.0=jdbc:mysql://192.168.163.100:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user=root db.password=root第五步,Nacos 集群節點配置
在 /nacos/config 目錄下提供了集群示例文件cluster.conf.example
通過 cluster.conf.example 創建集群節點列表
首先利用復制命令創建 cluster.conf 文件。
之后打開 cluster.conf,添加所有 Nacos 集群節點 IP 及端口。
192.168.163.131:8848 192.168.163.132:8848 192.168.163.133:8848Nacos 通過 cluster.conf 了解集群節點的分布情況。
第六步,啟動 Nacos 服務器。
在 3 臺 Nacos 節點上分別執行下面的啟動命令。
注意,集群模式下并不需要增加“-m”參數,默認就是以集群方式啟動。
啟動時可以通過 tail 命令觀察啟動過程。
啟動日志關鍵內容如下:
#-Xms2g -Xmx2g 默認運行時 JVM 要求 2G 可用內存 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64/bin/java -server -Xms2g -Xmx2g ... ... #列出 Nacos 所有集群節點 INFO The server IP list of Nacos is [192.168.163.131:8848, 192.168.163.132:8848, 192.168.163.133:8848] ... #Nacos 正在啟動 INFO Nacos is starting... ... #集群模式啟動成功,采用外置存儲 MySQL 數據庫 INFO Nacos started successfully in cluster mode. use external storage當確保所有節點均啟動成功,打開瀏覽器訪問下面網址:http://192.168.163.131:8848/nacos/#/clusterManagement?dataId=&group=&appName=&namespace=
登錄后便可看到集群列表。
UP 代表節點已就緒,DOWN 代表節點已離線,目前所有節點均已就緒。
第七步,微服務接入。
在開發好的微服務程序中,在 application.properties 配置 Nacos 集群的任意節點都可以完成接入工作,Nacos 內置的數據同步機制會保證各節點數據一致性。
# 應用名稱,默認也是在微服務中注冊的微服務 ID spring.application.name=sample-service # 配置 192.168.163.131/132/133 都可以接入 Nacos spring.cloud.nacos.discovery.server-addr=192.168.163.131:8848,192.168.163.132:8848,192.168.163.133:8848 #連接 Nacos 服務器使用的用戶名、密碼,默認為 nacos spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discvery.password=nacos #微服務提供 Web 服務的端口號 server.port=9000啟動微服務后,訪問下面三個 URL,會發現服務列表的結果是一致的,這也證明集群模式下 Nacos 能夠保證各節點的數據同步。
http://192.168.163.131:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace= http://192.168.163.132:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace= http://192.168.163.133:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
Nacos 集群的工作原理
Nacos 集群中 Leader 節點是如何產生的
Nacos 集群采用 Raft 算法實現。它是一種比較簡單的選舉算法,用于選舉出 Nacos 集群中最重要的 Leader(領導)節點。
在 Nacos 集群中,每個節點都擁有以下三種角色中的一種。
在集群中選舉出 Leader 是最重要的工作,產生選舉的時機有三個:
在開始介紹選舉過程前,先理解任期(Term)的含義:
Raft 算法將時間劃分成為任意不同長度的任期(Term)。任期用連續的數字進行表示。每一個任期的開始都是一次選舉(Election),一個或多個候選人會試圖成為 Leader。
為了便于理解,我們使用文字+表格的形式說明選舉過程。
之后 131 恢復上線,但此時 Nacos 集群已有 Leader 存在,131 自動變為 Follower,且任期歸0
對于 Nacos 集群來說,只要 UP 狀態節點不少于"1+N/2",集群就能正常運行。但少于“1+N/2”,集群仍然可以提供基本服務,但已無法保證 Nacos 各節點數據一致性。
以上就是 Nacos 基于 Raft 算法的 Leader 選舉過程,確定 Leader 是維持 Nacos 集群數據一致的最重要前提,下面咱們來講解在微服務注冊時 Nacos 集群節點信息同步的過程。
Nacos 節點間的數據同步過程
在 Raft 算法中,只有 Leader 才擁有數據處理與信息分發的權利。因此當微服務啟動時,假如注冊中心指定為 Follower 節點,則步驟如下:
第一步,Follower 會自動將注冊心跳包轉給 Leader 節點;
第二步,Leader 節點完成實質的注冊登記工作;
第三步,完成注冊后向其他 Follower 節點發起“同步注冊日志”的指令;
第四步,所有可用的 Follower 在收到指令后進行“ack應答”,通知 Leader 消息已收到;
第五步,當 Leader 接收過半數 Follower 節點的 “ack 應答”后,返回給微服務“注冊成功”的響應信息。
第六步,對于其他無效的 Follower 節點,Leader 仍會不斷重新發送,直到所有 Follower 的狀態與 Leader 保持同步。
以上便是 Nacos 節點間的數據同步主體流程,如果你對 Nacos 底層的細節感興趣,不妨翻閱 Nacos 的源碼了解更詳細的過程。
總結
以上是生活随笔為你收集整理的03 | 高可用保证:Nacos 如何有效构建注册中心集群的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 02 | 服务治理:Nacos 如何实现
- 下一篇: 04 | 负载均衡:Ribbon 如何保