数据切分概述

来源:互联网 发布:java 响应式编程 编辑:程序博客网 时间:2024/06/15 02:51
     什么是数据切分呢,简单来说,就是指通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库(主 机)上面,以达到分散单台设备负载的效果。
     切分能够分散单台设备的负载,提高整体的性能。但是切分也有一些问题,引入分布式事务 跨节点join跨节点排序分页以及多数据源管理。前面几个问题是针对服务端来说的,而最后一个问题是针对客户端来讲的。这里这些问题很容易理解,一个数据库中的数据分到多个节点上,那么与之对应的就是分布式事务,跨界点join,以及排序和分页等等。而对于客户端来讲,也由单一的数据源变成多个数据源,在进行操作的时候也变得比较复杂。
     数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表来切分到不同的数据库之上,这种切可以称之为数据的垂直切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称之为数据的水平切分。具体的垂直切分和水平切分到后面具体的介绍,这里就不多说了。
     对与垂直切分来讲,其实也可以分成两种形式,一种是数据库级别的切分,就是上面说到的,按照不同的表切分到不同的数据库之上。还有一种也可以理解为垂直切分,表级别的垂直切分,就是把一个表的字段,分开到多张表中。那么这些表可以放到同一台节点上,也可以放到不同的节点上,切分的表通过指定的字段来进行关联。当然了,对于表级别的切分,如果在数据库设计之初就考虑的比较完善,也就没有必要的,说白了,其实表级别的垂直切分就是一种数据库设计。
     这里经常会用到三个词:分区,分片,切分。分区是数据库支持的一种将一个物理文件分成多个文件的机制,是数据库提供的功能。切分和分片可以理解为同一个东西不同的翻译。但是准确来讲,我认为它俩还是有些区别的。切分是一种思想,把同一个数据库的数据分散到不同的数据库或者主机上。分片呢,可以认为是切分后的结果,每个节点或者每个数据库是一个分片。
上面提到切分就是分到不同的数据库或者不同的主机,当然也是可以分到当前的库中,这里就涉及到了多租户的概念。多租户有三个层面,分别是
    独立数据库
独立数据库安全性最高,独立性最好,备份恢复比骄简单,但成本最高。
    共享数据库,隔离数据架构
共享数据库,隔离数据架构处于这两者中间。
    共享数据库,共享数据架构
共享数据库,共享数据架构的隔离级别最低,安全性也最低,数据备份和恢复困难,当成本最低。

如何实现数据的切分呢?实现的工具多种多样,我总结三点,
     第一就是不是用任何的工具,我们通过客户端手动的来进行数据切分的操作,这样无疑是在重复造轮子,而且性能,稳定性都不能保证,且成本较高。
     第二是使用客户端组件,既然刚才提到了是重复造轮子,那么就一定有相应的组件来处理这些事情,通过组件来处理,可以降低成本,提高稳定性和安全性。比较有代表性的开源组件就属当当网的 sharding-jdbc了,文档非常详细。
     第三是通过数据库中间件来实现,这个方式最为简单,扩展性也最好。主流的数据库中间件有很多,其中比较有代表性的有阿里的amoeba,奇虎360的atlas,以及开源组织提供的MyCat等等。其各有优势。

原创粉丝点击