Nacos(九):Nacos集群部署和遇到的問題
- 2019 年 10 月 3 日
- 筆記
前言
前面的系列文章已經介紹了Nacos的如何接入SpringCloud,以及Nacos的基本使用方式
之前的文章中都是基於單機模式
部署進行講解的,本文對Nacos的集群
部署方式進行說明
環境準備
- JDK8
- Centos7.5(ip:
10.1.8.27
) - MySQL 5.6.5+
- Nacos-server:1.0.1
請提前下載Nacos-server:1.0.1壓縮包並解壓至相應目錄
本次的Nacos-server在linux伺服器上進行啟動。
集群模式部署
Nacos文檔中提供了三種集群部署方案
http://ip1:port/openAPI
直連ip模式:- ip+埠進行部署,客戶端直接連接Nacos的ip
http://Vip:port/openAPI
掛載虛擬IP模式:- 配合KeepAlive,Nacos真實ip都掛載虛擬Ip下
- 客戶端訪問Vip發起請求
- 當主Nacos宕機後,備用Nacos接管,實現高可用,
http://www.nacostest.com:port/openAPI
掛載虛擬IP+域名模式:- 為虛擬ip綁定一個域名,當Nacos集群遷移時,客戶端配置無需修改。
這三種方案都是為了儘可能實現高可用,後兩種方案除了基本的部署流程外更多側重於實現高可用的工作上
本文以第一種ip+埠的方式為大家介紹集群部署方式
當然ip+埠
也有多種部署方式
- 1ip+n埠+Nginx:普通玩家部署方式,沒有過多伺服器,單台伺服器啟動多個nacos實例,僅適合測試使用
- nip+n埠+Nginx:RMB玩家部署方式,伺服器資源充足,組建完美集群,實現更好的容災與隔離
無論怎麼部署,部署方式都是一樣的,這裡我以1ip+3埠+Nginx
的方式進行集群搭建
修改配置
1、修改Nacos-server目錄conf/
下的application.properties
文件,添加mysql數據源
2、修改集群配置
ip和埠的規劃如下:
ip | 埠 |
---|---|
10.1.8.27 | 8849 |
10.1.8.27 | 8850 |
10.1.8.27 | 8851 |
修改conf/
下的cluster.conf.example
文件,將其命名為cluster.conf
,內容如下
# ip:port 10.1.8.27:8849 10.1.8.27:8850 10.1.8.27:8851
註:一定要記得將配置文件重命名為
cluster.conf
, 最好用實際ip,而非127.0.0.1
,否則會出現問題
3、修改啟動腳本
我們要在單台伺服器上啟動多個Nacos實例,要保證三個實例為不同的埠,這裡我們可以修改啟動腳本
定位到export FUNCTION_MODE="all"
這一行,修改腳本內容,使其支援以-p
傳入埠參數
export MODE="cluster" export FUNCTION_MODE="all" # 新加 export SERVER_PORT="8848" while getopts ":m:f:p:" opt do case $opt in m) MODE=$OPTARG;; f) FUNCTION_MODE=$OPTARG;; # 新加 p) SERVER_PORT=$OPTARG;; ?) echo "Unknown parameter" exit 1;; esac done # 新加 JAVA_OPT="${JAVA_OPT} -Dserver.port=${SERVER_PORT}"
相應的,修改shutdown腳本,使其可接收參數
# 新加內容 PORT=$1 if [ ! $PORT ]; then echo "please select stop port!" >&2 exit 1 fi # 添加PORT過濾 pid=`ps ax | grep -i 'nacos.nacos' |grep java |grep ${PORT} | grep -v grep | awk '{print $1}'` # 後邊省略...
啟動Nacos
執行如下三條命令
bash startup.sh -p 8849
bash startup.sh -p 8850
bash startup.sh -p 8851
如果你的機器不能同時啟動3個實例,檢查是否記憶體不夠了,可以適當調整JVM參數
調整啟動腳本中JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m
中的-Xms
-Xmx
-Xmn
啟動成功後會列印如下一句話:
nacos is starting,you can check the /usr/local/nacos/nacos/logs/start.out
查看該目錄下的start.out文件,可以看到如下日誌
此時,多節點的集群雛形已經搭建好了,可以試著訪問Nacos後台
http://ip:8849/nacos/index.html
http://ip:8850/nacos/index.html
http://ip:8851/nacos/index.html
不出意外,可以正常訪問到Nacos控制台
從圖上可以看到集群節點共有三個,其中埠8850為leader
配置Nginx
完成上面的配置後,已經基本完成集群搭建的90%了
這裡我們可以通過Nginx配置,為Nacos提供統一的入口,來實現一個簡單的負載均衡
Nginx配置如下
upstream nacos-server { server 127.0.0.1:8849; server 127.0.0.1:8850; server 127.0.0.1:8851; } server { listen 8848; server_name localhost; location /nacos/ { proxy_pass http://nacos-server/nacos/; } }
執行命令 sudo nginx
啟動nginx
通過8848埠訪問Nacos後台,此時Nginx會將請求分發至nacos-server
下的地址中,這裡默認的分發策略是線性輪詢
客戶端測試
這裡繼續使用之前的Demo項目(Nacos(四))
1、修改下項目配置文件bootstarp.yml
spring: application: name: nacos-config cloud: nacos: discovery: server-addr: 10.1.8.27:8848 config: server-addr: 10.1.8.27:8848 prefix: ${spring.application.name} file-extension: yml
註:主要是修改註冊中心和配置中新的地址,記得替換成你的伺服器地址哦
2、啟動前確保已經向Nacos中添加配置文件,如果已經添加可以忽略
在公共空間(public)中新建一個配置文件DataID: nacos-config.yml
, 配置內容如下:
server: port: 9989 nacos: config: 配置文件已持久化到資料庫中...
3、啟動Nacos-config項目
啟動成功後檢查日誌和Nacos控制台
註冊成功的日誌如下:
09:37:19.366 [main] [nacos] [64] INFO o.s.c.a.n.r.NacosServiceRegistry – nacos registry, nacos-config 10.1.8.71:9989 register finished
控制台中可以看到服務已經註冊
瀏覽器請求nacos-config中的介面,查看是否可以讀取配置
訪問:http://127.0.0.1:9989/getValue 返回:配置文件和服務資訊已持久化到資料庫中…
集群的部署方式就介紹完了,文中的集群部署方式不是最優的方式
實際生產環境下,至少應該保證各個Nacos節點位於不同伺服器,以實現更好的隔離和容災
出現的問題
這裡將我在配置集群時出現的一些問題和解決方式進行說明
1、在集群搭建完成後,啟動nacos客戶端進行服務註冊時報錯了,提示我服務端沒有啟動,稍後再試
,如下:
code:503 msg: server is STARTING now, please try again later!
一臉懵B,Nacos後台都可以訪問的鴨,為啥說我沒啟動。翻閱Nacos-server的源碼後
- 後台可訪問只能說明
nacos-consloe
模組啟動成功 - 無法註冊服務
nacos-naming
模組可能啟動失敗了
參考了github中的#770-issues
必須保證`InetAddress.getLocalHost().getHostAddress()`或者`hostname -i`列印的結果是 192.xxx.xxx.xxx而不是`127.0.0.1`才行
解決辦法如下:
- 修改hosts,在hosts文件中添加
yourip hostname
,例如:10.1.8.27 lars
- 修改cluster.conf,修改集群配置文件,全部用實際ip+埠的方式,而非
127.0.0.1
總結
Nacos的集群部署基本就介紹完了,官方推薦的三種方式,他們的基本部署思路和方式都大同小異,只不過在高可用上有所不同,挑選你適合的方式動手搭建集群試試吧。
參考
社區issues
- 文章作者: LarsCheng
- 文章鏈接: 本文首發於個人部落格:https://www.larscheng.com/nacos-namespace/
- 發布方式:OpenWrite 最懂你的科技自媒體管理平台
- 版權聲明: 本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 LarsCheng’s Blog!