nacos集群原理与部署

安装包获取

公众号关注:阿峰博客站 回复"nacos2.3.2安装包" 和"jdk1.8安装包",可直接获取nacos与jdk安装包

Nacos节点间数据同步过程

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

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

此外,如果某个Follower节点无ack反馈,Leader也会不断重复发送,直到所有Follower节点的状态与Leader同步为止。

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

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

  • Leader:领导者(主节点),集群中最重要的角色,用于向其他节点下达指令。(一把手,请求接收并转发给其他节点处理,对能力的要求很高)
  • Candidate:参选者,参与竞选Leader的节点。(相当于岗位中的副职,等一把手GG的时候可以接替)
  • Follower:跟随者,用于接收来自Leader和Candidate的请求并进行处理。(相当于干活的大头兵,负责站队和干活)

选举Leade的时机:

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

当没有节点启动时

当所有Nacos节点都没有启动时,角色默认是Follower(跟随者),任期都是0。

当一个节点启动时

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

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

当第二第三个节点启动时

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

当Leader宕机时

当Leader节点无法提供服务(宕机)时,会在剩余的两个节点中产生新的Leader,现在 10.0.0.25 节点下线了,10.0.0.27 节点获得了两票成为了新的Leader,10.0.0.26 节点还是为Follower,10.0.0.25 节点已经下线但角色暂时仍为Leader。

新Leader产生后,10.0.0.25 节点恢复上线了,但此时Nacos集群中已经有Leader了,10.0.0.25 节点则自动变为Follower,且任期归0。

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

nacos集群部署

部署环境

主机 角色
10.0.0.25 nacos,jdk
10.0.0.26 nacos,jdk
10.0.0.27 nacos,jdk
10.0.0.17 nginx
10.0.0.21 mysql

安装mysql

安装mysql查看《mysql5.7版本部署》章节

安装jdk

三台nacos都需要安装

tar -xf jdk-8u401-linux-x64.tar.gz -C /usr/local/
mv /usr/local/jdk1.8.0_401 /usr/local/jdk
vim /etc/profile
JAVA_HOME=/usr/local/jdk
PATH=$JAVA_HOME/bin:$PATH

source  /etc/profile
java -version

安装nacos

# 1. 安装nacos,将包上传到服务器之后解压
unzip nacos-server-2.3.2.zip
mv nacos /usr/local/

# 2. 将sql文件传输到mysql机器
scp /usr/local/nacos/conf/mysql-schema.sql root@10.0.0.21:~/

# 3. mysql创建数据库并导入sql文件
mysql> create database nacos;
Query OK, 1 row affected (0.01 sec)

mysql> CREATE USER 'nacos'@'%' IDENTIFIED BY '1qaz@WSX';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT all  ON nacos.* TO 'nacos'@'%';
Query OK, 0 rows affected (0.01 sec)

mysql -unacos -p1qaz@WSX nacos < mysql-schema.sql

# 4. 修改nacos配置文件,以mysql方式持久化,这里需要注意的是,集群模式必须配自己的独立ip(三台机器都操作)
vim /usr/local/nacos/conf/application.properties
nacos.inetutils.ip-address=10.0.0.25  #填写各个本机ip
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://10.0.0.21:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=1qaz@WSX
# 开启鉴权功能
nacos.core.auth.enabled=true
# 关闭 User-Agent 白名单机制
nacos.core.auth.enable.userAgentAuthWhite=false
# 集群内部通信身份标识(自定义密钥,确保集群节点间通信安全),如果是集群,所有节点都要配置一样
nacos.core.auth.server.identity.key=nacos
nacos.core.auth.server.identity.value=1qaz@WSX
# JWT Token 加密密钥(固定且复杂的 Base64 字符串),如果是集群,所有节点都要配置一样
nacos.core.auth.plugin.nacos.token.secret.key=bmFjb3NfMjAyNDAxMTBfc2hpZ3poX25hY29zX3Rva2Vu
# 权限缓存开关,开启后权限缓存的更新默认有15秒的延迟
nacos.core.auth.caching.enabled=true

# 5. 配置集群配置文件(三台机器都配置)
cp /usr/local/nacos/conf/cluster.conf.example /usr/local/nacos/conf/cluster.conf
cat /usr/local/nacos/conf/cluster.conf
#it is ip
#example
10.0.0.25:8848
10.0.0.26:8848
10.0.0.27:8848

# 6. 启动nacos
cd /usr/local/nacos/bin/
./startup.sh

配置nginx

cat ruoyi-nacos.conf
upstream ruoyi_nacos {
    server 10.0.0.25:8848;
    server 10.0.0.26:8848;
    server 10.0.0.27:8848;
}
server {
    listen 80;
    server_name ruoyi-nacos.zqfstack.cn;
    access_log /var/log/nginx/ruoyi_nacos_access.log;
    error_log /var/log/nginx/ruoyi_nacos_error.log;
    location / {
        proxy_pass http://ruoyi_nacos;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

登录测试

默认账号密码:nacos/nacos

image

image

客户端连接nacos集群

目前架构是 nginx 将三个节点的 http 做了负载均衡,但 Nacos 的服务发现是基于 gRPC 长连接的,不是 HTTP 协议,nginx 默认无法处理 gRPC 多路复用,不能通过 nginx 负载均衡端口来访问注册中心。所以在客户端连接nacos集群时需要填写nacos三个节点的地址,不能填写nginx的代理地址。

案例:

spring: 
  application:
    # 应用名称
    name: ruoyi-gateway
  profiles:
    # 环境配置
    active: dev
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 10.0.0.25:8848,10.0.0.26:8848,10.0.0.27:8848
        username: nacos
        password: 1qaz@WSX123
      config:
        # 配置中心地址
        server-addr: 10.0.0.25:8848,10.0.0.26:8848,10.0.0.27:8848
        username: nacos
        password: 1qaz@WSX123
        # 配置文件格式
        file-extension: yml
        # 共享配置
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

posted @ 2025-07-24 21:53  阿峰博客站  阅读(31)  评论(0)    收藏  举报