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.confvrrp_instance VI_1 {...state BACKUP           # 所有节点设为BACKUPpriority 100           # 根据节点性能设置不同优先级nopreempt              # 仅在一个节点保留此配置...
}
配置VRRP单播通信:#### 主节点配置
unicast_src_ip 10.0.0.91
unicast_peer {10.0.0.9210.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 1000inet 10.0.0.92/24 brd 10.0.0.255 scope global eth0valid_lft forever preferred_lft foreverinet 10.0.0.66/32 scope global eth0  # VIP已漂移到node2valid_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.conf10.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 statusmode httpbind 0.0.0.0:9999stats enablelog globalstats uri  /ruokstats auth admin:yinzhengjielisten nacosbind 10.0.0.66:18848server elk91 10.0.0.91:8848 checkserver elk92 10.0.0.92:8848 checkserver 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 2weight -20
}
vrrp_instance VI_1 {state MASTERinterface eth0virtual_router_id 251priority 100advert_int 1mcast_src_ip 10.0.0.91nopreemptauthentication {auth_type PASSauth_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 2weight -20
}
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 251priority 80advert_int 1mcast_src_ip 10.0.0.92nopreemptauthentication {auth_type PASSauth_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 2weight -20
}
vrrp_instance VI_1 {state BACKUPinterface eth0virtual_router_id 251priority 60advert_int 1mcast_src_ip 10.0.0.93nopreemptauthentication {auth_type PASSauth_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万+次的微服务调用。建议企业根据实际业务规模动态调整节点数量,并定期进行故障演练。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36615.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT Quick(C++)跨平台应用程序项目实战教程 2 — 环境搭建和项目创建

目录 引言 1. 安装Qt开发环境 1.1 下载Qt安装包 1.2 安装Qt 1.3 安装Visual Studio 2022 1.4 在Visual Studio 2022中安装Qt插件 1.5 在Visual Studio 2022中安装大模型编程助手 2. 创建Qt Quick项目 2.1 创建新项目 2.2 项目结构 2.3 运行项目 3. 理解项目代码 3…

免密登录远程服务器shell脚本

一、脚本代码 #!/bin/bash #提示用户输入用户i名和ip地址 read -p "请输入远程服务器的用户名: " hname read -p "请输入远程服务器的IP地址: " fip read -p "请输入远程服务器的远程端口:" sdk #检查是否配置了免密登录 function sfmm(){ …

repo init 错误 Permission denied (publickey)

一、已经生成ssh-key并设置到gerrit上 二、已经设置.gitconfig &#xff08;此步骤是公司要求&#xff0c;设置gerrit地址为一个别名之类的&#xff0c;有的公司不需要&#xff09; 然后出现下面的错误&#xff0c;最后发现忘记设置git的用户名和邮箱 1. git config --globa…

卷积神经网络 - 汇聚层

卷积神经网络一般由卷积层、汇聚层和全连接层构成&#xff0c;本文我们来学习汇聚层。 汇聚层(Pooling Layer)也叫子采样层(Subsampling Layer)&#xff0c;其作用是进 行特征选择&#xff0c;降低特征数量&#xff0c;从而减少参数数量。 卷积层虽然可以显著减少网络中连接的…

C++ 头文件说明

如果一个程序足够大&#xff0c;代码功能很多&#xff0c;可以想象&#xff0c;不可能把代码写在一个cpp文件里。我们需要模块化&#xff0c;这样的好处很多&#xff0c;方便分工合作&#xff0c;可读性提高&#xff0c;调用也方便。 这个要怎么做呢&#xff1f; 很简单直接当…

【蓝桥杯】省赛:分糖果(思维/模拟)

思路 数据很小&#xff0c;直接暴力模拟。 有意思的是一个列表如何当成循环队列写&#xff1f;可以arr[(i1)%n]让他右边超出时自动回到开头。 code import os import sysn int(input()) arr list(map(int,input().split()))ans 0 while 1:arr1 arr.copy()for i in range…

如何理解分布式光纤传感器?

关键词&#xff1a;OFDR、分布式光纤传感、光纤传感器 分布式光纤传感器是近年来备受关注的前沿技术&#xff0c;其核心在于将光纤本身作为传感介质和信号传输介质&#xff0c;通过解析光信号在光纤中的散射效应&#xff0c;实现对温度、应变、振动等物理量的连续、无盲区、高…

【java面型对象进阶】------继承实例

继承结构下的标准Javabean 代码如下&#xff1a; package demo10;//定义员工父类 public class Employee {private String id;private String name;private double salary;//构造方法public Employee(){}public Employee(String id,String name,double salary){this.idid;thi…

matrix-breakout-2-morpheus 靶机----练习攻略 【仅获取shell】

【此练习仅做到反弹shell】 1.靶机下载地址 https://download.vulnhub.com/matrix-breakout/matrix-breakout-2-morpheus.ova 2. 打开靶机&#xff0c;kali使用nmap扫描同C段的主机 找到靶机ip 确保靶机和kali网卡均为NAT模式 先查看kali的ip nmap 192.168.182.1/24 …

解锁MySQL 8.0.41源码调试:Mac 11.6+CLion 2024.3.4实战指南

文章目录 解锁MySQL 8.0.41源码调试&#xff1a;Mac 11.6CLion 2024.3.4实战指南前期准备环境搭建详细步骤安装 CLion安装 CMake 3.30.5准备 MySQL 8.0.41 源码配置 CMake 选项构建 MySQL 项目 调试环境配置与验证配置 LLDB 调试器启动调试验证调试环境 总结与拓展碰到的问题1.…

使用码云搭建CocoaPods远程私有库

一、创建远程私有索引库 用来存放私有框架的详细描述信息.podspec文件 1. 创建私有库 假设码云上创建的私有库为repo-spec 2. 查看本地已存在的索引库 pod repo list 3. 将远程私有索引库添加到本地 pod repo add [https://gitee.com/jingluoguo/repo-spec.git](https://gi…

Devops之AWS:如何安装AWS CLI

AWS 命令行界面&#xff08;AWS CLI&#xff09;是一种开源工具&#xff0c;让我们能够使用命令行 Shell 中的命令与 AWS 服务进行交互。 安装步骤&#xff1a; 下载并运行AWS CLI的MSI安装程序&#xff1a; 点击如下的链接&#xff0c;即可下载MSI安装程序&#xff1a; htt…

docker需要sudo才能使用

一种方法是添加当前用户到docker组里去&#xff0c;当时添加的时候貌似是没问题的&#xff0c;但是现在又不可以了 产生的报错 ❯ docker images Cannot connect to the Docker daemon at unix:///home/ying/.docker/desktop/docker.sock. Is the docker daemon running?解决…

jmeter将返回的数据写入csv文件

举例说明&#xff0c;我需要接口返回体中的exampleid与todoid的数据信息&#xff08;使用边界提取器先将其提取&#xff09;&#xff0c;并将其写入csv文件进行保存 使用后置处理器BeanShell 脚本实例如下 import java.io.*;// 设置要写入的文件路径 String filePath "…

在线教育网站项目第四步:deepseek骗我, WSL2不能创建两个独立的Ubuntu,但我们能实现实例互访及外部访问

一、说明 上一章折腾了半天&#xff0c;搞出不少问题&#xff0c;今天我们在deepseek的帮助下&#xff0c;完成多个独立ubuntu24.04实例的安装&#xff0c;并完成固定ip&#xff0c;实践证明&#xff0c;deepseek不靠谱&#xff0c;浪费我2个小时时间&#xff0c;我们将在下面实…

Apache Paimon 在抖音集团多场景中的优化实践

资料来源&#xff1a;火山引擎-开发者社区 本文将基于抖音集团内部两大业务的典型实时数仓场景&#xff0c;介绍Paimon在抖音集团内部的生产实践。 作者&#xff1a;李明、苏兴、文杰 抖音集团大数据工程师 目前抖音集团内部主要使用 Lambda 架构进行实时数仓建设&#xff0c;其…

PDF Reader Pro for Mac v4.9.0 PDF编辑/批注/OCR/转换工具 支持M、Intel芯片

PDF Reader Pro 是一款用户必备的集管理、编辑、转换、阅读功能于一体的专业的全能PDF阅读专家。快速、易用、强大&#xff0c;让您出色完成 PDF 工作。 应用介绍 PDF Reader Pro&#xff0c;一款功能齐全且强大的PDF阅读和编辑软件。支持PDF阅读、批注、PDF编辑、PDF格式转换…

HTML5与CSS3新特性详解

一、HTML5新特性 1.概述 HTML5 的新增特性主要是针对于以前的不足&#xff0c;增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题&#xff0c;基本是 IE9 以上版本的浏览器才支持&#xff0c;如果不考虑兼容性问题&#xff0c;可以大量使用这些新特…

shell 脚本搭建apache

#!/bin/bash # Set Apache version to install ## author: yuan# 检查外网连接 echo "检查外网连接..." ping www.baidu.com -c 3 > /dev/null 2>&1 if [ $? -eq 0 ]; thenecho "外网通讯良好&#xff01;" elseecho "网络连接失败&#x…

Linux环境使用jmeter做性能测试

一、安装JDK&#xff0c;版本jdk1.8 1、下载压缩包到/jdk目录下解压 cd /jdk tar -zxvf jdk-8u241-linux-64.tar.gz 2、配置环境变量 在profile文件中末尾新增信息如下所示 vim /etc/profile export JAVA_HOME/usr/local/java/jdk/jdk1.8.0_221 export PATH$PATH:$JAVA_HOM…