qcon 2011:beansdb 的设计与实现

93
BeansDB 设计与实现 刘洪清 [email protected] 2011/4/8 11年4月8日星期五

Upload: davies-liu

Post on 20-May-2015

4.094 views

Category:

Technology


4 download

DESCRIPTION

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

TRANSCRIPT

Page 1: Qcon 2011:Beansdb 的设计与实现

BeansDB 设计与实现

刘洪清[email protected]

2011/4/8

11年4月8日星期五

Page 2: Qcon 2011:Beansdb 的设计与实现

•需求•设计•实现•回顾

11年4月8日星期五

Page 3: Qcon 2011:Beansdb 的设计与实现

产品需求

11年4月8日星期五

Page 4: Qcon 2011:Beansdb 的设计与实现

产品需求•图片• 头像,个人相册, 图片墙

• 电台单曲

11年4月8日星期五

Page 5: Qcon 2011:Beansdb 的设计与实现

产品需求•图片• 头像,个人相册, 图片墙

• 电台单曲•长文本• 评论,日记,作品,博客, 小组话题

• 用户属性, 条目属性

11年4月8日星期五

Page 6: Qcon 2011:Beansdb 的设计与实现

技术需求

11年4月8日星期五

Page 7: Qcon 2011:Beansdb 的设计与实现

技术需求•存储大量小文件(字段)

11年4月8日星期五

Page 8: Qcon 2011:Beansdb 的设计与实现

技术需求•存储大量小文件(字段)

•可扩展性

11年4月8日星期五

Page 9: Qcon 2011:Beansdb 的设计与实现

技术需求•存储大量小文件(字段)

•可扩展性•可靠性

11年4月8日星期五

Page 10: Qcon 2011:Beansdb 的设计与实现

技术需求•存储大量小文件(字段)

•可扩展性•可靠性•可用性

11年4月8日星期五

Page 11: Qcon 2011:Beansdb 的设计与实现

技术需求•存储大量小文件(字段)

•可扩展性•可靠性•可用性•一致性

11年4月8日星期五

Page 12: Qcon 2011:Beansdb 的设计与实现

技术需求•存储大量小文件(字段)

•可扩展性•可靠性•可用性•一致性•低成本

11年4月8日星期五

Page 13: Qcon 2011:Beansdb 的设计与实现

两个原则

11年4月8日星期五

Page 14: Qcon 2011:Beansdb 的设计与实现

两个原则

•KISS

11年4月8日星期五

Page 15: Qcon 2011:Beansdb 的设计与实现

两个原则

•KISS

•尽量复用开源方案

11年4月8日星期五

Page 16: Qcon 2011:Beansdb 的设计与实现

初步方案

11年4月8日星期五

Page 17: Qcon 2011:Beansdb 的设计与实现

初步方案•存储大量小文件• key/value, get/set/delete

• hash, bucket

11年4月8日星期五

Page 18: Qcon 2011:Beansdb 的设计与实现

初步方案•存储大量小文件• key/value, get/set/delete

• hash, bucket

•可扩展性• 独立存储节点,独立数据目录

• bucket 扩展

11年4月8日星期五

Page 19: Qcon 2011:Beansdb 的设计与实现

Node1 Node2 Node3 Node4

get b

Clients

set a

初步方案

11年4月8日星期五

Page 20: Qcon 2011:Beansdb 的设计与实现

深入设计

11年4月8日星期五

Page 21: Qcon 2011:Beansdb 的设计与实现

深入设计•可靠性• 多机冗余(N=3)

• 同步写, 依次读

11年4月8日星期五

Page 22: Qcon 2011:Beansdb 的设计与实现

深入设计•可靠性• 多机冗余(N=3)

• 同步写, 依次读

•一致性• 最终一致性• Hash Tree 同步 (外部脚本)

• 冲突: 独立版本号+更新时间

11年4月8日星期五

Page 23: Qcon 2011:Beansdb 的设计与实现

Proxy 1

Node1 Node2 Node3 Node4

Clients

11年4月8日星期五

Page 24: Qcon 2011:Beansdb 的设计与实现

Proxy 1

Node1 Node2 Node3 Node4

set a

Clients

11年4月8日星期五

Page 25: Qcon 2011:Beansdb 的设计与实现

Proxy 1

Node1 Node2 Node3 Node4

set a

Clients

get b

11年4月8日星期五

Page 26: Qcon 2011:Beansdb 的设计与实现

Sync with HT

Proxy 1

Node1 Node2 Node3 Node4

set a

Clients

get b

11年4月8日星期五

Page 27: Qcon 2011:Beansdb 的设计与实现

Sync with HT

Proxy 1

Node1 Node2 Node3 Node4

set a

Clients

get bNode5

11年4月8日星期五

Page 28: Qcon 2011:Beansdb 的设计与实现

Sync with HT

Proxy 1

Node1 Node2 Node3 Node4

set a

Clients

get bNode5

11年4月8日星期五

Page 29: Qcon 2011:Beansdb 的设计与实现

Sync with HT

Proxy 1

Node1 Node2 Node3 Node4

set a

Clients

get bNode5

Sync

11年4月8日星期五

Page 30: Qcon 2011:Beansdb 的设计与实现

Sync with HT

Proxy 1

Node1 Node2 Node3 Node4

set a

Clients

get bNode5

Sync

11年4月8日星期五

Page 31: Qcon 2011:Beansdb 的设计与实现

Sync with HT

Proxy 1

Node1 Node2 Node3 Node4

set a

Clients

get bNode5

Sync

11年4月8日星期五

Page 32: Qcon 2011:Beansdb 的设计与实现

存储节点实现

11年4月8日星期五

Page 33: Qcon 2011:Beansdb 的设计与实现

存储节点实现•Key/Value存储引擎

• ACID(宽松)

11年4月8日星期五

Page 34: Qcon 2011:Beansdb 的设计与实现

存储节点实现•Key/Value存储引擎

• ACID(宽松)

•网络协议• memcache 协议

11年4月8日星期五

Page 35: Qcon 2011:Beansdb 的设计与实现

存储节点实现•Key/Value存储引擎

• ACID(宽松)

•网络协议• memcache 协议

•同步接口• Hash Tree(哈希树)

11年4月8日星期五

Page 36: Qcon 2011:Beansdb 的设计与实现

存储节点实现•Key/Value存储引擎

• ACID(宽松)

•网络协议• memcache 协议

•同步接口• Hash Tree(哈希树)

•多线程模型11年4月8日星期五

Page 37: Qcon 2011:Beansdb 的设计与实现

存储引擎

11年4月8日星期五

Page 38: Qcon 2011:Beansdb 的设计与实现

存储引擎•Tokyo Cabinet

• 简单, 轻量, 小数据时性能不错

• crash, 大数据量时性能不好

11年4月8日星期五

Page 39: Qcon 2011:Beansdb 的设计与实现

存储引擎•Tokyo Cabinet

• 简单, 轻量, 小数据时性能不错

• crash, 大数据量时性能不好

•Berkeley DB

• 过重, 存储稍大的文件性能不好

11年4月8日星期五

Page 40: Qcon 2011:Beansdb 的设计与实现

存储引擎•Tokyo Cabinet

• 简单, 轻量, 小数据时性能不错

• crash, 大数据量时性能不好

•Berkeley DB

• 过重, 存储稍大的文件性能不好

•Bitcask

• 内存索引 + 日志结构数据文件

11年4月8日星期五

Page 41: Qcon 2011:Beansdb 的设计与实现

Bitcask

内存索引

数据格式

追加写入

11年4月8日星期五

Page 42: Qcon 2011:Beansdb 的设计与实现

Bitcask

内存索引

数据格式

追加写入

hint

11年4月8日星期五

Page 43: Qcon 2011:Beansdb 的设计与实现

优化Bitcask

11年4月8日星期五

Page 44: Qcon 2011:Beansdb 的设计与实现

优化Bitcask•每bucket一个Bitcask

11年4月8日星期五

Page 45: Qcon 2011:Beansdb 的设计与实现

优化Bitcask•每bucket一个Bitcask

•数据空间• 256 对齐, 最多256个, 自动压缩

• 在线GC, 外部控制

11年4月8日星期五

Page 46: Qcon 2011:Beansdb 的设计与实现

优化Bitcask•每bucket一个Bitcask

•数据空间• 256 对齐, 最多256个, 自动压缩

• 在线GC, 外部控制

•启动时间• hint 文件, QuickLZ L3压缩

• 多线程11年4月8日星期五

Page 47: Qcon 2011:Beansdb 的设计与实现

Hash Tree

0

key1key2key3key4

1

2

3

e

f

0

Bucket 0

KeyVersionHash

PositionHash(Key) = 0x02f93fea

Node

HashCount

0

1

Root

11年4月8日星期五

Page 48: Qcon 2011:Beansdb 的设计与实现

Hash Tree优化

11年4月8日星期五

Page 49: Qcon 2011:Beansdb 的设计与实现

Hash Tree优化•Hash Table

11年4月8日星期五

Page 50: Qcon 2011:Beansdb 的设计与实现

Hash Tree优化•Hash Table

•Node, Item 连续存放

• {1}{16}{256}

• {Size, Count, [{Ver, Hash, Pos, Key}, ....]

• 128 个自动分裂

11年4月8日星期五

Page 51: Qcon 2011:Beansdb 的设计与实现

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日星期五

Page 52: Qcon 2011:Beansdb 的设计与实现

同步过程节点 A

节点 B

客户端时间

11年4月8日星期五

Page 53: Qcon 2011:Beansdb 的设计与实现

同步过程

V1

V1

Set

节点 A

节点 B

客户端时间

11年4月8日星期五

Page 54: Qcon 2011:Beansdb 的设计与实现

同步过程

V1

V1

Set

节点 A

节点 B

客户端时间

V1

11年4月8日星期五

Page 55: Qcon 2011:Beansdb 的设计与实现

同步过程

V2

Set

V1

V1

Set

节点 A

节点 B

客户端时间

V1

11年4月8日星期五

Page 56: Qcon 2011:Beansdb 的设计与实现

同步过程

Sync

V2

V2

Set

V1

V1

Set

节点 A

节点 B

客户端时间

V1

11年4月8日星期五

Page 57: Qcon 2011:Beansdb 的设计与实现

同步过程

Sync

V2

V2

Set

V1

V1

Set

节点 A

节点 B

客户端时间

V1

V2

11年4月8日星期五

Page 58: Qcon 2011:Beansdb 的设计与实现

同步过程

Sync

V2

V2

Set

V1

V1

Set

节点 A

节点 B

客户端时间

Get

V1

V2

11年4月8日星期五

Page 59: Qcon 2011:Beansdb 的设计与实现

同步过程

Sync

V2

V2

Set

V1

V1

Set

V-3

Delete

节点 A

节点 B

客户端时间

Get

V1

V2

11年4月8日星期五

Page 60: Qcon 2011:Beansdb 的设计与实现

同步过程

Sync

V2

V2

Set

V1

V1

Set

V-3

Delete

V-3

Sync

节点 A

节点 B

客户端时间

Get

V1

V2

11年4月8日星期五

Page 61: Qcon 2011:Beansdb 的设计与实现

同步过程

Sync

V2

V2

Set

V1

V1

Set

V-3

Delete

V-3

Sync

GC

节点 A

节点 B

客户端时间

Get

V1

V2

11年4月8日星期五

Page 62: Qcon 2011:Beansdb 的设计与实现

网络协议

11年4月8日星期五

Page 63: Qcon 2011:Beansdb 的设计与实现

网络协议•memcache 文本协议

• 复用memcached的网络协议层代码

• 有大量客户端可用

11年4月8日星期五

Page 64: Qcon 2011:Beansdb 的设计与实现

网络协议•memcache 文本协议

• 复用memcached的网络协议层代码

• 有大量客户端可用•适当扩展• @fff, ?xxxx, flush_all

• get_multi, set_multi, delete_multi

11年4月8日星期五

Page 65: Qcon 2011:Beansdb 的设计与实现

IO与多线程模型

11年4月8日星期五

Page 66: Qcon 2011:Beansdb 的设计与实现

IO与多线程模型•并发与IO

• 并发连接多, 并发请求少

• 异步网络IO, 同步磁盘IO

11年4月8日星期五

Page 67: Qcon 2011:Beansdb 的设计与实现

IO与多线程模型•并发与IO

• 并发连接多, 并发请求少

• 异步网络IO, 同步磁盘IO

•多线程模型• 多个连接与线程绑定• 半同步, 半异步

• leader follower

11年4月8日星期五

Page 68: Qcon 2011:Beansdb 的设计与实现

Leader-Follower模型

Mutex

try to lock

unlock

wait for event

remove event fd

do the work (blocking)

Leader

Follower

11年4月8日星期五

Page 69: Qcon 2011:Beansdb 的设计与实现

Proxy 实现

11年4月8日星期五

Page 70: Qcon 2011:Beansdb 的设计与实现

Proxy 实现•Go 实现

• 易于实现高并发应用, 性能可接受

11年4月8日星期五

Page 71: Qcon 2011:Beansdb 的设计与实现

Proxy 实现•Go 实现

• 易于实现高并发应用, 性能可接受

•自动路由• 根据 Merkle Tree得到数据分布

• 更高可用性

11年4月8日星期五

Page 72: Qcon 2011:Beansdb 的设计与实现

Proxy 实现•Go 实现

• 易于实现高并发应用, 性能可接受

•自动路由• 根据 Merkle Tree得到数据分布

• 更高可用性•负载均衡• 减少IO慢的节点的请求量

11年4月8日星期五

Page 73: Qcon 2011:Beansdb 的设计与实现

版本历史

11年4月8日星期五

Page 74: Qcon 2011:Beansdb 的设计与实现

版本历史•0.1, like MogileFS 2008.8

• WebDAV, inotify, sync, client

11年4月8日星期五

Page 75: Qcon 2011:Beansdb 的设计与实现

版本历史•0.1, like MogileFS 2008.8

• WebDAV, inotify, sync, client

•0.2, like TokyoTrant 2008.12

• TC, HTree, sync, mc client

11年4月8日星期五

Page 76: Qcon 2011:Beansdb 的设计与实现

版本历史•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 Disk

11年4月8日星期五

Page 77: Qcon 2011:Beansdb 的设计与实现

版本历史(2)

11年4月8日星期五

Page 78: Qcon 2011:Beansdb 的设计与实现

版本历史(2)

•0.4 2010.2

• proxy

11年4月8日星期五

Page 79: Qcon 2011:Beansdb 的设计与实现

版本历史(2)

•0.4 2010.2

• proxy

•0.5 reload 2010.10

• Bitcask, Leader/Follower

11年4月8日星期五

Page 80: Qcon 2011:Beansdb 的设计与实现

实际部署案例(1)

11年4月8日星期五

Page 81: Qcon 2011:Beansdb 的设计与实现

实际部署案例(1)•数据量• 图片, 音频: 1k到20M

• 310M x 3 = 930 M

• 590G x 16 x 3 = 28T

• 17 个节点, 约 50 块SATA硬盘

11年4月8日星期五

Page 82: Qcon 2011:Beansdb 的设计与实现

实际部署案例(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 ms

11年4月8日星期五

Page 83: Qcon 2011:Beansdb 的设计与实现

各节点数据分布

11年4月8日星期五

Page 84: Qcon 2011:Beansdb 的设计与实现

线上运行状态截图 (图片, mp3, 3亿)

11年4月8日星期五

Page 85: Qcon 2011:Beansdb 的设计与实现

11年4月8日星期五

Page 86: Qcon 2011:Beansdb 的设计与实现

实际部署案例(2)

11年4月8日星期五

Page 87: Qcon 2011:Beansdb 的设计与实现

实际部署案例(2)•数据量• 文本字段: 100到100k

• 550M x 3 = 1.65 B

• 50G x 16 x 3 = 2.4T

• 13 个节点, 约 13 块SATA硬盘

11年4月8日星期五

Page 88: Qcon 2011:Beansdb 的设计与实现

实际部署案例(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 ms

11年4月8日星期五

Page 89: Qcon 2011:Beansdb 的设计与实现

Thanks!Q/A ?

11年4月8日星期五

Page 90: Qcon 2011:Beansdb 的设计与实现

原型开发

11年4月8日星期五

Page 91: Qcon 2011:Beansdb 的设计与实现

原型开发•原型开发• 快速验证想法

11年4月8日星期五

Page 92: Qcon 2011:Beansdb 的设计与实现

原型开发•原型开发• 快速验证想法

•Python

• Cython 扩展

11年4月8日星期五

Page 93: Qcon 2011:Beansdb 的设计与实现

原型开发•原型开发• 快速验证想法

•Python

• Cython 扩展

•Go

• cgo 扩展, 容易开发高并发应用

11年4月8日星期五