Nacos 入门教程 - 配置管理高级篇

上篇 - Nacos 入门教程 - 配置管理(中级篇)

Nacos Server 集群

部署模式

Nacos Server 支持三种部署模式:

  • 单机模式 - 用于测试和单机试用
  • 集群模式 - 用于生产环境,确保高可用
  • 多集群模式 - 用于多数据中心场景

集群搭建

安装 Nacos Server

集群环境下,至少需要安装三台以上的 Nacos Server,一般情况下复制三份 Nacos Server 解压后的文件夹即可,分别命名为 nacos-1、nacos-2、nacos-3。

配置 IP 与 端口

  • 若是单机搭建 Nacos Server 集群,则需要更改每台 Nacos Server 目录的 conf 目录下的 application.properties 配置文件,通过 server.port 参数让每台 Nacos Server 使用不同的端口,以此来避免端口冲突。
  • 在生产环境中,若每台 Nacos Sever 都有独立的真实 IP 地址,或者单台 Nacos Server 拥有多块网卡时,则需要在每台 Nacos Server 目录的 conf 目录下的 application.properties 配置文件里通过 nacos.inetutils.ip-address 参数绑定真实的 IP 地址。
1
2
server.port=8848
nacos.inetutils.ip-address=192.168.1.124

配置集群配置文件

在所有 Nacos Server 目录的 conf 目录下找到 cluster.conf.example 配置文件,将其重命名为 cluster.conf,并将所有 Nacos Server 的 IP 地址以 ip:port 的格式写到配置文件里,配置示例如下:

特别注意:这里的 IP 不能写 127.0.0.1,必须是 Linux 命令 hostname -i 能够识别的 IP

1
2
3
192.168.1.124:8848     # Nacos Server 1
192.168.1.124:8849 # Nacos Server 2
192.168.1.124:8850 # Nacos Server 3

配置 MySQL 数据源

Nacos Server 默认使用嵌入式数据库实现数据的存储,若直接启动多个默认配置下的 Nacos Server 节点,数据存储会存在一致性的问题。为了解决这个问题,Nacos Server 采用了集中存储的方式来支持集群化部署,目前只支持 MySQL 的存储(5.6.5+)。由于前面的教程已经介绍过 Nacos Server 如何配置 MySQL 数据源,这里不再累述。值得一提的是,每台 Nacos Server 都需要单独配置 MySQL 数据源。

集群模式下启动

启动 Nacos Server 集群,需要分别在每台 Nacos Server 目录的 bin 目录下执行启动脚本

1
2
3
$ sh nacos-1/bin/startup.sh
$ sh nacos-2/bin/startup.sh
$ sh nacos-3/bin/startup.sh

若每台 Nacos Server 在启动时输出以下日志信息,说明 Nacos Server 是以集群模式启动了

1
2
nacos is starting with cluster
nacos is starting,you can check the /nacos-x/logs/start.out

集群模式下关闭

若希望关闭 Nacos Server 集群,同样分别在每台 Nacos Server 目录的 bin 目录下执行关闭脚本即可

1
2
3
$ sh nacos-1/bin/shutdown.sh
$ sh nacos-2/bin/shutdown.sh
$ sh nacos-3/bin/shutdown.sh

Spring Cloud 配置 Nacos Server 集群

1
2
3
4
5
6
7
spring:
application:
name: service
cloud:
nacos:
config:
server-addr: 192.168.1.124:8848,192.168.1.124:8849,192.168.1.124:8850 # 当不使用Nginx作为负载均衡服务时,可以直接填写多个Nacos Server节点的IP

集群启动失败解决方法

若机器不能同时启动三个 Nacos Server 实例,建议检查是否内存不够,此时可以在每台 Nacos Server 目录的 bin 目录下的 startup.sh 启动脚本里适当调整 JVM 的内存参数

1
2
$ vim startup.sh
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"

集群部署架构(高可用)

多种部署模式

  • http://ip1:port/openAPI 直连 IP 模式,机器宕机则需要修改 IP 才可以使用
  • http://VIP:port/openAPI 挂载 VIP 模式,直连 VIP 即可,下面挂载 Server 真实 IP,可读性不好
  • http://nacos.com:port/openAPI 域名 + VIP 模式,可读性好,而且换 IP 方便,当 Nacos 集群迁移时客户端也无需修改,推荐使用此模式,部署架构图如下图所示:

nacos-cluster-group

Nginx 反向代理配置

在 Nacos Server 的集群启动完毕之后,根据上面的部署架构图所示,还需要提供一个统一的入口给 Spring Cloud 应用访问。简单地说,就是需要为上面启动的的三个 Nacos Server 节点做一个可以为它们实现负载均衡的访问点。这个实现的方式非常多,可以考虑使用 Nginx 来实现,配置示例如下。特别注意,考虑到 Nginx 的高可用性,建议使用 Nginx + Keepalive 来搭建 Nginx 集群。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
upstream nacos {
server 192.168.1.124:8848;
server 192.168.1.124:8849;
server 192.168.1.124:8850;
}

server {
listen 80;

server_name nacos.a-hh.cn;

location / {
proxy_pass http://nacos;
}
}

MySQL 数据库高可用

在 Nacos Server 集群模式下,当采用 MySQL 作为外置数据源时,为了确保数据库的高可用性,在生产环境下建议 MySQL 至少使用主备模式,或者采用高可用数据库。可通过修改 ${nacos-home}/conf/application.properties 配置文件,让 Nacos Server 拥有多个数据源,配置示例如下:

1
2
3
4
5
6
7
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://192.168.1.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.url.1=jdbc:mysql://192.168.1.2:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=123456

特别注意:若 MySQL 配置了主从库(主从同步),当主库宕机后,切换到从库,此时切到从库后会导致主库的数据比从库少,即会出现数据不一致的问题。

集群高可用部署架构图

nacos-cluster-ha

多集群模式

Nacos Server 支持 NameServer 路由请求模式,通过它可以设计一个有用的映射规则来控制请求转发到相应的集群,在映射规则中可以按命名空间或租户等分片请求。

多网卡 IP 选择

当本地环境比较复杂的时候,Nacos 服务在启动的时候需要选择运行时使用的 IP 或者网卡。Nacos Server 从多网卡获取 IP 参考了 Spring Cloud 设计,通过 nacos.inetutils 参数,可以指定 Nacos 使用的网卡和 IP 地址,目前支持的配置参数有:

  • ip-address 参数可以直接设置 Nacos 的 IP
1
nacos.inetutils.ip-address=10.11.105.155
  • use-only-site-local-interfaces 参数可以让 Nacos 使用局域网 IP,这个在 Nacos 部署的机器有多网卡时很有用,可以让 Nacos 选择局域网网卡
1
nacos.inetutils.use-only-site-local-interfaces=true
  • ignored-interfaces 支持网卡数组,可以让 Nacos 忽略多个网卡
1
2
- nacos.inetutils.ignored-interfaces[0]=eth0
- nacos.inetutils.ignored-interfaces[1]=eth1
  • preferred-networks 参数可以让 Nacos 优先选择匹配的 IP,支持正则匹配和前缀匹配
1
2
nacos.inetutils.preferred-networks[0]=30.5.124.
nacos.inetutils.preferred-networks[0]=30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d))),30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d)))