同一臺機使用不同的端口號,啓動多個Nacos節點時,會有jdk的堆棧不夠、端口號衝突的問題。
問題解決
1、解決jdk的堆棧不夠的問題
修改啓動腳本的堆棧大小:windows系統修改startup.bat,linux系統修改startup.sh,修改如下(具體數字可自行修改)
#修改前
set "NACOS_JVM_OPTS=-server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages"
#修改後
set "NACOS_JVM_OPTS=-server -Xms512m -Xmx512m -Xmn256m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=%BASE_DIR%\logs\java_heapdump.hprof -XX:-UseLargePages"
2、解決端口號衝突問題
觀察異常,如果出現 “Caused by: java.net.BindException: Address already in use: bind”,則應當屬於是端口號衝突的情況。
問題原因
nacos在2.0版本以後,除對外的端口外,還佔用另外3個端口,公式如下。
raft port: ${server.port} - 1000
grpc port: ${server.port} + 1000
grpc port for server: ${server.port} + 1001
假設對外端口爲8848,即總共會有4個端口被佔用,分別爲:7848=(8848-1000)、8848、9848=(8848+1000)、9849=(8848+1001),
因此,在同一臺機要啓動多個nacos節點,要避開所有佔用的端口才可以,需要前後計算一下。
錯誤示範:假設要啓動2個nacos節點,對外端口分別設置爲 :8000、10000 看似兩個端口相差甚遠不會衝突,但是:
8000 節點啓動後佔用端口分別爲:7000 、8000、9000、9001
10000節點啓動後佔用端口分別爲:9000、10000、11000、11001
兩個節點間有重複端口:9000,因此這樣啓動nacos節點必然是不成功的,只能啓動一個,另一個啓動時拋 java.net.BindException 異常。
解決辦法
改成其他不衝突的端口即可,如將10000改爲12000即可。
12000節點啓動後佔用端口分別爲:11000、12000、13000、13001