Redian新闻
>
SpringCloud Alibaba 之 Nacos 集群部署+高可用保证

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

公众号新闻

点击上方“芋道源码”,选择“设为星标

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 
来源:zhanjq.blog.csdn.net/
article/details/129156253

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

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

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个节点的数据一致性可能无法保障。

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

配置需要:

官方建议最低运行内存:

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

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

第二步,下载安装 Nacos。

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

tar -xvf nacos-server-2.0.2.tar.gz

第三步,配置数据库。

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

nacos_config 数据库初始化脚本

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 “数据源”配置附近,默认数据源配置都被#号注释,删除注释按下方示例配置数据源即可。


> 基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://github.com/YunaiV/ruoyi-vue-pro>
> * 视频教程:<https://doc.iocoder.cn/video/>

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

> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
>
> * 项目地址:<https://github.com/YunaiV/yudao-cloud>
> * 视频教程:<https://doc.iocoder.cn/video/>

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

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

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

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

当确保所有节点均启动成功,打开浏览器访问任意节点地址:

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

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

所有节点均已上线

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部署(参考待验证)

官方参考地址:

  • https://nacos.io/zh-cn/docs/quick-start-docker.html
  • https://zhuanlan.zhihu.com/p/150400342
  • https://blog.csdn.net/qq_40168110/article/details/103260470
  • https://www.cnblogs.com/jinit/p/13619493.html

Nacos 集群的工作原理

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

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

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

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

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

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

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

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

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

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

节点角色任期状态
ip1Follower0down
ip2Follower0down
ip3Follower0down

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

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

节点角色任期状态
ip1Candidate10up
ip2Follower0down
ip3Follower0down

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

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

节点角色任期状态
ip1Leader11up
ip2Follower5up
ip3Follower0up

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

节点角色任期状态
ip1Leader11down
ip2Follower12up
ip3Leader12up

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

节点角色任期状态
ip1Follower0up
ip2Follower12up
ip3Leader12up

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

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

Nacos 节点间的数据同步过程

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

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

  • 第一步,Follower 会自动将注册心跳包转给 Leader 节点;
  • 第二步,Leader 节点完成实质的注册登记工作;
  • 第三步,完成注册后向其他 Follower 节点发起“同步注册日志”的指令;
  • 第四步,所有可用的 Follower 在收到指令后进行“ack应答”,通知 Leader 消息已收到;
  • 第五步,当 Leader 接收过半数 Follower 节点的 “ack 应答”后,返回给微服务“注册成功”的响应信息。

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



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。

谢谢支持哟 (*^__^*)

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
对话OpenCloudOS:国内操作系统社区间不是竞争,而是互补什么是 CloudReady?它是 Chrome OS 的开源替代品吗? | Linux 中国5041 血壮山河之武汉会战 鏖战幕府山 10由一次SPEC Cloud基准测试引发的“一云多芯”之辨10.3k?这才是企业级的 Spring Cloud Alibaba 微服务开发平台,真心牛 x!基于 SpringBoot 实现多租户架构:支持应用多租户部署和管理恭喜DBC职梦UCL学员拿下Bloomberg (UK) Spring Week Offer!具备独立演进能力,OpenCloudOS 首个社区全自研版本发布 | 新闻如何在 RHEL 9/8 上设置高可用性 Apache(HTTP)集群 | Linux 中国H800国内首发!腾讯云推出大模型算力集群,集群算力提升3倍保姆级教程:Spring Cloud 集成 Seata 分布式事务6 Killed in Guangdong Kindergarten Attack, Including 3 Children书舔如颜柳,不啻秦桧!Zhongkao Fallout in Xi’an Over ‘Returning Students’Nginx 从安装到高可用,一篇搞定!Spring循环依赖那些事儿(含Spring详细流程图)一文了解电商大促系统的高可用保障思路两首和MSl的合唱:《山楂树》&《这世界那么多人》ChatGPT 最强竞品 Claude2 来了:代码、GRE 成绩超越 GPT-4,免费可用Agustín Hernández:中美洲建筑背景下的未来主义巨构【𝐂𝐚𝐥𝐧𝐢𝐊𝐞𝐚𝐧双皮奶无痕内裤】49元三条!巨巨巨好穿 !!简直就是辣妹顶配,食品级冰箱收纳盒【一日团】Young Chinese Love Everything About Sweden. Except Living There.𝐂𝐚𝐥𝐧𝐢𝐊𝐞𝐚𝐧双皮奶内衣裤,软弹有度,上身0束缚~对话 OpenCloudOS 社区:如何促进操作系统开源生态繁荣?Beyond Saving: In China, Young Shoppers Are Locked Out of LuxuryTengine-Ingress 高性能高可用的云原生网关ChatGPT最强竞品Claude2来了:代码、GRE成绩超越GPT-4,免费可用华为宣布昇腾AI集群升级 推出首个万卡AI集群纳税人的迷思---我们交了多少税Looking for Closure, a Grandson Built a Ghost in the MachineSpring Cloud Gateway 网关如何实现灰度发布?老海归的骨灰Java近期新闻:JDK 21的JEP、Spring Cloud AWS 3.0以及OptaPlanner转移至Timefold提升 Prometheus 的高可用性:Thanos 的部署与实践!Court Ruling Sparks Debate Over Promoting Work on Social Media
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。