Qcon 2011:Beansdb 的设计与实现

  • 3,710 views
Uploaded on

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

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

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
3,710
On Slideshare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
51
Comments
0
Likes
5

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

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