0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

SpringCloud Alibaba之Nacos集群部署+高可用保證

jf_ro2CN3Fa ? 來源:CSDN ? 2023-06-05 16:46 ? 次閱讀

Nacos 集群的工作原理

官方推薦用戶把所有服務列表放到一個vip下面,然后掛到一個域名下面。

域名 + SLB模式(內網(wǎng)SLB,不可暴露到公網(wǎng),以免帶來安全風險),可讀性好,而且換ip方便,推薦模式:

c61a0a6a-037b-11ee-90ce-dac502259ad0.png

Nacos 集群架構的設計要點:

微服務并不是直接通過 IP 地址訪問后端服務,而是采用域名訪問。通過 DNS(域名解析服務)轉換為具體的 IP 地址,通過域名方式屏蔽后端容易產生變化的 IP 地址。

底層 Nacos 自帶集群間節(jié)點與數(shù)據(jù)同步方案,因此需要 Nacos 節(jié)點對外暴露 8848 與 7848 端口。其中 8848 端口的作用是對外暴露 API 與集群間數(shù)據(jù)同步,而 7848 端口則用于節(jié)點選舉來確定集群領袖(Leader)。同時 Nacos 在集群環(huán)境下需要持久化應用配置、用戶權限、歷史信息等內置數(shù)據(jù),因此需要額外部署 MySQL 數(shù)據(jù)庫提供統(tǒng)一存儲。

在 Nacos 層面,每一臺服務器都有獨立的 IP。我們并不建議直接將物理 IP 對外暴露,而是額外增加 VIP(虛擬 IP),通過 DNS 服務綁定 VIP,這樣的好處是通過 VIP 屏蔽了Nacos集群實際的物理IP地址,同時為訪問者提供了統(tǒng)一的接入入口,使微服務的注冊接入和Nacos 集群實現(xiàn)細節(jié)彼此解耦,提高架構的維護性。

Nacos集群部署

Linux部署

第一步,環(huán)境準備。

Nacos 因為選舉算法的特殊性,要求最少三個節(jié)點才能組成一個有效的集群。一般選舉算法都建議奇數(shù)個節(jié)點,2個節(jié)點的數(shù)據(jù)一致性可能無法保障。

c63343ea-037b-11ee-90ce-dac502259ad0.png

Nacos 采用 Raft 選舉算法構成集群

配置需要:

c65919da-037b-11ee-90ce-dac502259ad0.png

官方建議最低運行內存:

準備三臺服務器(虛擬機),在這三個節(jié)點上安裝好 JDK1.8,并配置 JAVA_HOME 環(huán)境變量。

此外還需要額外部署一臺 MySQL 數(shù)據(jù)庫用于保存 Nacos 的配置管理、權限控制信息。這里推薦版本為 MySQL5.7 或者 MySQL 8.0。

第二步,下載安裝 Nacos。

下載 Nacos 2.0.2 版本,上傳到每一臺 CentOS 服務器的 /usr/data 目錄下,執(zhí)行解壓縮命令,生成 Nacos 目錄

tar-xvfnacos-server-2.0.2.tar.gz

第三步,配置數(shù)據(jù)庫。

使用任意 MySQL 客戶端工具連接到 MySQL 數(shù)據(jù)庫服務器,創(chuàng)建名為nacos_config的數(shù)據(jù)庫,之后使用 MySQL 客戶端執(zhí)行 /usr/data/nacos/conf/nacos-mysql.sql 文件,完成建表工作。

c695457c-037b-11ee-90ce-dac502259ad0.png

nacos_config 數(shù)據(jù)庫初始化腳本

c6c8c848-037b-11ee-90ce-dac502259ad0.png

nacos_config 表結構

相關表說明:

config_* :所有 config_ 開頭的表都是 Nacos 配置中心使用時保存應用配置的表。

users:系統(tǒng)用戶表,在集群環(huán)境下用戶信息保存在 users 表中,而非在配置文件中。

roles:系統(tǒng)角色表,Nacos 的權限基于 RBAC(基于角色的訪問控制)模型設計,此表保存角色數(shù)據(jù)。

permissions: 系統(tǒng)權限表,說明角色與系統(tǒng)使用權限的對應關系。

第四步,配置 Nacos 數(shù)據(jù)源。

依次打開 3 臺 Nacos 服務器中的核心配置文件 application.properties,文件路徑如下:

/usr/data/nacos/conf/application.properties

定位到 36 行 Count of DB “數(shù)據(jù)源”配置附近,默認數(shù)據(jù)源配置都被#號注釋,刪除注釋按下方示例配置數(shù)據(jù)源即可。

>基于SpringBoot+MyBatisPlus+Vue&Element實現(xiàn)的后臺管理系統(tǒng)+用戶小程序,支持RBAC動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能
>
>*項目地址:
>*視頻教程

#設置數(shù)據(jù)庫平臺為mysql
spring.datasource.platform=mysql

>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element實現(xiàn)的后臺管理系統(tǒng)+用戶小程序,支持RBAC動態(tài)權限、多租戶、數(shù)據(jù)權限、工作流、三方登錄、支付、短信、商城等功能
>
>*項目地址:
>*視頻教程

#CountofDB:數(shù)據(jù)庫總數(shù)
db.num=1
#ConnectURLofDB:數(shù)據(jù)庫連接,根據(jù)你的實際情況調整
db.url.0=jdbc//xxx: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

c6f1b15e-037b-11ee-90ce-dac502259ad0.png

通過 cluster.conf.example 創(chuàng)建集群節(jié)點列表

首先利用復制命令創(chuàng)建 cluster.conf 文件。

cpcluster.conf.examplecluster.conf

之后打開 cluster.conf,添加所有 Nacos 集群節(jié)點 IP 及端口。

ip1:8848
ip2:8848
ip3:8848

每個nacos服務器上都需要設置cluster.conf文件,Nacos 通過 cluster.conf 了解集群節(jié)點的分布情況。

第六步,啟動 Nacos 服務器。

在 3 臺 Nacos 節(jié)點上分別執(zhí)行下面的啟動命令。

sh/usr/local/nacos/bin/startup.sh

注意,集群模式下并不需要增加“-m”參數(shù),默認就是以集群方式啟動。

啟動時可以通過 tail 命令觀察啟動過程。

tail-f/usr/local/nacos/logs/start.out

啟動日志關鍵內容如下:

#-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所有集群節(jié)點
INFOTheserverIPlistofNacosis[xxx1:8848,xxx2:8848,xxx3:8848]
...
#Nacos正在啟動
INFONacosisstarting...
...
#集群模式啟動成功,采用外置存儲MySQL數(shù)據(jù)庫
INFONacosstartedsuccessfullyinclustermode.useexternalstorage

當確保所有節(jié)點均啟動成功

登錄后便可看到集群列表。

c70c3e3e-037b-11ee-90ce-dac502259ad0.png

所有節(jié)點均已上線

UP 代表節(jié)點已就緒,DOWN 代表節(jié)點已離線,目前所有節(jié)點均已就緒。

第七步,微服務接入。

在開發(fā)好的微服務程序中,在 application.properties 配置 Nacos 集群的任意節(jié)點都可以完成接入工作,Nacos 內置的數(shù)據(jù)同步機制會保證各節(jié)點數(shù)據(jù)一致性。

#應用名稱,默認也是在微服務中注冊的微服務ID
spring.application.name=sample-service
#配置ip1/ip2/ip3都可以接入Nacos
spring.cloud.nacos.discovery.server-addr=ip1:8848,ip2:8848,ip3:8848
#連接Nacos服務器使用的用戶名、密碼,默認為nacos
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discvery.password=nacos
#微服務提供Web服務的端口號
server.port=9000

啟動微服務后,訪問下面三個 URL,會發(fā)現(xiàn)服務列表的結果是一致的,這也證明集群模式下 Nacos 能夠保證各節(jié)點的數(shù)據(jù)同步。

http://ip1:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
http://ip2:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
http://ip3:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=

到這里 Nacos 集群的主體配置工作已完成,但僅會部署是遠不夠的,我們還需了解集群的內部運行機制。

docker部署(參考待驗證)

Nacos 集群的工作原理

Nacos 集群中 Leader 節(jié)點是如何產生的

Nacos 集群采用 Raft 算法實現(xiàn)。它是一種比較簡單的選舉算法,用于選舉出 Nacos 集群中最重要的 Leader(領導)節(jié)點。

c72d3b5c-037b-11ee-90ce-dac502259ad0.png

在 Nacos 集群中,每個節(jié)點都擁有以下三種角色中的一種。

Leader :領導者,集群中最重要的角色,用于向其他節(jié)點下達指令。

Candidate :參選者,參與競選 Leader 的節(jié)點。

Follower :跟隨者,用于接收來自 Leader 或者 Candidate 的請求并進行處理。

在集群中選舉出 Leader 是最重要的工作,產生選舉的時機有三個:

在 Nacos 節(jié)點啟動后,還沒有產生Leader時選舉;

集群成員總量變更時重新選舉;

當 Leader 停止服務后重新選舉。

在開始介紹選舉過程前,先理解任期(Term)的含義:

Raft 算法將時間劃分成為任意不同長度的任期(Term)。任期用連續(xù)的數(shù)字進行表示。每一個任期的開始都是一次選舉(Election),一個或多個候選人會試圖成為 Leader。

為了便于理解,我們使用文字+表格的形式說明選舉過程。

1.當最開始的時候,所有 Nacos 節(jié)點都沒有啟動。角色默認為 Follower(跟隨者),任期都是 0。

節(jié)點 角色 任期 狀態(tài)
ip1 Follower 0 down
ip2 Follower 0 down
ip3 Follower 0 down

2.當?shù)谝粋€節(jié)點(ip1)啟動后,節(jié)點角色會變?yōu)?Candidate(參選者),ip1 節(jié)點在每一個任期開始時便會嘗試向其他節(jié)點發(fā)出投票請求,征求自己能否成為 Leader(領導者)節(jié)點。只有算上自己獲得超過半數(shù)的選票,這個 Candidate 才能轉正為 Leader。

在當前案例,因為 ip1 發(fā)起選舉投票,但 ip2/ip3 兩個節(jié)點不在線,盡管 ip1 會投自己一票,但在總 3 票中未過半數(shù),因此無法成為 Leader。因為第一次選舉沒有產生 Leader,過段時間在下一個任期開始時,ip1 任期自增加 1,同時會再次向其他節(jié)點發(fā)起投票請求爭取其他節(jié)點同意,直到同意票過半。

節(jié)點 角色 任期 狀態(tài)
ip1 Candidate 10 up
ip2 Follower 0 down
ip3 Follower 0 down

3.在 Raft 算法中,成為 Leader 的必要條件是某個 Candidate 獲得過半選票,如果 ip2 節(jié)點上線,遇到 ip1 再次發(fā)起投票。

ip2 投票給 ip1 節(jié)點,ip1 獲得兩票超過半數(shù)就會成為 Leader,ip2 節(jié)點自動成為 Follower(跟隨者)。之后 ip3 節(jié)點上線,因為集群中已有 Leader,因此自動成為 Follower。

節(jié)點 角色 任期 狀態(tài)
ip1 Leader 11 up
ip2 Follower 5 up
ip3 Follower 0 up

4.當 Leader 節(jié)點宕機或停止服務,會在剩余 2 個 Nacos 節(jié)點中產生新的 Leader。如下所示ip3獲得兩票成為 Leader,ip2 成為 Follower,ip1已經(jīng)下線但角色暫時仍為 Leader。

節(jié)點 角色 任期 狀態(tài)
ip1 Leader 11 down
ip2 Follower 12 up
ip3 Leader 12 up

之后 ip1 恢復上線,但此時 Nacos 集群已有 Leader 存在,ip1 自動變?yōu)?Follower,且任期歸0。

節(jié)點 角色 任期 狀態(tài)
ip1 Follower 0 up
ip2 Follower 12 up
ip3 Leader 12 up

對于 Nacos 集群來說,只要 UP 狀態(tài)節(jié)點不少于"1+N/2",集群就能正常運行。但少于“1+N/2”,集群仍然可以提供基本服務,但已無法保證 Nacos 各節(jié)點數(shù)據(jù)一致性。

以上就是 Nacos 基于 Raft 算法的 Leader 選舉過程,確定 Leader 是維持 Nacos 集群數(shù)據(jù)一致的最重要前提,下面咱們來講解在微服務注冊時 Nacos 集群節(jié)點信息同步的過程。

Nacos 節(jié)點間的數(shù)據(jù)同步過程

c77b3776-037b-11ee-90ce-dac502259ad0.png

Nacos 節(jié)點間的數(shù)據(jù)同步過程:

在 Raft 算法中,只有 Leader 才擁有數(shù)據(jù)處理與信息分發(fā)的權利。因此當微服務啟動時,假如注冊中心指定為 Follower 節(jié)點,則步驟如下:

第一步,F(xiàn)ollower 會自動將注冊心跳包轉給 Leader 節(jié)點;

第二步,Leader 節(jié)點完成實質的注冊登記工作;

第三步,完成注冊后向其他 Follower 節(jié)點發(fā)起“同步注冊日志”的指令;

第四步,所有可用的 Follower 在收到指令后進行“ack應答”,通知 Leader 消息已收到;

第五步,當 Leader 接收過半數(shù) Follower 節(jié)點的 “ack 應答”后,返回給微服務“注冊成功”的響應信息。

此外,對于其他無效的 Follower 節(jié)點,Leader 仍會不斷重新發(fā)送,直到所有 Follower 的狀態(tài)與 Leader 保持同步。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2952

    瀏覽量

    104493
  • URL
    URL
    +關注

    關注

    0

    文章

    139

    瀏覽量

    15299
  • 虛擬機
    +關注

    關注

    1

    文章

    906

    瀏覽量

    28027
  • RBAC
    +關注

    關注

    0

    文章

    44

    瀏覽量

    9939
  • MYSQL數(shù)據(jù)庫

    關注

    0

    文章

    95

    瀏覽量

    9375

原文標題:SpringCloud Alibaba 之 Nacos 集群部署+高可用保證

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    LinuxHA可用集群知識,學到就是賺到

    HA(High Availability)可用集群,其特點為根據(jù)實際需求為前端Diretor,后端RS-server,數(shù)據(jù)庫服務器,共享存儲等集群節(jié)點做一個從備份服務器或者多個服務器
    的頭像 發(fā)表于 12-23 07:10 ?6344次閱讀

    Kubernetes Ingress 可靠部署最佳實踐

    摘要: 在Kubernetes集群中,Ingress作為集群流量接入層,Ingress的高可靠性顯得尤為重要,今天我們主要探討如何部署一套高性能可靠的Ingress接入層。簡介
    發(fā)表于 04-17 14:35

    Hadoop的集群環(huán)境部署說明

    或者是相同,指令多、步驟繁瑣。有的時候覺得不免覺得很奇怪,這些發(fā)行商為什么不對hadoop的集群環(huán)境部署做一下優(yōu)化呢?幸運的是總算是讓我找到了一個hadoop發(fā)行版集群環(huán)境搭建簡單易用。這里使用的是一款
    發(fā)表于 10-12 15:51

    結合場景談一談微服務配置

    的機房發(fā)生不可抗的災難(如地震)時,我們需要有動態(tài)調度流量的能力,最好能秒級得將流量從區(qū)域 A 調度到另外可用的區(qū)域的集群上。這正是 Nacos 配置管理大有作為的地方,將用戶 ID 的分片和對應的路由
    發(fā)表于 12-12 15:53

    基于kafka和zookeeper可用集群的shell腳本使用步驟

    kafka+zookeeper可用集群搭建shell腳本使用教程
    發(fā)表于 03-11 16:50

    Flink集群部署方法

    Flink集群部署詳細步驟
    發(fā)表于 04-23 11:45

    redis集群的如何部署

    redis集群部署(偽分布式)
    發(fā)表于 05-29 17:13

    構建ARM64版本nacos docker鏡像

    在適配過程中有大量合作伙伴用到nacos且采用容器化部署,dockerhub未提供官方鏡像,因此需要在鯤鵬服務器自定義構建。構建前提:Docker已部署構建步驟:1、下載包含構建所需的腳本下載完成
    發(fā)表于 06-16 14:29

    淺談Kubernetes集群可用方案

    整個Kubernetes集群中處于中心數(shù)據(jù)庫的地位,為保證Kubernetes集群可用性,首先需要
    發(fā)表于 10-11 10:04 ?1次下載
    淺談Kubernetes<b class='flag-5'>集群</b>的<b class='flag-5'>高</b><b class='flag-5'>可用</b>方案

    Eureka的集群搭建方法-保證可用

    在微服務架構中,注冊中心是一個必不可少的組件 前面我們搭建的注冊中心只適合本地開發(fā)使用,在生產環(huán)境必須搭建一個集群保證可用 Eureka的集群
    發(fā)表于 11-29 10:41 ?7531次閱讀
    Eureka的<b class='flag-5'>集群</b>搭建方法-<b class='flag-5'>保證</b><b class='flag-5'>高</b><b class='flag-5'>可用</b>

    Nacos、OpenFeign、Ribbon組件協(xié)調工作的原理

    ? ? Nacos 如何進行服務自動注冊? Ribbon OpenFeign 總結 前幾天有個大兄弟問了我一個問題,注冊中心要集成SpringCloud,想實現(xiàn)SpringCloud的負載均衡,需要
    的頭像 發(fā)表于 05-22 10:46 ?959次閱讀
    <b class='flag-5'>Nacos</b>、OpenFeign、Ribbon組件協(xié)調工作的原理

    如何搭建可用集群

    、Kubernetes 6、總結 1、可用 2、關于CP還是AP的選擇 3、技術體系 4、產品的活躍度 1、前言 微服務的注冊中心目前主流的有以下五種: Zookeeper Eureka Consul
    的頭像 發(fā)表于 05-25 11:03 ?561次閱讀
    如何搭建<b class='flag-5'>高</b><b class='flag-5'>可用</b><b class='flag-5'>集群</b>

    Nacos實現(xiàn)原理:SpringCloud集成Nacos的實現(xiàn)過程

    Protocol是一致性協(xié)議,用來實現(xiàn)Nacos集群節(jié)點的數(shù)據(jù)同步,這里使用的是Raft算法(Etcd、Redis哨兵選舉)
    發(fā)表于 10-09 16:08 ?978次閱讀
    <b class='flag-5'>Nacos</b>實現(xiàn)原理:<b class='flag-5'>SpringCloud</b>集成<b class='flag-5'>Nacos</b>的實現(xiàn)過程

    springcloud alibaba 五大組件

    Spring Cloud Alibaba是Spring Cloud的一個子項目,該項目致力于為構建分布式應用提供一站式解決方案。它基于阿里巴巴的底層Java開源框架,主要包含以下五大組件: 服務注冊
    的頭像 發(fā)表于 12-03 16:30 ?2w次閱讀

    K8S學習教程(二):在 PetaExpress KubeSphere容器平臺部署可用 Redis 集群

    前言 Redis 是在開發(fā)過程中經(jīng)常用到的緩存中間件,為了考慮在生產環(huán)境中穩(wěn)定性和可用,Redis通常采用集群模式的部署方式。 在制定Redis
    的頭像 發(fā)表于 07-03 15:30 ?647次閱讀
    K8S學習教程(二):在 PetaExpress KubeSphere容器平臺<b class='flag-5'>部署</b><b class='flag-5'>高</b><b class='flag-5'>可用</b> Redis <b class='flag-5'>集群</b>