1. 程式人生 > >Nacos(九):Nacos叢集部署和遇到的問題

Nacos(九):Nacos叢集部署和遇到的問題

前言

前面的系列文章已經介紹了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文件中提供了三種叢集部署方案

  1. http://ip1:port/openAPI 直連ip模式:
    • ip+埠進行部署,客戶端直接連線Nacos的ip
  2. http://Vip:port/openAPI 掛載虛擬IP模式:
    • 配合KeepAlive,Nacos真實ip都掛載虛擬Ip下
    • 客戶端訪問Vip發起請求
    • 當主Nacos宕機後,備用Nacos接管,實現高可用,
  3. 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的叢集部署基本就介紹完了,官方推薦的三種方式,他們的基本部署思路和方式都大同小異,只不過在高可用上有所不同,挑選你適合的方式動手搭建叢集試試吧。

參考

Nacos支援三種部署模式

社群issues

  • 文章作者: LarsCheng
  • 文章連結: 本文首發於個人部落格:https://www.larscheng.com/nacos-namespace/
  • 釋出方式:OpenWrite 最懂你的科技自媒體管理平臺
  • 版權宣告: 本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 LarsCheng's Blog!