Spring Cloud Alibaba Nacos+Nginx+Keepalived高可用集群注册中心搭建

简介

Nacos简介

Nacos官网:https://nacos.io

Nacos源码:https://github.com/alibaba/nacos

下载Nacos服务端压缩包:https://github.com/alibaba/nacos/releases

Nacos三种部署模式

  • 单机模式 - 用于测试和单机试用。
  • 集群模式 - 用于生产环境,确保高可用。
  • 多集群模式 - 用于多数据中心场景。

Nacos安装

单机配置文件

vim /usr/local/nacos/conf/application.properties
#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos  
### Default web server port:
server.port=8848   

#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=yibo

启动与关闭服务

[root@nacos-71 nacos]# /usr/local/nacos/bin/startup.sh -m standalone

[root@nacos-71 nacos]# /usr/local/nacos/bin/shutdown.sh

日志状态

2020-06-27 07:58:24,537 INFO Initializing ExecutorService 'taskScheduler'

2020-06-27 07:58:24,961 INFO Tomcat started on port(s): 8848 (http) with context path '/nacos'

2020-06-27 07:58:24,977 INFO Nacos Log files: /usr/local/nacos/logs

2020-06-27 07:58:24,980 INFO Nacos Log files: /usr/local/nacos/conf

2020-06-27 07:58:24,981 INFO Nacos Log files: /usr/local/nacos/data

2020-06-27 07:58:24,981 INFO Nacos started successfully in stand alone mode. use external storage

说明:nacos服务启动完成,并且已经看到日志路径以及配置文件路径与数据目录

日志路径

[root@nacos-71 logs]# tailf  /usr/local/nacos/logs/start.out 

安装完毕访问

http://192.168.31.71:8848/nacos/#/login
帐号:nacos
密码:nacos

集群搭建

集群搭建架构图设计

设置主机hosts文件

vim /etc/hosts

192.168.31.31 nacos1
192.168.31.32 nacos2
192.168.31.33 nacos3

nacos集群文件要求设计

#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848

#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql   开启mysql数据库


### Count of DB:
db.num=2                     设为2代表连接几个数据库实例

### Connect URL of DB:
db.url.1=jdbc:mysql://192.168.31.30:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.url.2=jdbc:mysql://192.168.31.31:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=yibo

配置数据库

在nacos/conf目录下找到schema.sql文件,执行schema.sql相关文件,新建nacos库和相关表。

配置集群文件

在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)

  • 更改配置文件名称
[root@nacos-71 conf]# mv cluster.conf.example cluster.conf
  • 设置集群内部IP
[root@nacos-71 conf]# vim /usr/local/nacos/conf/cluster.conf

#it is ip
#example
192.168.31.31:8848
192.168.31.32:8848
192.168.31.33:8848

注意:三台设置一样即可,启动三台nacos服务,切记一定添加主机/etc/hosts进行解析。

  • 启动与关闭服务
[root@nacos-71 nacos]# /usr/local/nacos/bin/startup.sh -m standalone
[root@nacos-71 nacos]# /usr/local/nacos/bin/shutdown.sh

总配置文件详解

#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos  项目目录
### Default web server port:
server.port=8848   默认端口

#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
#nacos.inetutils.prefer-hostname-over-ip=false

### Specify local server's IP: 
当本地环境比较复杂的时候,Nacos服务在启动的时候需要选择运行时使用的IP或者网卡。Nacos从多网卡获取IP参考Spring Cloud设计,
通过nacos.inetutils参数,可以指定Nacos使用的网卡和IP地址。目前支持的配置参数有:
#nacos.inetutils.ip-address=

use-only-site-local-interfaces参数可以让nacos使用局域网ip,这个在nacos部署的机器有多网卡时很有用,可以让nacos选择局域网网卡
nacos.inetutils.use-only-site-local-interfaces=true

ignored-interfaces支持网卡数组,可以让nacos忽略多个网卡
nacos.inetutils.ignored-interfaces[0]=eth0
nacos.inetutils.ignored-interfaces[1]=eth1

preferred-networks参数可以让nacos优先选择匹配的ip,支持正则匹配和前缀匹配
nacos.inetutils.preferred-networks[0]=30.5.124.
nacos.inetutils.preferred-networks[0]=30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d))),30.5.124.(25[0-5]|2[0-4]\\d|((1d{2})|([1-9]?\\d)))
#*************** Config Module Related Configurations ***************#
### If user MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:         多数据库连接,如设置2个代表连接两个数据库。
db.num=1

### Connect URL of DB:
db.url.1=jdbc:mysql://127.0.0.1:3306/nacos创建的数据库?....此处省略
true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.url.2=jdbc:mysql://127.0.0.1:3306/nacos创建的数据库?....此处省略
db.user=nacos             帐号:用户名
db.password=nacos         密码:密码  

Nginx配置文件信息

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    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  logs/access.log  main;

    upstream server_nacos {
        server 192.168.x.64:8880;
        server 192.168.x.65:8880;
        server 192.168.x.66:8880;
     } 
    server {
        listen   80;
        server_name  192.168.30.110;
        location /{
        rewrite ^/(.*)$  http://192.168.x.110/nacos/$1;
           }
        location /nacos/{
        proxy_pass http://server_nacos/nacos/;
        proxy_set_header  host $host;
        proxy_set_header  X-Forwarded-For $remote_addr;
       }
    }
 }

Keepalived配置文件

Master

! Configuration File for keepalived

global_defs {
   }
   router_id nacos1
}
vrrp_instance VI_52 {
    state MASTER
    interface eth0
    virtual_router_id 52
    priority 150
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.30.110
    }
}

Slave

! Configuration File for keepalived

global_defs {
   }
   router_id nacos1
}
vrrp_instance VI_52 {
    state BACKUP
    interface eth0
    virtual_router_id 52
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.30.110
    }
}

Nacos集群工作原理

集群选举问题:

Nacos支持集群模式,很显然。而一旦涉及到集群,就涉及到主从,那么nacos是一种什么样的机制来实现的集群呢?

Nacos的集群类似于zookeeper, 它分为leader角色和follower角色, 那么从这个角色的名字可以看出来,这个集群存在选举的机制。 因为如果自己不具备选举功能,角色的命名可能就是master/slave了。

选举算法 :

Nacos集群采用 raft 算法来实现,它是相对zookeeper的选举算法较为简单的一种。选举算法的核心在 RaftCore 中,包括数据的处理和数据同步。

raft 算法演示地址:http://thesecretlivesofdata.com/raft/

在Raft中,节点有三种角色,每个节点都拥有以下三种角色中的一种:

  • Leader:负责接收客户端的请求,并向集群中其他节点下达指令。
  • Candidate:用于选举Leader的一种角色(竞选状态)。
  • Follower:负责响应来自Leader或者Candidate的请求。
产生选举的三个时机
  • 1、在Nacos启动后,还没有产生Leader时的选举。
  • 2、集群成员总量变更时重新选举。
  • 3、Leader节点停止服务后重新选举。

所有节点启动的时候,都是follower状态。 如果在一段时间内如果没有收到leader的心跳(可能是没有leader,也可能是leader挂了),那么follower会变成Candidate。然后发起选举,选举之前,会增加 term,这个 term 和 zookeeper 中的 epoch 的道理是一样的。

follower会投自己一票,并且给其他节点发送票据vote,等到其他节点回复在这个过程中,可能出现几种情况

  • 1、收到过半的票数通过,则成为leader。
  • 2、被告知其他节点已经成为leader,则自己切换为follower。
  • 3、一段时间内没有收到过半的投票,则重新发起选举。

约束条件在任一term中,单个节点最多只能投一票

选举的几种情况 :
  • 1、第一种情况,赢得选举之后,leader会给所有节点发送消息,避免其他节点触发新的选举。

  • 2、第二种情况,比如有三个节点A B C。A B同时发起选举,而A的选举消息先到达C,C给A投了一票,当B的消息到达C时,已经不能满足上面提到的约束条件,即C不会给B投票,而A和B显然都不会给对方投票。A胜出之后,会给B,C发心跳消息,节点B发现节点A的term不低于自己的term,知道有已经有Leader了,于是转换成follower。

  • 3、第三种情况, 没有任何节点获得majority投票,可能是平票的情况。加入总共有四个节点(A/B/C/D),Node C、Node D同时成为了candidate,但Node A投了NodeD一票,NodeB投了Node C一票,这就出现了平票 split vote的情况。这个时候大家都在等啊等,直到超时后重新发起选举。如果出现平票的情况,那么就延长了系统不可用的时间,因此raft引入了 randomizedelection timeouts来尽量避免平票情况。

注意:
  • 1、只要UP状态节点不小于1+N/2,集群就能正常运行。
  • 2、小于1+N/2,集群任然可以提供基本服务,但已无法保证Nacos各节点数据一致性。
Nacos节点间的数据同步过程

步骤(注册中心指定为follower节点):

  • 1、follower会自动将注册心跳包转给Leader节点。
  • 2、Leader节点完成实质的注册登记工作。
  • 3、Leader节点完成注册后向其他follower节点发起同步注册日志的指令。
  • 4、所有可用follower节点在收到指令后进行ack应答,通知消息已收到。
  • 5、当Leader收到过半数follower节点的ack应答后,返回给微服务注册成功的响应信息。

注意——Nacos CP/AP模式切换

CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)Availability(可用性)Partition tolerance(分区容错性),三者不可得兼。

  • 一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)。

  • 可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)。

  • 分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

CAP原则的精髓就是在分布式情况下,要么AP,要么CP,要么AC,但是不存在CAP。如果在某个分布式系统中数据无副本, 那么系统必然满足强一致性条件, 因为只有独一数据,不会出现数据不一致的情况,此时C和P两要素具备,但是如果系统发生了网络分区状况或者宕机,必然导致某些数据不可以访问,此时可用性条件就不能被满足,即在此情况下获得了CP系统,但是CAP不可同时满足 。

Nacos 集群默认支持的是CAP原则中的AP原则,但是也可切换为CP原则,切换命令如下:

curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'

同时微服务的bootstrap.properties 需配置如下选项指明注册为临时/永久实例
AP模式不支持数据一致性,所以只支持服务注册的临时实例,CP模式支持服务注册的永久实例,满足配置文件的一致性。

#false为永久实例,true表示临时实例开启,注册为临时实例
spring.cloud.nacos.discovery.ephemeral=false

参考:
https://www.gylinux.cn/3210.html

https://blog.csdn.net/weixin_41358004/article/details/108506237

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容