Nacos搭建集群环境

集群布署架构

Nacos官方提供的集群模式搭建架构如下:

Nacos官方集群模式部署架构图

如上图,SLB通常可以使用nginx来实现,而DNS则可以使用Bind服务实现一个局域网环境的DNS解析,或者直接修改主机的hosts文件做域名解析。
另外,图种缺少了关于数据层的说明,其实在Nacos集群部署模式下,数据层通常也是高可用架构的。
所以通常来讲Nacos的集群部署架构应该如下图所示:

Nacos集群部署架构模式

端口分配如下表:

端口 与主端口的偏移量 描述
8848 0 主端口,客户端、控制台及OpenAPI所使用的HTTP端口
9848 1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
9849 1001 服务端gRPC请求服务端端口,用于服务间同步等
7848 -1000 Jraft请求服务端端口,用于处理服务端间的Raft相关请求

使用VIP/nginx请求时,需要配置成TCP转发,不能配置http2转发,否则连接会被nginx断开。9849和7848端口为服务端之间的通信端口,请勿暴露到外部网络环境和客户端侧。

集群布署实战

准备数据库环境

生产环境的MySQL至少使用主备架构。
根据conf/mysql-schema.sql文件的ddl语句准备数据库及其表,如果从源码启动,使用distribution\conf\mysql-schema.sql文件中的ddl语句。

配置Nacos

3个或3个以上Nacos节点才能构成集群。

在nacos的解压目录的conf目录下,有配置文件cluster.conf,请每行配置成集群节点的IP地址和对应端口。

1
2
3
192.168.10.100:8848
192.168.10.101:8848
192.168.10.102:8848

之后修改conf目录下的application.properties文件,开启默认鉴权插件(可选)。

1
2
3
4
5
nacos.core.auth.enabled=true
nacos.core.auth.system.type=nacos
nacos.core.auth.plugin.nacos.token.secret.key=${自定义,保证所有节点一致}
nacos.core.auth.server.identity.key=${自定义,保证所有节点一致}
nacos.core.auth.server.identity.value=${自定义,保证所有节点一致}

修改数据源配置:

1
2
3
4
5
spring.sql.init.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.100.200:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos

启动Nacos集群

分别启动各个节点的nacos服务:

1
sh startup.sh

若节点启动成功,将会看到如下日志:

1
2024-05-14 23:11:51,952 INFO Nacos started successfully in cluster mode. use external storage

另外,登录nacos管理界面,在左侧菜单栏路径“集群管理”->“几点列表”将能看到所有集群节点信息。

停止Nacos集群

依次在各个Nacos集群节点停止服务即可:

1
sh shutdown.sh

验证集群环境

服务注册

1
2
curl -X POST 'http://192.168.10.100:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
ok

注意:如果开启默认鉴权插件,需要在Header中带上用户名密码。

服务端日志:

1
[14/May/2024:23:24:14 +0800] "POST /nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080 HTTP/1.1" 200 2 24 curl/7.88.1 -

服务发现

1
2
curl -X GET 'http://192.168.10.100:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
{"name":"DEFAULT_GROUP@@nacos.naming.serviceName","groupName":"DEFAULT_GROUP","clusters":"","cacheMillis":10000,"hosts":[{"instanceId":"20.18.7.10#8080#DEFAULT#DEFAULT_GROUP@@nacos.naming.serviceName","ip":"20.18.7.10","port":8080,"weight":1.0,"healthy":true,"enabled":true,"ephemeral":true,"clusterName":"DEFAULT","serviceName":"DEFAULT_GROUP@@nacos.naming.serviceName","metadata":{},"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ipDeleteTimeout":30000,"instanceIdGenerator":"simple"}],"lastRefTime":1715700368045,"checksum":"","allIPs":false,"reachProtectionThreshold":false,"valid":true}

注意:如果开启默认鉴权插件,需要在Header中带上用户名密码。

服务端日志:

1
[14/May/2024:23:26:08 +0800] "GET /nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName HTTP/1.1" 200 623 10 curl/7.88.1 -

发布配置

1
2
curl -X POST "http://192.168.10.100:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld"
true

注意:如果开启默认鉴权插件,需要在Header中带上用户名密码。

服务端日志:

1
[14/May/2024:23:27:37 +0800] "POST /nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld HTTP/1.1" 200 14 66 curl/7.88.1 -

获取配置

1
2
curl -X GET "http://192.168.10.100:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
helloWorld

注意:如果开启默认鉴权插件,需要在Header中带上用户名密码。

服务端日志:

1
[14/May/2024:23:28:43 +0800] "GET /nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test HTTP/1.1" 200 20 7 curl/7.88.1 -

【参考】
Nacos集群部署说明
Nacos 实现环境隔离(项目、日常、预发、安全生产、线上)的实践
Nacos生产环境集群部署
Nacos集群搭建部署(超详细)
搭建生产可用的Nacos集群
简易搭建局域网内部dns服务器
如何快速在内网搭建一个DNS服务器
MySQL高可用方案选型参考