0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SpringCloud Alibaba之Nacos集群部署+高可用保证

jf_ro2CN3Fa 来源:CSDN 2023-06-05 16:46 次阅读

Nacos 集群的工作原理

官方推荐用户把所有服务列表放到一个vip下面,然后挂到一个域名下面。

域名 + SLB模式(内网SLB,不可暴露到公网,以免带来安全风险),可读性好,而且换ip方便,推荐模式:

c61a0a6a-037b-11ee-90ce-dac502259ad0.png

Nacos 集群架构的设计要点:

微服务并不是直接通过 IP 地址访问后端服务,而是采用域名访问。通过 DNS(域名解析服务)转换为具体的 IP 地址,通过域名方式屏蔽后端容易产生变化的 IP 地址。

底层 Nacos 自带集群间节点与数据同步方案,因此需要 Nacos 节点对外暴露 8848 与 7848 端口。其中 8848 端口的作用是对外暴露 API 与集群间数据同步,而 7848 端口则用于节点选举来确定集群领袖(Leader)。同时 Nacos 在集群环境下需要持久化应用配置、用户权限、历史信息等内置数据,因此需要额外部署 MySQL 数据库提供统一存储。

在 Nacos 层面,每一台服务器都有独立的 IP。我们并不建议直接将物理 IP 对外暴露,而是额外增加 VIP(虚拟 IP),通过 DNS 服务绑定 VIP,这样的好处是通过 VIP 屏蔽了Nacos集群实际的物理IP地址,同时为访问者提供了统一的接入入口,使微服务的注册接入和Nacos 集群实现细节彼此解耦,提高架构的维护性。

Nacos集群部署

Linux部署

第一步,环境准备。

Nacos 因为选举算法的特殊性,要求最少三个节点才能组成一个有效的集群。一般选举算法都建议奇数个节点,2个节点的数据一致性可能无法保障。

c63343ea-037b-11ee-90ce-dac502259ad0.png

Nacos 采用 Raft 选举算法构成集群

配置需要:

c65919da-037b-11ee-90ce-dac502259ad0.png

官方建议最低运行内存:

准备三台服务器(虚拟机),在这三个节点上安装好 JDK1.8,并配置 JAVA_HOME 环境变量。

此外还需要额外部署一台 MySQL 数据库用于保存 Nacos 的配置管理、权限控制信息。这里推荐版本为 MySQL5.7 或者 MySQL 8.0。

第二步,下载安装 Nacos。

下载 Nacos 2.0.2 版本,上传到每一台 CentOS 服务器的 /usr/data 目录下,执行解压缩命令,生成 Nacos 目录

tar-xvfnacos-server-2.0.2.tar.gz

第三步,配置数据库。

使用任意 MySQL 客户端工具连接到 MySQL 数据库服务器,创建名为nacos_config的数据库,之后使用 MySQL 客户端执行 /usr/data/nacos/conf/nacos-mysql.sql 文件,完成建表工作。

c695457c-037b-11ee-90ce-dac502259ad0.png

nacos_config 数据库初始化脚本

c6c8c848-037b-11ee-90ce-dac502259ad0.png

nacos_config 表结构

相关表说明:

config_* :所有 config_ 开头的表都是 Nacos 配置中心使用时保存应用配置的表。

users:系统用户表,在集群环境下用户信息保存在 users 表中,而非在配置文件中。

roles:系统角色表,Nacos 的权限基于 RBAC(基于角色的访问控制)模型设计,此表保存角色数据。

permissions: 系统权限表,说明角色与系统使用权限的对应关系。

第四步,配置 Nacos 数据源。

依次打开 3 台 Nacos 服务器中的核心配置文件 application.properties,文件路径如下:

/usr/data/nacos/conf/application.properties

定位到 36 行 Count of DB “数据源”配置附近,默认数据源配置都被#号注释,删除注释按下方示例配置数据源即可。

>基于SpringBoot+MyBatisPlus+Vue&Element实现的后台管理系统+用户小程序,支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
>*项目地址:
>*视频教程

#设置数据库平台为mysql
spring.datasource.platform=mysql

>基于SpringCloudAlibaba+Gateway+Nacos+RocketMQ+Vue&Element实现的后台管理系统+用户小程序,支持RBAC动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
>*项目地址:
>*视频教程

#CountofDB:数据库总数
db.num=1
#ConnectURLofDB:数据库连接,根据你的实际情况调整
db.url.0=jdbc//xxx:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root

第五步,Nacos 集群节点配置

在 /nacos/config 目录下提供了集群示例文件cluster.conf.example

c6f1b15e-037b-11ee-90ce-dac502259ad0.png

通过 cluster.conf.example 创建集群节点列表

首先利用复制命令创建 cluster.conf 文件。

cpcluster.conf.examplecluster.conf

之后打开 cluster.conf,添加所有 Nacos 集群节点 IP 及端口。

ip1:8848
ip2:8848
ip3:8848

每个nacos服务器上都需要设置cluster.conf文件,Nacos 通过 cluster.conf 了解集群节点的分布情况。

第六步,启动 Nacos 服务器。

在 3 台 Nacos 节点上分别执行下面的启动命令。

sh/usr/local/nacos/bin/startup.sh

注意,集群模式下并不需要增加“-m”参数,默认就是以集群方式启动。

启动时可以通过 tail 命令观察启动过程。

tail-f/usr/local/nacos/logs/start.out

启动日志关键内容如下:

#-Xms2g-Xmx2g默认运行时JVM要求2G可用内存
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.275.b01-0.el7_9.x86_64/bin/java-server-Xms2g-Xmx2g...
...
#列出Nacos所有集群节点
INFOTheserverIPlistofNacosis[xxx1:8848,xxx2:8848,xxx3:8848]
...
#Nacos正在启动
INFONacosisstarting...
...
#集群模式启动成功,采用外置存储MySQL数据库
INFONacosstartedsuccessfullyinclustermode.useexternalstorage

当确保所有节点均启动成功

登录后便可看到集群列表。

c70c3e3e-037b-11ee-90ce-dac502259ad0.png

所有节点均已上线

UP 代表节点已就绪,DOWN 代表节点已离线,目前所有节点均已就绪。

第七步,微服务接入。

在开发好的微服务程序中,在 application.properties 配置 Nacos 集群的任意节点都可以完成接入工作,Nacos 内置的数据同步机制会保证各节点数据一致性。

#应用名称,默认也是在微服务中注册的微服务ID
spring.application.name=sample-service
#配置ip1/ip2/ip3都可以接入Nacos
spring.cloud.nacos.discovery.server-addr=ip1:8848,ip2:8848,ip3:8848
#连接Nacos服务器使用的用户名、密码,默认为nacos
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discvery.password=nacos
#微服务提供Web服务的端口号
server.port=9000

启动微服务后,访问下面三个 URL,会发现服务列表的结果是一致的,这也证明集群模式下 Nacos 能够保证各节点的数据同步。

http://ip1:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
http://ip2:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
http://ip3:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=

到这里 Nacos 集群的主体配置工作已完成,但仅会部署是远不够的,我们还需了解集群的内部运行机制。

docker部署(参考待验证)

Nacos 集群的工作原理

Nacos 集群中 Leader 节点是如何产生的

Nacos 集群采用 Raft 算法实现。它是一种比较简单的选举算法,用于选举出 Nacos 集群中最重要的 Leader(领导)节点。

c72d3b5c-037b-11ee-90ce-dac502259ad0.png

在 Nacos 集群中,每个节点都拥有以下三种角色中的一种。

Leader :领导者,集群中最重要的角色,用于向其他节点下达指令。

Candidate :参选者,参与竞选 Leader 的节点。

Follower :跟随者,用于接收来自 Leader 或者 Candidate 的请求并进行处理。

在集群中选举出 Leader 是最重要的工作,产生选举的时机有三个:

在 Nacos 节点启动后,还没有产生Leader时选举;

集群成员总量变更时重新选举;

当 Leader 停止服务后重新选举。

在开始介绍选举过程前,先理解任期(Term)的含义:

Raft 算法将时间划分成为任意不同长度的任期(Term)。任期用连续的数字进行表示。每一个任期的开始都是一次选举(Election),一个或多个候选人会试图成为 Leader。

为了便于理解,我们使用文字+表格的形式说明选举过程。

1.当最开始的时候,所有 Nacos 节点都没有启动。角色默认为 Follower(跟随者),任期都是 0。

节点 角色 任期 状态
ip1 Follower 0 down
ip2 Follower 0 down
ip3 Follower 0 down

2.当第一个节点(ip1)启动后,节点角色会变为 Candidate(参选者),ip1 节点在每一个任期开始时便会尝试向其他节点发出投票请求,征求自己能否成为 Leader(领导者)节点。只有算上自己获得超过半数的选票,这个 Candidate 才能转正为 Leader。

在当前案例,因为 ip1 发起选举投票,但 ip2/ip3 两个节点不在线,尽管 ip1 会投自己一票,但在总 3 票中未过半数,因此无法成为 Leader。因为第一次选举没有产生 Leader,过段时间在下一个任期开始时,ip1 任期自增加 1,同时会再次向其他节点发起投票请求争取其他节点同意,直到同意票过半。

节点 角色 任期 状态
ip1 Candidate 10 up
ip2 Follower 0 down
ip3 Follower 0 down

3.在 Raft 算法中,成为 Leader 的必要条件是某个 Candidate 获得过半选票,如果 ip2 节点上线,遇到 ip1 再次发起投票。

ip2 投票给 ip1 节点,ip1 获得两票超过半数就会成为 Leader,ip2 节点自动成为 Follower(跟随者)。之后 ip3 节点上线,因为集群中已有 Leader,因此自动成为 Follower。

节点 角色 任期 状态
ip1 Leader 11 up
ip2 Follower 5 up
ip3 Follower 0 up

4.当 Leader 节点宕机或停止服务,会在剩余 2 个 Nacos 节点中产生新的 Leader。如下所示ip3获得两票成为 Leader,ip2 成为 Follower,ip1已经下线但角色暂时仍为 Leader。

节点 角色 任期 状态
ip1 Leader 11 down
ip2 Follower 12 up
ip3 Leader 12 up

之后 ip1 恢复上线,但此时 Nacos 集群已有 Leader 存在,ip1 自动变为 Follower,且任期归0。

节点 角色 任期 状态
ip1 Follower 0 up
ip2 Follower 12 up
ip3 Leader 12 up

对于 Nacos 集群来说,只要 UP 状态节点不少于"1+N/2",集群就能正常运行。但少于“1+N/2”,集群仍然可以提供基本服务,但已无法保证 Nacos 各节点数据一致性。

以上就是 Nacos 基于 Raft 算法的 Leader 选举过程,确定 Leader 是维持 Nacos 集群数据一致的最重要前提,下面咱们来讲解在微服务注册时 Nacos 集群节点信息同步的过程。

Nacos 节点间的数据同步过程

c77b3776-037b-11ee-90ce-dac502259ad0.png

Nacos 节点间的数据同步过程:

在 Raft 算法中,只有 Leader 才拥有数据处理与信息分发的权利。因此当微服务启动时,假如注册中心指定为 Follower 节点,则步骤如下:

第一步,Follower 会自动将注册心跳包转给 Leader 节点;

第二步,Leader 节点完成实质的注册登记工作;

第三步,完成注册后向其他 Follower 节点发起“同步注册日志”的指令;

第四步,所有可用的 Follower 在收到指令后进行“ack应答”,通知 Leader 消息已收到;

第五步,当 Leader 接收过半数 Follower 节点的 “ack 应答”后,返回给微服务“注册成功”的响应信息。

此外,对于其他无效的 Follower 节点,Leader 仍会不断重新发送,直到所有 Follower 的状态与 Leader 保持同步。





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103018
  • URL
    URL
    +关注

    关注

    0

    文章

    134

    浏览量

    14847
  • 虚拟机
    +关注

    关注

    1

    文章

    855

    浏览量

    27392
  • RBAC
    +关注

    关注

    0

    文章

    43

    浏览量

    9891
  • MYSQL数据库
    +关注

    关注

    0

    文章

    95

    浏览量

    9277

原文标题:SpringCloud Alibaba 之 Nacos 集群部署+高可用保证

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Kubernetes Ingress 可靠部署最佳实践

    摘要: 在Kubernetes集群中,Ingress作为集群流量接入层,Ingress的高可靠性显得尤为重要,今天我们主要探讨如何部署一套高性能可靠的Ingress接入层。简介
    发表于 04-17 14:35

    Hadoop的集群环境部署说明

    或者是相同,指令多、步骤繁琐。有的时候觉得不免觉得很奇怪,这些发行商为什么不对hadoop的集群环境部署做一下优化呢?幸运的是总算是让我找到了一个hadoop发行版集群环境搭建简单易用。这里使用的是一款
    发表于 10-12 15:51

    结合场景谈一谈微服务配置

    的机房发生不可抗的灾难(如地震)时,我们需要有动态调度流量的能力,最好能秒级得将流量从区域 A 调度到另外可用的区域的集群上。这正是 Nacos 配置管理大有作为的地方,将用户 ID 的分片和对应的路由
    发表于 12-12 15:53

    基于kafka和zookeeper可用集群的shell脚本使用步骤

    kafka+zookeeper可用集群搭建shell脚本使用教程
    发表于 03-11 16:50

    Flink集群部署方法

    Flink集群部署详细步骤
    发表于 04-23 11:45

    基于KeepAlive的可用配置

    KeepAlived集群可用搭建
    发表于 06-11 16:36

    redis集群的如何部署

    redis集群部署(伪分布式)
    发表于 05-29 17:13

    构建ARM64版本nacos docker镜像

    在适配过程中有大量合作伙伴用到nacos且采用容器化部署,dockerhub未提供官方镜像,因此需要在鲲鹏服务器自定义构建。构建前提:Docker已部署构建步骤:1、下载包含构建所需的脚本下载完成
    发表于 06-16 14:29

    浅谈Kubernetes集群的高可用方案

    在整个Kubernetes集群中处于中心数据库的地位,为保证Kubernetes集群的高可用性,首先需要保证数据库不是单故障点。一
    发表于 10-11 10:04 1次下载
    浅谈Kubernetes<b class='flag-5'>集群</b>的高<b class='flag-5'>可用</b>方案

    Eureka的集群搭建方法-保证可用

    在微服务架构中,注册中心是一个必不可少的组件 前面我们搭建的注册中心只适合本地开发使用,在生产环境必须搭建一个集群保证可用 Eureka的集群搭建很简单,每一台Eureka都需要在
    发表于 11-29 10:41 7419次阅读
    Eureka的<b class='flag-5'>集群</b>搭建方法-<b class='flag-5'>保证</b>高<b class='flag-5'>可用</b>

    Nacos为什么这么强?Nacos注册中心的底层原理,从服务注册到服务发现

    来源:码猿技术专栏 1. Nacos介绍 2. Nacos注册中心实现原理分析 2.1 Nacos架构图 2.2 注册中心的原理 3. Nacos源码分析 3.1
    的头像 发表于 10-08 16:46 1.1w次阅读

    Nacos、OpenFeign、Ribbon组件协调工作的原理

        Nacos 如何进行服务自动注册? Ribbon OpenFeign 总结 前几天有个大兄弟问了我一个问题,注册中心要集成SpringCloud,想实现SpringCloud的负载均衡,需要
    的头像 发表于 05-22 10:46 366次阅读
    <b class='flag-5'>Nacos</b>、OpenFeign、Ribbon组件协调工作的原理

    Nacos实现原理:SpringCloud集成Nacos的实现过程

    Protocol是一致性协议,用来实现Nacos集群节点的数据同步,这里使用的是Raft算法(Etcd、Redis哨兵选举)
    发表于 10-09 16:08 143次阅读
    <b class='flag-5'>Nacos</b>实现原理:<b class='flag-5'>SpringCloud</b>集成<b class='flag-5'>Nacos</b>的实现过程

    Helm部署MinIO集群

    Helm部署MinIO集群
    的头像 发表于 12-03 09:44 474次阅读
    Helm<b class='flag-5'>部署</b>MinIO<b class='flag-5'>集群</b>

    springcloud alibaba 五大组件

    Spring Cloud Alibaba是Spring Cloud的一个子项目,该项目致力于为构建分布式应用提供一站式解决方案。它基于阿里巴巴的底层Java开源框架,主要包含以下五大组件: 服务注册
    的头像 发表于 12-03 16:30 9485次阅读