微服務管理平臺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節》
- 本文轉載註明出處(必須帶連線,不能只轉文字):字母哥部落格。