# Nacos 的集群化部署

前面的介绍中,我们并未对 Nacos 服务端做任何特殊的配置,一切均以默认的单机模式运行,但是单机运行模式仅适用于学习与测试环境,对于有高可用要求的生产环境显然是不合适的。那我们怎么搭建支持高可用的集群环境呢?

在搭建 Nacos 集群前,我们需要先修改 Nacos 的数据持久化配置为 MySQL 存储。默认情况下,Nacos 使用内嵌的数据库 Derby 实现数据的存储,这种情况下,如果启动多个默认配置下的 Nacos 节点,数据存储是存在一致性问题的。为了解决这个问题,Nacos 采用了集中式存储的方式来支持集群化部署,但目前 Nacos 只支持 MySQL 的存储,且版本要求:5.6.5+

# 1、Nacos 配置的持久化:

(1)初始化 MySQL 数据库:

首先在 MySQL 中新建一个数据库 nacos-config(名称随意),然后执行 Nacos 中的 SQL 脚本,该脚本是 Nacos-server 的 conf 文件夹中的 nacos-mysql.sql,如下图:

执行该脚本,将会自动创建表,如下图:

(2)修改 conf/application.properties 配置文件:

Nacos-server 也是一个 Spring Boot 项目,想要连接自己的数据库,当然要配置数据源了,配置文件同样在 Nacos-server 中的 conf 目录下,如下图:

只需要将 application.properties 中的 Mysql 配置成自己的数据源并重启 Nacos-server 即可 ,如下:

# 此项一定要启用,默认是注释掉的
spring.datasource.platform=mysql
 
# 注意MySQL8.0以上版本指定url时一定要带入serverTimezone参数
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?serverTimezone=Asia/Shanghai&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
# 可选启用配置
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false

# 2、Nacos 集群化部署:

Nacos 官方推荐在生产环境使用集群模式部署,这样可以避免单点故障,集群化部署的架构图如下:

请求先通过 Nginx 集群进行转发到 Nacos 集群中,当然为了保持高可用,数据库也需要是集群模式。那么接下来我们就演示下搭建 Nacos 集群的方法。

由于条件限制,我们仅在一台服务器上启动三个 Nacos 服务演示。Nacos 的端口分别为 8848、8849、8850。

(1)修改端口号:

​ Nacos 默认的端口号是 8848,那么如何修改端口呢?只需要修改 conf 目录下的 application.properties 中的 server.port 即可,如下图:

(2)修改集群配置:

那么如何配置集群呢?在 conf 目录下有一个 cluster.conf.example 文件,如下图:

只需要将 cluster.conf.example 这个文件复制一份为 cluster.conf 放在 conf 目录下,其中配置的内容如下:

172.16.1.84:8848
172.16.1.84:8849
172.16.1.84:8850

(3)修改数据源:

这个在持久化的那里已经讲过了,只需要将 application.properties 中的数据源替换掉,如下:

# 此项一定要启用,默认是注释掉的
spring.datasource.platform=mysql
 
# 注意MySQL8.0以上版本指定url时一定要带入serverTimezone参数
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?serverTimezone=Asia/Shanghai&characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
 
# 可选启用配置
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false

(4)启动 Nacos:

经过上述的步骤 Nacos 集群已经配置好了,启动 Nacos 成功后,访问任意一个端口的 Nacos 服务,在 “集群管理 -> 节点列表” 中将会看到自己搭建的三个节点,如下图:

至此,Nacos 集群算是搭建完成了

(5)Nginx 中的配置:

此处就不演示 Nginx 集群搭建了,直接在单机的 Nginx 中配置。直接修改 nginx 的 conf 文件,内容如下:

upstream nacos{
		server 172.16.1.84:8848;
		server 172.16.1.84:8849;
		server 172.16.1.84:8850;
	 }
	 
	 server{
		listen 80;
		location / {
			proxy_pass http://nacos;
		}
	 }

(6)项目中配置 server-addr:

既然搭建了集群,那么项目中也要配置一下,有两种方式,下面分别介绍:

第一种:通过直连的方式配置,如下:

spring:
  application:
    ## 指定服务名称,在nacos中的名字
    name: cloud-producer-server
  cloud:
    nacos:
      discovery:
        # nacos的服务地址,nacos-server中IP地址:端口号
        server-addr: 172.16.1.84:8848,172.16.1.84:8849,172.16.1.84:8850

第二种:直接连接 Nginx,如下:

spring:
  application:
    ## 指定服务名称,在nacos中的名字
    name: cloud-producer-server
  cloud:
    nacos:
      discovery:
        # nacos的服务地址,nacos-server中IP地址:端口号
        server-addr: 172.16.1.84:80

Nacos 集群搭建非常简单,唯一的配置就是在 cluster.conf 中设置三个 Nacos 服务的地址。