|
| 1 | +# BigKey Analyzer |
| 2 | + |
| 3 | +BigKey Analyzer 是一个离线分析工具,用于检测和分析 PikiwiDB 数据库中的大键(Big Keys)。该工具直接读取 RocksDB 数据文件,无需启动数据库服务,可以帮助运维人员识别可能影响系统性能的大键。 |
| 4 | + |
| 5 | +## 功能特性 |
| 6 | + |
| 7 | +- 直接读取 RocksDB 数据文件,无需服务端运行 |
| 8 | +- 支持所有 PikiwiDB 数据类型:strings, hashes, sets, zsets, lists |
| 9 | +- 按键大小排序显示结果 |
| 10 | +- 支持设置最小键大小阈值,只显示超过阈值的键 |
| 11 | +- 支持限制显示结果数量(Top N) |
| 12 | +- 按前缀分析键分布情况 |
| 13 | +- 可输出到文件 |
| 14 | + |
| 15 | +## 编译 |
| 16 | + |
| 17 | +```bash |
| 18 | +# 确保在 PikiwiDB 根目录下 |
| 19 | +mkdir -p build && cd build |
| 20 | + |
| 21 | +# 带上工具编译参数 |
| 22 | +cmake .. -DUSE_PIKA_TOOLS=ON |
| 23 | +make bigkey_analyzer |
| 24 | +``` |
| 25 | + |
| 26 | +## 使用方法 |
| 27 | + |
| 28 | +```bash |
| 29 | +./bigkey_analyzer [OPTIONS] <db_path> |
| 30 | +``` |
| 31 | + |
| 32 | +### 选项 |
| 33 | + |
| 34 | +- `--min-size=SIZE`:只显示大于 SIZE 字节的键 |
| 35 | +- `--top=N`:只显示前 N 个最大的键 |
| 36 | +- `--prefix-stat`:显示按前缀分组的统计信息 |
| 37 | +- `--prefix-delimiter=C`:设置前缀分隔符(默认为 ":") |
| 38 | +- `--type=TYPE`:只分析指定类型,可选值:strings|hashes|lists|sets|zsets|all |
| 39 | +- `--output=FILE`:输出结果到文件 |
| 40 | +- `--help`:显示帮助信息 |
| 41 | + |
| 42 | +### 示例 |
| 43 | + |
| 44 | +分析数据库中所有键: |
| 45 | +```bash |
| 46 | +./bigkey_analyzer /path/to/db_directory |
| 47 | +``` |
| 48 | + |
| 49 | +只显示大于 1MB 的键: |
| 50 | +```bash |
| 51 | +./bigkey_analyzer --min-size=1048576 /path/to/db_directory |
| 52 | +``` |
| 53 | + |
| 54 | +只显示前 10 个最大的键: |
| 55 | +```bash |
| 56 | +./bigkey_analyzer --top=10 /path/to/db_directory |
| 57 | +``` |
| 58 | + |
| 59 | +按前缀统计键分布: |
| 60 | +```bash |
| 61 | +./bigkey_analyzer --prefix-stat /path/to/db_directory |
| 62 | +``` |
| 63 | + |
| 64 | +使用自定义前缀分隔符: |
| 65 | +```bash |
| 66 | +./bigkey_analyzer --prefix-stat --prefix-delimiter="." /path/to/db_directory |
| 67 | +``` |
| 68 | + |
| 69 | +只分析字符串类型: |
| 70 | +```bash |
| 71 | +./bigkey_analyzer --type=strings /path/to/db_directory |
| 72 | +``` |
| 73 | + |
| 74 | +输出到文件: |
| 75 | +```bash |
| 76 | +./bigkey_analyzer --output=result.txt /path/to/db_directory |
| 77 | +``` |
| 78 | + |
| 79 | +## 输出格式 |
| 80 | + |
| 81 | +基本输出格式: |
| 82 | +``` |
| 83 | +Type Size Key TTL |
| 84 | +``` |
| 85 | + |
| 86 | +- `Type`:键类型(string, hash, list, set, zset) |
| 87 | +- `Size`:键占用的总字节数(包括元数据) |
| 88 | +- `Key`:键名称 |
| 89 | +- `TTL`:剩余生存时间(秒),-1 表示无过期时间 |
| 90 | + |
| 91 | +前缀统计输出格式: |
| 92 | +``` |
| 93 | +Prefix Count TotalSize AvgSize |
| 94 | +``` |
| 95 | + |
| 96 | +- `Prefix`:键前缀 |
| 97 | +- `Count`:该前缀下的键数量 |
| 98 | +- `TotalSize`:该前缀下所有键的总大小(字节) |
| 99 | +- `AvgSize`:该前缀下键的平均大小(字节) |
| 100 | + |
| 101 | +## 提示 |
| 102 | + |
| 103 | +1. 对于非常大的数据库,建议先使用 `--min-size` 设置一个较大的阈值(如 1MB)来过滤小键。 |
| 104 | +2. 使用 `--prefix-stat` 可以帮助识别特定前缀下的键分布情况,有助于发现问题模块。 |
| 105 | +3. 大键可能导致性能问题,可以考虑以下解决方案: |
| 106 | + - 拆分大的 hash, set, zset 为多个小的 |
| 107 | + - 使用适当的过期策略 |
| 108 | + - 使用压缩算法减小值的大小 |
| 109 | + |
| 110 | +## 常见问题 |
| 111 | + |
| 112 | +1. **"Error: Database directory does not exist"** |
| 113 | + - 确保提供了正确的数据库路径 |
| 114 | + - 数据库路径通常包含 strings, hashes, sets, zsets, lists 子目录 |
| 115 | + |
| 116 | +2. **"Error opening X database"** |
| 117 | + - 确保数据库文件未被锁定(如数据库正在运行) |
| 118 | + - 检查是否有足够的文件访问权限 |
| 119 | + |
| 120 | +3. **显示的键大小与内存使用不匹配** |
| 121 | + - 此工具计算的是键在存储引擎中的总大小,包括元数据 |
| 122 | + - 实际内存使用可能因内存分配和 RocksDB 缓存策略而有所不同 |
0 commit comments