c store底层存储设计

13
C-Store底层存储设计 梁智超 [email protected]

Upload: zhichao-liang

Post on 24-Jun-2015

713 views

Category:

Technology


11 download

DESCRIPTION

C-Store底层存储设计原理描述,主要参考Mike Stonebraker的论文:C-Store: A Column-oriented DBMS。

TRANSCRIPT

Page 1: C store底层存储设计

C-Store底层存储设计

梁智超

[email protected]

Page 2: C store底层存储设计

C-Store设计思想

• 在只读的数据仓库应用中,支持更新事务也是很有必要的!

• 在实时的数据仓库应用中,将新灌入数据的可见性延迟压得越低越好!

• 但基于读优化的数据结构,很难再提供高效的更新性能!

• C-Store将两个针对读和写分别优化的存储模块集成到一起来解决读写两难的困境!

Page 3: C store底层存储设计

C-Store数据模型

• 逻辑上:数据库(Database)由表(Table)组成,表由属性列(Column)组成,支持唯一主键和外键,使用标准SQL查询。

• 物理上:C-Store只实现投影(Projection),每

个投影与一张表关联,包含了该表中的一个或多个属性列以及其任意数目其它表中的属性列。

EMP

Name Age Dept Salary

Bob 25 Math 10K

Bill 27 EECS 50K

Jill 24 Biology 80K

DEPT

Name Floor

Biology 10

Math 8

EECS 19

Page 4: C store底层存储设计

C-Store数据模型(cont.)

EMP1(name, age | age)

Name Age

Jill 24

Bob 25

Bill 27

EMP2(dept, age, DEPT.floor | DEPT.floor)

Dept Age DEPT.floor

Math 25 8

Biology 24 10

EECS 27 19

EMP3(name, salary | salary)

Name Salary

Bob 10K

Bill 50K

Jill 80K

DEPT1(name, floor | floor)

Name Floor

Math 8

Biology 10

EECS 19

EMP

Name Age Dept Salary

Bob 25 Math 10K

Bill 27 EECS 50K

Jill 24 Biology 80K

DEPT

Name Floor

Biology 10

Math 8

EECS 19

Page 5: C store底层存储设计

SK Age

1 24

2 25

1 27

SK Name

1 Jill

2 Bob

1 Bill

C-Store数据模型(cont.)

• 投影以列存的方式存储,即投影中有几个属性列,就有几个存储列的数据结构。

• 投影通过基于排序属性值的水平分区切割成段(Segment),每个段都会有一个标识。

• 段中的每个属性列的值都会关联一个存储主键。

EMP1(name, age | age)

Name Age

Jill 24

Bob 25

Bill 27

SID = 1

SID = 2

段中具有相同存储主键的属性列构成一条逻辑上的记录!

Page 6: C store底层存储设计

C-Store存储设计

• 读写分离,最新的更新数据全部写到Writeable Store (WS),只读数据存储在Read-Optimized Store (RS)。

• 查询时需要将RS和WS中的数据合并处理。

Writeable Store

Read-Optimized Store

Tuple Mover

1) WS和RS均采用列存储,分享相同的物理设计,包括投影、段等;

2) WS中的段与RS中的段一一对应; 3) WS中SK是显示存储的,RS中SK根

据列属性值的存储位置计算得到; 4) WS中的数据通过Tuple Mover实现

与RS中数据的Merge;

Page 7: C store底层存储设计

RS中数据存储和压缩

• RS中存储大部分数据,且将数据库表转化为多个投影会导致数据膨胀,所以RS中的数据需要进行压缩。

• RS中的数据压缩就是对投影中每个列的压缩,包括四种不同情况:

压缩列就是投影中的排序列,且压缩列中的distinct值很少

压缩列不是投影中的排序列,且压缩列中的distinct值很少

压缩列就是投影中的排序列,且压缩列中的distinct值很多

压缩列不是投影中的排序列,且压缩列中的distinct值很多

Page 8: C store底层存储设计

RS中数据存储和压缩(cont.)

• 压缩列就是投影中的排序列,且压缩列中的distinct值很少。

Salary

3000

3000

3000

8000

8000

8000

8000

(8000, 3, 4)

(3000, 0, 3)

使用Run-Length Encoding将连续的列属性值转

化为三元组(列属性值,在列中第一次出现的位置,出现次数)

整个列就可以使用多个三元组来表示

所有三元组使用B树索引来管理,B树

索引中所有节点不留空闲空间,使用大数据块来存节点以降低B树的层数

Page 9: C store底层存储设计

RS中数据存储和压缩(cont.)

• 压缩列不是投影中的排序列,且压缩列中的distinct值很少。

Salary

8000

3000

3000

8000

8000

3000

8000

列属性值转化为二元组(列属性值,该列属性值出现在列中位置的Bitmap)

(8000, 1001101) (3000, 0110010)

因为distinct值很少,所以每个二元组中的Bitmap都很稀疏,可以继续使用Run-Length Encoding对Bitmap进行压缩

构造B树将列中的每个位置映射给该位置上的列属性值,以快速定位列中每个位置上的列属性值

Page 10: C store底层存储设计

RS中数据存储和压缩(cont.)

• 压缩列就是投影中的排序列,且压缩列中的distinct值很多。

Salary

3000

4000

4000

4500

6800

7400

8000

将列属性值表示成为前一个列属性值的增量 Salary

3000

1000

0

500

2300

600

600

使用面向块的压缩算法对转换后的数据进行压缩,类似于IBM的VSAM对B树索引主键的编码

使用B树索引管理块级的压缩对象, B树索引中所有节点不留空闲空间

Page 11: C store底层存储设计

RS中数据存储和压缩(cont.)

• 压缩列不是投影中的排序列,且压缩列中的distinct值很多。

Salary

7400

6800

4000

8000

6800

4000

4500

可以选择不压缩数据

直接使用B树索引管理数据,B树

索引中所有节点不留空闲空间,使用大数据块来存节点以降低B树的层数

Page 12: C store底层存储设计

WS中数据存储

• WS中的数据比RS中的数据少很多,所以不进行数据压缩。

• 投影中每列的更新数据都使用二元组(列属性值,SK)来表示,且针对SK建B树索引。

• 投影中的排序属性列使用附加的二元组(排序属性值,该排序属性值第一次出现的SK)来表示,且针对排序属性值建B树索引。

• 先查询排序属性列二元组的B树索引,再查询其他列二元组的B树索引。

Page 13: C store底层存储设计

WS中数据存储(cont.)

Name列更新数据的二元组

Jill 1

Tom 2

Rose 3

Bob 4

Bill 5

EMP1(name, age | age)的更新数据

SK Name Age

1 Jill 24

2 Tom 24

3 Rose 25

4 Bob 25

5 Bill 27

排序属性列的附加二元组

24 1

25 3

27 5

(针对SK建 B树索引)

(针对排序 属性建B树 索引)

当使用排序属性进行查询时,先查询排序属性列二元组的B树索引,获取符合条件的SK,再查询其他列二元组的B树索引获取对应的属性列值

C-Store直接使用BerkeleyDB来管理WS!