本文记录一下Nacos集群的搭建过程。
一、集群部署架构图
Nacos官方文档中提供了三种集群部署模式:
http://ip1:port/openAPI
直连ip模式,机器挂则需要修改ip才可以使用。http://SLB:port/openAPI
挂载SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),直连SLB即可,下面挂server真实ip,可读性不好。http://nacos.com:port/openAPI
域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式。
官方推荐域名+SLB模式:
二、预备环境
部署Nacos集群所需环境:
- 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
- 64 bit JDK 1.8+。
- Maven 3.2.x+。
- 3个或3个以上Nacos节点。
三、环境信息
准备四台网络互通并能上外网的主机,这里使用的是四台虚拟机,Nacos节点所需的JDK和Maven均已装好。本文所使用的环境如下:
主机名 | ip | 操作系统 | JDK | Maven | Mysql | Nginx |
---|---|---|---|---|---|---|
nacos-node1 | 192.168.1.11 | CentOS Linux release 8.1.1911 | 1.8.0_212 | 3.8.1 | 8.0.24 | / |
nacos-node2 | 192.168.1.12 | CentOS Linux release 8.1.1911 | 1.8.0_212 | 3.8.1 | / | / |
nacos-node3 | 192.168.1.13 | CentOS Linux release 8.1.1911 | 1.8.0_212 | 3.8.1 | / | / |
nginx-node | 192.168.1.21 | CentOS Linux release 8.1.1911 | / | / | / | 1.20.0 |
四、准备工作
分别在每台主机上通过以下命令设置主机名:
hostnamectl set-hostname <hostname>
退出重新登陆即可显示新设置的主机名。在3个Nacos节点上都执行如下命令修改的hosts
文件:
cat >> /etc/hosts << EOF
192.168.1.11 nacos-node1
192.168.1.12 nacos-node2
192.168.1.13 nacos-node3
EOF
配置nacos-node1主机到nacos-node2和nacos-node3主机的免密登录。首先在nacos-node1
创建秘钥:
ssh-keygen -t rsa
将公钥同步至nacos-node2
和nacos-node3
:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@nacos-node2
ssh-copy-id -i ~/.ssh/id_rsa.pub root@nacos-node3
免密登录:
在3个Nacos节点上都执行如下命令创建Nacos安装目录:
mkdir -p /usr/local/nacos
在nacos-node1
执行以下命令进入Nacos安装目录:
cd /user/local/nacos/
五、下载Nacos安装包
只在nacos-node1执行本部分操作。
下载Nacos 2.0.1编译后的压缩包解压,然后重命名解压后的文件夹:
wget https://github.com/alibaba/nacos/releases/download/2.0.1/nacos-server-2.0.1.tar.gz
tar -zxvf nacos-server-2.0.1.tar.gz
mv nacos nacos-server-2.0.1
六、配置集群配置文件
只在nacos-node1执行本部分操作。
进入nacos-server-2.0.1/
的conf
目录:
cd nacos-server-2.0.1/conf/
拷贝cluster.conf.example
并重命名为cluster.conf
:
cp cluster.conf.example cluster.conf
vim编辑cluster.conf
集群配置文件:
vim cluster.conf
配置内容:
192.168.1.11:8848
192.168.1.12:8848
192.168.1.13:8848
七、数据持久化到mysql
只在nacos-node1执行本部分操作。
这里只是测试,所以将mysql安装在nacos-node1
节点上,使用的单机版mysql。生产使用建议至少主备模式,或者采用高可用的mysql数据库。
先初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
,位于nacos-server-2.0.1/
的conf
目录:
使用navicat连接mysql数据库并新建一个名为nacos
的数据库,再运行nacos-mysql.sql
,执行完成后得到如下表结构:
vim编辑application.properties
配置文件:
vim application.properties
新增以下配置:
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.1.11:3306/nacos?serverTimezone=GMT%2B8&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=root
八、复制配置好的Nacos Server到另两台服务器
分别将配置好的Nacos Server即nacos-server-2.0.1
文件夹复制到nacos-node2
和nacos-node3
:
scp -r /usr/local/nacos/nacos-server-2.0.1 root@nacos-node2:/usr/local/nacos/
scp -r /usr/local/nacos/nacos-server-2.0.1 root@nacos-node3:/usr/local/nacos/
九、启动服务器
在3个Nacos节点上都执行以下命令进入Nacos Server的bin
目录下:
cd /usr/local/nacos/nacos-server-2.0.1/bin/
在3个Nacos节点都执行以下命令启动服务器:
# 使用cluster模式启动并使用外置数据源
sh startup.sh
如果出现内存不足的问题,可适当将启动脚本startup.sh
中-server
后的jvm内存分配参数调小:
#===========================================================================================
# JVM Configuration
#===========================================================================================
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
fi
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
fi
可以查看Nacos Server主目录下的logs/start.out
或logs/nacos.log
的输出内容看是否出错以及是否启动成功。查看logs/start.out
(只截取了部分内容):
查看logs/nacos.log
(只截取了部分内容):
可见3个Nacos节点均启动成功。在浏览器中访问以下三个链接均可访问Nacos的管理页面,默认账号密码都是nacos:
这里以http://192.168.1.11:8848/nacos为例,登录Nacos的管理页面后查看集群管理中的节点列表,3个Nacos节点都处于up状态,可见3个Nacos节点均启动成功:
如果要关闭Nacos服务器,可以执行以下命令,停止整个集群则在每个Nacos节点都执行一次该命令:
sh shutdown.sh
十、配置并启动Nginx
这里只是测试,使用的单机版nginx为Nacos集群提供一个统一的入口并使用默认的轮询策略实现简单的负载均衡。生产中推荐使用高可用的nginx集群。
在nginx-node
上修改nginx主目录下的conf/nginx.conf
配置文件,配置内容如下:
upstream nacos {
server nacos-node1:8848;
server nacos-node2:8848;
server nacos-node3:8848;
}
server {
listen 80;
server_name nacos.cluster.tset.com;
location / {
proxy_pass http://nacos;
}
}
执行以下命令启动nginx:
nginx
在宿主机Windows系统的C:\Windows\System32\drivers\etc\hosts
中添加以下域名解析并保存:
192.168.1.21 nacos.cluster.test.com
访问http://nacos.cluster.test.com/nacos登录Nacos的管理页面后查看集群管理中的节点列表:
十一、测试发布配置
查看Nacos的管理页面中的配置列表,暂时还没有配置:
查看mysql的nacos数据库中的表tenant_info
和config_info
,暂时没有数据:
新建了一个命名空间:
刷新tenant_info
表,可见Nacos集群的数据已经成功持久化到mysql中:
然后新发布一个配置:
查看配置列表,发现创建成功:
刷新config_info
表,可见之前新发布的那个配置已经成功持久化到mysql中:
十二、客户端接入Nacos集群实现服务注册发现及配置管理
客户端接入Nacos集群实现服务注册发现及配置管理的测试在之前的SpringCloudAlibaba 服务注册发现与配置中心Nacos
SpringCloud2020版本中的服务提供者、服务消费者和Config客户端项目的基础上进行。
首先查看Nacos管理页面中的服务列表,暂时还没有服务注册:
修改服务提供者和服务消费者的application.yml
中的spring.cloud.nacos.discovery.server-addr
配置项:
spring:
cloud:
nacos:
discovery:
# nacos服务器地址,nacos集群可以设置为nacos集群的域名:port
server-addr: nacos.cluster.test.com:80
注意,Nacos服务器地址中的端口不能省略,即使Nacos集群的域名监听的是80也不行,否则在服务启动时会报如下错误:
启动3个服务提供者实例和一个服务消费者实例,查看查看Nacos的管理页面中命名空间dev的服务列表,可见两个服务都已注册成功:
不断访问http://localhost:8080/test1,服务调用成功并实现负载均衡:
下面测试获取之前发布的配置,先修改Config客户端服务的bootstrap.yml
中的spring.cloud.nacos.config.server-addr
配置项:
spring:
cloud:
nacos:
config:
# nacos服务器地址,nacos集群可以设置为nacos集群的域名:port
server-addr: nacos.cluster.test.com:80
启动Config客户端服务后访问http://localhost:8000/user,可见已经成功从Nacos Config Server获取到了配置文件中的数据:
通过以上测试结果,说明客户端接入Nacos集群成功实现了服务注册发现与配置管理的功能。