關於nacos 集群部署,網上的示例往往不全或不可用,而官方的教程太簡單了。官方也提供了一個 docker + nacos 的偽集群的 部署示例。但畢竟是 偽, 不能實際生產使用。
全網就幾乎就沒有一個 完整的教程???!!!
怎么辦呢? 自己動手吧。
准備數據庫
數據庫用了 mysql, 其實nacos 也是支持mysql 主從集群的,不過簡單起見, 這里就只用了一個 mysql 節點。 mysql 是需要自己事先安裝 配置的(需要執行 nacos 提供的 conf/nacos-mysql.sql 腳本)
這個其實很簡單。schema 名字不重要,重要的是 執行 nacos 的sql 腳本就好了。
准備nacos
一般集群需要至少3個節點。我們先准備3台機器: 192.168.11.200、192.168.11.196、192.168.11.126
nacos 的默認服務端口是 8848 ,但是由於 我們的機器上還有其他nacos 服務正在作用,所以, 我們這里把端口改為 8748, 如下:
192.168.11.200:8748
192.168.11.196:8748
192.168.11.126:8748
我們需要nacos-server 的安裝包, 1.0.0.zip 版本並沒有 集群的展示功能, 我們這里使用 nacos-server-1.1.0.zip, 這個也是最新的 nacos server 安裝包。 (從github 上下載非常耗時, 最好把這個安裝包 共享起來)
安裝目錄是 /app, 沒有的話, 需要自己創建。 將nacos-server-1.1.0.zip 上傳到 /app 目錄, 然后進入cd /app,
執行下面的 shell (需要3個節點上都要執行!!):
unzip nacos-server-1.1.0.zip -d nacos-cluster && cd nacos-cluster/nacos && cp conf/cluster.conf.example conf/cluster.conf &&
echo "192.168.11.200:8748
192.168.11.196:8748
192.168.11.126:8748" > conf/cluster.conf && sed -i s/server\.port=8848/server\.port=8748/ conf/application.properties && echo "
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.11.200:3316/test3?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456" >> conf/application.properties && sh bin/startup.sh
上面的腳本,需要按照情況修改, 主要是其中的 端口、 數據庫配置。 上面的腳本 包括了 啟動 nacos。
如果 3個節點都能正常訪問了,那么就表明集群部署基本正常了,如果有問題, 那么可以查看nacos 的日志, 位於 logs目錄, 主要 是下面幾個日志文件:
/app/nacos-cluster/nacos/start.out
/app/nacos-cluster/nacos/nacos.out
/app/nacos-cluster/nacos/naming-raft.out
觀察集群
3個節點都正常啟動之后, 可以分別登錄 各個web 界面查看 集群的節點、健康狀態:
http://192.168.11.126:8748/nacos/#/clusterManagement?dataId=&group=&appName=&namespace=&serverId=
http://192.168.11.196:8748/nacos/#/clusterManagement?dataId=&group=&appName=&namespace=&serverId=
http://192.168.11.200:8748/nacos/#/clusterManagement?dataId=&group=&appName=&namespace=&serverId=
最開始的時候, 所有節點都沒有啟動, 集群任期 應該都是0
(看到這個圖片, 說明 3個節點都正常啟動了, 否則請檢查是否有步驟遺漏了!)
如果我們只啟動一個節點,那么它的狀態會是 candidate:
處於candidate 狀態的 集群會一直進行選舉, 從而任期也會一直增加:
最先啟動的節點, 一般就是 leader , 但這個時候還只是 准leader,需要至少多數節點都啟動了, 才能做一個決斷。如下面的 126:
在沒有leader 產生之前, 集群會進行多次的選舉。 每次的選舉 任期會加1。 從而 最后會進行大概 2次的選舉, 從而 126 的任期是2;最后加入的 節點已經沒有了選舉的機會, 故直接作為 follower 加入, 其任期默認是0;
如果某一個或某幾個節點都掛了, 只要剩余節點不少於 1+ 1/N ,那么 集群仍然能夠正常運行; 掛掉的節點重新加入集群后,如果此時集群已經有了leader, 那么它的角色一般是follower, 它的任期是0( 就跟一個新節點一樣的);
當然,如果集群的剩余節點少於 1+ 1/N,集群仍然是可以工作的,只是已經無法保證 高可用了。
任期低節點一般是沒有資格參與選舉的,leader 一般是在 任期高的幾個節點之中產生(至少會有2個節點)。
如果把126 的nacos 殺掉,我們會觀察到 多個leader,其實這個時候的 126 已經死了, 至少集群保留它之前的狀態。同時 集群會重新選舉,如下,我們看到200 被選舉為 leader,126 的狀態被保留(其實他已經死掉了), 同時任期 +1:
在已經存在leader 的集群中,如果掛掉的節點不是 leader,那么不會重新進行選舉。 掛掉的節點雖不可用(其狀態會一直保留直到重啟), 不會影響集群的使用。
如果我們又把 126 啟動起來, 那么它的角色會是 follower,任期是0:
我們再把 200 的nacos 殺掉, 那么又會產生新的 leader:
Nacos + Docker 集群
nacos 官方 https://hub.docker.com/r/nacos/nacos-server 有提供docker 的鏡像:nacos/nacos-server,我們拿來用即可:
docker run --name nacos --net=host --env MODE=cluster --env NACOS_SERVERS="192.168.11.126:8748 192.168.11.196:8748 192.168.11.200:8748" --env MYSQL_DATABASE_NUM=1 --env MYSQL_MASTER_SERVICE_HOST=192.168.11.200 --env MYSQL_MASTER_SERVICE_PORT=3316 --env MYSQL_MASTER_SERVICE_DB_NAME=test3 --env MYSQL_MASTER_SERVICE_USER=root --env MYSQL_MASTER_SERVICE_PASSWORD=123456 --env NACOS_SERVER_PORT=8848 -d -p 8748:8848 nacos/nacos-server
上面的語句即啟動了 docker nacos ,同時通過env 設置了所有的相關的參數 比如數據庫、端口等。 特別需要注意的是, 網絡模式是 host,也就是使用直接宿主機的網絡, 這個是最簡單的nacos +docker 集群,否則我們可能需要做比較多的docker網絡配置。 另外注意, --net=host 應該放在命令的前面, 不能放最后, 否則不會生效。
NACOS_SERVERS 是所有的節點+端口 配置,目前只能寫死, nacos 不提供自動擴容等功能。
如果配置有誤,我們只能刪除nacos 容器,重新配置 : docker stop nacos && docker rm nacos 。
3個節點都執行上面的命令之后,我們的nacos 集群就做好了!
通過Nginx配置真正的集群
上面的集群,雖然可用, 但仍不是真正的集群, 我們一般不會這么用。官方推薦,nacos集群一般有3種方式:
http://ip1:port/openAPI 直連ip模式,機器掛則需要修改ip才可以使用。
http://VIP:port/openAPI 掛載VIP模式,直連vip即可,下面掛server真實ip,可讀性不好。
http://nacos.com:port/openAPI 域名 + VIP模式,可讀性好,而且換ip方便,推薦模式
域名的方式比較麻煩,暫不考慮。vip 的方式也稍稍麻煩。 這里我使用 nginx 的方式。 nginx 做集群很簡單, 只要 nginx.conf 做如下的配置就好了:
upstream nacos_server {
server 192.168.11.200:8748;
server 192.168.11.196:8748;
server 192.168.11.126:8748;
}
server {
listen 8648;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_pass http://nacos_server;
index index.html index.htm;
}
}
8648 的nginx 提供的 nacos 服務接口,可以自定義。 我們訪問
192.168.11.139:8648/nacos/#/clusterManagement?dataId=&group=&appName=&namespace=&serverId=
,就可以看到:
我們可以簡單測試一下,殺掉 126 或 196 上的 nacos ,看服務是否正常。 后面,我們對微服務提供nacos服務的時候,只要配置這個nginx 端口就好了!!
其他注意事項
nacos 默認是需要登錄, 有些麻煩,開發測試的時候,我們可以把它關閉,怎么辦呢? 修改 conf/application.properties 的相關配置即可:
### turn off security
spring.security.enabled=false
management.security=false
security.basic.enabled=false
nacos.security.ignore.urls=/**
#nacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**
另外,我們發現 nacos 的日志實在增長太快, 可以tomcat.accesslog 關閉:
server.tomcat.accesslog.enabled=true – 改為false
另外,我們可以把 日志級別調整一下,修改 conf/nacos-logback.xml 即可。
參考:
https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
https://hub.docker.com/r/nacos/nacos-server