Fighting bird分享 http://blog.sciencenet.cn/u/tonia

博文

《互联网计算的原理与实践》(二)

已有 4756 次阅读 2010-9-12 21:31 |系统分类:科研笔记

chapter 4 互联网分布式系统的数据资源存储与管理

数据密集型应用:
- 1 数据网格和数据库网格,如TeraGrid、Oracle 10g
- 2 web信息集成应用
- 3 搜索和日志分析等互联网应用
- 4 多租户的SaaS应用

新型数据库:
- Key/value数据库
- 面向文档的数据库
- 面向web的数据库
- 面向属性的数据库
- 分布式哈希表

Key/value存储系统的主要优点:查询速度快,支持大规模数据存储,支持高并发,非常适合只需要通过主键进行简单查询的应用场景(如互联网应用)。

Key/value存储系统与传统关系数据库的区别:

传统关系数据库:
- 由表组成,表由行和列组成,表中的行都有相同的模式;
- 数据模式需要提前定义;
- 使用约束和关系来保证数据完整性;
- 规范化来避免数据的重复存储。

Key/value存储系统:
- 由不同的域组成,域没有结构,域容纳数据项;数据项用键值来定义,一个域中的数据项可能具有不同的结构;
- 属性都是字符串类型的,但有些实现中也可以具有简单的类型,如整型、字符串数组等;
- 对不同域之间的关系或者一个域内的数据项之间的关系不进行定义;
- 不同数据项中很可能有重复存储的数据内容。
- Key/value的变体:BigTable,Cassandra等;四维(行键值,列族,列,时间戳)

Key/value存储系统的不足:
- 没有任何约束和关系的机制,因此数据完整性保障完全依赖于客户程序本身;
- 很多Key/value产品之间的兼容性很差,很难做到不同产品之间的数据迁移;
- 当前互联网环境中的分布式Key/value产品很难满足商业应用的实际需求,特别是对于数据分析(如用户使用模式、推荐系统等)。为了避免一个进程使共享环境超载,很多Key/value产品限制一个单独查询所能产生的全局影响。

数据划分:
database sharding (shared nothing)
- 相对于shared memory, shared disk方案,shared nothing不要求各个节点的处理机共享主存或磁盘;
- 各个节点是独立和自治的
- 系统中没有单点“瓶颈”
- 提供很好的可扩展性
- 切分可以分为垂直切分(按业务、产品功能切分)、水平切分(按key)及两种方式的结合。

Merkle Tree
- 优势:每个分支可以独立检验;有效地减少了为检验所需要传输的数据量。
- Dynamo中每个节点都为每个键值区间(虚拟节点覆盖的一系列的键值)维护一个Merkle Tree,两个节点交换其同一键值区间相对应的Merkle Tree的根,来比较某键值区间的数据是否一致。
- 缺点:当节点加入或退出时,变化的键值区间需要重新计算Merkle Tree。

多租户
- (Separate Databases)共享机器:各自的数据库进程。隔离性好,但不同数据库进程之间无法共享内存和连接池,导致每台服务器上所能支撑的租户数量有限。
- (Shared Database, Separate Schemas)共享进程:各个租户在同一数据库进程上拥有各自的表。由于不同的租户共享连接池,安全和资源竞争管理都要在应用层解决。
- (Shared Database, Shared Schema)共享表:各个租户的数据物理上保存在相同的表中,但它们的数据在逻辑上是分开的。需要一定得内存作为缓冲池,以在内存空间中缓存数据库的物理连接以及表的数据,从而可以使得数据库连接以及表数据被重复使用。当服务器容纳表数量太多时,由于内存的消耗,性能将明显下降。

共享表方式为实现租户的隔离性提出了更高的挑战:
- 如何让租户独立地修改数据模式?
- 如何根据不同租户的查询特点建立索引以优化性能?
- 数据访问安全:在应用出错的情况下,如何保证数据不会被其他用户读取和修改?

适合多租户数据库的应用:
- 较为复杂的应用(如ERP等)一般不适合使用多租户数据库。
- 这些应用一般需要较为成熟的扩展机制,需要保证敏感数据的绝对安全。
- 拥有这些应用的客户更倾向于再应用的备份、恢复、升级等方面具有更大的管理自主权。

共享表方式下的多租户数据模型:
1。 扩展表
将私有表的公共部分提取成一个表,其余部分各成立一个新表。
缺点:但随着租户数量增加,表数量随之增加,限制了可伸缩性。

2。 通用表
将所有表合成一张总表,预留可扩充列,类型设为一个通用类型,如varchar。
缺点:引入了较多的NULL值;数据失去了原有的类型。

3。 轴表(pivot table)
为每个在私有表中出现的数据类型建立一张表。
缺点:引入了大量元数据,存储开销较高;查询的多次join操作,带来了较高的运行时开销。

4。 块表
是通用表和轴表的折中。将相伴出现的值尽量组织成块,然后以轴表形式存储。

5。 块折叠(chunk folding)
扩展表与块表的结合。将私有表的公共部分提取成一个普通表,其余部分组织成块表。

6。 XML表
每个私有表的非公共部分提出,作为单独的一列(ext节点)。具有较高的灵活性。
缺点:需要进行XML解析,降低了数据访问的效率。

7。 key/value表
RowKey由租户标识、私有表的名字及该行在私有表的键值组成。较好的可伸缩性。

以上几种方法的比较:
- 租户定制数据模式的灵活性
- 数据访问效率
- 数据安全保障

https://blog.sciencenet.cn/blog-425672-362410.html

上一篇:软件架构师应该知道的97件事(一)
下一篇:软件架构师应该知道的97件事(二)
收藏 IP: .*| 热度|

0

发表评论 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-7-28 13:19

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部