数据库分片是一种横向分区的数据库架构模式,所谓的横向分区技术就是将一个表中的数据按行拆分为多个不同的表的实践方式,这些不同的表被称作分区。每个分区都拥有相同的模式和相同的列,但是数据行却完全不同。同样的,每一个分区中的数据都是唯一的,并且独立于其他的分区。
结合纵向分区来理解横向分区或许会更容易一些。在纵向分区的表中,成列的数据被分离到另外的新表中。每个纵向分区中的数据都独立于其他分区,并且每个分区的行和列都不相同。
数据库分片包括将数据分成若干个子集,称为逻辑分片。逻辑分片分布在不同的数据库节点上,这些节点被称为物理分片。因此,每个物理分片能够被划分为多个逻辑分片。尽管如此,所有这些分片集合中的数据一起表现出来在逻辑上就如同一整个数据集。
数据库分片是无共享架构的一个例证。这意味着分片行为是自治行为;各个分片之间不会共享任何数据或者计算资源。然而在某些情况下,将某些特定的数据表作为引用表复制到各个分片中也非常有用。比如,某个应用依赖固定的换算率在不同的重量单位之间换算。设计数据库的时候,把保存所需的换算率数据的表复制到每个分片中,将会帮助确保在每个分片中都保存着换算查询所需要的数据。
数据库分片通常在应用级别实现,应用里的代码定义了用于读、写的数据库分片。然而,一些数据库管理系统内置了分片功能,允许你直接在数据库级别实现分片操作。
数据库分片技术最吸引人的要数它能简化横向扩展的工作,也被称为扩张(scaling out)。横向扩展指的是在已有的基础上增加更多的机器来疏散负载,从而承载更多的流量、实现更快的处理速度。经常拿来与之比较的是纵向扩展,或者叫做扩容(scaling up),指的是升级现有机器的硬件配置,通常指加内存、加 CPU。
我们可以很容易地在某一台机器上运行一个关系型数据库实例,只需要通过升级机器的计算资源即可对其进行扩容。然而,所有非分布式的数据库最终都会受限于机器的存储容量和计算力,因此能够自由地横向扩展将使你的应用变得更加灵活。
另一个选择数据库分片架构的原因是提高查询的响应速度。假如不曾对数据库做分片处理,当你向数据库发送查询指令的时候,可能需要查询表中的所有行才能找到需要的数据。对于拥有庞大的单个数据库的应用来说,查询将会变得非常慢。通过分片技术,将数据分散到多个表,查询的时候将会在少部分数据中查找需要的数据,同时能够更快地返回结果集。
数据库分片还能降低宕机的影响,从而使应用更加稳定。如果你的应用或网站依赖于一个未经分片的数据库,宕机有可能会使得整个应用都不可用。但假如是分片的数据库,宕机也只会影响其中的一个分片。尽管我们的应用或网站的某些功能可能无法被一些用户访问,但总的影响仍然会比整个数据库都挂掉要小很多。
代码小兵57603-29 17:54
代码小兵69606-07 17:03
代码小兵22104-13 18:12
代码小兵22104-20 20:22