您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 脚本如何实现统计OSD内的PG数量
## 一、背景与需求分析
在Ceph分布式存储系统中,Placement Group(PG)是数据分布和负载均衡的关键机制。每个OSD(Object Storage Daemon)承载着多个PG,监控各OSD上的PG分布情况对于集群健康管理至关重要。当出现以下场景时,需要统计OSD内PG数量:
1. 排查数据分布不均问题
2. 评估OSD扩容后的负载均衡
3. 监控PG迁移进度
4. 容量规划与性能优化
## 二、基础命令解析
### 2.1 ceph pg dump 命令
基础数据获取命令:
```bash
ceph pg dump --format json > pg_dump.json
输出包含所有PG的详细信息:
{
"pg_stats": [
{
"pgid": "1.1f",
"up": [1,2,3],
"acting": [1,2,3],
"state": "active+clean"
}
]
}
查看OSD基础容量信息:
ceph osd df | head -n 5
输出示例:
ID CLASS WEIGHT SIZE USE AVL %USE VAR PGS
0 ssd 1.000 1.8TiB 1.2TiB 600GiB 66.67 1.00 123
#!/usr/bin/env python3
import json
import subprocess
from collections import defaultdict
def get_pg_distribution():
# 获取PG dump数据
cmd = "ceph pg dump --format json"
output = subprocess.check_output(cmd, shell=True)
data = json.loads(output)
# 统计各OSD的PG数量
osd_pg_count = defaultdict(int)
for pg in data["pg_stats"]:
for osd in pg["acting"]:
osd_pg_count[osd] += 1
# 获取OSD元数据
cmd = "ceph osd tree --format json"
osd_tree = json.loads(subprocess.check_output(cmd, shell=True))
# 构建结果表
results = []
for node in osd_tree["nodes"]:
if node["type"] == "osd":
osd_id = node["id"]
results.append({
"osd": osd_id,
"host": node["name"].split(".")[0],
"pg_count": osd_pg_count.get(osd_id, 0),
"status": node["status"]
})
# 按PG数量降序排序
results.sort(key=lambda x: x["pg_count"], reverse=True)
return results
if __name__ == "__main__":
report = get_pg_distribution()
print(f"{'OSD':<5} {'Host':<15} {'PGs':<5} {'Status':<10}")
print("-" * 40)
for item in report:
print(f"{item['osd']:<5} {item['host']:<15} {item['pg_count']:<5} {item['status']:<10}")
数据采集层:
subprocess
模块调用Ceph CLI命令--format json
参数获取结构化数据核心统计逻辑:
acting
集合(当前生效的OSD列表)defaultdict
自动初始化计数器数据增强处理:
结果展示:
# 使用多线程并行获取数据
from concurrent.futures import ThreadPoolExecutor
def parallel_fetch():
with ThreadPoolExecutor() as executor:
pg_future = executor.submit(get_pg_dump)
tree_future = executor.submit(get_osd_tree)
return pg_future.result(), tree_future.result()
try:
output = subprocess.check_output(cmd, stderr=subprocess.PIPE, shell=True)
except subprocess.CalledProcessError as e:
print(f"Command failed with retcode {e.returncode}: {e.stderr.decode()}")
sys.exit(1)
import matplotlib.pyplot as plt
def plot_pg_distribution(data):
osd_ids = [f"osd.{d['osd']}" for d in data]
counts = [d['pg_count'] for d in data]
plt.figure(figsize=(12,6))
plt.bar(osd_ids, counts)
plt.xticks(rotation=45)
plt.title("PG Distribution Across OSDs")
plt.tight_layout()
plt.savefig("pg_dist.png")
添加阈值告警逻辑:
avg_pg = sum(counts)/len(counts)
for item in report:
if item['pg_count'] > avg_pg * 1.3:
print(f"WARNING: OSD {item['osd']} has {item['pg_count']} PGs (>30% above avg)")
生成metrics输出:
print("# HELP ceph_osd_pg_count PG count per OSD")
print("# TYPE ceph_osd_pg_count gauge")
for item in report:
print(f'ceph_osd_pg_count{{osd="{item["osd"]}",host="{item["host"]}"}} {item["pg_count"]}')
本文实现的脚本方案具有以下特点: 1. 准确性:直接解析Ceph权威数据源 2. 高效性:单次执行通常在3秒内完成(万级PG场景) 3. 可扩展性:支持添加自定义过滤条件 4. 多场景适用:既可用于日常监控,也可用于故障排查
建议将脚本设置为定时任务,结合邮件/Slack通知机制,实现自动化监控。对于超大规模集群,建议采用Ceph Manager模块开发更高效的实现方案。 “`
注:实际执行脚本前需要确保: 1. 具有足够的Ceph CLI执行权限 2. 安装Python3及依赖库(json, subprocess等) 3. 在Ceph管理节点运行
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。