前言

前面的系列文章已经介绍了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,内容如下

  1. # ip:port
  2. 10.1.8.27:8849
  3. 10.1.8.27:8850
  4. 10.1.8.27:8851

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

3、修改启动脚本

我们要在单台服务器上启动多个Nacos实例,要保证三个实例为不同的端口,这里我们可以修改启动脚本

定位到export FUNCTION_MODE="all"这一行,修改脚本内容,使其支持以-p传入端口参数

  1. export MODE="cluster"
  2. export FUNCTION_MODE="all"
  3. # 新加
  4. export SERVER_PORT="8848"
  5. while getopts ":m:f:p:" opt
  6. do
  7. case $opt in
  8. m)
  9. MODE=$OPTARG;;
  10. f)
  11. FUNCTION_MODE=$OPTARG;;
  12. # 新加
  13. p)
  14. SERVER_PORT=$OPTARG;;
  15. ?)
  16. echo "Unknown parameter"
  17. exit 1;;
  18. esac
  19. done
  20. # 新加
  21. JAVA_OPT="${JAVA_OPT} -Dserver.port=${SERVER_PORT}"

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

  1. # 新加内容
  2. PORT=$1
  3. if [ ! $PORT ]; then
  4. echo "please select stop port!" >&2
  5. exit 1
  6. fi
  7. # 添加PORT过滤
  8. pid=`ps ax | grep -i 'nacos.nacos' |grep java |grep ${PORT} | grep -v grep | awk '{print $1}'`
  9. # 后边省略...

启动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配置如下

  1. upstream nacos-server {
  2. server 127.0.0.1:8849;
  3. server 127.0.0.1:8850;
  4. server 127.0.0.1:8851;
  5. }
  6. server {
  7. listen 8848;
  8. server_name localhost;
  9. location /nacos/ {
  10. proxy_pass http://nacos-server/nacos/;
  11. }
  12. }

执行命令 sudo nginx启动nginx

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

客户端测试

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

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

  1. spring:
  2. application:
  3. name: nacos-config
  4. cloud:
  5. nacos:
  6. discovery:
  7. server-addr: 10.1.8.27:8848
  8. config:
  9. server-addr: 10.1.8.27:8848
  10. prefix: ${spring.application.name}
  11. file-extension: yml

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

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

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

  1. server:
  2. port: 9989
  3. nacos:
  4. 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

  1. 必须保证`InetAddress.getLocalHost().getHostAddress()`或者`hostname -i`打印的结果是
  2. 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


Nacos(九):Nacos集群部署和遇到的问题的更多相关文章

  1. 【Nacos】本地集群部署

    关于Nacos已经展开了四篇入门文章: 初探Nacos(一)-- 单机模式启动 初探Nacos(二)-- SpringCloud使用Nacos的服务注册与发现 初探Nacos(三)-- SpringB ...

  2. Spring Cloud Alibaba | Nacos集群部署

    目录 Spring Cloud Alibaba | Nacos集群部署 1. Nacos支持三种部署模式 2. 集群模式下部署Nacos 2.1 架构图 2.2 下载源码或者安装包 2.3 配置集群配 ...

  3. Nacos 集群部署

    关于nacos 集群部署,网上的示例往往不全或不可用,而官方的教程太简单了.官方也提供了一个 docker  + nacos 的伪集群的 部署示例.但毕竟是 伪, 不能实际生产使用. 全网就几乎就没有 ...

  4. nacos 1.1.x 集群部署笔记

    Nacos 是什么? https://nacos.io/zh-cn/docs/what-is-nacos.html 服务(Service)是 Nacos 世界的一等公民.Nacos 支持几乎所有主流类 ...

  5. Alibaba Nacos 服务发现组件集群部署

    前面学习了单机模式下的启动,生产环境中部署nacos肯定是使用集群模式cluster保证高可用. 官方文档的集群部署推荐使用VIP+域名模式,把所有服务列表放到一个vip下面,然后挂到一个域名下面. ...

  6. nacos集群部署

    对于nacos的集群部署,建议大家参考nacos官网进行,地址:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 下面是我自己部署na ...

  7. Nacos集群部署:

    Nacos集群部署: 官网:    https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html 1: 下载 Nacos1.2.0 链接:http ...

  8. Kubernetes 部署 Nacos 1.4 集群

    文章转载自:http://www.mydlq.club/article/104/ 系统环境: Nacos 版本:1.4.1 Mysql 版本:8.0.19 Kubernetes 版本:1.20.1 一 ...

  9. Spring Eureka 本地Docker集群部署

    故事背景 最近因为产线使用的服务与发现服务,使用的是Spring Cloud Eureka集群部署,为了以后调试产线的问题,想在本地搭建和产线一样的环境.产线的所有服务都是基于K8s和Docker部署 ...

随机推荐

  1. [opengl] 画一个可移动的自行车 二维几何变换(平移、旋转、缩放)

    #include <cmath> #include "glut.h" #include "iostream" using namespace std ...

  2. python红蓝英雄大乱斗(面向对象实现)

    红蓝英雄大乱斗 游戏规则 ''' 有红蓝两方英雄(可自定义个数) 随机一方英雄使用随机攻击方式攻击另一方英雄,任意一方英雄全部阵亡则游戏结束 每个英雄有 名字.生命值.普通攻击.Q技能攻击.W技能攻击 ...

  3. 《C# 语言学习笔记》——定义属性

    属性定义的方式与字段类似,但包含的内容比较多. 属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值.这两个块也称访问器,分别用于get和set关键字定义,可以用于控制对属性的 ...

  4. python基础之list列表的增删改查以及循环、嵌套

    Python的列表在JS中又叫做数组,是基础数据类型之一,以[]括起来,以逗号隔开,可以存放各种数据类型.嵌套的列表.对象.列表是有序的,即有索引值,可切片,方便取值.列表的操作和对字符串的操作是一样 ...

  5. python常用函数进阶(2)之map,filter,reduce,zip

    Basic Python : Map, Filter, Reduce, Zip 1-Map() 1.1 Syntax # fun : a function applying to the iterab ...

  6. Android Studio 蓝牙开发实例——基于Android 6.0

    因项目需要做一个Android 的蓝牙app来通过手机蓝牙传输数据以及控制飞行器,在此,我对这段时间里写的蓝牙app的代码进行知识梳理和出现错误的总结. 该应用的Compile Sdk Version ...

  7. Python flask构建微信小程序订餐系统

    第1章 <Python Flask构建微信小程序订餐系统>课程简介 本章内容会带领大家通览整体架构,功能模块,及学习建议.让大家在一个清晰的开发思路下,进行后续的学习.同时领着大家登陆ht ...

  8. 曹工杂谈:Linux服务器上,Spring Boot 原地修改 jar 包配置文件/替换class文件,免去重复上传的麻烦

    一.前言 相信很多同学有这样的需求,现在很多公司都有多地的研发中心,经常需要跨地区部署,比如,博主人在成都,但是服务器是北京的.一般城市间网络都不怎么好,上传一个几十兆的jar包那是真的慢,别说现在微 ...

  9. 详解 Diff 算法以及循环要加 key 值问题

    上一篇文章我简述了什么是 Virtual DOM,这一章我会详细讲 Diff 算法以及为什么在 React 和 Vue 中循环都需要 key 值. 什么是 DOM Diff 算法 Web 界面其实就是 ...

  10. Android 使用 DiffUtil 处理 RecyclerView 数据更新问题

    背景 RecyclerView.Adapter#notifyDataSetChanged() 会每次刷新整个布局: 每次手动调用 RecyclerView.Adapter#notifyItemXx 系 ...