数据库扩展(二)——垂直划分、水平划分

简单解释:

垂直划分,即将数据库中的不同表分散到不同数据库服务器中。

水平划分,即让一张表同时存在于多个数据库服务器中(每张表仅存储部分数据)。

分区反向代理,Spock Proxy,可以帮助应用程序实现水平分区的访问调度。

详细解释:

垂直划分:

图示,见下图。

IMG_20150817_161229

优点,当数据库的请求或容量超过一台服务器的负载,或部分数据表的请求量较大时,可以将部分数据表独立在独立的数据库服务器中,减轻主数据库服务器的压力。

缺点,因为不同数据表的请求量不同,很难保证服务器的负载是否均衡,可能会出现有的服务器负载低,有的服务器负载高。

折中考虑,当每个服务器都没达到负载极限时,这种划分是可以接受的;当部分独立出来的数据表的请求仍超出独立服务器的负载能力时,可以考虑将此数据表做“水平划分”。

水平划分:

图示,见下图。

IMG_20150817_161205

优点,当某个数据表的请求量或数据量较大,一台独立的数据库服务器仍不能承载其请求时,可以将此数据表结构存储在多个数据库服务器中,每个服务器仅处理“自己范围内的数据”,即将此数据表的数据分散到多个数据库服务器中。

缺点,较难权衡如何划分数据,将数据分散存储在多个服务器中。

例如方式一(哈希算法,根据数据ID模运算取余划分),若存在三个数据库服务器,根据数据记录的ID除3取余,结果为0的存储在服务器A中、结果为1的存储在服务器B中、结果为2的存储在服务器C中。但当三台服务器仍不能满足需求,需要增加服务器时,原先的“除3取余”则需改动,原有的数据则需重新划分其要存储在哪个服务器中。

例如方式二(范围,根据数据ID范围划分),ID为1~10000范围内的数据存储在服务器A中,ID为10001~20000范围内的存储在服务器B中…。此种划分方式的难点是,如何抉择每个服务器能负载的数据ID范围。(可以实时监控服务器的资源使用情况,当达到阀值时,即可认为需要增加服务器了。)

例如方式三(映射关系,使用数据库记录数据分区信息),这种算法将对分区索引字段(即上面的ID)的每个可能的结果创建一个分区映射关系,这个映射关系将会非常庞大,应用程序已无法通过简单的逻辑或者配置文件来维护它,而需要将它也写入数据库。比如查询ID为1989的数据信息时,可先通过查询保存映射关系的数据库得到该ID使用的分区,再从该分区中取得具体信息。当然,可以使用缓存来提高性能。

由于方式三详细保存了每一个记录的分区对应关系,所以各个分区具有较强的可伸缩性,我们可以灵活地控制它们的规模,并且轻松地将数据从一个分区迁移到另一个分区,这也使得各个分区可以通过灵活的动态调节来保存平衡。

备注:上文中的“分区”和“数据库服务器”、“服务器”是同一概念。

反向代理:

Spock Proxy 本身的大部分代码是基于Mysql Proxy,其主要用于处理水平分区时的数据调度,示例图如下:

IMG_0101

摘自:

机械工业出版社《微信公众平台应用开发实战》 钟志勇 著

电子工业出版社 《构建高性能Web站点》 郭欣 著

发表评论