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


微服務管理平臺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。

微服務管理平臺nacos虛擬ip負載均衡集群模式搭建
  • 如果你是linux/unix系統,使用sh startup.sh -m standalone腳本啟動方式。
  • 如果你是windows系統,雙擊startup.cmd啟動nacos。

nacos的默認服務端口是8848,啟動完成之後通過瀏覽器訪問nacos:http://ip:8848/nacos/。看到如下界面,需要登陸,默認的用戶名密碼都是nacos,登陸之後看到如下界面:

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

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

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

三、查看主機網卡設備

使用ip addr命令查看linux主機的網絡設備

微服務管理平臺nacos虛擬ip負載均衡集群模式搭建
  • 第一個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虛擬ip負載均衡集群模式搭建

圖片:網卡獲取的不是我們希望綁定的網卡


分析: 通過日誌我們看到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虛擬ip負載均衡集群模式搭建

五、nacos集群架構

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


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


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

微服務管理平臺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虛擬ip負載均衡集群模式搭建

圖片:nacos集群+負載均衡+虛擬ip

  • 在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


分享到:


相關文章: