海量统计数据的分布式MySQL集群——MyFOX
Upcoming SlideShare
Loading in...5
×
 

海量统计数据的分布式MySQL集群——MyFOX

on

  • 8,299 views

 

Statistics

Views

Total Views
8,299
Views on SlideShare
8,299
Embed Views
0

Actions

Likes
13
Downloads
235
Comments
1

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • 真过瘾,难怪用node.js重写
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

海量统计数据的分布式MySQL集群——MyFOX 海量统计数据的分布式MySQL集群——MyFOX Presentation Transcript

  • 海量统计数据的分布式MySQL集群
  • 关于我自己
    朋春:
    • 2006年,百度
    • 2010年,淘宝,数据产品化团队
    • PHPER,VI党
  • 关于MyFOX—概况
    目前:
    • 8个节点,16台MySQL
    • 300 * 12 * 0.5 * 8 = 14T存储空间
    • 每天超过4亿条记录
    • 每天40G原始数据
  • 关于MyFOX—成本
    • 4W * (16 + 2) = 72W
    • 14T存储空间
    • 30%压缩率
    • 72 / 14 * 0.3 = 1.54W / T
  • 关于MyFOX—速度
  • 我们将要讨论什么?
    • 背景
    • 架构与数据装载
    • 数据的透明查询
    • 一些小故事
  • 背景
  • 数据量
  • 成本(Oracle)
  • 我们需要什么?
    • 去O
    • SQL查询
    • 海量存储
    • 可横向扩展
    • 对应用透明
    • 兼顾性能
  • 选择?
  • 应用特点—写入
    • 离线数据
    • 批量写入(4亿+ )
    • 分表分库规则
  • 应用特点—查询
    SELECT b.brand_nameAS f0, FLOOR(SUM(p.gmv_trade_amt)) AS f1, FLOOR(SUM(p.gmv_trade_amt)) AS f11, SUM(p.gmv_auction_num) AS f2,
    SUM(p.gmv_winner_num) AS f3
    FROM rpt_brand_info_dAS p
    INNER JOIN dim_brand AS b
    ON b.brand_id = p.brand_id
    WHERE p.category_id in ('1101')
    ANDp.thedate <= '2011-03-10'
    ANDp.thedate >= '2011-03-08'
    GROUP BY b.brand_name
    ORDER BY SUM(p.gmv_trade_amt) DESC LIMIT 1500
    • 大量聚合函数
    • JOIN
    • 可缓存
  • 我们需要
    数据
    魔方
    云梯
    MyFOX
    数据查询
    数据装载
    存储集群
    MyISAM
  • 小结
    MyFOX是什么?
    • 中间层
    • 负责
    • 数据装载
    • 透明查询
  • 架构与数据装载
  • 部署架构
    M
    路由信息库
    MyFOX(虚拟机)
    S
    热节点(MySQL)
    冷节点(MySQL)
    15k SAS硬盘,300G * 12,8节点
    7.2k SATA硬盘,1T * 12,8节点
    MySQL
    MySQL
    MySQL
    MySQL
    MySQL
    =
    =
    =
  • 数据装载
    切分
    装载
    云梯
    OLAP集群
    中间层
    路由表
  • 切分规则—冗余复制
    • 每个机器上都保存一份完整的数据
    • 适用于
    • 小表
    • 被频繁访问
    • 可能被JOIN
  • 切分规则—字段哈希
    • 按给定字段的值分区
    • 每个节点上保存一个分区
  • 切分规则—条目切割
    • 按字段哈希分区
    • 然后每N行切片
    • 切片装桶
  • 示例:条目切割
    • 分区
    • 切片
    • 阈值(200W)
    • 上浮动(5%)
    • 装桶
    • 一个桶装满再开新桶
    • “桶”即实际的物理表
    rpt_topranks_v3^Athedate=20100816, toprank_id=11^A2090000
    rpt_topranks_v3^Athedate=20100816, toprank_id=12^A2120000
    rpt_topranks_v3^Athedate=20100816, toprank_id=13^A760000
    rpt_topranks_v3^Athedate=20100816, toprank_id=14^A289
    thedate=20100816, toprank_id=11^A2090000
    thedate=20100816, toprank_id=12^A2000000
    thedate=20100816, toprank_id=12^A120000
    thedate=20100816, toprank_id=13^A760000
    thedate=20100816, toprank_id=14^A289
    thedate=20100816, toprank_id=11^A2090000
    thedate=20100816, toprank_id=14^A289
    thedate=20100816, toprank_id=12^A2000000
    thedate=20100816, toprank_id=13^A760000
    thedate=20100816, toprank_id=12^A120000
    rpt_topranks_v3_0.t_a10_22
  • 数据装载
    • 接口异步化
    • LOAD DATA LOCAL INFILE …
    • 节点之间并行
    • 节点内轮流翻转
  • 数据装载—原子性
    • 全量数据(REPLACE)
    • Begin:CREATE TABLE table_$pid ...
    • Query: LOAD DATA … INTO TABLE table_$pid ...
    • Commit:RENAME TABLE table TO table_bak, table_$pid TO table
    • Rollback: DROP TABLE table_$pid
  • 数据装载—原子性
    • 增量数据(APPEND)
    • Begin: SELECT MAX(autokid) FROM table
    • Query: LOAD DATA … INTO TABLE table ...
    • Commit:DELETE FROM table WHERE autokid <= ? AND 路由值
    • Rollback:DELETE FROM TABLE table WHERE autokid > ?
  • 路由值
    • 稀疏索引
    • KEY -> VALUE
    • 枚举特征
    mysql > SELECT route_value, node, path, hittimeFROM new_route_info_10 LIMIT 1G
    *********************** 1 row **************************
    route_value : rpt_topranks_v3:{“thedate”:20110308,”toprank_id”:110}
    node : 7
    path : rpt_topranks_v3_5.t_9e_438
    hittime : 2011-03-09 02:27:33
  • 思考
    • 如何纵向扩容(增加副本)?
    • 如何横向扩容(增加节点)?
  • 数据迁移
    DB1
    • 横向扩容
    • 冷数据迁出
    • 好钢用在刀刃上
    • 内存硬盘比
    • 方法
    • scp文件
    • SELECT TO OUTFILE,LOAD DATA INFILE …
    • federated
    APP
    DB2
  • 压缩存储
    • 非常适合压缩
    • 方法
    • myisampack
    • myisamchk
    • 结果
    • 压缩率29.84%
    • 查询慢10%
  • 监控预警
    • 装载队列
    • 队列滞塞
    • 装载错误
    • 数据一致性
    • COUNT
    • 抽样checksum
    • 数据均衡性
    • 超大分片
  • 小结
  • 数据的透明查询
  • 瞧瞧这个SQL:
    SELECT IF(INSTR(f.keyword,' ') > 0, UPPER(TRIM(f.keyword)), CONCAT(b.brand_name,' ',UPPER(TRIM(f.keyword)))) AS f0,
    SUM(f.search_num) AS f1,
    SUM(f.uv) AS f2,
    ROUND(SUM(f.search_num) / SUM(f.uv), 2) AS f3,
    AVG(f.uv) AS f4
    FROM dm_fact_keyword_brand_d f
    INNER JOIN dim_brand b ON f.keyword_brand_id = b.brand_id
    WHERE f.keyword_type_id = 1 AND f.keyword != ''
    AND keyword_cat_id IN ('50002535')
    AND thedate <= '2011-03-10'
    AND thedate >= '2011-03-08'
    GROUP BY f0
    ORDER BY SUM(f.search_num) DESC LIMIT 0, 1500
  • 数据查询
    缓存
    路由层
    SQL解析
    APC
    语义理解
    查询路由
    字段改写
    分片SQL
    计算规则
    查询层
    取分片数据
    缓存
    计算层
    结果合并
  • 路由层—语义理解
    WHEREthedate <= '2011-03-10'
    AND thedate > '2011-03-07'
    AND toprank_id IN (2, 3)
    AND aa NOT LIKE 'lalala%'
    toprank_id
    thedate
    thedate:20110308,toprank_id:2
  • 路由层—语义理解
    • 多表JOIN如何处理?
  • 路由层—字段改写
    SELECT a AS f0,
    SUM(f.search_num) AS f1,
    SUM(f.uv) AS f2,
    ROUND(SUM(f.search_num) / SUM(f.uv), 2) AS f3,
    AVG(f.uv) AS f4
    • AVG(aa)
    • 1 + SUM(aa)
    • SELECT a FROM … ORDER BY b
    • 重复查询列
  • 查询层—取分片数据
    • 困难
    • 分片SQL很多
    • PHP单线程
    • MySQL查询阻塞
    • 异步并发
    • nginx + drizzle
    • http协议,curl_multi_get
    • JSON格式
    查询SQL
    nginx
    drizzle
    mysql
  • 查询层—数据缓存
    • 缓存哪部分数据?
    • 最终结果
    • 分片数据
    缓存
    查询层
    取分片数据
    缓存
    计算层
    结果合并
  • 计算层—无聚合字段
    • 分片是有序的
    • 二路归并
    • LIMIT运算
  • 计算层—有聚合字段
    • 分片是有序的
    • 聚合规则处理(SUM, MAX, MIN, DISTINCT)
    • 表达式求值
    • 堆排序
    • LIMIT运算
  • 我压力很大
    SELECT ...
    FROM ...
    ORDER BY SUM(aa) DESC LIMIT 0, 10
    LIMIT 0, 1000
    SELECT ...
    FROM ...
    ORDER BY AVG(aa) DESC LIMIT 0, 10
    *#?&*)(*)^&*%^&%&
  • 小结
    • 三层
    • 缓存策略
    • Alpha = 80:
    • 跨节点JOIN
    • COUNT(DISTINCT …)
    • OR逻辑
    • 子查询、UNION查询
    • 不可穷举的路由字段
  • 一些小故事
  • 小流量实验
  • 未经过QA的产品
    • 黑盒测试不好搞
    • 单元测试
    • 8k行程序,10k行测试代码
    • 88.1%测试覆盖率
  • 缓存失效
  • 索引使用
    SELECTobject_idAS id …
    FROM rpt_topranks_v3
    WHERE partition_by1 = 1101
    SELECTobject_idAS id …
    FROM rpt_topranks_v3
    WHEREpartition_by1 + 0 > ?
    AND partition_by1 + 0 < ?
  • 谢谢各位
    朋春
    pengchun@taobao.com