1. 程式人生 > >微服務管理平臺nacos虛擬ip負載均衡叢集模式搭建

微服務管理平臺nacos虛擬ip負載均衡叢集模式搭建

一、Nacos簡介

Nacos是用於微服務管理的平臺,其核心功能是服務註冊與發現、服務配置管理。

  • Nacos作為服務註冊發現元件,可以替換Spring Cloud應用中傳統的服務註冊於發現元件,如:Eureka、consul等,支援服務的健康檢查。
  • Nacos作為服務配置中心,可以替換Spring Cloud Config。

當然Nacos作為一個微服務管理平臺,除了面向spring Cloud,還支援很多其他的微服務基礎設施,如:docker、dubbo、kubernetes等。除了核心的服務註冊與發現和配置管理功能,還提供了各種服務管理的功能特性,如:動態DNS、服務元資料管理等。

二、Nacos單點部署

Nacos支援單點部署的模式,搭建過程非常簡單,實際上nacos的standalone模式沒有所謂的安裝過程,就是下載和啟動。但是這種情況沒有高可用支援,所以只適合測試或學習使用。
首先去nacos的github地址下載release安裝包。當然你也可以自己下載原始碼之後進行編譯打包,nacos是使用java開發的,使用maven進行編譯打包。這裡我們就不自己打包了,使用release安裝包。下載地址是:https://github.com/alibaba/nacos/releases。在linux系統下可以使用如下的命令下載和解壓縮。

#下載nacos
wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz;
# 解壓nacos
tar -xvf nacos-server-1.1.4.tar.gz

進入到nacos/bin目錄下面,startup命令用於啟動nacos,shutdown命令用於停掉nacos。

  • 如果你是linux/unix系統,使用sh startup.sh -m standalone指令碼啟動方式。
  • 如果你是windows系統,雙擊startup.cmd啟動nacos。

nacos的預設服務埠是8848,啟動完成之後通過瀏覽器訪問nacos:http://ip:8848/nacos/。看到如下介面,需要登陸,預設的使用者名稱密碼都是nacos,登陸之後看到如下介面:

如果你訪問不到上面的介面,請檢查你部署的主機作業系統的防火牆設定。以下是為CentOS7系統防火牆開放8848埠的命令,其他系統請自行解決。

firewall-cmd --zone=public --add-port=8848/tcp --permanent    
firewall-cmd --reload

三、檢視主機網絡卡名稱

使用ip addr命令檢視linux主機的網絡卡。

  • 第一個lo網路ip是迴路ip,127.0.0.1,這個是標配
  • 第二個enp0s3網路裝置,ip是10.0.2.15,這個是因為我的伺服器網路使用了雙網絡卡:橋接+HostOnly模式。正常的伺服器是沒有的。
  • 第三個enp0s8就是本伺服器真正的使用到提供服務的網路ip,如:192.168.161.4。
  • 第四個網路裝置是因為我在這臺虛擬機器上安裝過docker,所以有一個docker0的網路裝置。

因為較多的網路裝置,導致我在後續安裝過程出現問題。這裡先賣個關子。

四、配置nacos叢集

我們準備了三臺伺服器(虛擬機器),192.168.161.3、192.168.161.4、192.168.161.5。在三臺伺服器上分別下載、解壓nacos,並開放8848埠。參考單點standalone部署的模式的操作。然後在conf/cluster.conf中加入三臺伺服器的ip配置

#ip:port
192.168.161.3:8848
192.168.161.4:8848
192.168.161.5:8848
  • 初始化 MySQL 資料庫,sql原始檔是在nacos/conf解壓目錄下面的nacos-mysql.sql檔案。sql語句原始檔。並在nacos/conf/application.properties中增加mysql配置
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://192.168.161.3:3306/testdb?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=test
db.password=
  • spring.datasource.platform說明支援資料持久化的資料庫型別,已知目前只支援mysql
  • db.num資料庫的數量,我們實驗環境只有一個mysql資料庫,所以是1
  • db.url.0表示第一個mysql資料庫的jdbc url連線。如果還有第二個、第三個,請增加db.url.n中的n。

問題: 解決網絡卡獲取的不是我們希望繫結的網絡卡的問題:當我們配置完成之後,使用startup.sh命令啟動。發現叢集節點列表中並沒有任何記錄。而且後臺服務日誌報錯,內容如下:

分析: 通過日誌我們看到nacos程式自動獲取的是10.0.2.15這個ip,而我們配置的是192.168.161.x的ip。二者不一致,所以報錯。我們看一下獲取主機ip的程式原始碼,如下:

private static String getHostAddress() {
        String address = System.getProperty("nacos.server.ip");
        if (StringUtils.isNotEmpty(address)) {
            return address;
        } else {
            address = "127.0.0.1";
        }
        ...
}

解決方案: 看完原始碼之後,ip是通過System.getProperty獲取的,所以我們完全可以通過JVM傳參指定ip。在startup.sh的啟動指令碼中增加nacos.server.ip引數。

#=================================================================================
# JVM Configuration
#================================================================================

# 單機模式對應的啟動引數
if [[ "${MODE}" == "standalone" ]]; then
    JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
    JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
# 叢集模式對應的啟動引數
    JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
    JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
    JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
# 新增以下引數設定本機ip地址
    JAVA_OPT="${JAVA_OPT} -Dnacos.server.ip=你的伺服器的ip"
fi

當以上工作都完成之後,我們通過瀏覽器分別訪問nacos服務,看到如下介面。叢集管理的節點列表裡面已經有三各節點,ip分別是192.168.161.3:8848、192.168.161.4:8848、192.168.161.5:8848。

五、nacos叢集架構

在完成nacos叢集的配置之後,我們可以通過三個入口分別訪問叢集內的nacos服務,那下面的問題就是如何將三個入口轉成一個入口。目前許多個人開發者寫的部落格或教程中的方法就是在三個nacos服務的前端加一個負載均衡器,如:nginx、haproxy。然後號稱是生產級別的搭建方法,但這種方法是絕對不能用於生產的,因為你的nginx和haproxy是單點,一旦nginx掛了,整個服務就掛了。

nacos官網推薦的方法是使用虛擬ip的方法,如下:

  • 最開始虛擬ip192.168.161.6可能與192.168.161.3的主機繫結在一起,通過這兩個ip都可以訪問192.168.161.3主機的nacos服務。
  • 一旦192.168.161.3主機宕機或者其他網路故障,192.168.161.6會自動切換到與192.168.161.4或者192.168.161.5主機繫結在一起。這個過程被叫做虛擬ip的漂移。

這種虛擬ip的方法就是沒有使用到負載均衡,訪問的仍然是某一個節點的nacos服務,只不過形成了主從備份,提供了高可用。那既可以提供高可用,又可以提供負載均衡的辦法可能有的朋友已經想到了,如下圖:

  • 在nacos服務的前端加上nginx或者haproxy的負載均衡器
  • 然後對負載均衡器使用虛擬ip,通過keepalived實現虛擬ip的漂移
  • 使用者訪問負載均衡器實現對nacos服務的訪問,主nginx掛掉,虛擬ip漂移到從nginx負載均衡提供服務

六、nacos叢集(虛擬ip漂移)

我們就拿官網中推薦的方法,使用虛擬ip訪問nacos叢集的方式做個例子講解一下。為什麼不講第三種?一般系統架構水平到了的人聽懂這種方式就知道第三種方式怎麼做,水平不到的人聽了第三種仍然還是不懂。

6.1.安裝配置keepalived

在三臺伺服器上分別安裝keepalived

yum install -y keepalived

在三臺伺服器上分別修改/etc/keepalived/keepalived.conf

vrrp_instance VI_1 {
    state MASTER
    interface enp0s8
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 123456
    }
    virtual_ipaddress {
        192.168.161.6
    }
}
  • 一臺伺服器是MASTER,其他的伺服器為BACKUP
  • interface 配置為我們剛剛檢視的網絡卡的名稱
  • virtual_router_id 必須一致,表示這三臺伺服器搶用一個虛擬ip。
  • 修改priority 優先順序,三臺伺服器要不一樣,比如:100、101、102,優先順序最高的優先使用虛擬ip。MASTER的優先順序一定要高於BACKUP主機
  • advert_int 是幾臺伺服器之間的同步檢查時間,1秒
  • authentication 的設定必須一致,這樣這幾臺伺服器才能通訊
  • 修改virtual_ipaddress為三臺伺服器所在網段內未被佔用的IP地址,比如:192.168.161.6

6.2.修改防火牆
CentOS7必須開放防火牆配置,否則三臺主機無法就虛擬ip的使用優先順序通訊,將都是MASTER,都配置虛擬ip。

firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0  --protocol vrrp -j ACCEPT;
firewall-cmd --reload;

6.3.啟動keepalived服務

sudo systemctl restart keepalived.service

期待您的關注

  • 向您推薦博主的系列文件:《手摸手教您學習SpringBoot系列-16章97節》
  • 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。