Nacos+Docker+Mysql快速集群搭建

目录

    • 说明
    • 安装docker
    • 创建mysql数据库
    • 拉取docker 镜像
    • nacos一些说明点
    • 创建docker容器
    • 访问集群
    • 结束语

说明

简单记录一下 三台 云ECS 快速docker方式创建 nacos集群。 Nacos 版本 2.0.2,里面的一些注意点一并记录

三台 ECS,充当三个节点

主机 内网IP 说明
172.20.167.254 node1
172.20.168.0 node2
172.20.167.255 node3

安装docker

这个跳过

创建mysql数据库

mysql安装跳过,这里使用了阿里云RDS

运行sql脚本
不得不吐槽一下,nacos文档中没有明显的找到mysql的脚本文件的提示语,
一般在nacos源代码文件夹中的文件: /distribution/conf/nacos-mysql.sql

拉取docker 镜像

三个节点上分别执行

docker pull  nacos/nacos-server:2.0.2

nacos一些说明点

避免一些坑,先说明一下很有可能导致你集群失败或访问失败的点

---------说明点1:--------------------
NACOS_APPLICATION_PORT 为nacos服务对外提供主端口(默认8848),而不是老版本的NACOS_SERVER_PORT

另外查看具体的环境变量含义参考官方文档:
https://github.com/nacos-group/nacos-docker

---------说明点2:--------------------
针对docker容器,我这里直接使用的是 host 网络模式,docker容器端口同宿主机端口,如果是默认模式,则需要注意nacos2.x版本起,多了好几个端口(这里吐槽一下 谁的主意, 搞这么多端口作甚?)

如果你不仔细看文档了解相关端口,启动客户端会大概率会报异常: NacosException: Client not connected,current status:STARTING
参考github issues https://github.com/alibaba/nacos/issues/6154

---------说明点3:--------------------
nacos 2.x 新增了gRPC的通信方式,因此需要注意不止官方网站文档里面说的2个端口,确切的说是4个端口!!! 看下面nacos端口用途:
Nacos+Docker+Mysql快速集群搭建_第1张图片

端口 与主端口的偏移量 描述
8848 0 【服务主端口】,默认8848,java程序注册中心、配置中心、服务注册等使用该端口
9848 +1000 客户端gRPC请求服务端端口,用于TCP长连接和请求,无需手动配置,已经集成了 就是【服务主端口】+ 1000
7848 -1000 jRaft服务节点之间数据同步协议端口,无需手动配置,已经集成了 就是【服务主端口】- 1000
9849 +1001 gRPC服务节点之间数据同步协议端口,无需手动配置,已经集成了 就是【服务主端口】+ 1001

再次吐槽一下 谁的主意, 搞这么多端口作甚?
因此不管你是docker 还是什么部署方式,一定一定注意这些端口是否对外开放了,是否服务节点之间开放了。

详情查看:https://nacos.io/zh-cn/docs/2.0.0-compatibility.html

创建docker容器

三个节点上分别执行 下面的docker命令。

部署再次说明:

  • docker 方式部署
  • mysql 方式存储
  • 三台阿里云ECS,同一个内网环境,之间任意端口访问正常
  • docker 网络模式为 host方式
  • 设置nacos主端口为 8849
  1. 在 172.20.167.254 节点上运行
docker run -d \
--network=host  \
--name nacos-node1 \
-e MODE=cluster \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=rm-xxx.mysql.rds.aliyuncs.com  \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=abc123 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_APPLICATION_PORT=8849 \
-e NACOS_SERVERS="172.20.167.254:8849 172.20.168.0:8849 172.20.167.255:8849" \
-e NACOS_SERVER_IP=172.20.167.254 \
-e JVM_XMS=256m -e JVM_XMX=512m  \
nacos/nacos-server:2.0.2
  1. 在 172.20.168.0 节点上运行
docker run -d \
--network=host  \
--name nacos-node2 \
-e MODE=cluster \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=rm-xxx.mysql.rds.aliyuncs.com  \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=abc123 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_APPLICATION_PORT=8849 \
-e NACOS_SERVERS="172.20.167.254:8849 172.20.168.0:8849 172.20.167.255:8849" \
-e NACOS_SERVER_IP=172.20.168.0 \
-e JVM_XMS=256m -e JVM_XMX=512m  \
nacos/nacos-server:2.0.2
  1. 在 172.20.167.255 节点上运行
docker run -d \
--network=host  \
--name nacos-node3 \
-e MODE=cluster \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=rm-xxx.mysql.rds.aliyuncs.com  \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=abc123 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e NACOS_APPLICATION_PORT=8849 \
-e NACOS_SERVERS="172.20.167.254:8849 172.20.168.0:8849 172.20.167.255:8849" \
-e NACOS_SERVER_IP=172.20.167.255 \
-e JVM_XMS=256m -e JVM_XMX=512m  \
nacos/nacos-server:2.0.2

访问集群

访问有两个点 1:访问nacos web管理界面 2:SDK客户端访问nacos接口

一般可以是 nginx代理访问这三台ECS ,或者通过阿里云SLB代理负载均衡访问这三台ECS(本质上还是nginx)
Nacos+Docker+Mysql快速集群搭建_第2张图片

注意了! 上面说过nacos2.x开始,多了好几个端口哦,这里就说一下nginx如何代理配置访问三台集群节点。
nginx 在第4台ECS上,nginx 需要代理两个 端口的访问 (8849 和 9849),8849是我们的主服务端口,9849是nacos gRPC直接计算出来的端口(8849+1000)

nginx 对外开放端口是8849和9848,nginx所在的ECS 对外公网ip假设为 8.20.168.6,阿里云上安全组开放8849和9848 端口。

这里重点说明一下 9848是TCP方式代理访问。

    ....

stream {
    upstream nacos_socket_proxy {
        hash $remote_addr consistent;
        server 172.20.167.254:9849;
        server 172.20.168.0:9849;
        server 172.20.167.255:9849;
    }

    server {
       listen 9849;
       proxy_connect_timeout 20s;
       proxy_timeout 300s;
       proxy_pass nacos_socket_proxy;
    }
}

http {
         ....
       upstream  nacos-server {
            server  172.20.168.0:8849   weight=1;
            server  172.20.167.254:8849 weight=3;
            server  172.20.167.255:8849 weight=6;
        }

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

首先访问 http://8.20.168.6:8849/nacos 进入登录页面,输入用户名密码(默认 nacos naocs)
一般在界面中可查看到如下情况,说明集群搭建完毕。
Nacos+Docker+Mysql快速集群搭建_第3张图片

SDK 本地测试访问,可以现在nacos 控制页面上 新增一个配置信息 dataId=“myTest” group=“DEFAULT_GROUP”


import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;

import java.util.Properties;
import java.util.concurrent.Executor;

public class NcosTest {

    public static void main(String[] args) throws NacosException, InterruptedException {
        String serverAddr = "8.20.168.6:8849";
        String dataId = "mytest";
        String group = "DEFAULT_GROUP";
        Properties properties = new Properties();
        properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
        ConfigService configService = NacosFactory.createConfigService(properties);
        String content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        configService.addListener(dataId, group, new Listener() {
            @Override
            public void receiveConfigInfo(String configInfo) {
                System.out.println("recieve:" + configInfo);
            }

            @Override
            public Executor getExecutor() {
                return null;
            }
        });

        boolean isPublishOk = configService.publishConfig(dataId, group, "content");
        System.out.println(isPublishOk);

        Thread.sleep(3000);
        content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);

        boolean isRemoveOk = configService.removeConfig(dataId, group);
        System.out.println(isRemoveOk);
        Thread.sleep(3000);

        content = configService.getConfig(dataId, group, 5000);
        System.out.println(content);
        Thread.sleep(300000);


    }

}


直接运行 main方法查看运行结果。

结束语

说实在话,nacos 2.0.2 引入了新的网络连接方式给运维带来了一定的工作量, 如果你是内网,如果你只是简单的用了注册中心服务,并发量没有想象的那么大,可以先直接采用单机模式运行,做好监控自动docker重启即可。

nacos 单机版本 并使用mysql作为持久化存储 docker启动命令记录一下:

docker run -d \
-e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=rm-xxxxxxxxx.mysql.rds.aliyuncs.com \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_USER=qizhi_dev \
-e MYSQL_SERVICE_PASSWORD=Qzhi123456 \
-e MYSQL_SERVICE_DB_NAME=nacos \
-e MYSQL_DATABASE_NUM=1 \
-e JVM_XMS=512m -e JVM_XMX=512m -e JVM_XMN=256m \
-p 8848:8848 \
--restart=always \
--name nacos \
nacos/nacos-server:1.4.3

你可能感兴趣的:(运维,docker,mysql,nacos,集群)