日期:2014-05-16  浏览次数:20341 次

分布式数据库计算涉及到分布式事务、数据分布、数据收敛计算等等要求

http://www.mysqlops.com/2012/04/05/mysql-cluster-%E4%B8%8E-mongodb-%E5%A4%8D%E5%88%B6%E9%9B%86%E5%88%86%E7%89%87%E8%AE%BE%E8%AE%A1%E5%8F%8A%E5%8E%9F%E7%90%86.html

分布式数据库计算涉及到分布式事务、数据分布、数据收敛计算等等要求

分布式数据库能实现高安全、高性能、高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Cluster从实现上来分析其中的设计思路,用以抽象我们在设计数据库时,可以引用的部分设计方法,应用于我们的生产系统

?首先说说关系及非关系数据库的特征

?MySQL的Innodb及Cluster拥有完整的ACID属性

A?原子性 ?整个事务将作为一个整体,要么完成,要么回滚

C?一致性?事务开始之前和事务结束以后,数据库的完整性限制没有被破坏

I 隔离性?两个事务的执行是互不干扰的,两个事务时间不会互相影响

D?持久性 在事务完成以后,该事务对数据库所作的更改便持久地保存在数据库之中,并且是完全的

为了实现ACID,引入了诸如Undo、Redo、MVCC、TAS、信号、两阶段封锁、两阶段提交、封锁等实现,并引入数据存取路径,整个事情变得将极其复杂

MySQL遵循SQL标准、使用SQL标准的情况下,可以做到RDBMS之间的无缝迁移

其丰富的数据类型、完整的业务逻辑控制及表达能力一直作为商业应用的首选
?

MongoDB使用集合表示数据,不拥有ACID属性,其无类型、快速部署及快速开发得到了普遍的认可

不管是RDBMS还是MongoDB,无一都使用了索引结构,MongoDB支持B树索引,索引根据用户需要进行建立,可以嵌套在各个层次的各个容器之间构建

在数据库中,有两种数据存放方法:

1、堆:数据按照向后插入的方法,一直堆积在文件末尾,使用索引结构访问数据时,将在索引中得到数据指针,然后获取数据,当有数据删除时,将其从对应位置删除,对于频繁更新的堆表,需要定期进行优化,使用堆表,会导致数据顺序访问原则被打破(在DBMS中做了访问优化,性能得到部分提升),由于没有填充因子,在相同压缩算法下,空间能得到很大的节省,堆表很适合于顺序范围访问,如数据仓库等业务场景

2、索引组织:一般索引组织表使用B+作为构造方法,整个结构如同一个倒挂的树(从数据访问流来看),路由信息存放在树枝上,所有的数据存放在叶子节点,通过双向指针将所有叶子根据顺序方式串联起来,由于时空访问局限特性,这能很大提升数据性能,DBMS根据访问存取路径访问及构造数据,访问路径深度直接影响了性能,一般建议访问路径控制在4以内(小于或等于3),原因由于访问多层路径需要消耗更高的代价及维护索引树代价越来越昂贵

我们常见的Innodb、MySQL Cluster等都是索引组织表、MyISAM为堆表,MongoDB的组织结构为堆