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