03.数据分布
分片
对于大型数据集或非常高的吞吐量的情况下,仅仅进行复制是不够的,我们需要将数据进行分区(partitions),也称为分片(sharding)。分区是一种有意将大型数据库分解成小型数据库的方式,它与网络分区(net splits)无关。分区(partition),在 MongoDB,Elasticsearch 和 Solr Cloud 中被称为分片(shard),在 HBase 中称之为区域(Region),Bigtable 中则是 表块(tablet),Cassandra 和 Riak 中是虚节点(vnode), Couchbase 中叫做虚桶(vBucket).但是分区(partition) 是约定俗成的叫法。
通常情况下,每条数据(每条记录,每行或每个文档)属于且仅属于一个分区,分区主要是为了可扩展性。不同的分区可以放在不共享集群中的不同节点上,对于在单个分区上运行的查询,每个节点可以独立执行对自己的查询,因此可以通过添加更多的节点来扩大查询吞吐量。大型,复杂的查询可能会跨越多个节点并行处理,尽管这也带来了新的困难。
分区数据库在 20 世纪 80 年代由 Teradata 和 NonStop SQL 等产品率先推出,最近因为 NoSQL 数据库和基于 Hadoop 的数据仓库重新被关注。有些系统是为事务性工作设计的,有些系统则用于分析:这种差异会影响系统的运作方式,但是分区的基本原理均适用于这两种工作方式。
分区与复制
分区通常与复制结合使用,使得每个分区的副本存储在多个节点上这意味着,即使每条记录属于一个分区,它仍然可以存储在多个不同的节点上以获得容错能力。一个节点可能存储多个分区如果使用主从复制模型,则分区和复制的组合如下图所示每个分区领导者(主)被分配给一个节点,追随者(从)被分配给其他节点每个节点可能是某些分区的领导者,同时是其他分区的追随者。大多数情况下,分区方案的选择与复制方案的选择是独立的。