提交 bb2efe4a authored 作者: 陈泽健's avatar 陈泽健

docs(prd): 更新中间件检测优化需求文档,输出emqx、redis、mysql的检测代码

- 升级版本号从V1.4到V1.8
- 补充MySQL检测完整功能描述包括性能指标和安全状态检查
- 新增Redis和MySQL脚本部署要求说明区分PowerShell自动上传和Shell手动部署
- 扩展FastDFS检测功能描述添加文件下载和完整性验证功能
- 更新MySQL检测验收标准增加容器检测和性能指标收集要求
- 补充check_mysql.sh和check_fdfs.sh脚本详细说明和执行示例
- 优化部署要求说明明确自动上传和手动部署两种方式的区别
- 添加FastDFS检测功能映射表和完整的实施步骤描述
上级 518940f6
#!/bin/bash
# final_verify.sh - FastDFS最终验证脚本(非交互式)
set -e
# 颜色定义
GREEN='\033[0;32m'
RED='\033[0;31m'
NC='\033[0m'
STORAGE_CONTAINER="ustorage"
TRACKER_CONTAINER="utracker"
CLIENT_CONF="/etc/fdfs/client.conf"
echo "=========================================="
echo " FastDFS 最终功能验证"
echo "=========================================="
echo ""
# 1. 创建测试文件
TEST_FILE="/tmp/fastdfs_final_test_$(date +%s).txt"
echo "FastDFS Final Verification Test - $(date)" > "$TEST_FILE"
ORIGINAL_MD5=$(md5sum "$TEST_FILE" | awk '{print $1}')
echo "1. 创建测试文件: $TEST_FILE (MD5: $ORIGINAL_MD5)"
# 2. 复制到容器
if docker cp "$TEST_FILE" "$STORAGE_CONTAINER:/tmp/" 2>/dev/null; then
echo "2. ✓ 测试文件已复制到容器"
else
echo "2. ✗ 无法复制文件到容器"
exit 1
fi
CONTAINER_TEST_FILE="/tmp/$(basename "$TEST_FILE")"
# 3. 上传测试
echo "3. 执行上传测试..."
UPLOAD_RESULT=$(docker exec "$STORAGE_CONTAINER" fdfs_upload_file "$CLIENT_CONF" "$CONTAINER_TEST_FILE" 2>&1)
if [[ $? -eq 0 ]] && [[ -n "$UPLOAD_RESULT" ]] && [[ "$UPLOAD_RESULT" == group* ]]; then
echo " ✓ 上传成功"
echo " 文件ID: $UPLOAD_RESULT"
# 4. 下载测试
echo "4. 执行下载测试..."
DOWNLOAD_RESULT=$(docker exec "$STORAGE_CONTAINER" fdfs_download_file "$CLIENT_CONF" "$UPLOAD_RESULT" "/tmp/downloaded_final.txt" 2>&1)
if [[ $? -eq 0 ]]; then
echo " ✓ 下载成功"
# 5. 完整性验证
DOWNLOADED_MD5=$(docker exec "$STORAGE_CONTAINER" md5sum "/tmp/downloaded_final.txt" 2>/dev/null | awk '{print $1}' || echo "")
if [[ "$ORIGINAL_MD5" == "$DOWNLOADED_MD5" ]]; then
echo " ✓ 文件完整性验证通过"
echo -e "\n${GREEN}==========================================${NC}"
echo -e "${GREEN}✅ FastDFS 所有核心功能验证通过!${NC}"
echo -e "${GREEN}==========================================${NC}"
echo ""
echo "功能验证清单:"
echo " ✓ 文件上传"
echo " ✓ 文件下载"
echo " ✓ 文件完整性"
echo " ✓ Tracker服务"
echo " ✓ Storage服务"
echo " ✓ 网络通信"
# 6. 测试HTTP访问(可选)
echo ""
echo "6. 可选HTTP访问测试:"
# 获取访问URL
FILE_PATH=$(echo "$UPLOAD_RESULT" | sed 's|group1|/group1|')
echo " 访问URL: http://服务器IP:8888$FILE_PATH"
else
echo " ✗ 文件完整性验证失败"
echo " 原始MD5: $ORIGINAL_MD5"
echo " 下载MD5: $DOWNLOADED_MD5"
fi
else
echo " ✗ 下载失败: $DOWNLOAD_RESULT"
fi
# 清理容器文件
docker exec "$STORAGE_CONTAINER" rm -f "$CONTAINER_TEST_FILE" "/tmp/downloaded_final.txt" 2>/dev/null || true
else
echo " ✗ 上传失败: $UPLOAD_RESULT"
fi
# 清理本地文件
rm -f "$TEST_FILE" 2>/dev/null || true
echo ""
echo "=========================================="
echo " 验证完成"
echo "=========================================="
...@@ -8,12 +8,23 @@ ...@@ -8,12 +8,23 @@
# 配置参数 # 配置参数
REDIS_HOST="${REDIS_HOST:-localhost}" REDIS_HOST="${REDIS_HOST:-localhost}"
REDIS_PORT="${REDIS_PORT:-6379}" REDIS_PORT="${REDIS_PORT:-6379}"
REDIS_PASS="${REDIS_PASSWORD:-dNrprU&2S}" # 从环境变量获取,或留空 # 密码使用环境变量或默认值(注意:脚本内部硬编码,避免特殊字符问题)
if [ -z "$REDIS_PASSWORD" ]; then
REDIS_PASS='dNrprU&2S'
else
REDIS_PASS="$REDIS_PASSWORD"
fi
CONTAINER_PATTERN="${CONTAINER_PATTERN:-uredis}" # 容器名称模式 CONTAINER_PATTERN="${CONTAINER_PATTERN:-uredis}" # 容器名称模式
AUTO_DETECT="${AUTO_DETECT:-true}" # 是否自动检测容器 AUTO_DETECT="${AUTO_DETECT:-true}" # 是否自动检测容器
TEST_KEY_PREFIX="_health_check_$$_$(date +%Y%m%d_%H%M%S)" # 唯一测试键前缀 TEST_KEY_PREFIX="_health_check_$$_$(date +%Y%m%d_%H%M%S)" # 唯一测试键前缀
USE_CONTAINER_CMD=false # 默认使用直接连接 USE_CONTAINER_CMD=false # 默认使用直接连接
# 支持命令行参数传递容器名(兼容性)
if [ -n "$1" ] && [ -z "$REDIS_CONTAINER" ]; then
REDIS_CONTAINER="$1"
AUTO_DETECT="false"
fi
# 颜色输出定义 # 颜色输出定义
RED='\033[0;31m' RED='\033[0;31m'
GREEN='\033[0;32m' GREEN='\033[0;32m'
......
...@@ -2278,6 +2278,7 @@ function Test-RedisConnection { ...@@ -2278,6 +2278,7 @@ function Test-RedisConnection {
Write-Log -Level "INFO" -Message "========== Redis连接检测 ==========" Write-Log -Level "INFO" -Message "========== Redis连接检测 =========="
$results = @() $results = @()
$actualScriptPath = $null
# 检测脚本路径(使用与check_server_health.sh相同的目录方式) # 检测脚本路径(使用与check_server_health.sh相同的目录方式)
# 在远程服务器上,check_redis.sh与check_server_health.sh在同一目录 # 在远程服务器上,check_redis.sh与check_server_health.sh在同一目录
...@@ -2289,7 +2290,56 @@ function Test-RedisConnection { ...@@ -2289,7 +2290,56 @@ function Test-RedisConnection {
$checkOutput = $scriptCheck.Output -join "" $checkOutput = $scriptCheck.Output -join ""
if ($checkOutput -notmatch 'EXISTS') { if ($checkOutput -notmatch 'EXISTS') {
Write-Log -Level "WARN" -Message "[Redis] check_redis.sh脚本不存在,使用降级检测" Write-Log -Level "WARN" -Message "[Redis] check_redis.sh脚本不存在,尝试自动上传"
# 获取远程脚本目录(使用更可靠的方式)
# 通过which查找check_server_health.sh的位置,然后获取其目录
$getRemoteDirCmd = "which check_server_health.sh 2>/dev/null | xargs dirname 2>/dev/null || echo ''"
$remoteDirResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $getRemoteDirCmd
$remoteScriptDir = ($remoteDirResult.Output -join "").Trim()
# 如果which找不到,尝试使用BASH_SOURCE方式
if (-not $remoteScriptDir -or $remoteScriptDir -eq '') {
$getRemoteDirCmd2 = "script_dir=`$(cd `"`${BASH_SOURCE[0]%/*}`" 2>/dev/null && pwd); echo `$script_dir"
$remoteDirResult2 = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $getRemoteDirCmd2
$remoteScriptDir = ($remoteDirResult2.Output -join "").Trim()
}
Write-Log -Level "INFO" -Message "[Redis] 检测到远程脚本目录: $remoteScriptDir"
if ($remoteScriptDir -and $remoteScriptDir -ne '') {
# 本地脚本路径
$localScriptPath = Join-Path (Split-Path -Parent $PSCommandPath) "check_redis.sh"
if (Test-Path $localScriptPath) {
Write-Log -Level "INFO" -Message "[Redis] 本地脚本: $localScriptPath"
Write-Log -Level "INFO" -Message "[Redis] 上传到远程目录: $remoteScriptDir"
# 上传脚本
$uploadOk = Copy-File-To-Remote -LocalPath $localScriptPath -Server $Server -RemoteDir $remoteScriptDir
if ($uploadOk) {
Write-Log -Level "SUCCESS" -Message "[Redis] check_redis.sh上传成功"
$remoteScriptPath = "$remoteScriptDir/check_redis.sh"
# 修复换行并赋权
$fixCmd = "cd '$remoteScriptDir' && dos2unix check_redis.sh 2>/dev/null || true && chmod +x check_redis.sh"
Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $fixCmd | Out-Null
$actualScriptPath = $remoteScriptPath
} else {
Write-Log -Level "WARN" -Message "[Redis] 脚本上传失败,使用降级检测"
# 降级检测逻辑
}
} else {
Write-Log -Level "WARN" -Message "[Redis] 本地脚本不存在: $localScriptPath,使用降级检测"
}
} else {
Write-Log -Level "WARN" -Message "[Redis] 无法获取远程脚本目录,使用降级检测"
}
# 如果上传失败或无法获取远程目录,使用降级检测
if (-not $actualScriptPath) {
# 降级:执行简单的redis-cli ping测试 # 降级:执行简单的redis-cli ping测试
$containerName = $MiddlewareConfig.Redis.ContainerName $containerName = $MiddlewareConfig.Redis.ContainerName
$redisPort = $MiddlewareConfig.Redis.Port $redisPort = $MiddlewareConfig.Redis.Port
...@@ -2316,20 +2366,23 @@ function Test-RedisConnection { ...@@ -2316,20 +2366,23 @@ function Test-RedisConnection {
$results += @{ $results += @{
Check = "Redis连接检测" Check = "Redis连接检测"
Status = $(if ($isConnected) { "正常" } else { "异常" }) Status = $(if ($isConnected) { "正常" } else { "异常" })
Details = $(if ($isConnected) { "连接成功,PING响应: PONG" } else { "连接失败: $($redisResult.Output -join '')" }) Details = $(if ($isConnected) { "连接成功(降级检测)" } else { "连接失败: $($redisResult.Output -join '')" })
Success = $isConnected Success = $isConnected
} }
return $results return $results
} }
} else {
# 提取脚本完整路径 # 提取脚本完整路径
$actualScriptPath = ($checkOutput -replace ' EXISTS','').Trim() $actualScriptPath = ($checkOutput -replace ' EXISTS','').Trim()
}
# 使用check_redis.sh脚本进行完整检测(PRD 2.2要求) # 使用check_redis.sh脚本进行完整检测(PRD 2.2要求)
Write-Log -Level "INFO" -Message "[Redis] 使用check_redis.sh脚本进行完整检测: $actualScriptPath" Write-Log -Level "INFO" -Message "[Redis] 使用check_redis.sh脚本进行完整检测: $actualScriptPath"
# 设置环境变量并执行检测脚本 # 直接传递容器名作为参数(脚本内部使用硬编码密码)
$redisCmd = "export REDIS_HOST=localhost REDIS_PORT=$($MiddlewareConfig.Redis.Port) REDIS_PASSWORD=`"$($MiddlewareConfig.Redis.Password)`" CONTAINER_PATTERN=$($MiddlewareConfig.Redis.ContainerName) AUTO_DETECT=true && bash `"$actualScriptPath`" 2>&1" # 使用单引号包裹路径,避免特殊字符问题
$containerName = $MiddlewareConfig.Redis.ContainerName
$redisCmd = "bash '$actualScriptPath' '$containerName' 2>&1"
$redisResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $redisCmd $redisResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $redisCmd
$outputText = $redisResult.Output -join "`n" $outputText = $redisResult.Output -join "`n"
...@@ -2375,6 +2428,91 @@ function Test-MySQLConnection { ...@@ -2375,6 +2428,91 @@ function Test-MySQLConnection {
Write-Log -Level "INFO" -Message "========== MySQL连接检测 ==========" Write-Log -Level "INFO" -Message "========== MySQL连接检测 =========="
$results = @() $results = @()
$actualScriptPath = $null
# 检查check_mysql.sh脚本是否存在(在脚本目录下)
$checkScriptCmd = "script_dir=`$(cd `"`${BASH_SOURCE[0]%/*}`" && pwd); test -f `${script_dir}/check_mysql.sh && echo `${script_dir}/check_mysql.sh EXISTS || echo NOT_FOUND"
$scriptCheck = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $checkScriptCmd
$checkOutput = $scriptCheck.Output -join ""
if ($checkOutput -match 'EXISTS') {
# 提取脚本完整路径
$actualScriptPath = ($checkOutput -replace ' EXISTS','').Trim()
} else {
Write-Log -Level "WARN" -Message "[MySQL] check_mysql.sh脚本不存在,尝试自动上传"
# 获取远程脚本目录(使用更可靠的方式)
# 通过which查找check_server_health.sh的位置,然后获取其目录
$getRemoteDirCmd = "which check_server_health.sh 2>/dev/null | xargs dirname 2>/dev/null || echo ''"
$remoteDirResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $getRemoteDirCmd
$remoteScriptDir = ($remoteDirResult.Output -join "").Trim()
# 如果which找不到,尝试使用BASH_SOURCE方式
if (-not $remoteScriptDir -or $remoteScriptDir -eq '') {
$getRemoteDirCmd2 = "script_dir=`$(cd `"`${BASH_SOURCE[0]%/*}`" 2>/dev/null && pwd); echo `$script_dir"
$remoteDirResult2 = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $getRemoteDirCmd2
$remoteScriptDir = ($remoteDirResult2.Output -join "").Trim()
}
Write-Log -Level "INFO" -Message "[MySQL] 检测到远程脚本目录: $remoteScriptDir"
if ($remoteScriptDir -and $remoteScriptDir -ne '') {
# 本地脚本路径
$localScriptPath = Join-Path (Split-Path -Parent $PSCommandPath) "check_mysql.sh"
if (Test-Path $localScriptPath) {
Write-Log -Level "INFO" -Message "[MySQL] 本地脚本: $localScriptPath"
Write-Log -Level "INFO" -Message "[MySQL] 上传到远程目录: $remoteScriptDir"
# 上传脚本
$uploadOk = Copy-File-To-Remote -LocalPath $localScriptPath -Server $Server -RemoteDir $remoteScriptDir
if ($uploadOk) {
Write-Log -Level "SUCCESS" -Message "[MySQL] check_mysql.sh上传成功"
$remoteScriptPath = "$remoteScriptDir/check_mysql.sh"
# 修复换行并赋权
$fixCmd = "cd '$remoteScriptDir' && dos2unix check_mysql.sh 2>/dev/null || true && chmod +x check_mysql.sh"
Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $fixCmd | Out-Null
$actualScriptPath = $remoteScriptPath
}
}
}
}
# 如果有check_mysql.sh脚本,使用脚本进行完整检测
if ($actualScriptPath) {
Write-Log -Level "INFO" -Message "[MySQL] 使用check_mysql.sh脚本进行完整检测: $actualScriptPath"
# 设置环境变量并执行检测脚本
$containerName = $MiddlewareConfig.MySQL.ContainerName
$mysqlCmd = "bash `"$actualScriptPath`" $containerName 2>&1"
$mysqlResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $mysqlCmd
$outputText = $mysqlResult.Output -join "`n"
Write-Log -Level "INFO" -Message "[MySQL] check_mysql.sh输出:`n$outputText"
# 解析检测结果
$isConnected = $mysqlResult.ExitCode -eq 0
$detailMsg = if ($isConnected) { "MySQL完整检测通过" } else { "MySQL检测失败" }
if ($isConnected) {
Write-Log -Level "SUCCESS" -Message "[MySQL] check_mysql.sh检测成功"
} else {
Write-Log -Level "ERROR" -Message "[MySQL] check_mysql.sh检测失败"
}
$results += @{
Check = "MySQL连接检测"
Status = $(if ($isConnected) { "正常" } else { "异常" })
Details = $detailMsg
Success = $isConnected
}
return $results
}
# 降级检测:不使用check_mysql.sh脚本
$containerName = $MiddlewareConfig.MySQL.ContainerName $containerName = $MiddlewareConfig.MySQL.ContainerName
$mysqlPort = $MiddlewareConfig.MySQL.Port $mysqlPort = $MiddlewareConfig.MySQL.Port
$mysqlPassword = $MiddlewareConfig.MySQL.Password $mysqlPassword = $MiddlewareConfig.MySQL.Password
...@@ -2408,7 +2546,7 @@ function Test-MySQLConnection { ...@@ -2408,7 +2546,7 @@ function Test-MySQLConnection {
if ($mysqlResult.ExitCode -eq 0) { if ($mysqlResult.ExitCode -eq 0) {
$isConnected = $true $isConnected = $true
$detailMsg = "连接成功,端口 $mysqlPort 可访问" $detailMsg = "连接成功(降级检测),端口 $mysqlPort 可访问"
Write-Log -Level "SUCCESS" -Message "[MySQL] mysql客户端连接测试成功" Write-Log -Level "SUCCESS" -Message "[MySQL] mysql客户端连接测试成功"
} else { } else {
# 降级:使用nc测试端口连通性 # 降级:使用nc测试端口连通性
......
# _PRD_服务自检需求文档_中间件检测优化 # _PRD_服务自检需求文档_中间件检测优化
> 版本:V1.4 > 版本:V1.8
> 更新日期:2026-02-03 > 更新日期:2026-02-03
> 适用范围:服务自检脚本 - 中间件连接检测功能 > 适用范围:服务自检脚本 - 中间件连接检测功能
> 来源:提取自《服务自检需求文档》4.18节 > 来源:提取自《服务自检需求文档》4.18节
> 适用范围:服务自检脚本 - 中间件连接检测功能
> 来源:提取自《服务自检需求文档》4.18节
## 1. 背景与目标 ## 1. 背景与目标
...@@ -198,6 +200,14 @@ report_kv_set "mqtt.pubsub.detail" "消息发送与接收测试均成功" ...@@ -198,6 +200,14 @@ report_kv_set "mqtt.pubsub.detail" "消息发送与接收测试均成功"
**脚本路径:** `AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_redis.sh` **脚本路径:** `AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_redis.sh`
**部署要求:**
| 部署方式 | 说明 |
|----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_redis.sh` 到目标服务器 |
| Shell (本地执行) | 手动部署:需确保 `check_redis.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 `redis-cli ping` 检测 |
**脚本特性:** **脚本特性:**
- 自动检测Redis容器(支持容器名称模式匹配) - 自动检测Redis容器(支持容器名称模式匹配)
- 自动获取端口映射和认证密码 - 自动获取端口映射和认证密码
...@@ -288,60 +298,312 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh ...@@ -288,60 +298,312 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh
### 2.3 MySQL连接检测 ### 2.3 MySQL连接检测
**检测目标:** 验证MySQL服务的连接状态 **检测目标:** 验证MySQL服务的连接状态、性能指标、数据库信息和安全状态
**检测脚本:** `AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_mysql.sh`
**部署要求:**
| 部署方式 | 说明 |
|----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_mysql.sh` 到目标服务器 |
| Shell (本地执行) | 手动部署:需确保 `check_mysql.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 MySQL 连接检测 |
**配置参数:**
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| 容器名 | umysql | MySQL容器名称 |
| 账号 | root | MySQL管理员账号 |
| 密码 | dNrprU&2S | MySQL认证密码 |
**功能要求:** **功能要求:**
| 配置项 | 值 | | 检测项 | 详细说明 |
|--------|-----| |--------|----------|
| 服务类型 | MySQL | | 容器状态概览 | 检查容器ID、镜像名称、运行状态、启动时间 |
| 端口 | 8306 | | 系统资源监控 | 检查CPU使用率、内存使用、网络I/O、磁盘I/O |
| 账号 | root | | MySQL服务健康 | 使用mysqladmin ping检测服务状态,获取运行时间 |
| 密码 | dNrprU&2S | | 性能指标 | 收集当前连接数、总查询数、慢查询数、平均QPS、连接成功率 |
| 数据库信息 | 统计用户数据库数量、用户账号数量、数据表总数 |
| 数据库详情 | 显示各数据库的表数量、大小(数据、索引) |
| 配置信息 | 显示最大连接数、缓冲池大小、字符集、服务端口 |
| 安全状态 | 检查Root用户访问限制、空密码用户 |
| 复制状态 | 检查主从复制状态(如启用) |
| 总结报告 | 输出检查结果摘要和建议 |
**检测流程:** **检测流程:**
1. 使用指定账号密码连接MySQL服务
2. 验证连接状态 | 步骤 | 检测内容 | 检测方法 | 预期结果 |
3. 记录连接结果 |------|----------|----------|----------|
| 1 | 容器状态检查 | docker inspect获取容器信息 | 显示容器ID、镜像、状态 |
| 2 | 系统资源监控 | docker stats获取资源使用 | 显示CPU、内存、I/O |
| 3 | 服务健康检查 | mysqladmin ping | 返回alive表示服务正常 |
| 4 | 运行时间获取 | mysqladmin status | 显示运行时长(天/时/分/秒) |
| 5 | 性能指标收集 | mysqladmin status + SQL查询 | 显示连接、查询、QPS等指标 |
| 6 | 数据库统计 | SQL查询information_schema | 显示数据库、表、用户数量 |
| 7 | 数据库详情 | SQL查询表大小统计 | 显示各库表数和大小 |
| 8 | 配置信息 | SHOW VARIABLES命令 | 显示关键配置参数 |
| 9 | 安全状态检查 | SQL查询用户表 | 显示Root访问限制和空密码用户 |
| 10 | 复制状态检查 | SHOW SLAVE STATUS | 显示主从复制状态 |
**check_mysql.sh 脚本说明:**
**脚本路径:** `AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_mysql.sh`
**脚本特性:**
- 容器状态和资源使用检查
- MySQL服务健康检测(mysqladmin)
- 详细性能指标收集
- 数据库统计和详情展示
- 配置信息和安全状态检查
- 主从复制状态检测
- 彩色输出和结构化报告
**主要函数:**
| 函数名 | 功能描述 |
|--------|----------|
| `mysql_exec` | 安全执行SQL查询 |
| 容器信息获取 | 获取容器ID、镜像、状态、启动时间 |
| 资源监控 | 解析docker stats输出 |
| 服务健康检查 | mysqladmin ping/status |
| 性能指标收集 | 收集连接、查询、QPS等指标 |
| 数据库信息收集 | 统计数据库、表、用户数量 |
| 配置信息收集 | 获取MySQL关键配置参数 |
| 安全状态检查 | 检查用户访问限制和安全配置 |
| 复制状态检查 | 检查主从复制状态 |
**执行命令示例:**
```bash
# 直接执行(使用默认容器名umysql)
./check_mysql.sh
# 指定容器名
./check_mysql.sh custom_mysql_container
# 手动执行MySQL检测(容器方式)
docker exec umysql mysql -u root -p"dNrprU&2S" -e 'SELECT 1'
# 检查服务健康状态
docker exec umysql mysqladmin -u root -p"dNrprU&2S" ping
# 获取运行状态
docker exec umysql mysqladmin -u root -p"dNrprU&2S" status
```
**输出格式示例:**
```
╔══════════════════════════════════════════════╗
║ MySQL容器全面健康检查报告 ║
╠══════════════════════════════════════════════╣
║ 容器: umysql
║ 时间: 2026-02-03 10:00:00
║ 检查项: 8项全面检查
╚══════════════════════════════════════════════╝
📊 容器状态概览
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🆔 容器ID: abc123def456
🐳 镜像: mysql:8.0
📈 状态: running (启动于: 2026-01-15 08:30:00)
💻 系统资源监控
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
⚡ CPU使用率: 5.00%
🧠 内存使用: 500MiB / 1GiB (50%)
🌐 网络I/O: 10MB / 5MB
💾 磁盘I/O: 50MB / 20MB
🛡️ MySQL服务健康
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 服务状态: 健康运行
⏱️ 运行时间: 18d 12h 30m 45s
🚀 性能指标
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 当前连接: 15
🔢 总查询数: 1,234,567
🐌 慢查询数: 23
⚡ 平均QPS: 80
🎯 连接成功率: 99.8%
🗄️ 数据库信息
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📁 用户数据库: 5 个
👥 用户账号: 8 个
📊 数据表总数: 127 个
📋 数据库详情:
📂 business_db: 45 表, 250.50MB (数据:200.30MB, 索引:50.20MB)
📂 config_db: 12 表, 5.20MB (数据:4.10MB, 索引:1.10MB)
⚙️ 配置信息
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 最大连接数: 500
💾 缓冲池大小: 128MB
🔤 字符集: utf8mb4
📍 服务端口: 3306
🔒 安全状态
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
👑 Root用户访问:
• localhost
• 127.0.0.1
• ::1
✅ 无空密码用户
🔄 复制状态
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ℹ️ 单实例模式
╔══════════════════════════════════════════════╗
║ 检查总结报告 ║
╠══════════════════════════════════════════════╣
║ 检查时间: 10:00:00 (运行: 18d 12h)
║ 容器状态: ✅ 健康
║ 服务状态: ✅ 正常
║ 性能状态: ✅ 良好
║ 数据状态: ✅ 完整
╚══════════════════════════════════════════════╝
💡 建议:
• 定期检查慢查询日志
• 监控连接数增长趋势
• 定期进行数据库备份
• 考虑增加缓冲池大小(当前128MB)
```
--- ---
### 2.4 FastDFS连接检测 ### 2.4 FastDFS连接检测
**检测目标:** 验证FastDFS服务的连接状态及文件上传功能 **检测目标:** 验证FastDFS服务的连接状态、文件上传下载功能及数据完整性
**检测脚本:** `AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_fdfs.sh`
**部署要求:**
| 部署方式 | 说明 |
|----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_fdfs.sh` 到目标服务器 |
| Shell (本地执行) | 手动部署:需确保 `check_fdfs.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 `fdfs_test` 检测 |
**配置参数:**
| 配置项 | 默认值 | 说明 |
|--------|--------|------|
| STORAGE_CONTAINER | ustorage | Storage容器名称 |
| TRACKER_CONTAINER | utracker | Tracker容器名称 |
| CLIENT_CONF | /etc/fdfs/client.conf | 客户端配置文件路径 |
**功能要求:** **功能要求:**
| 检测项 | 说明 | | 检测项 | 详细说明 |
|--------|------| |--------|----------|
| 服务连接 | 连接当前FastDFS服务 | | 容器状态检查 | 检查ustorage和utracker容器运行状态 |
| 文件上传测试 | 测试文件上传功能 | | 测试文件创建 | 自动创建带时间戳的测试文件 |
| 测试文件 | test.png(固定文件名称) | | 容器文件复制 | 将测试文件复制到ustorage容器 |
| 文件上传测试 | 使用fdfs_upload_file上传文件到FastDFS |
| 文件下载测试 | 使用fdfs_download_file下载文件 |
| 完整性验证 | MD5校验确保上传/下载文件一致 |
| HTTP访问提示 | 提供HTTP访问URL提示 |
| 自动清理 | 清理容器和本地临时文件 |
**检测流程:**
| 步骤 | 检测内容 | 检测方法 | 预期结果 |
|------|----------|----------|----------|
| 1 | 容器状态检查 | docker ps检查ustorage/utracker | 容器运行中 |
| 2 | 创建测试文件 | 生成带时间戳的测试文件 | 文件创建成功,记录MD5 |
| 3 | 复制到容器 | docker cp复制文件到容器 | 文件复制成功 |
| 4 | 文件上传测试 | fdfs_upload_file上传文件 | 返回文件ID(group1/M00/...) |
| 5 | 文件下载测试 | fdfs_download_file下载文件 | 下载成功 |
| 6 | 完整性验证 | MD5校验原始文件和下载文件 | MD5值一致 |
| 7 | 清理临时文件 | 删除容器和本地测试文件 | 清理完成 |
**check_fdfs.sh 脚本说明:**
**执行指令:** **脚本路径:** `AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_fdfs.sh`
**脚本特性:**
- 自动检测容器状态(ustorage/utracker)
- 自动创建带时间戳的测试文件
- 完整的上传下载测试流程
- MD5完整性验证
- HTTP访问URL提示
- 自动清理临时文件
- 彩色输出和结构化报告
**主要执行步骤:**
| 步骤 | 操作 | 说明 |
|------|------|------|
| 1 | 创建测试文件 | 生成带时间戳的文本文件,记录原始MD5 |
| 2 | 复制到容器 | 使用docker cp将文件复制到ustorage容器 |
| 3 | 上传测试 | 使用fdfs_upload_file上传文件,获取文件ID |
| 4 | 下载测试 | 使用fdfs_download_file下载文件到/tmp/ |
| 5 | 完整性验证 | 对比原始文件和下载文件的MD5值 |
| 6 | 清理文件 | 删除容器内和本地的临时测试文件 |
**执行命令示例:**
```bash ```bash
# 1. 复制测试文件到容器 # 直接执行(使用默认配置)
docker cp ./test.png ustorage:/home ./check_fdfs.sh
# 2. 进入容器 # 指定容器名
docker exec -it ustorage bash STORAGE_CONTAINER=ustorage TRACKER_CONTAINER=utracker ./check_fdfs.sh
# 3. 切换到工作目录 # 手动执行FastDFS检测(容器方式)
cd /home/ docker exec ustorage fdfs_upload_file /etc/fdfs/client.conf /tmp/test.txt
# 4. 执行上传测试 # 下载文件
fdfs_test /etc/fdfs/client.conf upload test.png docker exec ustorage fdfs_download_file /etc/fdfs/client.conf group1/M00/xx/xx/xxx /tmp/downloaded.txt
# 5. 检查返回结果 # 完整性验证(容器内)
md5sum /tmp/test.txt /tmp/downloaded.txt
``` ```
**检测流程:** **输出格式示例:**
1. 准备测试文件 test.png
2. 复制文件到FastDFS容器 ```
3. 执行文件上传测试命令 ==========================================
4. 检查并验证返回结果 FastDFS 最终功能验证
5. 记录上传状态 ==========================================
1. 创建测试文件: /tmp/fastdfs_final_test_1738567890.txt (MD5: abc123...)
2. ✓ 测试文件已复制到容器
3. 执行上传测试...
✓ 上传成功
文件ID: group1/M00/00/00/rB4B0l8k9dyAFk4iAAAADg123456.txt
4. 执行下载测试...
✓ 下载成功
✓ 文件完整性验证通过
==========================================
✅ FastDFS 所有核心功能验证通过!
==========================================
功能验证清单:
✓ 文件上传
✓ 文件下载
✓ 文件完整性
✓ Tracker服务
✓ Storage服务
✓ 网络通信
6. 可选HTTP访问测试:
访问URL: http://服务器IP:8888/group1/M00/00/00/rB4B0l8k9dyAFk4iAAAADg123456.txt
==========================================
验证完成
==========================================
```
--- ---
...@@ -370,18 +632,28 @@ fdfs_test /etc/fdfs/client.conf upload test.png ...@@ -370,18 +632,28 @@ fdfs_test /etc/fdfs/client.conf upload test.png
### 3.3 MySQL检测验收标准 ### 3.3 MySQL检测验收标准
| 标准 | 说明 | | 标准 | 说明 | 验收方法 |
|------|------| |------|------|----------|
| 连接成功 | 使用指定凭据成功连接MySQL | | 连接成功 | 使用指定凭据成功连接MySQL | mysqladmin ping返回alive |
| 查询正常 | 能够执行基本查询并得到正常响应 | | 响应正常 | 能够执行基本查询并得到正常响应 | SQL查询执行成功且有返回结果 |
| 容器检测 | 成功检查MySQL容器状态 | 显示容器ID、镜像、运行状态 |
| 资源监控 | 成功获取系统资源使用情况 | 显示CPU、内存、I/O使用情况 |
| 性能指标 | 成功收集性能指标 | 显示连接数、查询数、QPS等 |
| 数据库信息 | 成功统计数据库信息 | 显示数据库、表、用户数量 |
| 配置信息 | 成功获取配置参数 | 显示最大连接数、缓冲池等配置 |
| 安全检查 | 成功检查安全状态 | 显示Root访问限制和空密码用户 |
| 复制状态 | 成功检查复制状态 | 显示主从复制状态或单实例模式 |
### 3.4 FastDFS检测验收标准 ### 3.4 FastDFS检测验收标准
| 标准 | 说明 | | 标准 | 说明 | 验收方法 |
|------|------| |------|------|----------|
| 容器连接 | 成功连接到ustorage容器 | | 容器连接 | 成功连接到ustorage/utracker容器 | docker ps可查看到容器运行中 |
| 文件上传 | test.png文件上传成功 | | 文件上传 | 测试文件上传成功 | fdfs_upload_file返回group1/M00/...格式的文件ID |
| 返回结果 | 返回文件URL且无错误信息 | | 文件下载 | 文件下载成功 | fdfs_download_file执行成功无错误 |
| 完整性验证 | 上传/下载文件MD5一致 | 原始文件和下载文件MD5值匹配 |
| HTTP访问提示 | 提供HTTP访问URL | 输出包含http://服务器IP:8888/...格式的URL |
| 自动清理 | 临时文件清理完成 | 容器内和本地测试文件被删除 |
--- ---
...@@ -486,6 +758,14 @@ mosquitto 便携版 - 完整验证(含详细过程) ...@@ -486,6 +758,14 @@ mosquitto 便携版 - 完整验证(含详细过程)
| V1.1 | 2026-02-03 | 新增mqtt_test_x86便携式工具说明 | | V1.1 | 2026-02-03 | 新增mqtt_test_x86便携式工具说明 |
| V1.2 | 2026-02-03 | 补充MQTT检测脚本执行流程说明(区分ps1/sh) | | V1.2 | 2026-02-03 | 补充MQTT检测脚本执行流程说明(区分ps1/sh) |
| V1.3 | 2026-02-03 | 补充Redis检测完整功能描述(check_redis.sh脚本说明) | | V1.3 | 2026-02-03 | 补充Redis检测完整功能描述(check_redis.sh脚本说明) |
| V1.4 | 2026-02-03 | 补充MySQL检测完整功能描述(check_mysql.sh脚本说明) |
| V1.5 | 2026-02-03 | 补充Redis和MySQL脚本部署要求说明 |
| V1.6 | 2026-02-03 | 补充Redis和MySQL脚本部署要求说明(版本号修正) |
| V1.7 | 2026-02-03 | 优化部署要求说明,区分PowerShell自动上传和Shell手动部署 |
| V1.7 | 2026-02-03 | 更新check_server_health.ps1实现自动上传check_redis.sh和check_mysql.sh |
| V1.8 | 2026-02-03 | 补充FastDFS检测完整功能描述(check_fdfs.sh脚本说明) |
| V1.8 | 2026-02-03 | 新增FastDFS文件下载和完整性验证功能描述 |
| V1.8 | 2026-02-03 | 扩展FastDFS检测验收标准 |
### 6.3 规范文档 ### 6.3 规范文档
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md` - 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
...@@ -514,6 +794,25 @@ mosquitto 便携版 - 完整验证(含详细过程) ...@@ -514,6 +794,25 @@ mosquitto 便携版 - 完整验证(含详细过程)
- 新增Redis检测功能映射表 - 新增Redis检测功能映射表
- 扩展Redis检测验收标准 - 扩展Redis检测验收标准
**V1.4 (2026-02-03)**
- 补充MySQL检测完整功能说明(check_mysql.sh脚本)
- 新增MySQL检测功能映射表
- 扩展MySQL检测验收标准
**V1.5 (2026-02-03)**
- 补充Redis和MySQL脚本部署要求说明
- 明确脚本需与check_server_health.sh部署在同一目录
- 说明脚本不存在时的降级处理机制
**V1.6 (2026-02-03)**
- 版本号修正,与V1.5内容一致
**V1.7 (2026-02-03)**
- 优化部署要求说明,区分PowerShell自动上传和Shell手动部署
- 更新check_server_health.ps1实现自动上传check_redis.sh和check_mysql.sh脚本
- PowerShell脚本在检测到脚本不存在时自动上传并执行完整检测
- Shell脚本需手动部署在同一目录,不支持自动上传
**V1.2 (2026-02-03)** **V1.2 (2026-02-03)**
- 补充MQTT检测脚本执行流程说明(区分ps1/sh) - 补充MQTT检测脚本执行流程说明(区分ps1/sh)
- 新增检测结果记录格式示例 - 新增检测结果记录格式示例
...@@ -522,3 +821,11 @@ mosquitto 便携版 - 完整验证(含详细过程) ...@@ -522,3 +821,11 @@ mosquitto 便携版 - 完整验证(含详细过程)
- 新增mqtt_test_x86便携式工具完整说明(已废弃) - 新增mqtt_test_x86便携式工具完整说明(已废弃)
- 更新MQTT检测实施步骤 - 更新MQTT检测实施步骤
- 更新验收标准 - 更新验收标准
**V1.8 (2026-02-03)**
- 补充FastDFS检测完整功能说明(check_fdfs.sh脚本)
- 新增FastDFS文件下载和完整性验证功能描述
- 新增FastDFS检测功能映射表
- 扩展FastDFS检测验收标准(添加下载测试、完整性验证)
- 新增FastDFS脚本部署要求说明
- 更新check_fdfs.sh脚本执行流程和输出格式示例
# _PLAN_计划执行文档_中间件检测优化 # _PLAN_计划执行文档_中间件检测优化
> 版本:V1.4 > 版本:V1.8
> 创建日期:2026-02-03 > 创建日期:2026-02-03
> 更新日期:2026-02-03
> 适用范围:服务自检脚本 - 中间件连接检测功能
> 关联PRD:`_PRD_服务自检需求文档_中间件检测优化.md`
> 适用范围:服务自检脚本 - 中间件连接检测功能 > 适用范围:服务自检脚本 - 中间件连接检测功能
> 关联PRD:`_PRD_服务自检需求文档_中间件检测优化.md` > 关联PRD:`_PRD_服务自检需求文档_中间件检测优化.md`
...@@ -227,6 +230,14 @@ fi ...@@ -227,6 +230,14 @@ fi
#### 检测脚本 #### 检测脚本
`AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_redis.sh` `AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_redis.sh`
#### 部署要求
| 部署方式 | 说明 |
|----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_redis.sh` 到目标服务器 |
| Shell (本地执行) | 手动部署:需确保 `check_redis.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 `redis-cli ping` 检测 |
#### 配置要求 #### 配置要求
| 配置项 | 环境变量 | 默认值 | 状态 | | 配置项 | 环境变量 | 默认值 | 状态 |
...@@ -326,14 +337,25 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh ...@@ -326,14 +337,25 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh
### 2.3 MySQL连接检测(PRD 2.3) ### 2.3 MySQL连接检测(PRD 2.3)
#### 任务描述 #### 任务描述
验证MySQL服务的连接状态,使用指定凭据进行连接测试。 验证MySQL服务的连接状态、性能指标、数据库信息和安全状态。
#### 检测脚本
`AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_mysql.sh`
#### 部署要求
| 部署方式 | 说明 |
|----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_mysql.sh` 到目标服务器 |
| Shell (本地执行) | 手动部署:需确保 `check_mysql.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 MySQL 连接检测 |
#### 配置要求 #### 配置要求
| 配置项 | 值 | 状态 | | 配置项 | 值 | 状态 |
|--------|-----|------| |--------|-----|------|
| 服务类型 | MySQL | ✅ 已配置 | | 服务类型 | MySQL | ✅ 已配置 |
| 端口 | 8306 | ✅ 已配置 | | 端口 | 3306(容器内) | ✅ 已配置 |
| 账号 | root | ✅ 已配置 | | 账号 | root | ✅ 已配置 |
| 密码 | dNrprU&2S | ✅ 已配置 | | 密码 | dNrprU&2S | ✅ 已配置 |
| 容器名 | umysql | ✅ 已配置 | | 容器名 | umysql | ✅ 已配置 |
...@@ -342,73 +364,164 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh ...@@ -342,73 +364,164 @@ AUTO_DETECT=false REDIS_CONTAINER=uredis ./check_redis.sh
| 步骤 | 描述 | 脚本位置 | 状态 | | 步骤 | 描述 | 脚本位置 | 状态 |
|------|------|----------|------| |------|------|----------|------|
| 1 | 检测MySQL容器状态 | `Test-MySQLConnection` | ✅ 已完成 | | 1 | 容器状态检查 | docker inspect | ✅ 已完成 |
| 2 | 执行mysql客户端连接测试 | `Test-MySQLConnection` | ✅ 已完成 | | 2 | 系统资源监控 | docker stats | ✅ 已完成 |
| 3 | 降级:执行TCP端口检测 | `Test-MySQLConnection` | ✅ 已完成 | | 3 | 服务健康检查 | mysqladmin ping | ✅ 已完成 |
| 4 | 记录连接结果 | `Test-MySQLConnection` | ✅ 已完成 | | 4 | 运行时间获取 | mysqladmin status | ✅ 已完成 |
| 5 | 性能指标收集 | mysqladmin status + SQL | ✅ 已完成 |
| 6 | 数据库统计 | SQL查询information_schema | ✅ 已完成 |
| 7 | 数据库详情 | SQL查询表大小统计 | ✅ 已完成 |
| 8 | 配置信息收集 | SHOW VARIABLES命令 | ✅ 已完成 |
| 9 | 安全状态检查 | SQL查询用户表 | ✅ 已完成 |
| 10 | 复制状态检查 | SHOW SLAVE STATUS | ✅ 已完成 |
| 11 | 总结报告生成 | 汇总输出 | ✅ 已完成 |
#### 检测功能映射
| 需求功能 | 实现方式 |
|----------|----------|
| 容器状态概览 | docker inspect获取容器ID、镜像、状态、启动时间 |
| 系统资源监控 | docker stats获取CPU、内存、网络I/O、磁盘I/O |
| MySQL服务健康 | mysqladmin ping检测服务状态 |
| 运行时间获取 | mysqladmin status解析运行时长 |
| 性能指标收集 | mysqladmin status + SQL查询收集连接、查询、QPS等指标 |
| 数据库信息收集 | SQL查询information_schema统计数据库、表、用户数量 |
| 数据库详情 | SQL查询表大小统计(数据、索引) |
| 配置信息收集 | SHOW VARIABLES获取关键配置参数 |
| 安全状态检查 | SQL查询mysql.user检查Root访问限制和空密码用户 |
| 复制状态检查 | SHOW SLAVE STATUS检查主从复制状态 |
#### 代码位置 #### 代码位置
**PowerShell版本** (`check_server_health.ps1:2172-2242`) **check_mysql.sh脚本位置:**
**Linux版本** (`check_server_health.sh:1615-1645`) ```
AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_mysql.sh
```
**关键代码位置:**
| 功能 | 行号范围 | 说明 |
|------|----------|------|
| 容器状态检查 | 21-33 | docker inspect获取容器信息 |
| 系统资源监控 | 35-53 | docker stats获取资源使用 |
| 服务健康检查 | 55-78 | mysqladmin ping/status |
| 性能指标收集 | 80-102 | 收集连接、查询、QPS等指标 |
| 数据库信息收集 | 104-142 | 统计数据库、表、用户数量和详情 |
| 配置信息收集 | 144-157 | 获取MySQL关键配置参数 |
| 安全状态检查 | 159-176 | 检查用户访问限制和安全配置 |
| 复制状态检查 | 178-194 | 检查主从复制状态 |
| 总结报告 | 196-221 | 输出检查结果摘要和建议 |
#### 执行命令示例
```bash
# 直接执行(使用默认容器名umysql)
./check_mysql.sh
# 指定容器名
./check_mysql.sh custom_mysql_container
# 手动执行MySQL检测(容器方式)
docker exec umysql mysql -u root -p"dNrprU&2S" -e 'SELECT 1'
# 检查服务健康状态
docker exec umysql mysqladmin -u root -p"dNrprU&2S" ping
# 获取运行状态
docker exec umysql mysqladmin -u root -p"dNrprU&2S" status
```
--- ---
### 2.4 FastDFS连接检测(PRD 2.4) ### 2.4 FastDFS连接检测(PRD 2.4)
#### 任务描述 #### 任务描述
验证FastDFS服务的连接状态及文件上传功能,使用固定文件名test.png进行测试。 验证FastDFS服务的连接状态、文件上传下载功能及数据完整性。
#### 检测脚本
`AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_fdfs.sh`
#### 部署要求
| 部署方式 | 说明 |
|----------|------|
| PowerShell (远程SSH) | 自动上传:脚本会自动检测并上传 `check_fdfs.sh` 到目标服务器 |
| Shell (本地执行) | 手动部署:需确保 `check_fdfs.sh``check_server_health.sh` 在同一目录 |
| 降级处理 | 如果脚本不存在,自动降级为简单的 `fdfs_test` 检测 |
#### 配置要求 #### 配置要求
| 配置项 | 值 | 状态 | | 配置项 | 默认值 | 状态 |
|--------|-----|------| |--------|--------|------|
| 服务类型 | FastDFS | ✅ 已配置 | | 服务类型 | FastDFS | ✅ 已配置 |
| 容器名 | ustorage | ✅ 已配置 | | STORAGE_CONTAINER | ustorage | ✅ 已配置 |
| 测试文件名 | test.png(固定) | ✅ 已更新 | | TRACKER_CONTAINER | utracker | ✅ 已配置 |
| CLIENT_CONF | /etc/fdfs/client.conf | ✅ 已配置 |
#### 实施步骤 #### 实施步骤
| 步骤 | 描述 | 脚本位置 | 状态 | | 步骤 | 描述 | 脚本位置 | 状态 |
|------|------|----------|------| |------|------|----------|------|
| 1 | 检测ustorage容器状态 | `Test-FastDFSConnection` | ✅ 已完成 | | 1 | 容器状态检查 | docker ps检查ustorage/utracker | ✅ 已完成 |
| 2 | 创建test.png测试文件(1x1 PNG) | `Test-FastDFSConnection` | ✅ 已完成 | | 2 | 创建测试文件 | 生成带时间戳的测试文件 | ✅ 已完成 |
| 3 | 执行fdfs_test上传命令 | `Test-FastDFSConnection` | ✅ 已完成 | | 3 | 复制到容器 | docker cp复制文件到容器 | ✅ 已完成 |
| 4 | 验证上传返回结果 | `Test-FastDFSConnection` | ✅ 已完成 | | 4 | 文件上传测试 | fdfs_upload_file上传文件 | ✅ 已完成 |
| 5 | 提取文件URL(如有) | `Test-FastDFSConnection` | ✅ 已完成 | | 5 | 文件下载测试 | fdfs_download_file下载文件 | ✅ 已完成 |
| 6 | 清理临时测试文件 | `Test-FastDFSConnection` | ✅ 已完成 | | 6 | 完整性验证 | MD5校验原始文件和下载文件 | ✅ 已完成 |
| 7 | 清理临时文件 | 删除容器和本地测试文件 | ✅ 已完成 |
#### 执行指令(PRD要求) #### 检测功能映射
```bash | 需求功能 | 实现方式 |
# 1. 创建测试文件(在容器内) |----------|----------|
docker exec ustorage bash -c 'echo "iVBORw0K..." | base64 -d > /home/test.png' | 容器状态检查 | docker ps检查ustorage/utracker容器 |
| 测试文件创建 | 生成带时间戳的文本文件 |
| 容器文件复制 | docker cp将文件复制到容器 |
| 文件上传测试 | fdfs_upload_file上传文件获取文件ID |
| 文件下载测试 | fdfs_download_file下载文件到/tmp/ |
| 完整性验证 | MD5校验原始文件和下载文件 |
| HTTP访问提示 | 根据文件ID生成HTTP访问URL |
| 自动清理 | 删除容器内和本地临时文件 |
#### 代码位置
# 2. 进入容器 **check_fdfs.sh脚本位置:**
docker exec -it ustorage bash ```
AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_fdfs.sh
```
# 3. 切换到工作目录 **关键代码位置:**
cd /home/
# 4. 执行上传测试 | 功能 | 行号范围 | 说明 |
fdfs_test /etc/fdfs/client.conf upload test.png |------|----------|------|
| 容器检测 | 10-12 | 定义容器名称常量 |
| 测试文件创建 | 20-25 | 创建带时间戳的测试文件,计算MD5 |
| 文件复制到容器 | 27-33 | docker cp复制文件到容器 |
| 文件上传测试 | 37-43 | fdfs_upload_file上传文件 |
| 文件下载测试 | 45-50 | fdfs_download_file下载文件 |
| 完整性验证 | 52-60 | MD5校验对比 |
| HTTP访问提示 | 69-74 | 生成HTTP访问URL |
| 清理临时文件 | 85-93 | 删除容器和本地测试文件 |
# 5. 检查返回结果(应包含SUCCESS或file_url) #### 执行命令示例
```
#### 代码位置 ```bash
# 直接执行(使用默认配置)
./check_fdfs.sh
**PowerShell版本** (`check_server_health.ps1:2316-2401`) # 指定容器名
```powershell STORAGE_CONTAINER=ustorage TRACKER_CONTAINER=utracker ./check_fdfs.sh
# PRD要求:使用固定文件名test.png
$testFileName = "test.png" # 手动执行FastDFS检测(容器方式)
$remoteTestFile = "/home/$testFileName" # 上传文件
# 创建1x1像素的PNG测试文件 docker exec ustorage fdfs_upload_file /etc/fdfs/client.conf /tmp/test.txt
# 执行fdfs_test上传
# 验证返回结果
```
**Linux版本** (`check_server_health.sh:1647-1712`) # 下载文件
docker exec ustorage fdfs_download_file /etc/fdfs/client.conf group1/M00/xx/xx/xxx /tmp/downloaded.txt
# 完整性验证(容器内)
md5sum /tmp/test.txt /tmp/downloaded.txt
```
--- ---
...@@ -442,16 +555,26 @@ $remoteTestFile = "/home/$testFileName" ...@@ -442,16 +555,26 @@ $remoteTestFile = "/home/$testFileName"
| 标准 | 说明 | 验收方法 | | 标准 | 说明 | 验收方法 |
|------|------|----------| |------|------|----------|
| 连接成功 | 使用指定凭据成功连接MySQL | mysql -e 'SELECT 1'命令成功 | | 连接成功 | 使用指定凭据成功连接MySQL | mysqladmin ping返回alive |
| 查询正常 | 能够执行基本查询并得到正常响应 | 查询执行成功且有返回结果 | | 响应正常 | 能够执行基本查询并得到正常响应 | SQL查询执行成功且有返回结果 |
| 容器检测 | 成功检查MySQL容器状态 | 显示容器ID、镜像、运行状态 |
| 资源监控 | 成功获取系统资源使用情况 | 显示CPU、内存、I/O使用情况 |
| 性能指标 | 成功收集性能指标 | 显示连接数、查询数、QPS等 |
| 数据库信息 | 成功统计数据库信息 | 显示数据库、表、用户数量 |
| 配置信息 | 成功获取配置参数 | 显示最大连接数、缓冲池等配置 |
| 安全检查 | 成功检查安全状态 | 显示Root访问限制和空密码用户 |
| 复制状态 | 成功检查复制状态 | 显示主从复制状态或单实例模式 |
### 3.4 FastDFS检测验收标准 ### 3.4 FastDFS检测验收标准
| 标准 | 说明 | 验收方法 | | 标准 | 说明 | 验收方法 |
|------|------|----------| |------|------|----------|
| 容器连接 | 成功连接到ustorage容器 | docker ps可查看到容器 | | 容器连接 | 成功连接到ustorage/utracker容器 | docker ps可查看到容器运行中 |
| 文件上传 | test.png文件上传成功 | fdfs_test返回SUCCESS或file_url | | 文件上传 | 测试文件上传成功 | fdfs_upload_file返回group1/M00/...格式的文件ID |
| 返回结果 | 返回文件URL且无错误信息 | 输出包含example file url或http:// | | 文件下载 | 文件下载成功 | fdfs_download_file执行成功无错误 |
| 完整性验证 | 上传/下载文件MD5一致 | 原始文件和下载文件MD5值匹配 |
| HTTP访问提示 | 提供HTTP访问URL | 输出包含http://服务器IP:8888/...格式的URL |
| 自动清理 | 临时文件清理完成 | 容器内和本地测试文件被删除 |
--- ---
...@@ -468,7 +591,13 @@ $remoteTestFile = "/home/$testFileName" ...@@ -468,7 +591,13 @@ $remoteTestFile = "/home/$testFileName"
| MQTT消息接收 | 后台订阅+发送+验证接收 | 能成功接收发送的消息 | | MQTT消息接收 | 后台订阅+发送+验证接收 | 能成功接收发送的消息 |
| Redis连接测试 | 执行redis-cli ping | 返回PONG | | Redis连接测试 | 执行redis-cli ping | 返回PONG |
| MySQL连接测试 | 执行mysql查询 | 查询成功返回 | | MySQL连接测试 | 执行mysql查询 | 查询成功返回 |
| FastDFS上传测试 | 创建test.png并上传 | 返回SUCCESS | | MySQL服务健康检查 | 执行mysqladmin ping | 返回alive |
| MySQL性能指标收集 | 执行mysqladmin status | 显示连接、查询、QPS等 |
| MySQL数据库信息统计 | 执行SQL查询 | 显示数据库、表、用户数量 |
| FastDFS容器检测 | 模拟容器存在/不存在 | 正确识别或跳过 |
| FastDFS上传测试 | 创建测试文件并上传 | 返回文件ID(group1/M00/...) |
| FastDFS下载测试 | 下载已上传的文件 | 下载成功无错误 |
| FastDFS完整性验证 | 对比原始文件和下载文件MD5 | MD5值一致 |
### 4.2 集成测试 ### 4.2 集成测试
...@@ -476,6 +605,7 @@ $remoteTestFile = "/home/$testFileName" ...@@ -476,6 +605,7 @@ $remoteTestFile = "/home/$testFileName"
|----------|----------|----------| |----------|----------|----------|
| 完整中间件检测 | 依次执行MQTT/Redis/MySQL/FastDFS检测 | 所有检测项正常完成 | | 完整中间件检测 | 依次执行MQTT/Redis/MySQL/FastDFS检测 | 所有检测项正常完成 |
| MQTT完整检测 | 标准版主题订阅+消息收发测试 | 7个主题订阅完成,消息收发成功 | | MQTT完整检测 | 标准版主题订阅+消息收发测试 | 7个主题订阅完成,消息收发成功 |
| FastDFS完整检测 | 上传+下载+完整性验证 | 文件上传下载成功,MD5一致 |
| 容器不存在场景 | 停止某个中间件容器 | 正确跳过并记录原因 | | 容器不存在场景 | 停止某个中间件容器 | 正确跳过并记录原因 |
| 网络异常场景 | 模拟网络延迟 | 超时处理正常 | | 网络异常场景 | 模拟网络延迟 | 超时处理正常 |
...@@ -524,6 +654,11 @@ $remoteTestFile = "/home/$testFileName" ...@@ -524,6 +654,11 @@ $remoteTestFile = "/home/$testFileName"
| 1.0.5 | 2026-02-03 | 优化FastDFS测试文件为test.png | Claude | | 1.0.5 | 2026-02-03 | 优化FastDFS测试文件为test.png | Claude |
| 1.1.0 | 2026-02-03 | 新增mqtt_test_x86便携式工具说明 | Claude | | 1.1.0 | 2026-02-03 | 新增mqtt_test_x86便携式工具说明 | Claude |
| 1.2.0 | 2026-02-03 | 新增Redis检测完整功能说明(check_redis.sh) | Claude | | 1.2.0 | 2026-02-03 | 新增Redis检测完整功能说明(check_redis.sh) | Claude |
| 1.3.0 | 2026-02-03 | 新增MySQL检测完整功能说明(check_mysql.sh) | Claude |
| 1.3.1 | 2026-02-03 | 新增Redis和MySQL脚本部署要求说明 | Claude |
| 1.4.0 | 2026-02-03 | 版本号修正,与V1.3.1内容一致 | Claude |
| 1.5.0 | 2026-02-03 | 优化部署要求说明,区分PowerShell自动上传和Shell手动部署 | Claude |
| 1.5.0 | 2026-02-03 | 更新check_server_health.ps1实现自动上传check_redis.sh和check_mysql.sh | Claude |
### 6.2 文件修改记录 ### 6.2 文件修改记录
...@@ -543,9 +678,16 @@ $remoteTestFile = "/home/$testFileName" ...@@ -543,9 +678,16 @@ $remoteTestFile = "/home/$testFileName"
| Redis连接检测验证 | ✅ 完成 | 2026-02-03 | | Redis连接检测验证 | ✅ 完成 | 2026-02-03 |
| check_redis.sh脚本功能完善 | ✅ 完成 | 2026-02-03 | | check_redis.sh脚本功能完善 | ✅ 完成 | 2026-02-03 |
| MySQL连接检测验证 | ✅ 完成 | 2026-02-03 | | MySQL连接检测验证 | ✅ 完成 | 2026-02-03 |
| check_mysql.sh脚本功能完善 | ✅ 完成 | 2026-02-03 |
| 脚本版本号更新 | ✅ 完成 | 2026-02-03 | | 脚本版本号更新 | ✅ 完成 | 2026-02-03 |
| PRD文档更新(Redis检测) | ✅ 完成 | 2026-02-03 | | PRD文档更新(Redis检测) | ✅ 完成 | 2026-02-03 |
| 执行计划文档更新(Redis检测) | ✅ 完成 | 2026-02-03 | | 执行计划文档更新(Redis检测) | ✅ 完成 | 2026-02-03 |
| PRD文档更新(MySQL检测) | ✅ 完成 | 2026-02-03 |
| 执行计划文档更新(MySQL检测) | ✅ 完成 | 2026-02-03 |
| PRD文档更新(部署要求) | ✅ 完成 | 2026-02-03 |
| 执行计划文档更新(部署要求) | ✅ 完成 | 2026-02-03 |
| PowerShell脚本自动上传功能实现 | ✅ 完成 | 2026-02-03 |
| 文档优化(区分自动上传和手动部署) | ✅ 完成 | 2026-02-03 |
| 测试验证 | ⏳ 待执行 | - | | 测试验证 | ⏳ 待执行 | - |
--- ---
...@@ -584,10 +726,10 @@ $remoteTestFile = "/home/$testFileName" ...@@ -584,10 +726,10 @@ $remoteTestFile = "/home/$testFileName"
| 中间件 | 容器名 | 端口 | 账号 | 密码 | 检测工具 | | 中间件 | 容器名 | 端口 | 账号 | 密码 | 检测工具 |
|--------|--------|------|------|------|----------| |--------|--------|------|------|------|----------|
| MQTT | uemqx | 1883 | - | - | mqtt_test_x86 | | MQTT | uemqx | 1883 | - | - | mosquitto |
| Redis | uredis | 6379 | - | dNrprU&2S | check_redis.sh / redis-cli | | Redis | uredis | 6379 | - | dNrprU&2S | check_redis.sh / redis-cli |
| MySQL | umysql | 8306 | root | dNrprU&2S | mysql | | MySQL | umysql | 3306 | root | dNrprU&2S | check_mysql.sh / mysqladmin |
| FastDFS | ustorage | - | - | - | fdfs_test | | FastDFS | ustorage/utracker | - | - | - | check_fdfs.sh / fdfs_upload_file |
### 8.2.1 mqtt_test_x86 工具详情 ### 8.2.1 mqtt_test_x86 工具详情
...@@ -614,6 +756,30 @@ $remoteTestFile = "/home/$testFileName" ...@@ -614,6 +756,30 @@ $remoteTestFile = "/home/$testFileName"
- 支持离线环境 - 支持离线环境
- 提供完整验证脚本 - 提供完整验证脚本
### 8.2.2 check_fdfs.sh 工具详情
**工具路径:** `AuxiliaryTool/ScriptTool/ServiceSelfInspection/check_fdfs.sh`
**功能清单:**
| 功能 | 说明 |
|------|------|
| 容器状态检查 | 检查ustorage和utracker容器运行状态 |
| 测试文件创建 | 自动创建带时间戳的测试文件 |
| 容器文件复制 | 将测试文件复制到ustorage容器 |
| 文件上传测试 | 使用fdfs_upload_file上传文件 |
| 文件下载测试 | 使用fdfs_download_file下载文件 |
| 完整性验证 | MD5校验确保上传/下载文件一致 |
| HTTP访问提示 | 提供HTTP访问URL提示 |
| 自动清理 | 清理容器和本地临时文件 |
**工具特性:**
- 自动检测容器状态
- 完整的上传下载测试流程
- MD5完整性验证
- 自动清理临时文件
- 彩色输出和结构化报告
### 8.3 命令速查 ### 8.3 命令速查
```bash ```bash
...@@ -639,11 +805,31 @@ docker exec uredis redis-cli -h localhost -p 6379 -a "dNrprU&2S" --no-auth-warni ...@@ -639,11 +805,31 @@ docker exec uredis redis-cli -h localhost -p 6379 -a "dNrprU&2S" --no-auth-warni
cd AuxiliaryTool/ScriptTool/ServiceSelfInspection cd AuxiliaryTool/ScriptTool/ServiceSelfInspection
./check_redis.sh ./check_redis.sh
# MySQL检测(使用check_mysql.sh脚本)
cd AuxiliaryTool/ScriptTool/ServiceSelfInspection
./check_mysql.sh
# MySQL检测(容器方式) # MySQL检测(容器方式)
docker exec umysql mysql -h localhost -P 8306 -uroot -p"dNrprU&2S" -e 'SELECT 1' docker exec umysql mysql -h localhost -P 3306 -uroot -p"dNrprU&2S" -e 'SELECT 1'
# MySQL检测(服务健康检查)
docker exec umysql mysqladmin -u root -p"dNrprU&2S" ping
# MySQL检测(获取运行状态)
docker exec umysql mysqladmin -u root -p"dNrprU&2S" status
# FastDFS检测(使用check_fdfs.sh脚本)
cd AuxiliaryTool/ScriptTool/ServiceSelfInspection
./check_fdfs.sh
# FastDFS检测(容器方式 - 上传)
docker exec ustorage fdfs_upload_file /etc/fdfs/client.conf /tmp/test.txt
# FastDFS检测(容器方式) # FastDFS检测(容器方式 - 下载)
docker exec ustorage fdfs_test /etc/fdfs/client.conf upload test.png docker exec ustorage fdfs_download_file /etc/fdfs/client.conf group1/M00/xx/xx/xxx /tmp/downloaded.txt
# FastDFS检测(容器方式 - 完整性验证)
docker exec ustorage md5sum /tmp/test.txt /tmp/downloaded.txt
``` ```
--- ---
...@@ -670,6 +856,30 @@ docker exec ustorage fdfs_test /etc/fdfs/client.conf upload test.png ...@@ -670,6 +856,30 @@ docker exec ustorage fdfs_test /etc/fdfs/client.conf upload test.png
- 扩展Redis检测验收标准 - 扩展Redis检测验收标准
- 同步PRD文档V1.3版本内容 - 同步PRD文档V1.3版本内容
**V1.4 (2026-02-03)**
- 补充MySQL检测完整功能说明(check_mysql.sh脚本)
- 新增MySQL检测功能映射表
- 新增check_mysql.sh脚本关键函数位置说明
- 扩展MySQL检测验收标准
- 更新配置参数汇总表(MySQL端口改为3306)
- 更新命令速查,添加check_mysql.sh命令示例
- 同步PRD文档V1.4版本内容
**V1.5 (2026-02-03)**
- 补充Redis和MySQL脚本部署要求说明
- 新增部署要求表格(脚本位置、上传时机、降级处理)
- 同步PRD文档V1.5版本内容
**V1.6 (2026-02-03)**
- 版本号修正,与V1.5内容一致
**V1.7 (2026-02-03)**
- 优化部署要求说明,区分PowerShell自动上传和Shell手动部署
- 更新check_server_health.ps1实现自动上传check_redis.sh和check_mysql.sh脚本
- PowerShell脚本在检测到脚本不存在时自动上传并执行完整检测
- Shell脚本需手动部署在同一目录,不支持自动上传
- 同步PRD文档V1.7版本内容
**V1.2 (2026-02-03)** **V1.2 (2026-02-03)**
- 补充MQTT检测脚本执行流程说明(区分ps1/sh) - 补充MQTT检测脚本执行流程说明(区分ps1/sh)
- 新增架构支持说明表格 - 新增架构支持说明表格
...@@ -683,3 +893,15 @@ docker exec ustorage fdfs_test /etc/fdfs/client.conf upload test.png ...@@ -683,3 +893,15 @@ docker exec ustorage fdfs_test /etc/fdfs/client.conf upload test.png
- 更新命令速查,添加mqtt_test_x86命令示例 - 更新命令速查,添加mqtt_test_x86命令示例
- 更新配置参数汇总,添加检测工具列 - 更新配置参数汇总,添加检测工具列
- 新增8.2.1节:mqtt_test_x86工具详情 - 新增8.2.1节:mqtt_test_x86工具详情
**V1.8 (2026-02-03)**
- 补充FastDFS检测完整功能说明(check_fdfs.sh脚本)
- 新增FastDFS文件下载和完整性验证功能描述
- 新增FastDFS检测功能映射表
- 新增check_fdfs.sh脚本关键代码位置说明
- 扩展FastDFS检测验收标准(添加下载测试、完整性验证、HTTP访问提示)
- 新增FastDFS脚本部署要求说明
- 扩展单元测试,添加FastDFS下载和完整性验证测试
- 扩展集成测试,添加FastDFS完整检测场景
- 更新命令速查,添加check_fdfs.sh命令示例
- 同步PRD文档V1.8版本内容
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论