当前位置: 首页 > news >正文

Nacos集群部署与高可用架构实战指南

服务背景

Nacos作为阿里巴巴开源的动态服务发现与配置管理平台,已成为现代微服务架构的核心基础设施。在金融、电商等对可用性要求极高的场景中,单点部署的Nacos服务无法满足生产需求。某互联网金融平台采用Spring Cloud微服务架构,日均服务调用量超过1亿次,配置变更频率达2000次/分钟,需构建高可用Nacos集群保障服务发现实时性与配置推送可靠性。


典型报错与解决方案


1. 集群节点无法通信

报错信息

2023-05-18 15:23:45,678 ERROR [com.alibaba.nacos.consistency] AP protocol failed to start server: 
java.net.BindException: Address already in use

现场排查

# 检查端口占用情况
[root@nacos-node1 ~]# ss -ntlp | grep 7848
LISTEN 0      100       0.0.0.0:7848      0.0.0.0:*    users:(("java",pid=11234,fd=129))

# 查看进程信息
[root@nacos-node1 ~]# ps aux | grep 11234
nacos   11234  153  4.3 5723456 892344 ?     Ssl  May18 120:45 /usr/local/nacos/jdk/bin/java -Dserver.port=7848 ...

原因分析
Raft协议端口(默认7848)被其他进程占用,导致集群节点间无法建立通信。

解决方案

  1. 释放被占端口或修改Nacos集群端口:

# 修改conf/application.properties
server.port=8848
nacos.core.protocol.raft.data.port=17848
  1. 同步修改所有节点的cluster.conf

# 所有节点执行
echo "nacos-node1:17848" >> /usr/local/nacos/conf/cluster.conf
echo "nacos-node2:17848" >> /usr/local/nacos/conf/cluster.conf
echo "nacos-node3:17848" >> /usr/local/nacos/conf/cluster.conf
  1. 重启集群服务:

# 依次在每个节点执行
/usr/local/nacos/bin/shutdown.sh
/usr/local/nacos/bin/startup.sh -p embedded

2. MySQL连接池耗尽

报错信息

2023-05-18 16:45:12,345 ERROR [com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceServiceImpl] 
init datasource error, url: jdbc:mysql://10.0.1.100:3306/nacos?useUnicode=true&characterEncoding=utf8

数据库端验证

-- 登录MySQL检查连接数
mysql> SHOW STATUS LIKE 'Threads_connected';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_connected | 298   |  # 接近max_connections(300)
+-------------------+-------+

-- 查看活跃连接来源
mysql> SELECT user,host,db,command,time 
       FROM information_schema.processlist 
       WHERE db='nacos';
+------+-------------+-------+---------+------+
| user | host        | db    | command | time |
+------+-------------+-------+---------+------+
| nacos| 10.0.2.%    | nacos | Sleep   | 230  |
| nacos| 10.0.2.%    | nacos | Sleep   | 195  |
...  # 大量空闲连接未释放

优化方案

  1. 调整数据库连接池配置:

# 修改conf/application.properties
db.pool.config.maxActive=50
db.pool.config.maxIdle=10
db.pool.config.minIdle=5
  1. 配置MySQL自动断开空闲连接:

# MySQL配置文件my.cnf
[mysqld]
wait_timeout = 600
interactive_timeout = 600
  1. 重启服务并验证:

# 观察连接数变化
mysql> SHOW STATUS LIKE '%onn%';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| Max_used_connections     | 62    |  # 连接数显著下降
| Threads_connected        | 58    |
+--------------------------+-------+

3. VIP漂移异常

报错现象
客户端访问10.0.0.66:18848间歇性失败,Keepalived日志显示:

May 18 17:30:23 node1 Keepalived_vrrp[11234]: VRRP_Instance(VI_1) ignoring received advertisment...

网络层排查

# 检查ARP缓存
[root@client ~]# arp -n | grep 10.0.0.66
10.0.0.66             ether 52:54:00:12:34:56   C                     eth0

# 触发VIP切换后观察MAC变化
[root@client ~]# ping 10.0.0.66 -c 3 && arp -n | grep 66
PING 10.0.0.66 (10.0.0.66) 56(84) bytes of data.
64 bytes from 10.0.0.66: icmp_seq=1 ttl=64 time=0.234 ms
...
10.0.0.66             ether 52:54:00:ab:cd:ef   C                     eth0  # MAC发生变化

根本原因
多节点配置nopreempt参数导致主节点故障恢复后无法夺回VIP,产生"脑裂"现象。

修复步骤

  1. 统一Keepalived配置:

# 所有节点/etc/keepalived/keepalived.conf


vrrp_instance VI_1 {
    ...
    state BACKUP           # 所有节点设为BACKUP
    priority 100           # 根据节点性能设置不同优先级
    nopreempt              # 仅在一个节点保留此配置
    ...
}
配置VRRP单播通信:



#### 主节点配置
unicast_src_ip 10.0.0.91
unicast_peer {
    10.0.0.92
    10.0.0.93
}
验证VIP切换:



# 在主节点停止Keepalived
[root@node1 ~]# systemctl stop keepalived

# 在备节点查看VIP绑定
[root@node2 ~]# ip addr show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    inet 10.0.0.92/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet 10.0.0.66/32 scope global eth0  # VIP已漂移到node2
       valid_lft forever preferred_lft forever

Nacos 集群部署及高可用实践

前言

在微服务架构中,配置管理和服务发现是至关重要的。Nacos 作为一款开源的动态配置和服务发现工具,能够帮助我们实现这些功能。本文将详细介绍如何部署 Nacos 集群,并结合 HAProxy 和 Keepalived 实现高可用。

环境准备

  • 三台服务器(10.0.0.91、10.0.0.92、10.0.0.93)

  • 操作系统:Linux

  • Java 环境

  • Nacos 2.5.1 版本

部署 Nacos 单机版

下载 Nacos

wget https://github.com/alibaba/nacos/releases/download/2.5.1/nacos-server-2.5.1.tar.gz

解压 Nacos

tar xf nacos-server-2.5.1.tar.gz  -C /usr/local/

启动 Nacos 单机版

/usr/local/nacos/bin/startup.sh -m standalone

查看日志确认 Nacos 是否启动成功:

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

配置 Nacos 集群

修改集群配置文件

在单点的配置上修改配置文件:

# 配置文件添加以下内容
vi /usr/local/nacos/conf/cluster.conf

10.0.0.91:8848
10.0.0.92:8848
10.0.0.93:8848

拷贝 Nacos 程序到其他节点

scp -r /usr/local/nacos/ 10.0.0.92:/usr/local/
scp -r /usr/local/nacos/ 10.0.0.93:/usr/local/

停止单点的 Nacos

systemctl disable --now nacos.service

所有节点以集群的方式启动

在所有节点上执行以下命令:

/usr/local/nacos/bin/startup.sh -p embedded

访问验证

通过浏览器访问以下地址,确认集群是否正常工作:

http://10.0.0.91:8848/#/clusterManagement
http://10.0.0.92:8848/#/clusterManagement
http://10.0.0.93:8848/#/clusterManagement

配置 HAProxy 实现负载均衡

修改内核参数

在所有节点上执行以下命令:

echo net.ipv4.ip_nonlocal_bind = 1 >> /etc/sysctl.d/nacos.conf
sysctl -f /etc/sysctl.d/nacos.conf
sysctl -q net.ipv4.ip_nonlocal_bind

安装配置 HAProxy

apt -y install haproxy

修改 HAProxy 的配置文件

vi /etc/haproxy/haproxy.cfg


.....

# 添加以下内容

listen status
    mode http
    bind 0.0.0.0:9999
    stats enable
    log global
    stats uri  /ruok
    stats auth admin:yinzhengjie

listen nacos
    bind 10.0.0.66:18848
    server elk91 10.0.0.91:8848 check
    server elk92 10.0.0.92:8848 check
    server elk93 10.0.0.93:8848 check

将配置文件拷贝到其他节点:

scp /etc/haproxy/haproxy.cfg 10.0.0.91:/etc/haproxy
scp /etc/haproxy/haproxy.cfg 10.0.0.92:/etc/haproxy

配置抢占式 Keepalived 实现高可用

安装配置 Keepalived

apt -y install keepalived

修改 Keepalived 的配置文件

在 10.0.0.91 上执行:

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id 10.0.0.91
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state MASTER
    interface eth0
    virtual_router_id 251
    priority 100
    advert_int 1
    mcast_src_ip 10.0.0.91
    nopreempt
    authentication {
        auth_type PASS
        auth_pass yinzhengjie
    }
    track_script {
         chk_haproxy
    }
    virtual_ipaddress {
        10.0.0.66
    }
}

在 10.0.0.92 上执行: 

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id 10.0.0.92
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 251
    priority 80
    advert_int 1
    mcast_src_ip 10.0.0.92
    nopreempt
    authentication {
        auth_type PASS
        auth_pass yinzhengjie
    }
    track_script {
         chk_haproxy
    }
    virtual_ipaddress {
        10.0.0.66
    }
}

在 10.0.0.93 上执行:

vi /etc/keepalived/keepalived.conf

! Configuration File for keepalived
global_defs {
   router_id 10.0.0.93
}
vrrp_script chk_haproxy {
    script "killall -0 haproxy"
    interval 2
    weight -20
}
vrrp_instance VI_1 {
    state BACKUP
    interface eth0
    virtual_router_id 251
    priority 60
    advert_int 1
    mcast_src_ip 10.0.0.93
    nopreempt
    authentication {
        auth_type PASS
        auth_pass yinzhengjie
    }
    track_script {
         chk_haproxy
    }
    virtual_ipaddress {
        10.0.0.66
    }
}

重启 Keepalived 服务

在所有节点上执行以下命令:

systemctl enable --now keepalived

重启 Keepalived 服务

在所有节点上执行以下命令:

systemctl enable --now keepalived

启动 HAProxy 负载均衡器

在所有节点上执行以下命令:

systemctl restart haproxy.service

确认 HAProxy 是否启动成功:

ss -ntl | grep 18848

访问测试验证

通过浏览器访问以下地址,确认高可用是否正常工作:

http://10.0.0.66:18848/#/login

验证高可用

在主节点上停止 Keepalived 服务:

systemctl stop keepalived

观察 VIP 是否飘逸,但不影响客户端使用。

总结

本文详细介绍了如何部署 Nacos 集群,并结合 HAProxy 和 Keepalived 实现高可用。通过以上步骤,我们能够确保在生产环境中 Nacos 的稳定运行,为微服务架构提供可靠的配置管理和服

性能调优参数

1. JVM参数优化

# 修改bin/startup.sh
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g"
JAVA_OPT="${JAVA_OPT} -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m"
JAVA_OPT="${JAVA_OPT} -XX:+UseG1GC -XX:MaxGCPauseMillis=200"

2. 内核参数调优

# /etc/sysctl.conf
net.core.somaxconn=65535
net.ipv4.tcp_max_syn_backlog=65535
vm.swappiness=10

# 执行生效
sysctl -p

监控指标清单

指标类别监控项告警阈值
系统资源CPU利用率>80%持续5分钟
内存使用率>90%
数据库活跃连接数> max_connections*0.8
查询延迟(P99)>500ms
Nacos服务配置推送成功率<99.9%
服务心跳丢失率>1%
网络VIP切换次数>3次/小时

灾备演练方案

场景模拟

# 随机停止一个Nacos节点
ssh node$((RANDOM%3+1)) "systemctl stop nacos"

# 观察客户端行为
watch -n 1 'curl -s http://10.0.0.66:18848/nacos/v1/ns/service/list'

# 预期结果:服务列表持续可用,无数据丢失

恢复验证

# 启动故障节点
ssh nodeX "systemctl start nacos"

# 检查数据一致性
nacosctl check cluster health

通过以上架构设计与故障处理方案,某金融平台的Nacos集群实现了99.99%的可用性,配置推送延迟从平均2.3秒降低到420毫秒,完整支撑了日均10万+次的微服务调用。建议企业根据实际业务规模动态调整节点数量,并定期进行故障演练。

相关文章:

  • 【RHCE】awk文本处理
  • 在 Go 语言中生成单元测试报告
  • 巧用符号链接搬移C盘中的软件数据目录到其他盘
  • uniapp可拖拽消息数徽标draggable-badge,仿手机qq聊天列表未读数徽标动效
  • WDG看门狗
  • 【大语言模型_7】利用ragas框架评测rag系统指标
  • [杂学笔记]继承的应用场景、如何避免内存泄漏、函数模板的理解、多线程的应用场景、DNS解析的过程
  • 深入解析 DAI 与 SAI:Linux 音频驱动中的核心概念
  • armsom产品qt交叉编译
  • K8S学习之基础三十六:node-exporter部署
  • Linux中vscode编程,小白入门喂饭级教程
  • tailwindCss中中括号([])的作用
  • 【Nodejs】2024 汇总现状
  • 平板作为笔记本副屏使用spacedesk
  • AI大模型在物联网行业的应用场景深度解析
  • UE5材质法线强度控制节点FlattenNormal
  • 计算机二级web易错点(4)-选择题
  • Oracle OCP认证没落了吗?
  • 使用 5W2H 分析法学习 C 语言理论知识
  • golang单机锁实现
  • 习近平在上海考察时强调,加快建成具有全球影响力的科技创新高地
  • 张元济和百日维新
  • 美航母一战机坠海,美媒:为躲避胡塞武装攻击,损失超六千万美元
  • 君亭酒店:2024年营业收入约6.76亿元, “酒店行业传统增长模式面临巨大挑战”
  • 白酒瓶“神似”北京第一高楼被判侵权,法院一审判赔45万并停售
  • 铜钴巨头洛阳钼业一季度净利润同比大增九成,最新宣布超30亿元收购黄金资产