Qcon 2011:Beansdb 的设计与实现

5,772 views

Published on

QCon 上的演讲: Beansdb 的设计与实现

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,772
On SlideShare
0
From Embeds
0
Number of Embeds
3,544
Actions
Shares
0
Downloads
59
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Qcon 2011:Beansdb 的设计与实现

  1. 1. BeansDB 设计与实现 刘洪清 Davies@douban.com 2011/4/811年4月8日星期五
  2. 2. •需求 • 设计 • 实现 • 回顾11年4月8日星期五
  3. 3. 产品需求11年4月8日星期五
  4. 4. 产品需求 • 图片 • 头像,个人相册, 图片墙 • 电台单曲11年4月8日星期五
  5. 5. 产品需求 • 图片 • 头像,个人相册, 图片墙 • 电台单曲 • 长文本 • 评论,日记,作品,博客, 小组话题 • 用户属性, 条目属性11年4月8日星期五
  6. 6. 技术需求11年4月8日星期五
  7. 7. 技术需求 • 存储大量小文件(字段)11年4月8日星期五
  8. 8. 技术需求 • 存储大量小文件(字段) • 可扩展性11年4月8日星期五
  9. 9. 技术需求 • 存储大量小文件(字段) • 可扩展性 • 可靠性11年4月8日星期五
  10. 10. 技术需求 • 存储大量小文件(字段) • 可扩展性 • 可靠性 • 可用性11年4月8日星期五
  11. 11. 技术需求 • 存储大量小文件(字段) • 可扩展性 • 可靠性 • 可用性 • 一致性11年4月8日星期五
  12. 12. 技术需求 • 存储大量小文件(字段) • 可扩展性 • 可靠性 • 可用性 • 一致性 • 低成本11年4月8日星期五
  13. 13. 两个原则11年4月8日星期五
  14. 14. 两个原则 • KISS11年4月8日星期五
  15. 15. 两个原则 • KISS • 尽量复用开源方案11年4月8日星期五
  16. 16. 初步方案11年4月8日星期五
  17. 17. 初步方案 • 存储大量小文件 • key/value, get/set/delete • hash, bucket11年4月8日星期五
  18. 18. 初步方案 • 存储大量小文件 • key/value, get/set/delete • hash, bucket • 可扩展性 • 独立存储节点,独立数据目录 • bucket 扩展11年4月8日星期五
  19. 19. 初步方案 Node1 Node2 Node3 Node4 set a get b Clients11年4月8日星期五
  20. 20. 深入设计11年4月8日星期五
  21. 21. 深入设计 • 可靠性 • 多机冗余(N=3) • 同步写, 依次读11年4月8日星期五
  22. 22. 深入设计 • 可靠性 • 多机冗余(N=3) • 同步写, 依次读 • 一致性 • 最终一致性 • Hash Tree 同步 (外部脚本) • 冲突: 独立版本号+更新时间11年4月8日星期五
  23. 23. Node1 Node2 Node3 Node4 Proxy 1 Clients11年4月8日星期五
  24. 24. Node1 Node2 Node3 Node4 Proxy 1 set a Clients11年4月8日星期五
  25. 25. Node1 Node2 Node3 Node4 Proxy 1 set a get b Clients11年4月8日星期五
  26. 26. Sync with HT Node1 Node2 Node3 Node4 Proxy 1 set a get b Clients11年4月8日星期五
  27. 27. Sync with HT Node1 Node2 Node3 Node4 Proxy 1 Node5 set a get b Clients11年4月8日星期五
  28. 28. Sync with HT Node1 Node2 Node3 Node4 Proxy 1 Node5 set a get b Clients11年4月8日星期五
  29. 29. Sync with HT Node1 Node2 Node3 Node4 Sync Proxy 1 Node5 set a get b Clients11年4月8日星期五
  30. 30. Sync with HT Node1 Node2 Node3 Node4 Sync Proxy 1 Node5 set a get b Clients11年4月8日星期五
  31. 31. Sync with HT Node1 Node2 Node3 Node4 Sync Proxy 1 Node5 set a get b Clients11年4月8日星期五
  32. 32. 存储节点实现11年4月8日星期五
  33. 33. 存储节点实现 • Key/Value存储引擎 • ACID(宽松)11年4月8日星期五
  34. 34. 存储节点实现 • Key/Value存储引擎 • ACID(宽松) • 网络协议 • memcache 协议11年4月8日星期五
  35. 35. 存储节点实现 • Key/Value存储引擎 • ACID(宽松) • 网络协议 • memcache 协议 • 同步接口 • Hash Tree(哈希树)11年4月8日星期五
  36. 36. 存储节点实现 • Key/Value存储引擎 • ACID(宽松) • 网络协议 • memcache 协议 • 同步接口 • Hash Tree(哈希树) • 多线程模型11年4月8日星期五
  37. 37. 存储引擎11年4月8日星期五
  38. 38. 存储引擎 • Tokyo Cabinet • 简单, 轻量, 小数据时性能不错 • crash, 大数据量时性能不好11年4月8日星期五
  39. 39. 存储引擎 • Tokyo Cabinet • 简单, 轻量, 小数据时性能不错 • crash, 大数据量时性能不好 • Berkeley DB • 过重, 存储稍大的文件性能不好11年4月8日星期五
  40. 40. 存储引擎 • Tokyo Cabinet • 简单, 轻量, 小数据时性能不错 • crash, 大数据量时性能不好 • Berkeley DB • 过重, 存储稍大的文件性能不好 • Bitcask • 内存索引 + 日志结构数据文件11年4月8日星期五
  41. 41. 内存索引 追加写入数据格式 Bitcask11年4月8日星期五
  42. 42. 内存索引 追加写入 hint数据格式 Bitcask11年4月8日星期五
  43. 43. 优化Bitcask11年4月8日星期五
  44. 44. 优化Bitcask • 每bucket一个Bitcask11年4月8日星期五
  45. 45. 优化Bitcask • 每bucket一个Bitcask • 数据空间 • 256 对齐, 最多256个, 自动压缩 • 在线GC, 外部控制11年4月8日星期五
  46. 46. 优化Bitcask • 每bucket一个Bitcask • 数据空间 • 256 对齐, 最多256个, 自动压缩 • 在线GC, 外部控制 • 启动时间 • hint 文件, QuickLZ L3压缩 • 多线程11年4月8日星期五
  47. 47. Hash Tree 0 Node 1 key1 Key key2 Version 2 key3 Hash Root key4 Position 0 3 Hash(Key) = 0x02f93fea Bucket 0 0 e Hash 1 f Count11年4月8日星期五
  48. 48. Hash Tree优化11年4月8日星期五
  49. 49. Hash Tree优化 • Hash Table11年4月8日星期五
  50. 50. Hash Tree优化 • Hash Table • Node, Item 连续存放 • {1}{16}{256} • {Size, Count, [{Ver, Hash, Pos, Key}, ....] • 128 个自动分裂11年4月8日星期五
  51. 51. Hash Tree优化 • Hash Table • Node, Item 连续存放 • {1}{16}{256} • {Size, Count, [{Ver, Hash, Pos, Key}, ....] • 128 个自动分裂 • 重新编码key • /topic/1234567/body=>{/topic/%d/body, 123}11年4月8日星期五
  52. 52. 同步过程 节点 A 节点 B 客户端 时间11年4月8日星期五
  53. 53. 同步过程 节点 A V1 节点 B V1 客户端 Set 时间11年4月8日星期五
  54. 54. 同步过程 节点 A V1 V1 节点 B V1 客户端 Set 时间11年4月8日星期五
  55. 55. 同步过程 节点 A V1 V1 节点 B V1 V2 客户端 Set Set 时间11年4月8日星期五
  56. 56. 同步过程 节点 A V1 V1 V2 Sync 节点 B V1 V2 客户端 Set Set 时间11年4月8日星期五
  57. 57. 同步过程 节点 A V1 V1 V2 Sync 节点 B V1 V2 V2 客户端 Set Set 时间11年4月8日星期五
  58. 58. 同步过程 节点 A V1 V1 V2 Sync 节点 B V1 V2 V2 客户端 Set Set Get 时间11年4月8日星期五
  59. 59. 同步过程 节点 A V1 V1 V2 V-3 Sync 节点 B V1 V2 V2 客户端 Set Set Get Delete 时间11年4月8日星期五
  60. 60. 同步过程 节点 A V1 V1 V2 V-3 Sync Sync 节点 B V1 V2 V2 V-3 客户端 Set Set Get Delete 时间11年4月8日星期五
  61. 61. 同步过程 节点 A V1 V1 V2 V-3 Sync Sync 节点 B V1 V2 V2 V-3 客户端 Set Set Get Delete GC 时间11年4月8日星期五
  62. 62. 网络协议11年4月8日星期五
  63. 63. 网络协议 • memcache 文本协议 • 复用memcached的网络协议层代码 • 有大量客户端可用11年4月8日星期五
  64. 64. 网络协议 • memcache 文本协议 • 复用memcached的网络协议层代码 • 有大量客户端可用 • 适当扩展 • @fff, ?xxxx, flush_all • get_multi, set_multi, delete_multi11年4月8日星期五
  65. 65. IO与多线程模型11年4月8日星期五
  66. 66. IO与多线程模型 • 并发与IO • 并发连接多, 并发请求少 • 异步网络IO, 同步磁盘IO11年4月8日星期五
  67. 67. IO与多线程模型 • 并发与IO • 并发连接多, 并发请求少 • 异步网络IO, 同步磁盘IO • 多线程模型 • 多个连接与线程绑定 • 半同步, 半异步 • leader follower11年4月8日星期五
  68. 68. Leader-Follower模型 Leader try to lock wait for event Mutex remove event fd unlock Follower do the work (blocking)11年4月8日星期五
  69. 69. Proxy 实现11年4月8日星期五
  70. 70. Proxy 实现 • Go 实现 • 易于实现高并发应用, 性能可接受11年4月8日星期五
  71. 71. Proxy 实现 • Go 实现 • 易于实现高并发应用, 性能可接受 • 自动路由 • 根据 Merkle Tree得到数据分布 • 更高可用性11年4月8日星期五
  72. 72. Proxy 实现 • Go 实现 • 易于实现高并发应用, 性能可接受 • 自动路由 • 根据 Merkle Tree得到数据分布 • 更高可用性 • 负载均衡 • 减少IO慢的节点的请求量11年4月8日星期五
  73. 73. 版本历史11年4月8日星期五
  74. 74. 版本历史 • 0.1, like MogileFS 2008.8 • WebDAV, inotify, sync, client11年4月8日星期五
  75. 75. 版本历史 • 0.1, like MogileFS 2008.8 • WebDAV, inotify, sync, client • 0.2, like TokyoTrant 2008.12 • TC, HTree, sync, mc client11年4月8日星期五
  76. 76. 版本历史 • 0.1, like MogileFS 2008.8 • WebDAV, inotify, sync, client • 0.2, like TokyoTrant 2008.12 • TC, HTree, sync, mc client • 0.3, like memcachedb 2009.6 • HTree in TC, on Disk11年4月8日星期五
  77. 77. 版本历史(2)11年4月8日星期五
  78. 78. 版本历史(2) • 0.4 2010.2 • proxy11年4月8日星期五
  79. 79. 版本历史(2) • 0.4 2010.2 • proxy • 0.5 reload 2010.10 • Bitcask, Leader/Follower11年4月8日星期五
  80. 80. 实际部署案例(1)11年4月8日星期五
  81. 81. 实际部署案例(1) • 数据量 • 图片, 音频: 1k到20M • 310M x 3 = 930 M • 590G x 16 x 3 = 28T • 17 个节点, 约 50 块SATA硬盘11年4月8日星期五
  82. 82. 实际部署案例(1) • 数据量 • 图片, 音频: 1k到20M • 310M x 3 = 930 M • 590G x 16 x 3 = 28T • 17 个节点, 约 50 块SATA硬盘 • 性能: • 250 qps左右, 有CDN • Med/Avg/90%/99%: 16/29/69/232 ms11年4月8日星期五
  83. 83. 各节点数据分布11年4月8日星期五
  84. 84. 线上运行状态截图 (图片, mp3, 3亿)11年4月8日星期五
  85. 85. 11年4月8日星期五
  86. 86. 实际部署案例(2)11年4月8日星期五
  87. 87. 实际部署案例(2) • 数据量 • 文本字段: 100到100k • 550M x 3 = 1.65 B • 50G x 16 x 3 = 2.4T • 13 个节点, 约 13 块SATA硬盘11年4月8日星期五
  88. 88. 实际部署案例(2) • 数据量 • 文本字段: 100到100k • 550M x 3 = 1.65 B • 50G x 16 x 3 = 2.4T • 13 个节点, 约 13 块SATA硬盘 • 性能: • 200 qps左右, 有memcached作缓存 • Med/Avg/90%/99%: 1/14/15/104 ms11年4月8日星期五
  89. 89. Thanks! Q/A ?11年4月8日星期五
  90. 90. 原型开发11年4月8日星期五
  91. 91. 原型开发 • 原型开发 • 快速验证想法11年4月8日星期五
  92. 92. 原型开发 • 原型开发 • 快速验证想法 • Python • Cython 扩展11年4月8日星期五
  93. 93. 原型开发 • 原型开发 • 快速验证想法 • Python • Cython 扩展 • Go • cgo 扩展, 容易开发高并发应用11年4月8日星期五

×