第125集Nacos服务注册与配置中心迁移运维实战
|字数总计:3.7k|阅读时长:17分钟|阅读量:
1. Nacos迁移概述
Nacos是阿里巴巴开源的动态服务发现、配置管理和服务管理平台,是微服务架构中的重要组件。本文将详细介绍Nacos服务注册与配置中心迁移运维的实战经验,包括集群部署、数据迁移、配置管理、服务发现的完整解决方案。
1.1 核心功能
- 服务注册与发现: 动态服务注册和发现
- 配置管理: 动态配置管理和推送
- 集群管理: Nacos集群的部署和管理
- 数据迁移: 配置数据和服务数据的迁移
- 运维监控: 集群监控和性能优化
1.2 技术架构
1 2 3
| 客户端应用 → Nacos集群 → 数据库存储 ↓ ↓ ↓ 服务注册 → 配置管理 → 数据持久化
|
2. 环境准备
2.1 系统要求检查
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #!/bin/bash
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" }
check_os_version() { log "检查系统版本..." if [ -f /etc/os-release ]; then . /etc/os-release log "操作系统: $NAME $VERSION" else log "无法确定操作系统版本" fi }
check_java_version() { log "检查Java版本..." JAVA_VERSION=$(java -version 2>&1 | head -1 | cut -d'"' -f2) log "Java版本: $JAVA_VERSION" if [[ $JAVA_VERSION == 1.8* ]] || [[ $JAVA_VERSION == 11* ]] || [[ $JAVA_VERSION == 17* ]]; then log "Java版本符合要求" else log "Java版本不符合要求,需要Java 8+" exit 1 fi }
check_mysql_version() { log "检查MySQL版本..." if command -v mysql > /dev/null 2>&1; then MYSQL_VERSION=$(mysql --version | cut -d' ' -f3) log "MySQL版本: $MYSQL_VERSION" else log "MySQL未安装" exit 1 fi }
check_ports() { log "检查端口使用情况..." PORTS=(8848 9848 9849) for port in "${PORTS[@]}"; do if netstat -tlnp | grep ":$port " > /dev/null; then log "端口 $port 已被占用" else log "端口 $port 可用" fi done }
check_disk_space() { log "检查磁盘空间..." df -h | grep -E "(/$|/var|/tmp|/home)" | while read line; do log "磁盘使用: $line" done }
check_memory() { log "检查内存使用..." TOTAL_MEM=$(free -h | grep Mem | awk '{print $2}') USED_MEM=$(free -h | grep Mem | awk '{print $3}') AVAIL_MEM=$(free -h | grep Mem | awk '{print $7}') log "总内存: $TOTAL_MEM" log "已使用: $USED_MEM" log "可用内存: $AVAIL_MEM" }
main() { log "开始Nacos环境检查..." check_os_version check_java_version check_mysql_version check_ports check_disk_space check_memory log "Nacos环境检查完成" }
main "$@"
|
3. Nacos集群部署
3.1 集群部署脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235
| #!/bin/bash
NACOS_SERVERS=( "192.168.1.10" "192.168.1.11" "192.168.1.12" )
NACOS_VERSION="2.2.0" NACOS_USER="nacos" NACOS_HOME="/opt/nacos" CLUSTER_CONFIG_DIR="/etc/nacos/cluster" MYSQL_HOST="192.168.1.20" MYSQL_PORT="3306" MYSQL_DB="nacos" MYSQL_USER="nacos" MYSQL_PASSWORD="nacos123"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" }
install_nacos() { log "安装Nacos $NACOS_VERSION..." cd /tmp wget https://github.com/alibaba/nacos/releases/download/${NACOS_VERSION}/nacos-server-${NACOS_VERSION}.tar.gz tar xzf nacos-server-${NACOS_VERSION}.tar.gz mv nacos $NACOS_HOME if [ $? -eq 0 ]; then log "Nacos安装成功" else log "Nacos安装失败" exit 1 fi }
create_nacos_user() { log "创建Nacos用户..." if ! id $NACOS_USER &>/dev/null; then useradd -r -s /bin/false $NACOS_USER log "Nacos用户创建成功" else log "Nacos用户已存在" fi }
create_directories() { log "创建目录结构..." mkdir -p $NACOS_HOME/{bin,conf,logs,data} mkdir -p $CLUSTER_CONFIG_DIR chown -R $NACOS_USER:$NACOS_USER $NACOS_HOME chown -R $NACOS_USER:$NACOS_USER $CLUSTER_CONFIG_DIR log "目录结构创建完成" }
configure_mysql() { log "配置MySQL数据库..." mysql -h $MYSQL_HOST -P $MYSQL_PORT -u root -p$MYSQL_PASSWORD -e "CREATE DATABASE IF NOT EXISTS $MYSQL_DB CHARACTER SET utf8 COLLATE utf8_bin;" mysql -h $MYSQL_HOST -P $MYSQL_PORT -u root -p$MYSQL_PASSWORD -e "CREATE USER IF NOT EXISTS '$MYSQL_USER'@'%' IDENTIFIED BY '$MYSQL_PASSWORD';" mysql -h $MYSQL_HOST -P $MYSQL_PORT -u root -p$MYSQL_PASSWORD -e "GRANT ALL PRIVILEGES ON $MYSQL_DB.* TO '$MYSQL_USER'@'%';" mysql -h $MYSQL_HOST -P $MYSQL_PORT -u root -p$MYSQL_PASSWORD -e "FLUSH PRIVILEGES;" mysql -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD $MYSQL_DB < $NACOS_HOME/conf/nacos-mysql.sql log "MySQL数据库配置完成" }
generate_cluster_config() { log "生成集群配置文件..." for i in "${!NACOS_SERVERS[@]}"; do server=${NACOS_SERVERS[$i]} server_id=$((i + 1)) cat > $CLUSTER_CONFIG_DIR/application-${server_id}.properties << EOF # Nacos集群配置文件 server.contextPath=/nacos server.servlet.contextPath=/nacos server.port=8848
nacos.cmdb.dumpTaskInterval=3600 nacos.cmdb.eventTaskInterval=10 nacos.cmdb.labelTaskInterval=300 nacos.cmdb.loadDataAtStart=false
management.metrics.export.elastic.enabled=false management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/**,/actuator/**,/v1/console/server/**
nacos.console.ui.enabled=true
nacos.istio.mcp.server.enabled=false
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://$MYSQL_HOST:$MYSQL_PORT/$MYSQL_DB?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=$MYSQL_USER db.password.0=$MYSQL_PASSWORD
nacos.cmdb.dumpTaskInterval=3600 nacos.cmdb.eventTaskInterval=10 nacos.cmdb.labelTaskInterval=300 nacos.cmdb.loadDataAtStart=false
management.metrics.export.elastic.enabled=false management.metrics.export.influx.enabled=false
server.tomcat.accesslog.enabled=true server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
nacos.security.ignore.urls=/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-ui/public/**,/v1/auth/**,/v1/console/**,/actuator/**,/v1/console/server/**
nacos.console.ui.enabled=true
nacos.istio.mcp.server.enabled=false EOF cat > $CLUSTER_CONFIG_DIR/cluster-${server_id}.conf << EOF # Nacos集群节点配置 192.168.1.10:8848 192.168.1.11:8848 192.168.1.12:8848 EOF log "配置文件生成: application-${server_id}.properties, cluster-${server_id}.conf" done }
start_nacos_cluster() { log "启动Nacos集群..." for i in "${!NACOS_SERVERS[@]}"; do server=${NACOS_SERVERS[$i]} server_id=$((i + 1)) cp $CLUSTER_CONFIG_DIR/application-${server_id}.properties $NACOS_HOME/conf/application.properties cp $CLUSTER_CONFIG_DIR/cluster-${server_id}.conf $NACOS_HOME/conf/cluster.conf nohup $NACOS_HOME/bin/startup.sh -m cluster > $NACOS_HOME/logs/startup-${server_id}.log 2>&1 & if [ $? -eq 0 ]; then log "Nacos启动成功: $server" else log "Nacos启动失败: $server" exit 1 fi done }
verify_cluster() { log "验证Nacos集群..." sleep 30 for server in "${NACOS_SERVERS[@]}"; do if curl -f http://$server:8848/nacos/v1/ns/operator/servers > /dev/null 2>&1; then log "Nacos节点状态正常: $server:8848" else log "Nacos节点状态异常: $server:8848" fi done curl -s http://192.168.1.10:8848/nacos/v1/ns/operator/servers | jq . log "集群验证完成" }
main() { log "开始Nacos集群部署..." install_nacos create_nacos_user create_directories configure_mysql generate_cluster_config start_nacos_cluster verify_cluster log "Nacos集群部署完成" }
main "$@"
|
4. 数据迁移脚本
4.1 配置数据迁移脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
| #!/bin/bash
SOURCE_NACOS="http://source-nacos:8848" TARGET_NACOS="http://target-nacos:8848" SOURCE_USERNAME="nacos" SOURCE_PASSWORD="nacos" TARGET_USERNAME="nacos" TARGET_PASSWORD="nacos" BACKUP_DIR="/backup/nacos" LOG_FILE="/var/log/nacos_config_migration.log"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE }
create_backup_dir() { log "创建备份目录..." BACKUP_DATE=$(date +%Y%m%d_%H%M%S) BACKUP_PATH="$BACKUP_DIR/$BACKUP_DATE" mkdir -p $BACKUP_PATH if [ $? -eq 0 ]; then log "备份目录创建成功: $BACKUP_PATH" else log "备份目录创建失败" exit 1 fi }
export_config_data() { log "导出配置数据..." NAMESPACES=$(curl -s -u $SOURCE_USERNAME:$SOURCE_PASSWORD "$SOURCE_NACOS/nacos/v1/console/namespaces" | jq -r '.data[].namespace') for namespace in $NAMESPACES; do log "导出命名空间: $namespace" CONFIGS=$(curl -s -u $SOURCE_USERNAME:$SOURCE_PASSWORD "$SOURCE_NACOS/nacos/v1/cs/configs?search=accurate&pageNo=1&pageSize=1000&group=&appName=&config_tags=&tenant=$namespace" | jq -r '.pageItems[].dataId') for config in $CONFIGS; do log "导出配置: $config" CONFIG_CONTENT=$(curl -s -u $SOURCE_USERNAME:$SOURCE_PASSWORD "$SOURCE_NACOS/nacos/v1/cs/configs?dataId=$config&group=DEFAULT_GROUP&tenant=$namespace") echo "$CONFIG_CONTENT" > "$BACKUP_PATH/${namespace}_${config}.txt" done done log "配置数据导出完成" }
import_config_data() { log "导入配置数据..." for config_file in $BACKUP_PATH/*.txt; do if [ -f "$config_file" ]; then filename=$(basename "$config_file") namespace=$(echo $filename | cut -d'_' -f1) config_id=$(echo $filename | cut -d'_' -f2 | cut -d'.' -f1) log "导入配置: $namespace/$config_id" CONFIG_CONTENT=$(cat "$config_file") curl -X POST -u $TARGET_USERNAME:$TARGET_PASSWORD \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "dataId=$config_id&group=DEFAULT_GROUP&content=$CONFIG_CONTENT&tenant=$namespace" \ "$TARGET_NACOS/nacos/v1/cs/configs" if [ $? -eq 0 ]; then log "配置导入成功: $namespace/$config_id" else log "配置导入失败: $namespace/$config_id" fi fi done log "配置数据导入完成" }
verify_config_migration() { log "验证配置迁移..." SOURCE_COUNT=$(curl -s -u $SOURCE_USERNAME:$SOURCE_PASSWORD "$SOURCE_NACOS/nacos/v1/cs/configs?search=accurate&pageNo=1&pageSize=1000" | jq '.count') TARGET_COUNT=$(curl -s -u $TARGET_USERNAME:$TARGET_PASSWORD "$TARGET_NACOS/nacos/v1/cs/configs?search=accurate&pageNo=1&pageSize=1000" | jq '.count') log "源Nacos配置数量: $SOURCE_COUNT" log "目标Nacos配置数量: $TARGET_COUNT" if [ "$SOURCE_COUNT" = "$TARGET_COUNT" ]; then log "配置数量验证通过" else log "配置数量验证失败" exit 1 fi }
generate_migration_report() { log "生成迁移报告..." REPORT_FILE="$BACKUP_PATH/config_migration_report.txt" echo "Nacos配置数据迁移报告" > $REPORT_FILE echo "迁移时间: $(date)" >> $REPORT_FILE echo "源Nacos: $SOURCE_NACOS" >> $REPORT_FILE echo "目标Nacos: $TARGET_NACOS" >> $REPORT_FILE echo "备份目录: $BACKUP_PATH" >> $REPORT_FILE echo "================================" >> $REPORT_FILE echo "配置信息:" >> $REPORT_FILE ls -la $BACKUP_PATH/*.txt >> $REPORT_FILE log "迁移报告生成: $REPORT_FILE" }
main() { log "开始Nacos配置数据迁移..." create_backup_dir export_config_data import_config_data verify_config_migration generate_migration_report log "Nacos配置数据迁移完成" }
main "$@"
|
5. 服务数据迁移脚本
5.1 服务注册数据迁移脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
| #!/bin/bash
SOURCE_NACOS="http://source-nacos:8848" TARGET_NACOS="http://target-nacos:8848" SOURCE_USERNAME="nacos" SOURCE_PASSWORD="nacos" TARGET_USERNAME="nacos" TARGET_PASSWORD="nacos" BACKUP_DIR="/backup/nacos" LOG_FILE="/var/log/nacos_service_migration.log"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE }
export_service_data() { log "导出服务数据..." NAMESPACES=$(curl -s -u $SOURCE_USERNAME:$SOURCE_PASSWORD "$SOURCE_NACOS/nacos/v1/console/namespaces" | jq -r '.data[].namespace') for namespace in $NAMESPACES; do log "导出命名空间: $namespace" SERVICES=$(curl -s -u $SOURCE_USERNAME:$SOURCE_PASSWORD "$SOURCE_NACOS/nacos/v1/ns/service/list?pageNo=1&pageSize=1000&namespaceId=$namespace" | jq -r '.doms[]') for service in $SERVICES; do log "导出服务: $service" SERVICE_DETAIL=$(curl -s -u $SOURCE_USERNAME:$SOURCE_PASSWORD "$SOURCE_NACOS/nacos/v1/ns/instance/list?serviceName=$service&namespaceId=$namespace") echo "$SERVICE_DETAIL" > "$BACKUP_PATH/${namespace}_${service}.json" done done log "服务数据导出完成" }
import_service_data() { log "导入服务数据..." for service_file in $BACKUP_PATH/*.json; do if [ -f "$service_file" ]; then filename=$(basename "$service_file") namespace=$(echo $filename | cut -d'_' -f1) service_name=$(echo $filename | cut -d'_' -f2 | cut -d'.' -f1) log "导入服务: $namespace/$service_name" SERVICE_DATA=$(cat "$service_file") INSTANCES=$(echo $SERVICE_DATA | jq -r '.hosts[] | @base64') for instance in $INSTANCES; do INSTANCE_DATA=$(echo $instance | base64 -d) IP=$(echo $INSTANCE_DATA | jq -r '.ip') PORT=$(echo $INSTANCE_DATA | jq -r '.port') WEIGHT=$(echo $INSTANCE_DATA | jq -r '.weight') ENABLED=$(echo $INSTANCE_DATA | jq -r '.enabled') HEALTHY=$(echo $INSTANCE_DATA | jq -r '.healthy') METADATA=$(echo $INSTANCE_DATA | jq -r '.metadata | tostring') curl -X POST -u $TARGET_USERNAME:$TARGET_PASSWORD \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "serviceName=$service_name&ip=$IP&port=$PORT&weight=$WEIGHT&enabled=$ENABLED&healthy=$HEALTHY&metadata=$METADATA&namespaceId=$namespace" \ "$TARGET_NACOS/nacos/v1/ns/instance" if [ $? -eq 0 ]; then log "服务实例导入成功: $namespace/$service_name/$IP:$PORT" else log "服务实例导入失败: $namespace/$service_name/$IP:$PORT" fi done fi done log "服务数据导入完成" }
verify_service_migration() { log "验证服务迁移..." SOURCE_COUNT=$(curl -s -u $SOURCE_USERNAME:$SOURCE_PASSWORD "$SOURCE_NACOS/nacos/v1/ns/service/list?pageNo=1&pageSize=1000" | jq '.count') TARGET_COUNT=$(curl -s -u $TARGET_USERNAME:$TARGET_PASSWORD "$TARGET_NACOS/nacos/v1/ns/service/list?pageNo=1&pageSize=1000" | jq '.count') log "源Nacos服务数量: $SOURCE_COUNT" log "目标Nacos服务数量: $TARGET_COUNT" if [ "$SOURCE_COUNT" = "$TARGET_COUNT" ]; then log "服务数量验证通过" else log "服务数量验证失败" exit 1 fi }
main() { log "开始Nacos服务数据迁移..." export_service_data import_service_data verify_service_migration log "Nacos服务数据迁移完成" }
main "$@"
|
6. 总结
Nacos服务注册与配置中心迁移运维是微服务架构中的重要组成部分。通过本文的详细介绍,我们了解了:
- 集群部署: Nacos集群的部署、配置和管理
- 数据迁移: 配置数据和服务数据的迁移
- 配置管理: 动态配置管理和推送
- 服务发现: 动态服务注册和发现
- 运维监控: 集群监控和性能优化
通过合理的运维策略和工具,可以确保Nacos服务注册与配置中心的稳定运行和高可用。
运维实战要点:
- 集群部署时注意网络配置和数据库连接
- 数据迁移前做好备份,确保数据安全
- 定期监控集群状态,及时发现问题
- 性能调优需要根据实际业务场景进行
- 故障处理要有完整的诊断流程
代码注解说明:
- 日志函数: 统一日志格式,便于问题追踪
- 错误处理: 完善的错误检查和异常处理
- 配置管理: 灵活的配置参数管理
- 监控告警: 实时监控和告警机制
- 自动化运维: 脚本化运维提高效率