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 Hexo IDEA IPA JavaScript jsDeliver JS樱花特效 JVM Linux markdown Maven MyBatis MyBatis-plus MySQL Pictures Sakura SEO shadowrocket Spring Boot Spring Cloud Spring Cloud Alibaba SpringMVC SSR Thymeleaf V2ray Vue Web WebSocket Wechat Social WordPress Yoast SEO 代理 分页 图床 小幸运 苹果iOS国外账号 苹果IOS账号