实战Nacos的集群搭建

声明

    初生牛犊不怕虎啊,我和我的意志斗争,不过胜负已经知晓,不然该文章也不会出现,Nacos集群,经历过无数次实验,我成功了!!!

先锋

    单服务搭建Nacos集群(docker-compose方式),全网首发,我是第一个欧耶!!!

前提

  1. Centos版本:7.x
  2. Docker(版本任意)
  3. 提前装好Docker-compose依赖
  4. Mysql5.7(Docker容器中安装)

为什么搭建Nacos集群?

     Nacos支持几乎所有主流类型的“服务”的发现、配置和管理,服务将自身入驻到Nacos中,Nacos将服务管理起来,并且服务与服务之间的通信也在服务发现基础之上进行的,如果Nacos服务因某种原因宕机了,也就意味将军失去了虎符,服务将会群龙无首,服务与服务之间通信的桥梁也会消失,对于该情况,我们可以搭建Nacos集群,即使某个Nacos挂掉,其他存活的Nacos服务也会正常工作,大大的提升了系统的可用性。
   Nacos单机模式和集群模式
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何搭建Nacos集群?

      长话短说,在讲清楚为什么搭建Nacos集群后,就要开始进行Nacos的集群搭建了,我搭建Nacos集群是在单个服务器上搭建的,没有使用分布式的方式,不过单服务搭建方式和分布式搭建方式基本类似,只不过配置内容不同。
      
自己画的,凑合下哈,实现流程通过该图展现出来
在这里插入图片描述
步骤一:Nacos官方中寻找灵感
  Nacos官网,到Nacos官方中获取Nacos官网提供的搭建Nacos集群的配置文件(custom.properties和cluster-hostname.yaml)。
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述步骤二:修改配置文件中的内容
  修改cluster-hostname.yaml配置文件,注意mysql的网段一定要和nacos的网段在同一个网段域中,否则就会无法连接,原因是无法访问到mysql地址。
  cluster-hostname.yaml

version: "3.7"
services:
  nacos1:
    hostname: nacos1             			#主机名称
    container_name: nacos1					#容器名称
    image: nacos/nacos-server:1.3.0			#Docker镜像包
    volumes:								#映射
      - ./nacos/cluster-logs/nacos1:/home/nacos/logs
      - ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:									#端口
      - "28846:28846"
    environment:							#环境
       NACOS_APPLICATION_PORT: 28846		#nacos端口号
       NACOS_SERVER_IP: 172.168.0.5			#nacos的ip
       NACOS_SERVERS: 172.168.0.5:28846 172.168.0.4:28847 172.168.0.3:28848
       SPRING_DATASOURCE_PLATFORM: mysql    #nacos依赖的数据
       MYSQL_SERVICE_HOST: 172.168.0.2 		#数据的地址
       MYSQL_SERVICE_DB_NAME: nacos_devtest	#数据库名称
       MYSQL_SERVICE_PORT: 3306				#数据库端口
       MYSQL_SERVICE_USER: root				#数据库用户名
       MYSQL_SERVICE_PASSWORD: root    		#数据库密码
    restart: always							#重启方式
    depends_on:								#启动顺序
      - mysql    
    networks: 								#网段设置
      extnetwork:
        ipv4_address: 172.168.0.5
  nacos2:
    hostname: nacos2
    image: nacos/nacos-server:1.3.0
    container_name: nacos2
    volumes:
      - ./nacos/cluster-logs/nacos2:/home/nacos/logs
      - ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "28847:28847"
    environment:
       NACOS_APPLICATION_PORT: 28847
       NACOS_SERVER_IP: 172.168.0.4
       NACOS_SERVERS: 172.168.0.5:28846 172.168.0.4:28847 172.168.0.3:28848
       SPRING_DATASOURCE_PLATFORM: mysql
       MYSQL_SERVICE_HOST: 172.168.0.2 
       MYSQL_SERVICE_DB_NAME: nacos_devtest
       MYSQL_SERVICE_PORT: 3306
       MYSQL_SERVICE_USER: root
       MYSQL_SERVICE_PASSWORD: root
    restart: always 
    depends_on:
      - mysql    
    networks: 
      extnetwork:
        ipv4_address: 172.168.0.4
  nacos3:
    hostname: nacos3
    image: nacos/nacos-server:1.3.0
    container_name: nacos3
    volumes:
      - ./nacos/cluster-logs/nacos3:/home/nacos/logs
      - ./nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties
    ports:
      - "28848:28848"
    environment:
       NACOS_APPLICATION_PORT: 28848
       NACOS_SERVER_IP: 172.168.0.3
       NACOS_SERVERS: 172.168.0.5:28846 172.168.0.4:28847 172.168.0.3:28848
       SPRING_DATASOURCE_PLATFORM: mysql
       MYSQL_SERVICE_HOST: 172.168.0.2 
       MYSQL_SERVICE_DB_NAME: nacos_devtest
       MYSQL_SERVICE_PORT: 3306
       MYSQL_SERVICE_USER: root
       MYSQL_SERVICE_PASSWORD: root
    networks: always       
    depends_on:
      - mysql
    networks: 
      extnetwork:
        ipv4_address: 172.168.0.3
  mysql:
    container_name: mysql
    image: nacos/nacos-mysql:5.7
    environment:
       MYSQL_ROOT_PASSWORD: root
       MYSQL_DATABASE: nacos_devtest
       MYSQL_USER: nacos
       MYSQL_PASSWORD: nacos
    volumes:
      - ./mysql:/var/lib/mysql
    ports:
      - "28336:3306"        
    networks: 
      extnetwork:
        ipv4_address: 172.168.0.2      
  nginx-server:
    image: nginx:latest
    container_name: nginx-server
    ports:
      - "28180:28180"
    volumes:
      - /SpringCloud/nginx/conf.d:/etc/nginx/conf.d
      - /SpringCloud/nginx/nginx.conf:/etc/nginx/nginx.conf
      - /SpringCloud/logs/nginx:/var/log/nginx
      - /SpringCloud/www:/usr/share/nginx/html
    environment:
      - TZ=Asia/Shanghai     
    restart: always
    networks: 
      extnetwork:
        ipv4_address: 172.168.0.6
networks: 
  extnetwork:
    ipam:
      config:
      - subnet: 172.168.0.0/24

  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

  nginx.conf

user  root;
worker_processes  4;

error_log  /var/log/nginx/error.log info;
#pid        /var/run/nginx.pid;

events {
    worker_connections  4096;
}

http {
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
    add_header Access-Control-Allow-Headers X-Requested-With;
    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;
    autoindex  on;
    #gzip  on;
	
    upstream  nacoscluster{
  	ip_hash;
	server 172.168.0.5:28846;
	server 172.168.0.4:28847;
	server 172.168.0.3:28848;
    }
	server {
      listen  28180;
	  #server_name  gwmyd.org.cn;
	location ^~/ {
	    proxy_pass http://nacoscluster;
    }			
     error_page   500 502 503 504  /50x.html;
     location = /50x.html {
         root   /usr/share/nginx/html;
     }
}
    client_max_body_size 100M;
    client_header_buffer_size    128k;
    large_client_header_buffers  4  128k;
 
}

步骤三:将配置文件上传到服务器中
  注意:cluster-hostname.yaml配置文件中的映射文件路径,这里的配置文件放置目录都是根据cluster-hostname.yaml配置文件中的映射目录来放置的。在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
步骤四:Shell命令
  对于接下的操作就是Shell命令了,连接到服务器中,通过Shell命令进行操作。
  小细节
    在这里有个小细节,由于我们在yaml配置文件中配置了网段,所以在执行yaml文件之前,先查看docker容器中已存在网段是否和我们自定义网段冲突,如果不冲突则正常运行,如果冲突的话则运行时会报错并提示“”该网段已经存在“”,解决方案1:换未存在的网段,解决方案2:删掉冲突的网段。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
好,步入正题,在确定没有冲突的网段之后,就可以运行yaml文件了,需要注意的是,Docker容器映射的端口一定要对外开放,否则外部无法访问。
在这里插入图片描述在这里插入图片描述

 步骤四说明:在启动成功之后,如果去查看Nacos对应的mysql的数据库的话,会发现数据库中是空表的,如果发现此问题不需要担心,当我们在Nacos客户端创建配置的时候,Nacos底层会自动帮我们创建数据表。
步骤五:访问测试
  访问方式:服务器ip或服务器域名:nginx监听端口号/nacos
在这里插入图片描述
  通过Navicat for MySQL客户端进行连接,前提是外网开放映射端口,本地保证可以访问到。
在这里插入图片描述
在这里插入图片描述

Nacos的选举

     Nacos的选举是基于Raft算法的,我怎么知道是基于Raft算法呢?很简单,因为我查看了日志(偷笑),由于主题是如何搭建Nacos集群,所以对于Nacos选举的详细描述忽略,不过我会通过图片的方式放置在下方,如果有不懂的地方,可以通过评论区询问。
在这里插入图片描述
  导入该依赖查看Nacos选举步骤源码

	<dependency>
			<groupId>com.alibaba.nacos</groupId>
			<artifactId>nacos-naming</artifactId>
			<version>0.8.0</version>
	</dependency>

最核心的类是RaftCore类,其余的都是辅助类。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
最终效果,leader已经被选出来。
在这里插入图片描述

Nacos的过半机制

     对于Nacos的过半机制,实际上非常容易理解,话不多说,码起来。

     /**
      * look,这就是过半机制,如果看不懂的话可以将peers.size()方法换成数字,
      * eg: 3/2+1=2,如果投票数大于等于peers.size()/2+1的值,则就成功。
      * 
     */
    public int majorityCount() {
        return peers.size() / 2 + 1;
    }

Nacos的参数指南

    Nacos的参数地址,yaml配置文件中的参数都是参照该页面的参数进行配置的,不过对于JVM的设置参数(对Java虚拟机的一些优化)我没有使用,感兴趣的码佬们可以进行添加。
在这里插入图片描述

尾声

    深夜文章,写之不易,麻烦各位码佬们点赞关注下,我会时不时更新一些实战系列的文章~~

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值