Nacos 高可用集群

515 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

Nacos 高可用集群

生产环境中 Nacos 需要以集群模式运行,我们可以搞个3个或者3个以上的 nacos 集群部署,实现高可用。

  • 默认 Nacos 使用嵌入式数据库实现数据的存储. 所以, 如果启动多个默认配置下的 Nacos 节点, 数据存储是存在一致性问题的. 为了解决这个问题, Nacos 采用了集中式存储的方式来支持集群化部署, 目前只支持 MySQL 的存储.

生产环境高可用集群搭建

nacos-server-2.1.1

1.环境准备

Linux 系统, JDK 1.8, Maven, MySQL, 3 个 Nginx 节点. ( 也可以是 1 个 ), 3 个 Nacos 节点 ( 必须 )

注意:startup.sh 中 Mode 模式需要改成 cluster集群模式。

2.准备数据源

以集群模式启动时,必须需要配置使用 MySQL 进行持久化.

创建数据库名为nacos_config,执行nacos/conf/nacos-mysql.sql脚本。

3.配置 Nacos

为了方便, 在一台服务器上通过设置不同端口号,来构建不同的 Nacos Server 实例.

所以需要启动 3 个 Naocs 实例, 其端口号分别为 8847、8848、8849. 【注意:如果是在 windos 上搭建,注意端口号不要连续,不要连续,不要连续】

解压三份 nacos:

tar -zxvf nacos-server-1.4.0.tar.gz -C nacos_8847
tar -zxvf nacos-server-1.4.0.tar.gz -C nacos_8848
tar -zxvf nacos-server-1.4.0.tar.gz -C nacos_8849

对每一个 nacos 实例,进行修改 nacos/conf/application.properties 配置 :

# nacos_8847 实例
# IP+PORT
server.port=8847
nacos.inetutils.ip-address=127.0.0.1
# 持久化数据库配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

注意 : IP 配置不能使用 localhost, 应该使用 hostname -i 命令的输出结果.

上面是只有一个数据库的配置,如果数据库也是高可用的,进行如下配置:

# nacos_8847 实例
# IP+PORT
server.port=8847
nacos.inetutils.ip-address=127.0.0.1
# 持久化数据库配置
spring.datasource.platform=mysql
db.num=3
db.url.0=xxx
db.user.0=xxx
db.password.0=xxx
db.url.1=xxx
db.user.1=xxx
db.password.1=xxx
db.url.2=xxx
db.user.2=xxx
db.password.2=xxx
4.集群配置

nacos/conf/cluster.conf.example 文件拷贝一份, 然后重命名为cluster.conf, 在cluster.conf 中添加集群服务器的 ip 和 port, 如下所示:

127.0.0.1:8847
127.0.0.1:8848
127.0.0.1:8849

上述配置在实例 nacos_8847、nacos_8848、nacos_8849 中保持一致.

5.启动

进入 nacos / bin 目录, 分别执行 sh startup.sh 命令来启动 3 个 Nacos 服务.

集群模式下,启动稍慢一些。

6.查看

登录任意一个 Nacos 后台, 在 "集群管理" -> "节点列表" 中查看所有节点.

注意:图文有差异,使用的是 8846,8848,8850端口的节点列表图。

7.项目连接到 Nacos 集群

在application.yml 中如下配置即可:

spring:
  cloud:
  	nacos:  # nacos配置
  		config:
  			server-addr: 127.0.0.1:8846,127.0.0.1:8848,127.0.0.1:8850 # nacos地址和端口
8.搭建时踩坑

1.启动报错【db-load-error load jdbc.properties error】的解决

没有配置数据源,以集群模式启动时,必须需要配置使用 MySQL 进行持久化。

2.启动报错【No DataSource set】的解决

数据库没连接上,网上的解决办法:点击

我这里启动报错【No DataSource set】的解决:是将 nacos/conf/application.properties 配置中 mysql 的用户改为了 root 用户,这样是可以正常启动的。

3.启动报错【Address already in use: bind】的解决

看到这个,感觉很简单,不就是端口被占用了嘛,找到被占用的端口,然后杀掉就好了呀。

【案发现场】

然后我是在 windos 上先启动的 nacos_8847,然后启动 nacos_8848,最后启动 nacos_8849,然后就发现 8848 一直没连上来。

很奇怪,然后发现 8848 报错:【Address already in use: bind】

好吧,看来 8848 端口被占用了,那就去看看谁占用的。

新启动 cmd 窗口,执行 netstat -ano | findstr 8848,发现是 PID 为 7204 的应用占用了。

嗯???

为什么是 7204 呀?7204 不是 nacos 8847 这个应用吗?

也就是说 7204 占用了两个端口?

使用netstat -aon命令查看,还真是这样的:

【问题解决】

Nacos 2.0 版本之后,会占用两个连续端口: server.port{server.port} 和 {server.port} + 1

哦,这也就解释了,为什么 8847 启动后,8848 无法启动的原因。

所以,还是让端口尽量错开吧,集群不要设置同项目连续端口。