持续创作,加速成长!这是我参与「掘金日新计划 · 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} + 1
哦,这也就解释了,为什么 8847 启动后,8848 无法启动的原因。
所以,还是让端口尽量错开吧,集群不要设置同项目连续端口。