同一台机使用不同的端口号,启动多个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