基于Docker搭建Nacos高可用集群

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 基于Docker搭建Nacos高可用集群

一、Naocs简介



       Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

       Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。


     

二、Nacos部署方式


       Nacos 支持三种部署模式:单机模式集群模式多集群模式。在实践中,我们往往习惯用单机模式快速构建一个 Nacos 开发/测试环境,而在生产中,出于高可用的考虑,一定需要使用 Nacos 集群部署模式。多集群模式一般用于多数据中心场景。

 

 

三、Nacos部署方式对比

 

3.1 直连模式


直连模式是比较容易理解的,也是最简单的部署方式了,如下图所示:

        采用直连模式后,典型的开发场景配置如下:


server-addr: 192.168.10.128:8848,192.168.10.129:8848,192.168.10.130:8848

这种方式优点是部署比较简单、很直观。但是这种方式有很大的弊端,就是扩缩容、或者调整IP、机器置换、集群迁移等场景下,所有的应用都需要修改配置,很不灵活,生产环境不推荐。


直连模式分析:


  • 高可用性,集群本身的扩缩容必须要改动业务代码才能被感知到,出现节点故障需要紧急下线、紧急扩容等场景,让业务修改代码是不现实的,不符合高可用的原则;
  • 可伸缩性,同上,可伸缩性不好;
  • 架构简单,用户理解成本低;
  • 有引入额外的组件,没有新增组件的运维成本;

 3.2 VIP模式


VIP(Virtual IP) 模式可以很好的解决直连模式 IP 变化所带来的应用批量修改的问题,如下图所示:

       


那么什么是 VIP 呢?

       VIP是指虚拟IP,VIP的叫法来自阿里内部,如下图所示:


  • Real Server:处理实际请求的后端服务器节点
  • Director Server:指的是负载均衡器节点,负责接收客户端请求,并转发给 RS;
  • VIP:Virtual IP,DS 用于和客户端通信的 IP 地址,作为客户端请求的目标 IP 地址
  • IP:DS 用于和内部 RS 通信的 IP 地址
  • RIP:Real IP,后端服务器的 IP 地址
  • CIP:Client IP,客户端的 IP 地址


VIP模式的好处就是帮助Nacos Client 屏蔽了后端 RIP,相对于 RIP 而言,VIP 很少会发生变化。以扩容场景为例,只需要让 VIP 感知到即可,Nacos Client 只需要关注 VIP,避免了扩容引起的代码改造。只要是具备负载均衡能力的组件,均可以实现 VIP 模式,如下所示:



例如用nginx来实现VIP模式,如下图所示:



nginx配置如下:

#配置nginx反向代理
upstream nacos_server {
  server 192.168.10.128:8848  weight=1 max_fails=1 fail_timeout=10s;
  server 192.168.10.129:8848  weight=1 max_fails=1 fail_timeout=10s;
  server 192.168.10.130:8848  weight=1 max_fails=1 fail_timeout=10s;
}
server {
    listen 80;
    server_name nacos;
    location / {
    proxy_pass http://nacos_server;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header REMOTE-HOST $remote_addr;
  add_header X-Cache $upstream_cache_status;
  add_header Cache-Control no-cache;
    }
}


开发场景配置如下:


server-addr: 192.168.10.127:8848


其实VIP模式也存在可读性问题,例如VIP的ip发生了变化,也需要修改应用代码,这种情况下最好给VIP挂一个域名,如下图所示:


nginx配置如下:

#配置nginx反向代理
upstream nacos_server {
  server 192.168.10.128:8848  weight=1 max_fails=1 fail_timeout=10s;
  server 192.168.10.129:8848  weight=1 max_fails=1 fail_timeout=10s;
  server 192.168.10.130:8848  weight=1 max_fails=1 fail_timeout=10s;
}
server {
    listen 80;
    server_name nacos.com;
    location / {
        proxy_pass http://nacos_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header REMOTE-HOST $remote_addr;
        add_header X-Cache $upstream_cache_status;
        add_header Cache-Control no-cache;
    }
}
#配置nginx反向代理upstream nacos_server {  server 192.168.10.128:8848  weight=1 max_fails=1 fail_timeout=10s;  server 192.168.10.129:8848  weight=1 max_fails=1 fail_timeout=10s;  server 192.168.10.130:8848  weight=1 max_fails=1 fail_timeout=10s;}
server {    listen 80;    server_name nacos.com;    location / {        proxy_pass http://nacos_server;        proxy_set_header Host $host;        proxy_set_header X-Real-IP $remote_addr;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;        proxy_set_header REMOTE-HOST $remote_addr;        add_header X-Cache $upstream_cache_status;        add_header Cache-Control no-cache;    }}


开发场景配置如下:


server-addr: nacos.com


模式分析如下:


  • 高可用性。域名的可用性需要由 DNS 域名服务器负责,可用性保障较高;VIP 需要由高可用的负责均衡组件支持,且流量经过负载均衡转发,对 VIP 的实现有较高可用性的要求。
  • 可伸缩性。水平扩缩容时,只需要让 VIP 感知即可,可伸缩性好。
  • 依赖了域名解析系统和负载均衡系统,生产部署时,需要有配套设施的支持。

 3.3 地址服务器模式


       地址服务器是什么?顾名思义,是用来寻址地址的服务器,发送一个请求,返回一串地址列表。如下图所示:


        注:简单来说,就是一个后端服务,包含一个返回服务器IP地址的接口,通过这个接口可以获取到定义的服务器IP

如下示例代码:

@Controller
public class AddressServerController {
    @RequestMapping("/nacos/serverlist")
    public ResponseEntity<String> serverlist() {
        return ResponseEntity.ok().
                header("Content-Type", "text/plain").
                body("192.168.10.128:8848\r\n" + 
                        "192.168.10.129:8848\r\n" +
                        "192.168.10.130:8848\r\n"
                );
    }
}

@Controllerpublic class AddressServerController {    @RequestMapping("/nacos/serverlist")    public ResponseEntity<String> serverlist() {        return ResponseEntity.ok().                header("Content-Type", "text/plain").                body("192.168.10.128:8848\r\n" +                         "192.168.10.129:8848\r\n" +                        "192.168.10.130:8848\r\n"                );    }}


      使用地址服务器可以完成集群地址和客户端配置的解耦,解决直连模式中无法动态感知集群节点变化的问题。客户端根据地址服务器返回的列表,随后采取直连模式连接;并且在客户端启动后,会启动一个定时器,轮询感知 AddressServer 的变化,进而及时更新地址列表。如下图所示:



模式分析如下:


  • 高可用性。域名的可用性需要由 DNS 域名服务器负责,可用性保障较高;地址服务器的职责单一,有较高的可用性;运行时 Client 直连 Nacos Server 节点,可用性靠 nacos-sdk 保障。
  • 可伸缩性。水平扩缩容时,只需要让地址服务器感知即可,可伸缩性好。
  • 依赖了域名解析系统和地址服务器,生产部署时,需要有配套设施的支持。


   

四、Nacos实战



       采用Nginx+域名模式进行搭建Nacos2.0.3 三节点的高可用集群。


4.1 环境要求


系统        ip                      插件
centos7 192.168.10.127 docker、docker-compose、nginx
centos7 192.168.10.128 docker、docker-compose、nacos
centos7 192.168.10.129 docker、docker-compose、nacos
centos7 192.168.10.130 docker、docker-compose、nacos


4.2 拉取镜像




#在对应的服务器上拉取镜像docker pull nacos/nacos-server:2.0.3docker pull nginx:1.20.1


4.3 docker-compose部署nacos

#以192.168.10.128为例:
#新建目录(可以自定义) 若干 :
mkdir  /data/nacos-docker/ -p 
mkdir  /data/nacos-docker/env/ -p
mkdir  /data/nacos-docker/init.d/ -p
#新建docker-compose-nacos.yaml文件,内容如下:
version: "3"
services:
  nacos:
    hostname: nacos
    image: nacos/nacos-server:2.0.3
    container_name: bdyh-nacos
    privileged: true
    networks:
      - pknet
    volumes:
      - ./cluster-logs:/home/nacos/logs
      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "7848:7848"
      - "8848:8848"
      - "9848:9848"
      - "9555:9555"
      - "9849:9849"
    env_file:
      - ./env/nacos-ip.env
    restart: on-failure
networks:
  pknet:
    external: true
#以192.168.10.128为例:#新建目录(可以自定义) 若干 :mkdir  /data/nacos-docker/ -p mkdir  /data/nacos-docker/env/ -pmkdir  /data/nacos-docker/init.d/ -p


#新建docker-compose-nacos.yaml文件,内容如下:version: "3"services:  nacos:    hostname: nacos    image: nacos/nacos-server:2.0.3    container_name: bdyh-nacos    privileged: true    networks:      - pknet    volumes:      - ./cluster-logs:/home/nacos/logs      - ./init.d/custom.properties:/home/nacos/init.d/custom.properties    ports:      - "7848:7848"      - "8848:8848"      - "9848:9848"      - "9555:9555"      - "9849:9849"    env_file:      - ./env/nacos-ip.env    restart: on-failurenetworks:  pknet:    external: true

注:其中端口 7848、8848、9848、9849是必须要开放的端口,8848是web页面端口,7848是集群数据同步接口,9848、9849是nacos 2.0.0以上的版本必须开发的端口。


4.4 新版本部署扩展


Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。


端口 与主端口的偏移量 描述

9848

1000 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求
9849 1000 服务端gRPC请求服务端端口,用于服务间同步等

注:客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。



4.5 自定义Docker网络




sudo docker network create --driver bridge --subnet 10.139.0.0/16 --gateway 10.139.0.1 pknet###说明:pknet是docker自定义的网络名称,此处的10.139可以自定义,不冲突即可


4.6 添加Nacos的环境变量

#nacos dev env#如果支持主机名可以使用hostname,否则使用ip,默认也是ip
PREFER_HOST_MODE=ip
MODE=cluster
#多网卡情况下,指定ip或网卡
NACOS_SERVER_IP=192.168.10.128
#集群中其它节点[ip1:port ip2:port ip3:port]
NACOS_SERVERS=192.168.10.128:8848 192.168.10.129:8848 192.168.10.130:8848
#nacos的web端口,不写默认就是8848
NACOS_APPLICATION_PORT=8848
#数据源平台 仅支持mysql或不保存empty
SPRING_DATASOURCE_PLATFORM=mysql
MYSQL_SERVICE_HOST=192.168.10.131
MYSQL_SERVICE_DB_NAME=nacos-config
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_SERVICE_PASSWORD=123456
MYSQL_DATABASE_NUM=1
#JVM调优参数
JVM_XMS=2g
JVM_XMX=2g
JVM_XMN=2g
JVM_MS=128m
JVM_MMS=320m

在/data/nacos-docker/env/目录下新建nacos-ip.env文件,内容如下:

注:NACOS_SERVER_IP=192.168.10.128,需对应调整为部署机器的ip,mysql数据源自行调整


4.7 挂载nacos的配置文件


在/data/nacos-docker/init.d目录下新建custom.properties文件,内容如下:


#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for prometheus
management.endpoints.web.exposure.include=*
# metrics for elastic search
#management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200
# metrics for influx
#management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true

目录结构如下(若是自定义,请注意修改docker-compose文件中对应的路径):



4.8 利用docker-compose编排nacos容器

 


docker-compose -p nacos -f docker-compose-nacos.yaml up -d


日志查看:


docker logs -f bdyh-nacos


     注:192.168.10.128   192.168.10.129  192.168.10.129都是同样的部署方式,注意修改特定的机器IP即可。


4.9 利用nginx+域名的方式做负载均衡

#在192.168.10.127上部署nginx
#新建目录若干:
mkdir -p /data/nginx
mkdir -p /data/nginx/conf/
mkdir -p /data/nginx/conf.d
mkdir -p /data/nginx/log
在/data/nginx目录下新建docker-compose-nginx.yml文件,内容如下:
version: '3.7'
services:
  nginx:
    image: nginx:1.20.1
    container_name: bdyh-nginx
    restart: always
    environment:
      TZ: Asia/Shanghai
    volumes:
      - /data/nginx/log:/var/log/nginx
      - /data/nginx/conf.d:/etc/nginx/conf.d
      - /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "80:80"
    networks:
      - pknet
networks:
  pknet:
    external: true
在/data/nginx/conf/目录下新建nginx.conf文件,内容如下:
user  root;
worker_processes  auto;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;
events {
    worker_connections  1024;
}
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}
在/data/nginx/conf.d/目录下新建nacos-cluster.conf文件,内容如下:
#配置nginx反向代理
upstream nacos_server {
  server 192.168.10.128:8848  weight=1 max_fails=1 fail_timeout=10s;
  server 192.168.10.129:8848  weight=1 max_fails=1 fail_timeout=10s;
  server 192.168.10.130:8848  weight=1 max_fails=1 fail_timeout=10s;
}
server {
    listen 80;
    server_name nacos.com;
    location / {
        proxy_pass http://nacos_server;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header REMOTE-HOST $remote_addr;
  add_header X-Cache $upstream_cache_status;
  add_header Cache-Control no-cache;
    }
}
利用docker-compose编排nginx容器:
docker-compose -p nginx -f docker-compose-nginx.yml up -d
在需要访问nacos的机器上配置hosts地址:
cat >> /etc/hosts << EOF
192.168.10.127 nacos.com
EOF

 

 

五、访问Nacos控制台


浏览器访问:192.168.10.127:80/nacos/


   

六、服务注册


Spring Boot项目如下配置:














spring:  cloud:    nacos:      config:        # 用nacos中的 命名空间(Namespace) 隔离不同的项目        namespace: prod        # 配置中心地址        server-addr: nacos.com      discovery:        namespace: prod        # 服务注册地址        server-addr: nacos.com


   

七、关闭双写


关闭双写,从而释放性能,具体的关闭方式是通过API进行:


curl -X PUT 'localhost:8848/nacos/v1/ns/operator/switches?entry=doubleWriteEnabled&value=false'

注:关闭后可以从logs/naming-server.log日志中观察到Disable Double write, stop and clean v1.x cache and features字样。说明关闭双写。


相关文章
|
1天前
|
安全 Linux Nacos
使用Docker运行Nacos并安装cpolar内网穿透工具实现远程访问
使用Docker运行Nacos并安装cpolar内网穿透工具实现远程访问
|
1天前
|
监控 Docker 容器
【Docker 专栏】Docker Swarm 集群的扩展与缩容策略
【5月更文挑战第8天】本文探讨了Docker Swarm集群的扩展与缩容策略。集群扩展可提高性能、增强可用性和适应业务发展,可通过手动或自动方式实现。缩容则需考虑业务需求、资源利用率和节点状态,可手动或按策略执行。关键步骤包括添加/移除节点及任务迁移。注意数据同步、监控评估和测试验证。案例分析和总结强调了灵活管理对保持集群最佳状态的重要性。
【Docker 专栏】Docker Swarm 集群的扩展与缩容策略
|
1天前
|
Linux Nacos 数据库
【微服务】生产部署nacos集群(三个节点)
【微服务】生产部署nacos集群(三个节点)
27 1
|
1天前
|
算法 Nacos Docker
docker部署nacos集群
docker部署nacos集群
30 0
|
1天前
|
NoSQL Redis Docker
使用Docker搭建Redis主从集群
使用Docker搭建Redis主从集群
32 1
|
1天前
|
Java Nacos 数据库
Docker 安装 Nacos
Docker 安装 Nacos
24 0
|
1天前
|
存储 Kubernetes Docker
构建高效稳定的Docker容器集群:从原理到实践
【4月更文挑战第19天】 在当今微服务架构盛行的时代,容器化技术已经成为了软件开发和部署的标准实践。本文深入探讨了如何利用Docker容器技术,结合Kubernetes集群管理工具,构建一个高效、稳定且可扩展的容器化环境。文章首先简述了Docker的核心原理及其优势,接着详细阐述了Kubernetes的基本概念与组件,最后通过一个实际案例来指导读者如何从零开始搭建并优化一个基于Docker和Kubernetes的容器集群系统。
24 1
|
1天前
|
安全 Linux Nacos
如何在CentOS使用Docker运行Nacos容器并实现无公网IP远程访问UI界面
如何在CentOS使用Docker运行Nacos容器并实现无公网IP远程访问UI界面
|
1天前
|
存储 应用服务中间件 Nacos
Nacos集群搭建
官方给出的Nacos集群图: 其中包含3个nacos节点,然后一个负载均衡器代理3个Nacos。这里负载均衡器可以使用nginx。
37 3
|
1天前
|
关系型数据库 MySQL Nacos
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
【深入浅出Nacos原理及调优】「实战开发专题」采用Docker容器进行部署和搭建Nacos服务以及“坑点”
61 1