性能优化 #
一、性能优化概述 #
1.1 优化方向 #
text
性能优化方向:
数据模型
├── 主键设计
├── 分区大小
└── 反范式化
读写优化
├── 一致性级别
├── 批量操作
└── 并发控制
配置调优
├── 内存配置
├── 并发配置
└── 压缩策略
硬件优化
├── 磁盘IO
├── 网络带宽
└── CPU资源
1.2 性能指标 #
text
关键性能指标:
延迟
├── 读延迟:< 10ms
├── 写延迟:< 5ms
└── P99延迟:监控
吞吐量
├── 读TPS:根据业务
├── 写TPS:根据业务
└── 并发连接数
资源使用
├── CPU使用率:< 70%
├── 内存使用率:< 80%
├── 磁盘IO:< 80%
└── 网络带宽:< 70%
二、数据模型优化 #
2.1 主键设计 #
sql
-- 好的设计:分区均匀
CREATE TABLE events (
device_id TEXT,
date DATE,
hour INT,
event_time TIMESTAMP,
data TEXT,
PRIMARY KEY ((device_id, date, hour), event_time)
);
-- 不好的设计:分区过大
CREATE TABLE events_bad (
device_id TEXT,
event_time TIMESTAMP,
data TEXT,
PRIMARY KEY (device_id, event_time)
);
2.2 分区大小控制 #
text
分区大小建议:
推荐
├── < 100MB
├── 查询效率高
└── 修复速度快
警告
├── > 100MB
├── 性能下降
└── 监控关注
限制
├── > 2GB
├── 严重性能问题
└── 需要重新设计
2.3 反范式化 #
sql
-- 反范式化:为查询创建多个表
CREATE TABLE orders_by_user (
user_id UUID,
order_id UUID,
order_date DATE,
amount DECIMAL,
PRIMARY KEY (user_id, order_id)
);
CREATE TABLE orders_by_date (
order_date DATE,
order_id UUID,
user_id UUID,
amount DECIMAL,
PRIMARY KEY (order_date, order_id)
);
三、读写优化 #
3.1 一致性级别选择 #
sql
-- 高性能:ONE
CONSISTENCY ONE;
INSERT INTO users ...
-- 平衡性能和一致性:QUORUM
CONSISTENCY QUORUM;
SELECT * FROM orders ...
-- 本地优先:LOCAL_QUORUM
CONSISTENCY LOCAL_QUORUM;
SELECT * FROM users ...
3.2 批量操作 #
sql
-- 同分区批量操作
BEGIN UNLOGGED BATCH
INSERT INTO orders (user_id, order_id, amount)
VALUES (?, ?, ?);
INSERT INTO orders (user_id, order_id, amount)
VALUES (?, ?, ?);
APPLY BATCH;
3.3 分页查询 #
sql
-- 使用分页避免大结果集
SELECT * FROM orders
WHERE user_id = ?
LIMIT 100;
-- 使用fetch_size
-- 驱动配置
四、内存优化 #
4.1 JVM堆内存 #
bash
# jvm.options
# 堆内存(建议不超过32GB)
-Xms16G
-Xmx16G
# 年轻代(堆的1/4)
-Xmn4G
# 避免压缩指针问题
# 如果堆 > 32GB,使用 -XX:+UseCompressedOops
4.2 缓存配置 #
yaml
# cassandra.yaml
# 键缓存
key_cache_size_in_mb: 100
# 行缓存(谨慎使用)
row_cache_size_in_mb: 0
# 缓存提供者
row_cache_provider: SerializingCacheProvider
4.3 MemTable配置 #
yaml
# cassandra.yaml
# MemTable堆内存比例
memtable_heap_space_in_mb: 2048
# MemTable非堆内存
memtable_offheap_space_in_mb: 2048
# 刷新阈值
memtable_flush_writers: 8
五、压缩优化 #
5.1 压缩策略选择 #
sql
-- SizeTieredCompactionStrategy(默认)
-- 适合:写入密集
CREATE TABLE write_heavy (
id UUID PRIMARY KEY,
data TEXT
) WITH compaction = {
'class': 'SizeTieredCompactionStrategy',
'min_threshold': 4,
'max_threshold': 32
};
-- LeveledCompactionStrategy
-- 适合:读取密集
CREATE TABLE read_heavy (
id UUID PRIMARY KEY,
data TEXT
) WITH compaction = {
'class': 'LeveledCompactionStrategy',
'sstable_size_in_mb': 160
};
-- TimeWindowCompactionStrategy
-- 适合:时间序列
CREATE TABLE time_series (
id UUID,
event_time TIMESTAMP,
data TEXT,
PRIMARY KEY (id, event_time)
) WITH compaction = {
'class': 'TimeWindowCompactionStrategy',
'compaction_window_unit': 'HOURS',
'compaction_window_size': 1
};
5.2 压缩配置 #
yaml
# cassandra.yaml
# 压缩吞吐量(MB/s)
compaction_throughput_mb_per_sec: 64
# 并发压缩
concurrent_compactors: 4
# 墓碑压缩阈值
tombstone_threshold: 0.2
tombstone_compaction_interval: 86400
六、IO优化 #
6.1 磁盘配置 #
yaml
# cassandra.yaml
# 数据目录(多磁盘)
data_file_directories:
- /data1/cassandra/data
- /data2/cassandra/data
- /data3/cassandra/data
# 提交日志(独立磁盘)
commitlog_directory: /commitlog/cassandra/commitlog
# 提交日志同步
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000
6.2 并发配置 #
yaml
# cassandra.yaml
# 并发读写
concurrent_reads: 32
concurrent_writes: 32
concurrent_counter_writes: 32
# 网络线程
native_transport_max_threads: 128
# 请求超时
read_request_timeout_in_ms: 5000
write_request_timeout_in_ms: 2000
七、监控与诊断 #
7.1 性能监控 #
bash
# 查看延迟
nodetool tablestats | grep -i latency
# 查看压缩
nodetool compactionstats
# 查看线程池
nodetool tpstats
# 查看缓存命中率
nodetool info | grep -i cache
7.2 性能诊断 #
sql
-- 启用查询追踪
TRACING ON;
SELECT * FROM users WHERE user_id = ?;
-- 查看执行计划
7.3 性能问题排查 #
text
常见性能问题:
读延迟高
├── 检查分区大小
├── 检查缓存命中率
├── 检查压缩状态
└── 检查墓碑数量
写延迟高
├── 检查MemTable刷新
├── 检查压缩队列
├── 检查磁盘IO
└── 检查并发配置
GC频繁
├── 检查堆内存大小
├── 检查对象创建
├── 调整GC参数
└── 检查内存泄漏
八、总结 #
性能优化要点:
- 数据模型:合理设计主键,控制分区大小
- 一致性级别:根据需求选择合适的级别
- 内存配置:合理配置堆内存和缓存
- 压缩策略:根据场景选择合适策略
- IO优化:多磁盘、独立提交日志
- 监控诊断:持续监控,及时发现问题
下一步,让我们学习监控与诊断!
最后更新:2026-03-27