Nacos Docker集群 最近学习Nacos,之前学习是使用的Nacos 单机模式,学习的情况下单机模式作为入门学习是不错的,但是实际环境中都是集群模式,但是目前还是处于学习,本人也就两台服务器,只能用测试服务器进行"伪集群”,即在一台服务器上使用docker-compose 启动三个Nacos并映射到不同的端口。刚开始弄这个遇到了很多坑,弄了快两天差不多才弄好,下面就大概的记录一下整个过程。

1.Docker的安装

我自己使用的是CentOS7.3的系统,直接使用下面的命令安装Docker

yum install docker

Docker安装之后默认的镜像源很慢,建议切换到阿里的源,可以参考我以前写过的教程:Docker配置阿里云镜像教程

2.安装docker-compose

这个安装的方式很多,可以直接使用下面的命令安装(CentOS)

yum install docker-compose

查看docker-compose 版本

docker-compose -version

我的版本如下:

[root@yremp ~]# docker-compose -version
docker-compose version 1.18.0, build 8dd22a9

3. 下载Nacaos Docker版

这个大概步骤 Nacos官方文档 中有

git clone https://github.com/nacos-group/nacos-docker.git

没有git命令执行下面命令进行安装

yum install git

4. 修改配置文件

4.1 项目目录

先进入下载的文件里面(根据自己下载的位置

cd nacos-docker

这个项目的目录结构如下

bulid里面是一些Spring的配置,env里面是各种模式的环境配置,example里面是各种模式的示例 docker-composer 启动配置

4.2 修改JVM参数

首先要说的就是Nacos的一些参数配置,下面是官方给的Docker运行参数说明:

namedescriptionoption
MODEcluster模式/standalone模式cluster/standalone default cluster
NACOS_SERVERSnacos cluster地址eg. ip1,ip2,ip3
PREFER_HOST_MODE是否支持hostnamehostname/ip default ip
NACOS_SERVER_PORTnacos服务器端口default 8848
NACOS_SERVER_IP多网卡下的自定义nacos服务器IP
SPRING_DATASOURCE_PLATFORMstandalone 支持 mysqlmysql / empty default empty
MYSQL_MASTER_SERVICE_HOSTmysql 主节点host
MYSQL_MASTER_SERVICE_PORTmysql 主节点端口default : 3306
MYSQL_MASTER_SERVICE_DB_NAMEmysql 主节点数据库
MYSQL_MASTER_SERVICE_USER数据库用户名
MYSQL_MASTER_SERVICE_PASSWORD数据库密码
MYSQL_SLAVE_SERVICE_HOSTmysql从节点host
MYSQL_SLAVE_SERVICE_PORTmysql从节点端口default :3306
MYSQL_DATABASE_NUM数据库数量default :2
JVM_XMS-Xmsdefault :2g
JVM_XMX-Xmxdefault :2g
JVM_XMN-Xmndefault :1g
JVM_MS-XX:MetaspaceSizedefault :128m
JVM_MMS-XX:MaxMetaspaceSizedefault :320m
NACOS_DEBUG开启远程调试y/n default :n
TOMCAT_ACCESSLOG_ENABLEDserver.tomcat.accesslog.enableddefault :false

默认的 -Xms(初始堆大小) -Xmx(最大堆大小) -Xmn (新生代大小)这几个参数如果像我一样在一个服务器上面进行伪集群必须要修改,设置的小一点,如果使用默认的参数运行,服务器几乎会满负载直接宕机(我一开始遇到了几次),我的测试服务器是1C2G的配置,使用默认参数运行负载如下图:

跑了几次直接把服务器给搞崩了,因为运行三个Nacos+MySQL所以必须修改上的几个参数

关于JVM参数的设置在env下,对应不同模式的配置,我是使用的hostname集群版的

先进入env目录

cd env

编辑nacos-hostname.env (如果使用ip形式的集群就编辑nacos-ip.env)

vim nacos-hostname.env

打开默认的配置如下:

#nacos dev env
PREFER_HOST_MODE=hostname
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos_devtest
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos

里面没有JVM参数设置,需要我们手动添加进去,修改后的如下:

#nacos dev env
PREFER_HOST_MODE=hostname
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
MYSQL_SERVICE_HOST=mysql
MYSQL_SERVICE_DB_NAME=nacos_devtest
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=nacos
MYSQL_SERVICE_PASSWORD=nacos
JVM_XMS=200m
JVM_XMX=200m
JVM_XMN=150m

JVM几个参数可以自己测试,我的测试上面的数据可以顺利运行几个服务,测试的过程中有的服务因为服务器满负载都运行不起来,或者全部崩掉。

4.3 启动配置查看

下面打开example下面的 cluster-hostname.yaml

打开后内容如下:

version: "3"
services:
  nacos1:
    hostname: nacos1
    container_name: nacos1
    image: nacos/nacos-server:latest
    volumes:
      - ./cluster-logs/nacos1:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8848:8848"
      - "9555:9555"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql

  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:latest
    container_name: nacos2
    volumes:
      - ./cluster-logs/nacos2:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8849:8848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:latest
    container_name: nacos3
    volumes:
      - ./cluster-logs/nacos3:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "8850:8848"
    env_file:
      - ../env/nacos-hostname.env
    restart: always
    depends_on:
      - mysql
  mysql:
    container_name: mysql
    image: nacos/nacos-mysql:5.7
    env_file:
      - ../env/mysql.env
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "3306:3306"

大概就是运行下面几个服务,测试环境基本不用修改

  1. nacos1,外部端口映射8848
  2. nacos2,外部端口映射8849
  3. nacos3,外部端口映射8850
  4. mysql5.7,外部端口映射 3306

5. 启动集群服务

接下来就是启动三个nacos和mysql服务,先到nacos-dcoker目录下执行:

docker-compose -f example/cluster-hostname.yaml up 

第一次执行需要下载几个镜像,如果不配置阿里或者国内的镜像源,会很慢,这个一开始就说过了,可以去顶部看看第一部分的说明,重新开启一个SSH连接,使用下面的命令情况查看几个服务运行情况

docker ps

结果如下

确保几个服务的状态都是UP,如果有及其他状态注意排查原因,这种伪集群最需要注意的就是JVM参数的指定,默认的参数很大,很容易导致服务器宕机然后部分服务运行失败,我之前大部分的问题就是没有注意到默认的JVM参数问题,导致爬坑时间过长。

6. Web界面访问测试

启动之后访问各个服务对应的Web端口,查看集群状态

nacos1
nacos2
nacos3

几个服务都是没有问题,集群状态显示也是OK的

7. 服务注册测试

我去之前的代码里面测试一下对几个不同的nacos进行服务注册检测

先让 cloud-alibaba-provider-payment9001 服务从nacos2 即8849端口注册,修改配置文件如下:

server:
  port: 9001

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 39.105.173.178:8849 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

先让 cloud-alibaba-provider-payment9002 服务从nacos3 即8850端口注册,修改配置文件如下:

server:
  port: 9002

spring:
  application:
    name: nacos-payment-provider
  cloud:
    nacos:
      discovery:
        server-addr: 39.105.173.178:8850 #配置Nacos地址

management:
  endpoints:
    web:
      exposure:
        include: '*'

启动两个微服务项目,去nacos1 (8848端口)的Web界面查看服务注册情况

我是用nacos1的Web界面查看的服务注册情况,可以看到nacos-payment-provider服务确实有两个实例,因为是集群,所以在哪个服务查看都是一样的。

到这里Nacos的集群就结束了,虽然明白之后感觉很简单,但是刚开始弄的时候感觉挺难的,不知到错误原因所在,琢磨了两天才搞明白。不过更加能体会到这种搞明白之后豁然开朗的感觉。

标签云

ajax AOP Bootstrap cdn Chevereto CSS Docker Editormd GC Github Hexo IDEA JavaScript jsDeliver JS樱花特效 JVM Linux Live2D markdown Maven MyBatis MyBatis-plus MySQL Navicat Oracle Pictures QQ Sakura SEO Spring Boot Spring Cloud Spring Cloud Alibaba SpringMVC Thymeleaf Vue Web WebSocket Wechat Social WordPress Yoast SEO 代理 分页 图床 小幸运 通信原理