Nacos(九):Nacos集群部署和遇到的问题
前言
前面的系列文章已经介绍了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文档中提供了三种集群部署方案
http://ip1:port/openAPI直连ip模式:- ip+端口进行部署,客户端直接连接Nacos的ip
http://Vip:port/openAPI挂载虚拟IP模式:- 配合KeepAlive,Nacos真实ip都挂载虚拟Ip下
- 客户端访问Vip发起请求
- 当主Nacos宕机后,备用Nacos接管,实现高可用,
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的集群部署基本就介绍完了,官方推荐的三种方式,他们的基本部署思路和方式都大同小异,只不过在高可用上有所不同,挑选你适合的方式动手搭建集群试试吧。
参考
社区issues
- 文章作者: LarsCheng
- 文章链接: 本文首发于个人博客:https://www.larscheng.com/nacos-namespace/
- 发布方式:OpenWrite 最懂你的科技自媒体管理平台
- 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LarsCheng's Blog!
Nacos(九):Nacos集群部署和遇到的问题的更多相关文章
- 【Nacos】本地集群部署
关于Nacos已经展开了四篇入门文章: 初探Nacos(一)-- 单机模式启动 初探Nacos(二)-- SpringCloud使用Nacos的服务注册与发现 初探Nacos(三)-- SpringB ...
- Spring Cloud Alibaba | Nacos集群部署
目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...
- Nacos 集群部署
关于nacos 集群部署,网上的示例往往不全或不可用,而官方的教程太简单了.官方也提供了一个 docker + nacos 的伪集群的 部署示例.但毕竟是 伪, 不能实际生产使用. 全网就几乎就没有 ...
- nacos 1.1.x 集群部署笔记
Nacos 是什么? https://nacos.io/zh-cn/docs/what-is-nacos.html 服务(Service)是 Nacos 世界的一等公民.Nacos 支持几乎所有主流类 ...
- Alibaba Nacos 服务发现组件集群部署
前面学习了单机模式下的启动,生产环境中部署nacos肯定是使用集群模式cluster保证高可用. 官方文档的集群部署推荐使用VIP+域名模式,把所有服务列表放到一个vip下面,然后挂到一个域名下面. ...
- nacos集群部署
对于nacos的集群部署,建议大家参考nacos官网进行,地址:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 下面是我自己部署na ...
- Nacos集群部署:
Nacos集群部署: 官网: https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 1: 下载 Nacos1.2.0 链接:http ...
- Kubernetes 部署 Nacos 1.4 集群
文章转载自:http://www.mydlq.club/article/104/ 系统环境: Nacos 版本:1.4.1 Mysql 版本:8.0.19 Kubernetes 版本:1.20.1 一 ...
- Spring Eureka 本地Docker集群部署
故事背景 最近因为产线使用的服务与发现服务,使用的是Spring Cloud Eureka集群部署,为了以后调试产线的问题,想在本地搭建和产线一样的环境.产线的所有服务都是基于K8s和Docker部署 ...
随机推荐
- C#3.0新增功能09 LINQ 基础06 LINQ 查询操作中的类型关系
连载目录 [已更新最新开发文章,点击查看详细] 若要有效编写查询,应了解完整的查询操作中的变量类型是如何全部彼此关联的. 如果了解这些关系,就能够更容易地理解文档中的 LINQ 示例和代码示例. ...
- Javascript中style,currentStyle和getComputedStyle的区别以及获取css操作方法
style: 只能获取行内style. 调用:obj.style.属性; 兼容:都兼容 currentStyle: 可以获取该obj所有style,但只可读. 调用:obj.currentStyle[ ...
- 快速java环境变量配置记录
配置java环境变量就是将java.exe和javac.exe的路径告诉系统,让系统能够找到这两个exe文件,废话不多说,直接开始如何配置环境变量,安装jdk时记住你的安装位置.(配置时必须要的) ...
- Git学习笔记 (二)
Git学习笔记(二) 突然发现,学习新知识新技能,都得经常温故使用,这样才能日益精进.最近学习的Git是因为加入了课题组,在学习做一些后台,由于后台开发会牵扯到多人开发,所以学会Git这一代码管理工具 ...
- 技术派-不用sqrt手工计算平方根
题目:任意长度数串,不使用sqrt函数,手工计算平方根? 要求只准用加/减/乘/除四则运算,不准使用power/sqrt等函数. 算法如下: 1.以小数点为中心往两边每2位分隔为一组: 2.然 ...
- Oracle 数据库登录、用户解锁、改密码、创建用户授权操作
一.数据库登录1.常用账户: 管理员: sys主要练习操作用户: scott2.测试环境是否配置成功: 1.命令窗口 win+R -> cmd(以管理员身份运行) - > sqlplus ...
- 脱壳系列_2_IAT加密壳_详细版解法1(含脚本)
1 查看壳程序信息 使用ExeInfoPe 分析: 发现这个壳的类型没有被识别出来,Vc 6.0倒是识别出来了,Vc 6.0的特征是 入口函数先调用GetVersion() 2 用OD找OEP 拖进O ...
- 【Android】java.lang.StackOverflowError: stack size 8MB
最近遇到的问题,报了两个错误,如下: java.lang.StackOverflowError: stack size 8MB android.os.TransactionTooLargeExcept ...
- 常用GDB命令行调试命令
po po是print-object的简写,可用来打印所有NSObject对象.使用举例如下: (gdb) po self <LauncherViewController: 0x552c570& ...
- git指令-未完待更新
git指令 1. $ git config --global user.name "Your Name" $ git config --global user.email &quo ...