Spring Cloud Alibaba【Nacos 服务治理】 高可用保证:Nacos 如何有效构建注册中心集群
上一节我们学习了 Nacos 注册中心的作用以及单点运行的方法,但是单点运行是分布式应用的大忌,在分布式架构中,任何单点都可能成为系统的瓶颈,因此在生产环境中 Nacos 都需要通过部署集群来为系统带来高可用性。因此本文围绕 Nacos 集群主要讲解以下三方面内容:
- 生产环境 Nacos 集群的设计要点;
- Nacos 集群的部署过程;
- 介绍 Nacos 集群的工作原理。
如何在生产环境部署 Nacos 集群
首先介绍下之前我们在国内某互联网金融机构在项目中落地的 Nacos 集群架构图。
下面我们来解读下 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 集群的部署过程
第一步,环境准备。
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 集群中,每个节点都拥有以下三种角色中的一种。
- Leader:领导者,集群中最重要的角色,用于向其他节点下达指令。
- Candidate:参选者,参与竞选 Leader 的节点。
- Follower:跟随者,用于接收来自 Leader 或者 Candidate 的请求并进行处理。
在集群中选举出 Leader 是最重要的工作,产生选举的时机有三个:
- 在 Nacos 节点启动后,还没有产生Leader时选举;
- 集群成员总量变更时重新选举;
- 当 Leader 停止服务后重新选举。
在开始介绍选举过程前,先理解任期(Term)的含义:
Raft 算法将时间划分成为任意不同长度的任期(Term)。任期用连续的数字进行表示。每一个任期的开始都是一次选举(Election),一个或多个候选人会试图成为 Leader。
为了便于理解,我们使用文字+表格的形式说明选举过程。
- 当最开始的时候,所有 Nacos 节点都没有启动。角色默认为 Follower(跟随者),任期都是 0。
- 当第一个节点(192.168.163.131)启动后,节点角色会变为 Candidate(参选者),131 节点在每一个任期开始时便会尝试向其他节点发出投票请求,征求自己能否成为 Leader(领导者)节点。只有算上自己获得超过半数的选票,这个 Candidate 才能转正为 Leader。在当前案例,因为 131 发起选举投票,但 132/133 两个节点不在线,尽管 131 会投自己一票,但在总 3 票中未过半数,因此无法成为 Leader。因为第一次选举没有产生 Leader,过段时间在下一个任期开始时,131 任期自增加 1,同时会再次向其他节点发起投票请求争取其他节点同意,直到同意票过半。
- 在 Raft 算法中,成为 Leader 的必要条件是某个 Candidate 获得过半选票,如果 132 节点上线,遇到 131 再次发起投票。132 投票给 131 节点,131 获得两票超过半数就会成为 Leader,132 节点自动成为 Follower(跟随者)。之后 133 节点上线,因为集群中已有 Leader,因此自动成为 Follower。
- 当 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 如何有效构建注册中心集群相关推荐
- 03 | 高可用保证:Nacos 如何有效构建注册中心集群
如何在生产环境部署 Nacos 集群 首先介绍下之前我们在国内某互联网金融机构在项目中落地的 Nacos 集群架构图. 下面我们来解读下 Nacos 集群架构的设计要点: 微服务并不是直接通过 IP ...
- Spring Cloud Alibaba 之 服务治理:Nacos 如何实现微服务服务治理
前文我们学习了通用的微服务架构应包含哪些组件以及 Spring Cloud Alibaba 生态中对应的技术实现,其中整个架构体系最核心的组件是服务注册中心 Alibaba Nacos.本讲我们就对 ...
- Spring Cloud Alibaba微服务组件快速上手
文章目录 Nacos 什么是Nacos Nacos的启动 将项目注册到Nacos 项目pom依赖 yaml配置 Nacos心跳机制 Dubbo 什么是RPC 什么是Dubbo Dubbo服务的注册与发 ...
- 防止内卷和被潜规则,Spring Cloud Alibaba微服务架构实战派(上下册)|35岁程序员那些事
目录 1 写书缘由 2 本书上册核心内容 2.1 Spring Cloud Alibaba基础实战 2.1.1 主要内容 2.1.2 MyBatis-Plus实现多租户架构的核心原理 2.2 分布式服 ...
- Spring Cloud Alibaba | Sentinel: 服务限流高级篇
Spring Cloud Alibaba | Sentinel: 服务限流高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明 ...
- Spring Cloud Eureka(三)实现一个高可用的注册中心
Spring Cloud Eureka(三)实现一个高可用的注册中心 实现一个高可用的注册中心 在微服务结构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须为服务的各个组件进行 ...
- 从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (中)
本文承接上文<从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(三) (mini-cloud) 搭建认证服务(认证/资源分离版) oauth2.0 (上)> ...
- Spring Cloud Alibaba 微服务开发实践
作者:禅与计算机程序设计艺术 1.简介 Spring Cloud Alibaba 是阿里巴巴开源的基于 Spring Cloud 的微服务框架.该项目从最初孵化到现在已经历经十多年的发展,得到了广泛的 ...
- 从0到1手把手搭建spring cloud alibaba 微服务大型应用框架(十五) swagger篇 : gateway 集成swagger 与 knife4j实现在线api文档并嵌入到自己项目内
背景 我们日常开发中基本都是协同开发的,当然极个别的项目整体前后端都是一个人开发的,当多人协作时,尤其是前后端人员协同开发时 必然会面临着前端需要了解后端api接口的情况,两个选择,提前设计好文档,然 ...
最新文章
- Java多线程设计模式(4)线程池模式
- TX的8B/10B编码功能
- Google 的 Java 编码规范,参考学习!
- Java Management extentsions(jmx)与tomcat
- 如何用文本档编辑c语言,c语言读写word文档
- import package的问题
- .NET Core用数据库做配置中心加载Configuration
- 啃碎并发(二):Java线程的生命周期
- c语言spoc期末考试及答案,MOOC-SPOC测试题(部分答案)(至数组一章)-C语言-宣城校区2016年.docx...
- PHP使用 uEditor富文本编辑器
- 单机版fifa11显示ea服务器,游戏新消息:EA服务器出问题所有EA游戏在线功能无法正常运行...
- c++11新特性介绍
- java程序员月薪3万需要掌握哪些技术?技术水平需要到什么程度?
- 毁掉一个孩子的几个方法 有多少家长正在这么做?
- logo怎么设计才好看?好看的logo设计方法大公开。
- 面试题(2020)微信小程序常见面试题
- 华为鸿蒙os的内核是Linux,谈华为鸿蒙内核和操作系统
- 445端口的用处和禁用
- Vue3究竟好在哪里?
- Cacheable、CacheEvict、Caching使用示例
热门文章
- 最后2周 | 高级转录组分析和R语言数据可视化第十一期 (报名线上课还可免费参加线下课)...
- 合种樟子松/华山松专车3天领证
- Nature:肠道菌如何影响大脑,帮助消除恐惧相关的行为
- 3寸以上java手机_7寸屏手机有哪些(堪称性价比之王的四款手机)
- python使用matplotlib可视化:设置坐标轴的范围、设置主次坐标轴刻度、坐标轴刻度显示样式、坐标轴刻度数颜色、小数点位数、坐标轴刻度网格线、线条类型、数据点形状标签、文本字体、颜色、大小等
- R语言可视化包ggplot2绘制平滑曲线、回归线实战:geom_smooth() 函数
- R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
- R语言dplyr包distinct函数去除重复数据行实战
- 主成分分析(Principle Component Analysis)PCA的核心思想是什么?PCA算法的优缺点?增量PCA模型, 随机PCA, 模型、 核化PCA分别是什么?使用时如何选择?
- 机器学习中的偏差和方差是什么?