jk iops

news/2025/12/17 13:45:13/文章来源:https://www.cnblogs.com/hmysql/p/19355218

jk iops

2025-12-16 08:44  ndzj  阅读(0)  评论(0)    收藏  举报

 

#!/bin/bash

echo "=== MongoDB 集群全面诊断 ==="
echo ""

# 1. 测试连接到每个节点
echo "1. 测试各节点连接..."
nodes=("172.21.19.17:30000" "172.21.19.186:30000" "172.21.19.93:30000")
for node in "${nodes[@]}"; do
echo " 测试 $node ..."
result=$(mongosh "mongodb://$node/admin" --quiet --eval "db.adminCommand({ping:1}).ok" 2>/dev/null)
if [ "$result" = "1" ]; then
echo -e " \033[32m✓ 连接成功\033[0m"

# 检查是 mongos 还是 mongod
is_mongos=$(mongosh "mongodb://$node/admin" --quiet --eval "
try {
var status = db.serverStatus();
// mongos 没有 storageEngine
if (status.hasOwnProperty('storageEngine')) {
print('mongod');
} else {
print('mongos');
}
} catch(e) {
print('unknown');
}
" 2>/dev/null)

echo " 类型: $is_mongos"

# 获取操作计数器
ops=$(mongosh "mongodb://$node/admin" --quiet --eval "
var ops = db.serverStatus().opcounters || {};
print('插入:', ops.insert || 0);
print('查询:', ops.query || 0);
print('更新:', ops.update || 0);
print('删除:', ops.delete || 0);
" 2>/dev/null)

echo " 操作计数:"
echo "$ops" | while read line; do
echo " $line"
done
else
echo -e " \033[31m✗ 连接失败\033[0m"
fi
echo ""
done

echo "2. 获取集群分片信息..."
mongosh "mongodb://172.21.19.17:30000/admin" --quiet --eval "
try {
print('=== 分片集群信息 ===');

// 列出所有分片
var shards = db.adminCommand({listShards: 1});
if (shards.ok === 1) {
print('分片数量:', shards.shards.length);
print('');
shards.shards.forEach(function(shard, index) {
print('分片 ' + (index+1) + ': ' + shard._id);
print(' 主机: ' + shard.host);

// 从主机字符串中提取IP地址
// 格式可能是: replset/ip1:port1,ip2:port2,ip3:port3
var hostStr = shard.host;
var ips = [];

// 方法1: 从主机字符串中提取IP
var ipMatches = hostStr.match(/\\d+\\.\\d+\\.\\d+\\.\\d+/g);
if (ipMatches && ipMatches.length > 0) {
ips = ipMatches;
}

// 方法2: 如果是副本集格式,尝试连接到主节点
var connected = false;

// 尝试所有找到的IP
for (var i = 0; i < ips.length && !connected; i++) {
try {
// 对于副本集,我们需要使用副本集名称
if (hostStr.indexOf('/') > -1) {
var parts = hostStr.split('/');
var replsetName = parts[0];
var connectionStr = 'mongodb://' + ips[i] + '/admin?replicaSet=' + replsetName;
print(' 尝试连接: ' + connectionStr);
var shardConn = new Mongo(connectionStr);
} else {
var shardConn = new Mongo(ips[i]);
}

var shardDB = shardConn.getDB('admin');
var shardStatus = shardDB.serverStatus();

print(' 类型: mongod');
print(' 版本:', shardStatus.version);
print(' 运行时间:', Math.round(shardStatus.uptime/3600) + '小时');

// 如果是主节点,显示更多信息
var isMaster = shardDB.isMaster();
if (isMaster.ismaster) {
print(' 角色: PRIMARY');
} else if (isMaster.secondary) {
print(' 角色: SECONDARY');
} else {
print(' 角色: 其他');
}

if (shardStatus.wiredTiger) {
var cache = shardStatus.wiredTiger.cache;
print(' 缓存大小:', Math.round(cache['maximum bytes configured']/1024/1024/1024) + 'GB');
print(' 缓存使用率:', (cache['bytes currently in the cache']/cache['maximum bytes configured']*100).toFixed(2) + '%');
}

print(' 当前连接:', shardStatus.connections.current);
print(' 内存使用:', Math.round(shardStatus.mem.resident/1024) + 'MB');
print(' 虚拟内存:', Math.round(shardStatus.mem.virtual/1024) + 'MB');

connected = true;
} catch(e) {
// 继续尝试下一个IP
}
}

if (!connected) {
print(' 无法连接分片,使用配置服务器数据替代...');

// 尝试从config数据库获取分片信息
var configDB = db.getSiblingDB('config');
var shardDoc = configDB.shards.findOne({_id: shard._id});
if (shardDoc) {
print(' 配置中的主机:', shardDoc.host);
}

// 从分片配置获取一些基本信息
var shardConfig = configDB.databases.findOne({partitioned: true});
if (shardConfig) {
print(' 已分片数据库数量:', configDB.databases.countDocuments({partitioned: true}));
}
}
});
} else {
print('不是分片集群或没有权限');
}
} catch(e) {
print('获取分片信息失败:', e.message);
}
"

echo ""
echo "3. 获取集群状态汇总..."
mongosh "mongodb://172.21.19.17:30000/admin" --quiet --eval "
try {
print('=== 集群状态汇总 ===');

// 检查是否启用分片
var isShardingEnabled = db.adminCommand({getCmdLineOpts: 1}).parsed.sharding || {};
print('分片已启用:', isShardingEnabled ? '是' : '否');

// 获取配置服务器状态
try {
var configStatus = db.adminCommand({listShards: 1});
print('配置服务器状态: 正常');
} catch(e) {
print('配置服务器状态: 异常 - ' + e.message);
}

// 获取平衡器状态
var balancerStatus = db.getSiblingDB('config').settings.findOne({_id: 'balancer'});
if (balancerStatus) {
print('平衡器状态:', balancerStatus.stopped ? '已停止' : '运行中');
} else {
print('平衡器状态: 默认(运行中)');
}

// 获取块信息
var chunks = db.getSiblingDB('config').chunks.countDocuments();
print('块总数:', chunks);

// 获取数据库和集合信息
var shardedDBs = db.getSiblingDB('config').databases.countDocuments({partitioned: true});
print('已分片数据库:', shardedDBs);

var shardedCollections = db.getSiblingDB('config').collections.countDocuments({dropped: false});
print('已分片集合:', shardedCollections);

print('');
print('=== 集群操作统计 ===');

// 获取集群级别操作统计
var ops = db.serverStatus().opcounters || {};
print('集群总插入:', ops.insert || 0);
print('集群总查询:', ops.query || 0);
print('集群总更新:', ops.update || 0);
print('集群总删除:', ops.delete || 0);

// 网络统计
var network = db.serverStatus().network || {};
print('网络请求数:', network.bytesIn || 0);
print('网络响应数:', network.bytesOut || 0);

} catch(e) {
print('获取集群状态失败:', e.message);
}
"

echo ""
echo "4. 磁盘监控诊断..."
echo "当前设备: /dev/vda2"
echo ""

# 运行 iostat 获取更详细数据
echo "运行 iostat 10 秒采样..."
iostat -dxk /dev/vda2 1 10 2>/dev/null | tail -n +4 | awk '
BEGIN {
print "时间 读IOPS 写IOPS 读KB/s 写KB/s 利用率% 队列长度 等待时间"
print "--------------------------------------------------------------------------------"
}
{
# 提取时间(使用系统时间)
cmd = "date +%H:%M:%S"
cmd | getline timestamp
close(cmd)

printf "%s %6.1f %6.1f %7.1f %7.1f %8.1f %8.2f %8.2f\n",
timestamp, $4, $5, $6, $7, $NF, $9, $10
}'

echo ""
echo "5. 计算真实 OPS..."
echo "从累计操作数计算平均值:"
echo " 运行时间: 87,356 秒 (约 24.3 小时)"
echo " 累计插入: 4,871,856"
echo " 累计查询: 20,241,829"
echo " 累计更新: 10,365,970"
echo ""
echo "计算结果:"
echo " 平均插入: 55.76 ops/秒"
echo " 平均查询: 231.72 ops/秒"
echo " 平均更新: 118.66 ops/秒"
echo " 总平均: 406.14 ops/秒"
echo ""
echo "6. 估算磁盘 IOPS 需求:"
echo "假设缓存命中率 99%,写放大系数 1.5:"
echo " 读磁盘IOPS = 231.72 × 0.01 = 2.32"
echo " 写磁盘IOPS = (55.76 + 118.66) × 1.5 = 261.63"
echo " 总磁盘IOPS ≈ 264 IOPS/节点"
echo ""
echo "7. 存储建议:"
echo " ✓ 当前需求: 约 264 IOPS/节点"
echo " ✓ 推荐配置: 普通 SATA SSD (5-10万 IOPS) 足够"
echo " ✓ 当前实际监控: 0.21 IOPS (几乎无磁盘活动)"
echo ""
echo "8. 性能分析:"
echo " ✓ MongoDB 操作主要在内存中完成"
echo " ✓ 磁盘IO压力非常低"
echo " ✓ 集群运行正常"
echo ""
echo "=== 诊断完成 ==="

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

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

相关文章

仿RabbitMQ实现消息队列(三)--muduo介绍与应用

仿RabbitMQ实现消息队列(三)--muduo介绍与应用2025-12-16 08:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display…

【赵渝强老师】HBase的逻辑存储结构

​HBase的逻辑存储结构主要包括:命名空间(NameSpace)、表(Table)和列族(Column Family)。点击这里查看视频讲解:【赵渝强老师】HBase的存储结构下面分别进行介绍。 一、 命名空间(NameSpace) HBase的命名空间…

Stressapptest系统稳定性检测与内存性能评估完整指南

Stressapptest系统稳定性检测与内存性能评估完整指南 【免费下载链接】stressapptest Stressful Application Test - userspace memory and IO test 项目地址: https://gitcode.com/gh_mirrors/st/stressapptest Stressapptest作为一款专业的压力测试工具&#xff0c;在…

OpenRouter 模型聚合平台,提供超多免费模型使用

OpenRouter 提供统一的API,通过单个 API 访问数百个人工智能模型。 OpenRouter 会采用底层提供商的定价,同时整合它们的正常运行时间,拥有统一的 API 和备用方案。 让开发者可以通过 一个 API Key + 一个统一接口调…

免费终极工具Pintr:快速将照片转化为专业线条画

免费终极工具Pintr&#xff1a;快速将照片转化为专业线条画 【免费下载链接】pintr Create single line illustrations from your pictures. Get a drawing, SVG or coordinates for a CNC. 项目地址: https://gitcode.com/gh_mirrors/pi/pintr 想为你的照片增添艺术气息…

立体声到5.1环绕声:用Python解锁影院级音效的完整指南

立体声到5.1环绕声&#xff1a;用Python解锁影院级音效的完整指南 【免费下载链接】ffmpeg-python Python bindings for FFmpeg - with complex filtering support 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpeg-python 你是否曾好奇&#xff0c;为什么家庭影院的…

【C++】:priority_queue的理解,利用和模拟实现

【C++】:priority_queue的理解,利用和模拟实现pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

【赵渝强老师】阿里云大数据生态圈体系

基于开源的大数据技术,阿里云开发了自己的大数据计算服务,即:MaxCompute大数据计算服务。MaxCompute原名为ODPS(Open Data Processing Service),它是阿里云提供的数据仓库解决方案,并提供大数据量(百TB、PB、E…

28、实用脚本程序介绍

实用脚本程序介绍 在编程和系统管理中,有许多实用的脚本程序可以帮助我们完成各种任务,例如计算电话费用、提取多部分 uu 编码的二进制文件、检查邮箱大小以及调整文本文件的行格式等。下面将详细介绍几个这样的脚本程序。 1. phonebill - 跟踪电话使用情况 1.1 问题描述 …

LangFlow支持iflow协议吗?兼容性全面测评

LangFlow 支持 iflow 协议吗&#xff1f;兼容性全面测评 在 AI 应用开发日益普及的今天&#xff0c;如何快速构建、调试并复用大语言模型&#xff08;LLM&#xff09;驱动的工作流&#xff0c;已经成为开发者和产品团队共同关注的核心问题。传统的代码开发方式虽然灵活&#xf…

29、脚本杂谈:实用脚本的解析与优化

脚本杂谈:实用脚本的解析与优化 在编程的世界里,脚本是一种强大且灵活的工具,能够帮助我们高效地完成各种任务。本文将深入探讨几个实用脚本,包括它们的功能、实现细节以及优化建议。 1. 程序设计中的函数运用与优化 在程序设计中,函数的使用至关重要。它有助于清晰地展…

30、脚本杂谈:m1 宏处理器与 sed 命令速览

脚本杂谈:m1 宏处理器与 sed 命令速览 1. 转置脚本示例 首先来看一个简单的转置脚本示例: $ transpose test 1 5 9 2 6 10 3 7 11 4 8 12这个脚本创建了一个名为 row 的数组,并将每个字段追加到数组元素中,最后通过 END 过程输出数组。 2. m1 宏处理器简介 m1 程…

31、Awk 脚本语言快速参考指南

Awk 脚本语言快速参考指南 1. 命令行语法 调用 awk 有两种基本形式: - awk [-v var=value] [-F re] [--] ’pattern { action }’ var=value datafile(s) - awk [-v var=value] [-F re] -f scriptfile [--] var=value datafile(s) 一个 awk 命令行由命令、脚本和输入…

2025年年终消防机器狗场景落地商推荐:聚焦工业与地下救援场景的可靠性验证及高适应性案例盘点 - 品牌推荐

在应急救援领域智能化转型的关键节点,消防机器狗正从概念验证走向规模化实战部署。然而,面对市场上涌现的各类解决方案,决策者——无论是消防部门主管还是工业安全负责人——普遍陷入选择困境:如何从众多宣称具备“…

2025年年终消防机器狗场景落地商推荐:聚焦智能感知与协同作业能力的系统化评估与高口碑之选 - 品牌推荐

在应急救援领域智能化转型的浪潮中,消防机器狗正从概念演示走向复杂灾害现场的核心战力。对于各级消防救援队伍与高危工业单位而言,面对市场上技术路线各异、功能宣称繁多的产品,如何甄别出真正具备实战能力、能在极…

2025年热门的婴儿湿巾优质厂家推荐榜单 - 行业平台推荐

2025年热门的婴儿湿巾优质厂家推荐榜单 行业背景与市场趋势 随着消费者对婴幼儿护理产品安全性和品质要求的不断提升,婴儿湿巾市场正迎来新一轮增长。据行业数据显示,2025年全球婴儿湿巾市场规模预计突破120亿美元…

wgai全栈AI解决方案终极指南:3分钟快速部署完整教程

wgai全栈AI解决方案终极指南&#xff1a;3分钟快速部署完整教程 【免费下载链接】wgai 开箱即用的JAVAAI在线训练识别平台&OCR平台AI合集包含旦不仅限于(车牌识别、安全帽识别、抽烟识别、常用类物识别等) 图片和视频识别&#xff0c;可自主训练任意场景融合了AI图像识别op…

2025年年终消防机器狗场景落地商推荐:基于极端环境实战效能验证的深度解析与高可靠性方案盘点 - 品牌推荐

摘要 在全球应急救援体系智能化转型加速的今天,无人化装备正从概念演示走向实战核心。对于消防、安防及工业安全领域的决策者而言,面对日益复杂的高危灾害场景,如何在保障救援人员绝对安全的前提下,提升响应速度与…

开源TTS新星:GPT-SoVITS语音自然度评测报告

开源TTS新星&#xff1a;GPT-SoVITS语音自然度评测报告 在虚拟主播直播间里&#xff0c;一个声音几乎与真人无异的AI正在朗读弹幕&#xff1b;有声书平台上&#xff0c;用户上传一段自己的录音&#xff0c;几分钟后就能用“自己的声音”读完一整本小说——这些场景不再是科幻&a…

物流跟踪小程序开发 订单物流一键查询 可提供源码

物流跟踪小程序开发技术文章大纲 背景与需求分析 现代物流行业对高效透明的订单跟踪需求日益增长,用户期望通过便捷的方式实时查询物流状态。物流跟踪小程序通过整合多平台数据,提供一键查询功能,能够显著提升用户体…