数据库容量规划

规划维度

  • 存储容量:数据量、索引量、日志量
  • 计算资源:CPU、内存、I/O
  • 网络带宽:读写QPS、数据传输量
  • 时间维度:短期(3个月)、中期(1年)、长期(3年)

业务分析框架

业务特征 → 数据模型 → 容量估算 → 资源规划 → 监控预警

容量规划实施步骤

1、业务调研

-- 1.收集业务指标
-- 当前用户量、日活跃用户
-- 核心功能使用频次
-- 数据增长趋势

-- 2.分析访问模式
-- 读写比例
-- 峰值时段分布
-- 季节性波动

-- 3.数据生命周期
-- 热数据:最近1个月,需要高性能访问
-- 温数据:1-12个月,中等性能访问
-- 冷数据:12个月以上,归档存储

2、容量计算公式

存储容量计算

-- 单表容量 = 行数 × 平均行长度 × (1 + 索引系数)
-- 数据库总容量 = Σ(单表容量) × (1 + 冗余系数)

-- 示例计算
-- 用户表:1000万行 × 300字节 × 1.3 = 3.9GB
-- 订单表:3650万行 × 200字节 × 1.3 = 9.5GB
-- 日志表:36.5亿行 × 100字节 × 1.3 = 475GB

性能容量计算

-- QPS计算
-- 读QPS = DAU × 平均查询次数 / 86400 × 峰值系数
-- 写QPS = 日写入量 / 86400 × 峰值系数

-- 硬件需求
-- CPU:每核心支持1000 QPS(简单查询)
-- 内存:buffer pool = 数据量 × 0.8
-- 磁盘:IOPS = QPS × 每查询平均IO次数

3、分层存储策略

数据分层模型
-- 第一层:内存缓存(Redis/Memcached)
-- 热点数据:用户会话、商品库存、实时统计
-- 容量:32GB,TTL:1小时

-- 第二层:SSD存储(主数据库)
-- 活跃数据:最近3个月的交易、用户信息
-- 容量:500GB,响应时间:< 10ms

-- 第三层:HDD存储(历史数据)
-- 历史数据:3个月以上的订单、日志
-- 容量:2TB,响应时间:< 100ms

-- 第四层:对象存储(归档数据)
-- 冷数据:1年以上的数据,仅用于审计
-- 容量:无限制,响应时间:秒级
数据生命周期管理
-- 自动归档策略
-- 创建归档表
CREATE TABLE orders_archive_2017 LIKE orders;

-- 定期归档任务
INSERT INTO orders_archive_2017 
SELECT * FROM orders 
WHERE created_at < '2017-01-01';

DELETE FROM orders 
WHERE created_at < '2017-01-01';

-- 分区表自动管理
ALTER TABLE orders_partitioned 
DROP PARTITION p201701;

4、监控与预警

容量监控指标
-- 存储使用率监控
SELECT 
    table_schema,
    table_name,
    ROUND(((data_length + index_length) / 1024 / 1024), 2) as size_mb,
    table_rows
FROM information_schema.tables
WHERE table_schema = 'your_database'
ORDER BY size_mb DESC;

-- 增长率监控
SELECT 
    DATE(created_at) as date,
    COUNT(*) as daily_count,
    SUM(COUNT(*)) OVER (ORDER BY DATE(created_at)) as cumulative_count
FROM orders
WHERE created_at >= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)
GROUP BY DATE(created_at);
性能监控
-- QPS监控
SELECT 
    DATE_FORMAT(created_at, '%Y-%m-%d %H:%i') as minute,
    COUNT(*) as qps
FROM orders
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 HOUR)
GROUP BY minute
ORDER BY minute;

-- 慢查询监控
SELECT 
    query_time,
    lock_time,
    rows_examined,
    LEFT(sql_text, 100) as query_sample
FROM mysql.slow_log
WHERE start_time >= DATE_SUB(NOW(), INTERVAL 1 DAY)
ORDER BY query_time DESC
LIMIT 10;
预警阈值设置
-- 容量预警
-- 存储使用率 > 80%
-- 单表数据量 > 5000万行
-- 日增长率 > 预期150%

-- 性能预警
-- 平均响应时间 > 100ms
-- QPS > 系统承载能力80%
-- 慢查询数量 > 100个/小时

5、扩容策略

垂直扩容
-- 硬件升级
-- CPU:8核 → 16核
-- 内存:32GB → 64GB
-- 磁盘:HDD → SSD → NVMe

-- 数据库配置优化
SET GLOBAL innodb_buffer_pool_size = 51539607552; -- 48GB
SET GLOBAL innodb_log_file_size = 1073741824;     -- 1GB
SET GLOBAL max_connections = 2000;
水平扩容
-- 读写分离
-- 主库:处理写操作
-- 从库:处理读操作
-- 负载均衡:根据读写比例分发

-- 分库分表
-- 用户维度:user_id % 100
-- 时间维度:按月/年分表
-- 业务维度:按地区/业务线分库

-- 示例:分表查询路由
-- 查询用户123的订单
SELECT * FROM orders_23 WHERE user_id = 123; -- 123 % 100 = 23

-- 查询2019年1月的订单
SELECT * FROM orders_201901 WHERE created_at >= '2019-01-01';
架构演进路径
单机MySQL → 主从复制 → 分库分表 → 分布式数据库 → 多活架构

6、成本优化

存储成本优化
-- 数据压缩
-- 使用压缩算法减少存储空间
ALTER TABLE orders ROW_FORMAT=COMPRESSED;
select @@innodb_default_row_format;

-- 字段优化
-- 使用合适的数据类型
-- BIGINT → INT(数据量允许时)
-- TEXT → VARCHAR(适当长度)
-- 时间戳优化:TIMESTAMP vs DATETIME

-- 索引优化
-- 删除重复索引
-- 合并相似索引
-- 使用部分索引
计算成本优化
-- 查询优化
-- 避免全表扫描
-- 使用覆盖索引
-- 合理使用缓存

-- 批处理优化
-- 批量插入代替逐条插入
-- 定时任务合并小事务
-- 异步处理非核心业务

7、常见误区

  • 过度设计:初期就规划过大容量
  • 忽视增长:未考虑业务发展趋势
  • 单点关注:只关注存储忽视性能
  • 静态规划:规划后不根据实际调整

典型业务场景分析

1、电商平台

业务特征
-- 核心业务实体
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50),
    email VARCHAR(100),
    phone VARCHAR(20),
    avatar_url VARCHAR(500),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE products (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(200),
    description TEXT,
    price DECIMAL(10,2),
    images JSON,
    category_id INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE orders (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT,
    order_no VARCHAR(32),
    total_amount DECIMAL(10,2),
    status TINYINT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE order_items (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    order_id BIGINT,
    product_id BIGINT,
    quantity INT,
    price DECIMAL(10,2)
);

容量估算模型

-- 假设业务规模:
-- 用户数:100万注册用户,10万日活
-- 商品数:50万SKU
-- 订单量:日均1万单,峰值3万单

-- 1. 存储容量估算
-- 用户表:1M用户 × 300字节/用户 = 300MB
-- 商品表:500K商品 × 2KB/商品 = 1GB
-- 订单表(年):3.65M订单 × 200字节/订单 = 730MB
-- 订单明细(年):7.3M明细 × 100字节/明细 = 730MB

-- 2. 索引容量估算(约为数据量的30%)
-- 总索引大小:(300MB + 1GB + 730MB + 730MB) × 0.3 = 822MB

-- 3. 日志和备份(约为数据量的50%)
-- 日志空间:2.76GB × 0.5 = 1.38GB

-- 年度存储总需求:2.76GB + 0.82GB + 1.38GB = 4.96GB ≈ 5GB

性能容量规划

-- QPS估算
-- 读操作:商品浏览、订单查询等
-- 峰值读QPS:10万DAU × 平均30次查询/天 ÷ 86400秒 × 3倍峰值 = 104 QPS

-- 写操作:下单、支付、状态更新等
-- 峰值写QPS:3万单/天 ÷ 86400秒 × 10倍峰值 = 3.5 QPS

-- 硬件资源估算
-- CPU:8核心(支持500+ QPS)
-- 内存:16GB(buffer pool 8GB + 系统开销)
-- 磁盘:SSD 100GB(含3年数据增长)
-- 网络:千兆带宽

2、社交媒体平台

业务特征
-- 用户关系网络
CREATE TABLE user_follows (
    follower_id BIGINT,
    followee_id BIGINT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (follower_id, followee_id)
);

-- 内容发布
CREATE TABLE posts (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT,
    content TEXT,
    images JSON,
    likes_count INT DEFAULT 0,
    comments_count INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 互动数据
CREATE TABLE post_likes (
    post_id BIGINT,
    user_id BIGINT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (post_id, user_id)
);

CREATE TABLE comments (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    post_id BIGINT,
    user_id BIGINT,
    content TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

容量增长模型

-- 业务假设:
-- 用户:500万注册,50万日活
-- 内容:日均发布10万条动态
-- 互动:日均100万次点赞,20万条评论

-- 存储增长预测(年度)
-- 用户关系:5M用户 × 100个关注 × 16字节 = 8GB
-- 动态内容:36.5M动态 × 1KB/动态 = 36.5GB
-- 点赞数据:365M点赞 × 16字节 = 5.8GB
-- 评论数据:73M评论 × 500字节 = 36.5GB

-- 总存储(含索引):(8 + 36.5 + 5.8 + 36.5) × 1.3 = 113GB

分库分表策略

-- 用户维度分片
CREATE TABLE posts_001 LIKE posts; -- user_id % 100 = 1
CREATE TABLE posts_002 LIKE posts; -- user_id % 100 = 2
-- ... 分100个表

-- 时间维度分片
CREATE TABLE posts_201901 LIKE posts; -- 按月分表
CREATE TABLE posts_201902 LIKE posts;

-- 分片路由示例
-- 查询用户动态:SELECT * FROM posts_001 WHERE user_id = 12345001
-- 查询最新动态:SELECT * FROM posts_201901 WHERE created_at > '2019-01-01'

3、金融交易系统 

业务特征
-- 交易流水
CREATE TABLE transactions (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    account_id BIGINT,
    transaction_type TINYINT, -- 1:转入 2:转出 3:消费 4:退款
    amount DECIMAL(15,2),
    balance DECIMAL(15,2),
    counterparty VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 账户表
CREATE TABLE accounts (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT,
    account_type TINYINT,
    balance DECIMAL(15,2),
    frozen_amount DECIMAL(15,2) DEFAULT 0,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

-- 风控记录
CREATE TABLE risk_logs (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    account_id BIGINT,
    risk_type VARCHAR(50),
    risk_level TINYINT,
    description TEXT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

高并发容量规划

-- 业务量级:
-- 账户数:1000万
-- 日交易量:1000万笔
-- 峰值TPS:10000笔/秒

-- 存储容量估算
-- 交易流水(年):36.5亿笔 × 200字节 = 730GB
-- 账户数据:1000万 × 100字节 = 1GB
-- 风控日志(年):3.65亿条 × 300字节 = 109.5GB

-- 性能要求
-- 读QPS:50000(账户查询、交易查询)
-- 写QPS:10000(交易写入)
-- 响应时间:< 100ms

-- 硬件配置
-- CPU:32核心(支持高并发)
-- 内存:128GB(大内存缓存)
-- 磁盘:NVMe SSD 2TB(高IOPS)
-- 网络:10Gbps

 

posted @ 2020-07-08 14:09  lvlin241  阅读(1265)  评论(0)    收藏  举报