Nacos九Nacos集群部署和遇到的问题

23次阅读

共计 3854 个字符,预计需要花费 10 分钟才能阅读完成。

前言

前面的系列文章已经介绍了 Nacos 的如何接入 SpringCloud,以及 Nacos 的基本使用方式

之前的文章中都是基于 单机模式 部署进行讲解的,本文对 Nacos 的 集群 部署方式进行说明

环境准备

  • JDK8
  • Centos7.5(ip:10.1.8.27)
  • MySQL 5.6.5+
  • Nacos-server:1.0.1

请提前下载 Nacos-server:1.0.1 压缩包并解压至相应目录

本次的 Nacos-server 在 linux 服务器上进行启动。

集群模式部署

Nacos 文档中提供了三种集群部署方案

  1. http://ip1:port/openAPI 直连 ip 模式:

    • ip+ 端口进行部署,客户端直接连接 Nacos 的 ip
  2. http://Vip:port/openAPI 挂载虚拟 IP 模式:

    • 配合 KeepAlive,Nacos 真实 ip 都挂载虚拟 Ip 下
    • 客户端访问 Vip 发起请求
    • 当主 Nacos 宕机后,备用 Nacos 接管,实现高可用,
  3. http://www.nacostest.com:port/openAPI 挂载虚拟 IP+ 域名模式:

    • 为虚拟 ip 绑定一个域名,当 Nacos 集群迁移时,客户端配置无需修改。

这三种方案都是为了尽可能实现高可用,后两种方案除了基本的部署流程外更多侧重于实现高可用的工作上

本文以第一种 ip+ 端口的方式为大家介绍集群部署方式

当然 ip+ 端口 也有多种部署方式

  • 1ip+ n 端口 +Nginx:普通玩家部署方式,没有过多服务器,单台服务器启动多个 nacos 实例,仅适合测试使用
  • nip+ n 端口 +Nginx:RMB 玩家部署方式,服务器资源充足,组建完美集群,实现更好的容灾与隔离

无论怎么部署,部署方式都是一样的,这里我以 1ip+ 3 端口 +Nginx 的方式进行集群搭建

修改配置

1、修改 Nacos-server 目录 conf/ 下的 application.properties 文件,添加 mysql 数据源

2、修改集群配置

ip 和端口的规划如下:

ip 端口
10.1.8.27 8849
10.1.8.27 8850
10.1.8.27 8851

修改 conf/ 下的 cluster.conf.example 文件,将其命名为cluster.conf,内容如下

# ip:port
10.1.8.27:8849
10.1.8.27:8850
10.1.8.27:8851

注:一定要记得将配置文件重命名为cluster.conf, 最好用实际 ip,而非127.0.0.1,否则会出现问题

3、修改启动脚本

我们要在单台服务器上启动多个 Nacos 实例,要保证三个实例为不同的端口,这里我们可以修改启动脚本
定位到 export FUNCTION_MODE="all" 这一行,修改脚本内容,使其支持以 -p 传入端口参数

export MODE="cluster"
export FUNCTION_MODE="all"
# 新加
export SERVER_PORT="8848"
while getopts ":m:f:p:" opt
do
    case $opt in
        m)
            MODE=$OPTARG;;
        f)
            FUNCTION_MODE=$OPTARG;;
        # 新加
        p)
            SERVER_PORT=$OPTARG;;
        ?)
        echo "Unknown parameter"
        exit 1;;
    esac
done
# 新加
JAVA_OPT="${JAVA_OPT} -Dserver.port=${SERVER_PORT}"

相应的,修改 shutdown 脚本,使其可接收参数

# 新加内容
PORT=$1
if [! $PORT]; then
  echo "please select stop port!" >&2
  exit 1
fi

# 添加 PORT 过滤
pid=`ps ax | grep -i 'nacos.nacos' |grep java |grep ${PORT} | grep -v grep | awk '{print $1}'`

# 后边省略...

启动 Nacos

执行如下三条命令

bash startup.sh -p 8849
bash startup.sh -p 8850
bash startup.sh -p 8851

如果你的机器不能同时启动 3 个实例,检查是否内存不够了,可以适当调整 JVM 参数

调整启动脚本中 JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m 中的-Xms -Xmx -Xmn

启动成功后会打印如下一句话:

nacos is starting,you can check the /usr/local/nacos/nacos/logs/start.out

查看该目录下的 start.out 文件,可以看到如下日志

此时,多节点的集群雏形已经搭建好了,可以试着访问 Nacos 后台

http://ip:8849/nacos/index.html
http://ip:8850/nacos/index.html
http://ip:8851/nacos/index.html

不出意外, 可以正常访问到 Nacos 控制台

从图上可以看到集群节点共有三个,其中端口 8850 为leader

配置 Nginx

完成上面的配置后,已经基本完成集群搭建的 90% 了

这里我们可以通过 Nginx 配置,为 Nacos 提供统一的入口,来实现一个简单的负载均衡

Nginx 配置如下

upstream nacos-server {
  server 127.0.0.1:8849;
  server 127.0.0.1:8850;
  server 127.0.0.1:8851;
}

server {
  listen 8848;
  server_name  localhost;
  location /nacos/ {proxy_pass http://nacos-server/nacos/;}
}

执行命令 sudo nginx 启动 nginx

通过 8848 端口访问 Nacos 后台,此时 Nginx 会将请求分发至 nacos-server 下的地址中,这里默认的分发策略是 线性轮询

客户端测试

这里继续使用之前的 Demo 项目(Nacos(四))

1、修改下项目配置文件bootstarp.yml

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      discovery:
        server-addr: 10.1.8.27:8848
      config:
        server-addr: 10.1.8.27:8848
        prefix: ${spring.application.name}
        file-extension: yml

注:主要是修改注册中心和配置中新的地址,记得替换成你的服务器地址哦

2、启动前确保已经向 Nacos 中添加配置文件,如果已经添加可以忽略

在公共空间 (public) 中新建一个配置文件 DataID: nacos-config.yml, 配置内容如下:

server: 
    port: 9989
nacos:
    config: 配置文件已持久化到数据库中...

3、启动 Nacos-config 项目

启动成功后检查日志和 Nacos 控制台

注册成功的日志如下:

09:37:19.366 [main] [nacos] [64] INFO o.s.c.a.n.r.NacosServiceRegistry – nacos registry, nacos-config 10.1.8.71:9989 register finished

控制台中可以看到服务已经注册

浏览器请求 nacos-config 中的接口,查看是否可以读取配置

访问:http://127.0.0.1:9989/getValue 返回:配置文件和服务信息已持久化到数据库中 …

集群的部署方式就介绍完了,文中的集群部署方式不是最优的方式

实际生产环境下,至少应该保证各个 Nacos 节点位于不同服务器, 以实现更好的隔离和容灾

出现的问题

这里将我在配置集群时出现的一些问题和解决方式进行说明

1、在集群搭建完成后,启动 nacos 客户端进行服务注册时报错了,提示我 服务端没有启动,稍后再试,如下:

code:503 msg: server is STARTING now, please try again later!

一脸懵 B,Nacos 后台都可以访问的鸭,为啥说我没启动。翻阅 Nacos-server 的源码后

  • 后台可访问只能说明 nacos-consloe 模块启动成功
  • 无法注册服务 nacos-naming 模块可能启动失败了

参考了 github 中的 #770-issues

必须保证 `InetAddress.getLocalHost().getHostAddress()` 或者 `hostname -i` 打印的结果是  
192.xxx.xxx.xxx 而不是 `127.0.0.1` 才行

解决办法如下:

  • 修改 hosts,在 hosts 文件中添加yourip hostname,例如:10.1.8.27 lars
  • 修改 cluster.conf, 修改集群配置文件,全部用实际 ip+ 端口的方式,而非127.0.0.1

总结

Nacos 的集群部署基本就介绍完了,官方推荐的三种方式,他们的基本部署思路和方式都大同小异,只不过在高可用上有所不同,挑选你适合的方式动手搭建集群试试吧。

参考

Nacos 支持三种部署模式

社区 issues

  • 文章作者: LarsCheng
  • 文章链接: 本文首发于个人博客:https://www.larscheng.com/nac…
  • 发布方式:OpenWrite 最懂你的科技自媒体管理平台
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LarsCheng’s Blog!

正文完
 0