上一节我们学习了 Nacos 注册中心的作用以及单点运行的方法,但是单点运行是分布式应用的大忌,在分布式架构中,任何单点都可能成为系统的瓶颈,因此在生产环境中 Nacos 都需要通过部署集群来为系统带来高可用性。因此本文围绕 Nacos 集群主要讲解以下三方面内容:

    1. 生产环境 Nacos 集群的设计要点;
    1. Nacos 集群的部署过程;
    1. 介绍 Nacos 集群的工作原理。

如何在生产环境部署 Nacos 集群

首先介绍下之前我们在国内某互联网金融机构在项目中落地的 Nacos 集群架构图。

下面我们来解读下 Nacos 集群架构的设计要点:

    1. 微服务并不是直接通过 IP 地址访问后端服务,而是采用域名访问。通过 DNS(域名解析服务)转换为具体的 IP 地址,通过域名方式屏蔽后端容易产生变化的 IP 地址。
    1. 底层 Nacos 自带集群间节点与数据同步方案,因此需要 Nacos 节点对外暴露 8848 与 7848 端口。其中 8848 端口的作用是对外暴露 API 与集群间数据同步,而 7848 端口则用于节点选举来确定集群领袖(Leader)。同时 Nacos 在集群环境下需要持久化应用配置、用户权限、历史信息等内置数据,因此需要额外部署 MySQL 数据库提供统一存储。
    1. 在 Nacos 层面,每一台服务器都有独立的 IP。我们并不建议直接将物理 IP 对外暴露,而是额外增加 VIP(虚拟 IP),通过 DNS 服务绑定 VIP,这样的好处是通过 VIP 屏蔽了Nacos集群实际的物理IP地址,同时为访问者提供了统一的接入入口,使微服务的注册接入和Nacos 集群实现细节彼此解耦,提高架构的维护性。

Nacos 集群的部署过程

第一步,环境准备。

Nacos 因为选举算法的特殊性,要求最少三个节点才能组成一个有效的集群,关于选举算法我会在后面课程中进行讲解,感兴趣的同学可以持续关注。

这里需要准备三台服务器(虚拟机)。

我为此准备了三个 CentOS 7 节点(测试环境本地安装虚拟机即可),符合最低运行要求,其 IP 地址分别为:

  • 192.168.163.131

  • 192.168.163.132

  • 192.168.163.133

在这三个节点上安装好 JDK1.8,并配置 JAVA_HOME 环境变量,这些操作在上一节我们已经讲过,不再赘述。

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

第二步,下载安装 Nacos。

访问到 https://github.com/alibaba/nacos/releases/ 网址下载 Nacos 1.4.0 版本,上传到每一台 CentOS 服务器的 /usr/local 目录下,执行解压缩命令,生成 Nacos 目录

tar -xvf nacos-server-1.4.0.tar.gz。

第三步,配置数据库。

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

其中比较重要的表我们有必要了解一下。

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

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

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

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

第四步,配置 Nacos 数据源。

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

/usr/local/nacos/conf/application.properties

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

spring.datasource.platform=mysql
### Count of DB: 数据库总数
db.num=1
### Connect URL of DB: 数据库连接,根据你的实际情况调整
db.url.0=jdbc:mysql://192.168.163.100: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

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

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

cp cluster.conf.example cluster.conf

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

192.168.163.131:8848
192.168.163.132:8848
192.168.163.133:8848

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 所有集群节点
INFO The server IP list of Nacos is [192.168.163.131:8848, 192.168.163.132:8848, 192.168.163.133:8848]
...
#Nacos 正在启动
INFO Nacos is starting...
...
#集群模式启动成功,采用外置存储 MySQL 数据库
INFO Nacos started successfully in cluster mode. use external storage

当确保所有节点均启动成功,打开浏览器访问下面网址:

http://192.168.163.131:8848/nacos/#/clusterManagement?dataId=&group=&appName=&namespace=

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

所有节点均已上线

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

第七步,微服务接入。

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

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

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

http://192.168.163.131:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
http://192.168.163.132:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=
http://192.168.163.133:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=

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

Nacos 集群的工作原理

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

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

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

    1. Leader:领导者,集群中最重要的角色,用于向其他节点下达指令。
    1. Candidate:参选者,参与竞选 Leader 的节点。
    1. Follower:跟随者,用于接收来自 Leader 或者 Candidate 的请求并进行处理。

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

    1. 在 Nacos 节点启动后,还没有产生Leader时选举;
    1. 集群成员总量变更时重新选举;
    1. 当 Leader 停止服务后重新选举。

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

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

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

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

  1. 当第一个节点(192.168.163.131)启动后,节点角色会变为 Candidate(参选者),131 节点在每一个任期开始时便会尝试向其他节点发出投票请求,征求自己能否成为 Leader(领导者)节点。只有算上自己获得超过半数的选票,这个 Candidate 才能转正为 Leader。在当前案例,因为 131 发起选举投票,但 132/133 两个节点不在线,尽管 131 会投自己一票,但在总 3 票中未过半数,因此无法成为 Leader。因为第一次选举没有产生 Leader,过段时间在下一个任期开始时,131 任期自增加 1,同时会再次向其他节点发起投票请求争取其他节点同意,直到同意票过半。

  1. 在 Raft 算法中,成为 Leader 的必要条件是某个 Candidate 获得过半选票,如果 132 节点上线,遇到 131 再次发起投票。132 投票给 131 节点,131 获得两票超过半数就会成为 Leader,132 节点自动成为 Follower(跟随者)。之后 133 节点上线,因为集群中已有 Leader,因此自动成为 Follower。

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

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

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

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

Nacos 节点间的数据同步过程

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

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

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

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

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

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

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

以上便是 Nacos 节点间的数据同步主体流程,如果你对 Nacos 底层的细节感兴趣,不妨翻阅 Nacos 的源码了解更详细的过程。

Spring Cloud Alibaba【Nacos 服务治理】 高可用保证:Nacos 如何有效构建注册中心集群相关推荐

  1. 03 | 高可用保证:Nacos 如何有效构建注册中心集群

    如何在生产环境部署 Nacos 集群 首先介绍下之前我们在国内某互联网金融机构在项目中落地的 Nacos 集群架构图. 下面我们来解读下 Nacos 集群架构的设计要点: 微服务并不是直接通过 IP ...

  2. Spring Cloud Alibaba 之 服务治理:Nacos 如何实现微服务服务治理

    前文我们学习了通用的微服务架构应包含哪些组件以及 Spring Cloud Alibaba 生态中对应的技术实现,其中整个架构体系最核心的组件是服务注册中心 Alibaba Nacos.本讲我们就对 ...

  3. Spring Cloud Alibaba微服务组件快速上手

    文章目录 Nacos 什么是Nacos Nacos的启动 将项目注册到Nacos 项目pom依赖 yaml配置 Nacos心跳机制 Dubbo 什么是RPC 什么是Dubbo Dubbo服务的注册与发 ...

  4. 防止内卷和被潜规则,Spring Cloud Alibaba微服务架构实战派(上下册)|35岁程序员那些事

    目录 1 写书缘由 2 本书上册核心内容 2.1 Spring Cloud Alibaba基础实战 2.1.1 主要内容 2.1.2 MyBatis-Plus实现多租户架构的核心原理 2.2 分布式服 ...

  5. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    Spring Cloud Alibaba | Sentinel: 服务限流高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明 ...

  6. Spring Cloud Eureka(三)实现一个高可用的注册中心

    Spring Cloud Eureka(三)实现一个高可用的注册中心 实现一个高可用的注册中心 在微服务结构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须为服务的各个组件进行 ...

  7. 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (中)

    本文承接上文<从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (上)> ...

  8. Spring Cloud Alibaba 微服务开发实践

    作者:禅与计算机程序设计艺术 1.简介 Spring Cloud Alibaba 是阿里巴巴开源的基于 Spring Cloud 的微服务框架.该项目从最初孵化到现在已经历经十多年的发展,得到了广泛的 ...

  9. 从0到1手把手搭建spring cloud alibaba 微服务大型应用框架(十五) swagger篇 : gateway 集成swagger 与 knife4j实现在线api文档并嵌入到自己项目内

    背景 我们日常开发中基本都是协同开发的,当然极个别的项目整体前后端都是一个人开发的,当多人协作时,尤其是前后端人员协同开发时 必然会面临着前端需要了解后端api接口的情况,两个选择,提前设计好文档,然 ...

最新文章

  1. Java多线程设计模式(4)线程池模式
  2. TX的8B/10B编码功能
  3. Google 的 Java 编码规范,参考学习!
  4. Java Management extentsions(jmx)与tomcat
  5. 如何用文本档编辑c语言,c语言读写word文档
  6. import package的问题
  7. .NET Core用数据库做配置中心加载Configuration
  8. 啃碎并发(二):Java线程的生命周期
  9. c语言spoc期末考试及答案,MOOC-SPOC测试题(部分答案)(至数组一章)-C语言-宣城校区2016年.docx...
  10. PHP使用 uEditor富文本编辑器
  11. 单机版fifa11显示ea服务器,游戏新消息:EA服务器出问题所有EA游戏在线功能无法正常运行...
  12. c++11新特性介绍
  13. java程序员月薪3万需要掌握哪些技术?技术水平需要到什么程度?
  14. 毁掉一个孩子的几个方法 有多少家长正在这么做?
  15. logo怎么设计才好看?好看的logo设计方法大公开。
  16. 面试题(2020)微信小程序常见面试题
  17. 华为鸿蒙os的内核是Linux,谈华为鸿蒙内核和操作系统
  18. 445端口的用处和禁用
  19. Vue3究竟好在哪里?
  20. Cacheable、CacheEvict、Caching使用示例

热门文章

  1. 最后2周 | 高级转录组分析和R语言数据可视化第十一期 (报名线上课还可免费参加线下课)...
  2. 合种樟子松/华山松专车3天领证
  3. Nature:肠道菌如何影响大脑,帮助消除恐惧相关的行为
  4. 3寸以上java手机_7寸屏手机有哪些(堪称性价比之王的四款手机)
  5. python使用matplotlib可视化:设置坐标轴的范围、设置主次坐标轴刻度、坐标轴刻度显示样式、坐标轴刻度数颜色、小数点位数、坐标轴刻度网格线、线条类型、数据点形状标签、文本字体、颜色、大小等
  6. R语言可视化包ggplot2绘制平滑曲线、回归线实战:geom_smooth() 函数
  7. R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
  8. R语言dplyr包distinct函数去除重复数据行实战
  9. 主成分分析(Principle Component Analysis)PCA的核心思想是什么?PCA算法的优缺点?增量PCA模型, 随机PCA, 模型、 核化PCA分别是什么?使用时如何选择?
  10. 机器学习中的偏差和方差是什么?