数据库分库分表学而时习之

数据的垂直切分,也可以称之为纵向切分。将数据库想象成为由很多个一大块一大块的“数据块”(表)组成,我们垂直的将这些数据块切开,然后将他们分散到多台数据库主机上面,这样的切分方法就是一个垂直(纵向)的数据切分。

系统功能可以基本分为以下四个功能模块:用户、群组消息、相册以及事件,分别对应为如下这些表:

1.用户模块表user、user_profile、user_group、user_photo_album

2.群组讨论表groups、group_message、group_message_content、top_message

4.事件信息表event

模块之间的关系:

1.群组讨论模块和用户模块之间主要存在通过用户或者是群组关系来进行关联。一般关联的时候都会是通过用户id或者nick_name以及group的id来进行关联,,通过模块之间的接口实现不会带来太多麻烦。

2.相册模块仅仅与用户模块存在通过用户的关联。这两个模块之间的关联基本就有通过用户id关联的内容,简单清晰,接口明确。

通过这样的垂直切分之后,之前只能通过一个数据库来提供的服务,就被分拆成四个数据库来提供服务,服务能力自然是增加几倍了。

垂直切分的优点

u数据库的拆分简单明了,拆分规则明确

u应用程序模块清晰明确,整合容易

u数据维护方便易行,容易定位

垂直切分的缺点

u部分表关联无法在数据库级别完成,需要在程序中完成

u对于访问极其频繁且数据量超大的表仍然存在性能平静,不一定能满足要求

u事务处理相对更为复杂

u切分达到一定程度之后,扩展性会遇到限制

u过度切分可能会带来系统过渡复杂而难以维护

数据的水平切分,一般来说,简单的水平切分主要是将某个访问极其平凡的表再按照某个字段的某种规则来分散到多个表之中,每个表中包含一部分数据。简单来说,我们可以将数据的水平切分理解为是按照数据行的切分,就是将表中的某些行切分到一个数据库,而另外的某些行又切分到其他的数据库中。

水平切分的优点

u表关联基本能够在数据库端全部完成

u不会存在某些超大型数据量和高负载的表遇到瓶颈的问题

u事务处理相对简单

u只要切分规则能够定义好,基本上较难遇到扩展性限制

水平切分的缺点

u切分规则相对更为复杂,很难抽象出一个能够满足整个数据库的切分规则

u后期数据的维护难度有所增加,人为手工定位数据更困难

u应用系统各模块耦合度较高,可能会对后面数据的迁移拆分造成一定的困难

一般来说,我们数据库中的所有表很难通过某一个(或少数几个)字段全部关联起来,所以很难简单的仅仅通过数据的水平切分来解决所有问题。而垂直切分也只能解决部分问题,对于那些负载非常高的系统,即使仅仅只是单个表都无法通过单台数据库主机来承担其负载,我们必须结合“水平”和“垂直”两种切分方式同时使用,充分利用两者的优点,避开其缺点。

每一个应用系统的负载都是一步一步增长上来的,在开始遇到性能瓶颈的时候,大多数架构师和DBA都会选择先进行数据的垂直拆分,然而,随着业务的不断扩张,系统负载的持续增长,在系统稳定一段时期之后,经过了垂直拆分之后的数据库集群可能又再一次不堪重负,遇到了性能瓶颈。

这时候我们就必须要通过数据的水平切分的优势,来解决这里所遇到的问题。对于我们的示例数据库,假设在最开始,我们进行了数据的垂直切分,然而随着业务的不断增长,数据库系统遇到了瓶颈,我们选择重构数据库集群的架构。如何重构?考虑到之前已经做好了数据的垂直切分,而且模块结构清晰明确。而业务增长的势头越来越猛,即使现在进一步再次拆分模块,也坚持不了太久。我们选择了在垂直切分的基础上再进行水平拆分。

下图展示了切分后的整个架构:

在应对不同的应用场景的时候,也需要充分考虑到这两种切分方法各自的局限,以及各自的优势,在不同的时期(负载压力)使用不同的结合方式。

联合切分的优点

u可以充分利用垂直切分和水平切分各自的优势而避免各自的缺陷

u让系统扩展性得到最大化提升

联合切分的缺点

u数据库系统架构比较复杂,维护难度更大

u应用程序架构也相对更复杂

第一部分:实施策略

1.准备阶段

对数据库进行分库分表(Sharding化)前,需要充分了解系统业务逻辑和数据库schema.绘制一张数据库ER图,以图为基础划分shard,直观易行,可以确保清醒思路。

2.分析阶段

1.垂直切分

垂直切分的依据原则是:将业务紧密,表间关联密切的表划分在一起,例如同一模块的表。结合已经准备好的数据库ER图或领域模型图,仿照活动图中的泳道概念,一个泳道代表一个shard,把所有表格划分到不同的泳道中。下面的分析示例会展示这种做法。这种方式多个数据库之间的表结构不同。

2.水平切分

垂直切分后,需要对shard内表格的数据量和增速进一步分析,以确定是否需要进行水平切分。这些数据库中的表结构完全相同。

2.1若划分到一起的表格数据增长缓慢,在产品上线后可遇见的足够长的时期内均可以由单一数据库承载,则不需要进行水平切分,所有表格驻留同一shard,所有表间关联关系会得到最大限度的保留,同时保证了书写SQL的自由度,不易受join、groupby、orderby等子句限制。

2.2若划分到一起的表格数据量巨大,增速迅猛,需要进一步进行水平分割。进一步的水平分割就这样进行:

2.2.1结合业务逻辑和表间关系,将当前shard划分成多个更小的shard,通常情况下,这些更小的shard每一个都只包含一个主表(将以该表ID进行散列的表)和多个与其关联或间接关联的次表。这种一个shard一张主表多张次表的状况是水平切分的必然结果。这样切分下来,shard数量就会迅速增多。如果每一个shard代表一个独立的数据库,那么管理和维护数据库将会非常麻烦,而且这些小shard往往只有两三张表,为此而建立一个新库,利用率并不高,因此,在水平切分完成后可再进行一次“反向的Merge”,即:将业务上相近,并且具有相近数据增长速率(主表数据量在同一数量级上)的两个或多个shard放到同一个数据库上,在逻辑上它们依然是独立的shard,有各自的主表,并依据各自主表的ID进行散列,不同的只是它们的散列取模(即节点数量)必需是一致的。这样,每个数据库结点上的表格数量就相对平均了。

2.2.2所有表格均划分到合适的shard之后,所有跨越shard的表间关联都必须打断,在书写sql时,跨shard的join、groupby、orderby都将被禁止,需要在应用程序层面协调解决这些问题。

3.实施阶段

如果项目在开发伊始就决定进行分库分表,则严格按照分析设计方案推进即可。如果是在中期架构演进中实施,除搭建实现sharding逻辑的基础设施外,还需要对原有SQL逐一过滤分析,修改那些因为sharding而受到影响的sql。

第二部分:示例演示

以下使用jpetstore(宠物店的电子商务系统)来演示如何进行分库分表(sharding)在分析阶段的工作。jpetstore来自原ibatis官方的一个Demo版本,SVN地址为:

由于系统较简单,我们很容易从模型上看出,其主要由三个模块组成:用户,产品和订单。那么垂直切分的方案也就出来了。接下来看水平切分,如果我们从一个实际的宠物店出发考虑,可能出现数据激增的单表应该是Account和Order,因此这两张表需要进行水平切分。对于Product模块来说,如果是一个实际的系统,Product和Item的数量都不会很大,因此只做垂直切分就足够了,也就是(Product,Category,Item,Iventory,Supplier)五张表在一个数据库结点上(没有水平切分,不会存在两个以上的数据库结点)。但是作为一个演示,我们假设产品模块也有大量的数据需要我们做水平切分,那么分析来看,这个模块要拆分出两个shard:一个是(Product(主),Category),另一个是(Item(主),Iventory,Supplier),同时,我们认为:这两个shard在数据增速上应该是相近的,且在业务上也很紧密,那么我们可以把这两个shard放在同一个数据库节点上,Item和Product数据在散列时取一样的模。根据前文介绍的图纸绘制方法,我们得到下面这张sharding示意图:

对于这张图再说明几点:

1.使用泳道表示物理shard(一个数据库结点)

2.若垂直切分出的shard进行了进一步的水平切分,但公用一个物理shard的话,则用虚线框住,表示其在逻辑上是一个独立的shard。

3.深色实体表示主表

4.X表示需要打断的表间关联

一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键生成机制。一方面,某个分区数据库自生成的ID无法保证在全局上是唯一的;另一方面,应用程序在插入数据之前需要先获得ID,以便进行SQL路由。

flickr开发团队在2010年撰文介绍了flickr使用的一种主键生成测策略,同时表示该方案在flickr上的实际运行效果也非常令人满意,它与一般Sequence表方案有些类似,但却很好地解决了性能瓶颈和单点问题,是一种非常可靠而高效的全局主键生成方案。

flickr这一方案的整体思想是:建立两台以上的数据库ID生成服务器,每个服务器都有一张记录各表当前ID的Sequence表,但是Sequence中ID增长的步长是服务器的数量,起始值依次错开,这样相当于把ID的生成散列到了每个服务器节点上。例如:如果我们设置两台数据库ID生成服务器,那么就让一台的Sequence表的ID起始值为1,每次增长步长为2,另一台的Sequence表的ID起始值为2,每次增长步长也为2,那么结果就是奇数的ID都将从第一台服务器上生成,偶数的ID都从第二台服务器上生成,这样就将生成ID的压力均匀分散到两台服务器上,同时配合应用程序的控制,当一个服务器失效后,系统能自动切换到另一个服务器上获取ID,从而保证了系统的容错。

关于这个方案,有几点细节这里再说明一下:

1.flickr的数据库ID生成服务器是专用服务器,服务器上只有一个数据库,数据库中表都是用于生成Sequence的,这也是因为auto-increment-offset和auto-increment-increment这两个数据库变量是数据库实例级别的变量。

2.flickr的方案中表格中的stub字段只是一个char(1)NOTNULL存根字段,并非表名,因此,一般来说,一个Sequence表只有一条纪录,可以同时为多张表生成ID,如果需要表的ID是有连续的,需要为该表单独建立Sequence表。

4.使用REPLACEINTO插入数据,这是很讨巧的作法,主要是希望利用mysql自身的机制生成ID,不仅是因为这样简单,更是因为我们需要ID按照我们设定的方式(初值和步长)来生成。

5.SELECTLAST_INSERT_ID()必须要于REPLACEINTO语句在同一个数据库连接下才能得到刚刚插入的新ID,否则返回的值总是0

实现该方案,应用程序同样需要做一些处理,主要是两方面的工作:

1.自动均衡数据库ID生成服务器的访问

2.确保在某个数据库ID生成服务器失效的情况下,能将请求转发到其他服务器上执行。

通过前面的章节,我们已经很清楚了通过数据库的数据切分可以极大的提高系统的扩展性。但是,数据库中的数据在经过垂直和(或)水平切分被存放在不同的数据库主机之后,应用系统面临的最大问题就是如何来让这些数据源得到较好的整合。

在应用服务器与数据库之间通过代理实现

AmoebaForMySQL主要是专门针对MySQL数据库的解决方案,前端应用程序请求的协议以及后端连接的数据源数据库都必须是MySQL。对于客户端的任何应用程序来说,amoebaForMySQL和一个MySQL没有什么区别,任何使用MySQL协议的客户端请求,都可以被AmoebaForMySQL解析并进行相应的处理,下图可以告诉我们AmoebaForMySQL的架构信息:

Amoeba使用指南:

其他的一些实现层可以参考:

Sharding扩容——系统维护不能承受之重

一般来说,“理想”的扩容方案应该努力满足以下几个要求:

1.最好不迁移数据(无论如何,数据迁移都是一个让团队压力山大的问题)

2.允许根据硬件资源自由规划扩容规模和节点存储负载

3.能均匀的分布数据读写,避免“热点”问题

4.保证对已经达到存储上限的节点不再写入数据

目前,能够避免数据迁移的优秀方案并不多,相对可行的有两种,一种是维护一张记录数据ID和目标Shard对应关系的映射表,写入时,数据都写入新扩容的Shard,同时将ID和目标节点写入映射表,读取时,先查映射表,找到目标Shard后再执行查询。该方案简单有效,但是读写数据都需要访问两次数据库,且映射表本身也极易成为性能瓶颈。为此系统不得不引入分布式缓存来缓存映射表数据,但是这样也无法避免在写入时访问两次数据库,同时大量映射数据对缓存资源的消耗以及专门为此而引入分布式缓存的代价都是需要权衡的问题。另一种方案来自淘宝综合业务平台团队,它利用对2的倍数取余具有向前兼容的特性(如对4取余得1的数对2取余也是1)来分配数据,避免了行级别的数据迁移,但是依然需要进行表级别的迁移,同时对扩容规模和分表数量都有限制。总得来说,这些方案都不是十分的理想,多多少少都存在一些缺点,这也从一个侧面反映出了Sharding扩容的难度。

取长补短,兼容并包——一种理想的Sharding扩容方案

原理

在这个模型中,有几个细节需要注意:ShardGroup的writable属性用于标识该ShardGroup是否可以写入数据,一个Partition在任何时候只能有一个ShardGroup是可写的,这个ShardGroup往往是最近一次扩容引入的;startId和endId属性用于标识该ShardGroup的ID增量区间;Shard的hashValue属性用于标识该Shard节点接受哪些散列值的数据;FragmentTable的startId和endId是用于标识该分段表储存数据的ID区间。

让我们通过示例来了解这套方案是如何工作的。

阶段一:初始上线

假设某系统初始上线,规划为某表提供4000W条记录的存储能力,若单表存储上限为1000W条,单库存储上限为2000W条,共需2个Shard,每个Shard包含两个分段表,ShardGroup增量区间为0-4000W,按2取余分散到2个Shard上,具体规划方案如下:

(上面说单表的存储上线为1000W条,但是为什么图中Table_0的范围是0-2000W?)

与之相适应,Sharding拓扑结构的元数据如下:

阶段二:系统扩容

相应拓扑结构表数据下:

从这个扩容案例中我们可以看出该方案允许根据硬件情况进行灵活规划,对扩容规模和节点数量没有硬性规定,是一种非常自由的扩容方案。

让我们还是通过一个示例来了解升级后的方案是如何工作的。

阶段三:不扩容,重复利用再生存储空间

图7.重复利用2000W再生存储空间的规划方案

相应拓扑结构的元数据如下:

这套方案综合利用了增量区间和散列两种路由方式的优势,避免了数据迁移和“热点”问题,同时,它对Sharding拓扑结构建模,使用了一致的路由算法,从而避免了扩容时修改路由代码,是一种理想的Sharding扩容方案。

THE END
1.温馨宠物天地:宠物店装修效果图精选宠物店作为宠物与宠物主人交流互动的重要场所,其装修设计不仅要满足基本的功能需求,更要营造出一种温馨、舒适、富有爱意的氛围,让每一位踏入店内的顾客都能感受到家的温暖。通过自然主题、温馨色彩、趣味互动、功能分区和…https://m.sohu.com/a/820484755_561386/
2.2021年宠物店规划方案设计(完整版)20241028.docx2021年宠物店规划方案设计(完整版)一、市场调研与分析1.市场需求分析:通过对目标市场的调查,了解消费者对宠物的需求,包括宠物种类、宠物用品、宠物服务等方面的需求。2.竞争对手分析:分析竞争对手的优劣势,包括产品种类、服务质量、价格策略等,以便制定出更有竞争力的经营策略。3.消费者行为分析:了解消费者的购买行为...https://www.renrendoc.com/paper/356676231.html
1.宠物店商业计划(精选3篇)宠物店(pet shop)是为宠物提供各类服务和产品的专门场所,包括宠物用品零售、美容、寄养、活体销售等。其经营项目涵盖了宠物用品超市、活体销售、美容、寄养、医疗、乐园、摄影等多种服务。有时,宠物店也被视为宠物用品店、美容店、寄存处、医院、驯养中心等。 目前,宠物*品市场具有巨大的潜力,原有的兽*生产厂家可以...https://www.kk567.cn/html/67304eadd0b53.html
2.宠物店创业计划书范文(精选11篇)前期宣传是很重要的,如果是一家社区店,可采用在周遍小区发放宣传单的方式进行广告宣传,也可以通过免费洗澡或低价美容等措施吸引顾客。 投资方案: 拿出1万元左右,参加培训一个月左右并拿到“宠物美容师”资格证。除啦营养品跟上,还应该有专门的美容项目,所以,还应该拿出1万元投资宠物美容设施:洗澡池、一把电剪(2000...https://www.oh100.com/kaidian/3887568.html
3.宠物医院设计戈者设计该项目是作为宠物殡仪馆规划的,以改造现有建筑的形式进行,而不是新建。该建筑位于稻田、工厂和大自然交织的金浦市郊区,是韩国第一家宠物殡仪馆,自 1999 年起开始运营,在缺乏宠物殡葬法律制度的情 ... Read more Category : 室内设计 | Tags : 宠物中心设计 , 宠物医院设计 , 宠物基地设计 , 宠物店设计 , 宠...https://www.gavindesign.com/tag/chongwuyiyuansheji/
4.如何进行宠物美容店装修设计宠物美容店怎么装修才好看→MAIGOO知识摘要:动物是人类的好朋友,很多人都喜欢养一些小宠物,从而带动了宠物行业的发展。开办一家宠物美容店,一定要做好装修工作,这样才能吸引客户。宠物美容店装修设计,要着重考虑好店面的走向、宠物美容室的装修,宠物店内部的整体颜色这几个重要部分,装修时,要与周围建筑的形式和风格基本协调,接下来就和小编一起来看看吧。https://m.maigoo.com/goomai/215643.html
5.宠物店充值卡设计方案掌卡包微信电子会员卡管理营销系统软件宠物店充值卡旨在提供一种便捷、高效的方式来管理顾客的预付款,同时增加顾客的粘性和忠诚度。通过设计合理的充值卡方案,可以吸引更多的顾客,提高顾客的消费频次和消费金额。 二、充值卡类型 固定金额充值卡:顾客在宠物店购买固定金额的充值卡,如500元、1000元等。 http://zhangkabao.com/279.html
6.项目解决方案:多地宠物店的视频监控系统建设解决方案GB 50395-2007 视频安防监控系统工程设计规范 ITU H.264协议标准 GB/T 28181-2011 安全防范视频监控联网系统信息传输、交换、控制技术要求 ONVIF 全球性的开放接口标准 2.2建设目标 建设本系统的思想内核是借助先进的科学技术,构造一套精密、复杂、庞大的多地宠物店视频监控系统,综合考虑维护及操作因素,并将为今后的...https://blog.csdn.net/weixin_70208651/article/details/143674390
7.金点子创意设计方案(精选8篇)金点子创意设计方案篇二 春节长假,旅游自然成为许多人春节休闲的首选,而家中的狗宝贝、猫宝贝们怎么办?找“宠物托养”。于是,宠物托养所,或是在宠物店的基础上提供寄养业务,就成为春节的另一商机。据了解,宠物托养的经济收入不错,宠物猫的寄养费约30元/日,宠物狗的约在50元/日,名品宠物或体形较大的宠物,收费...https://fw.chazidian.com/mip/fanwen2665071/
8.VI设计品牌设计设计公司品牌策划门店系统 · 营销解决方案 (宠物店案例) 门店系统 · 宠物店解决方案旨在帮助宠物店打破地域限制,接入引流微信小程序,直达微信更多流量资源,同时实现手机和电脑同步管店。数据系统+开单系统+员工业绩+多门店管理 门店引流打破地域限制,借助互联网获得多方客源1.营销活动刺激裂变通过拼团、全民有奖推广等,促进私域裂变,...https://www.gamlon.ltd/h-col-101.html
9....运动素养提升教学指导学前儿童和小学生的言行执教与练习方案设计人民邮电出版社有限公司 关注店铺 进店逛逛 书名:儿童运动素养提升教学指导:学前儿童和小学生的言行执教与练习方案设计 定价:98.0 ISBN:9787115524461 作者:朗达·L. 克莱门茨等 版次:第1版 出版时间:2020-06 内容提要: 处于儿童阶段的孩子,语言能力和运动能力都是有限的,这就给指导他们进行有效的身体素质训练带来了...https://shop2517475.m.youzan.com/wscgoods/detail/3nvbkw3jgt4jl
10.宠物商店创业计划书(精选10篇)(1)宠物用品自身风险;宠物用品行业是国内新兴行业,随着人们生活水平的提高、知识素养程度的提升,宠物越来越受到人们的欢迎,随着而来的就是巨大的宠物用品市场,所以该风险在长期内将会非常小,反而却有利于本项目的实施。 (2)货源不稳定;本店通过考察、洽谈,已确定几家大规模的宠物用品生产商,可从他们厂直接进货,且可...https://www.yjbys.com/chuangye/ziliao/chuangyejihuashu/632154.html
11.药品销售职业生涯规划书(通用6篇)在大学四年内,专业学习方面认真学好专业内容,加入老师组织的中药小组,大二通过四级考试,拿到普通话证等,参加实验室的工作,暑假到宠物店或养殖场等与畜牧相关的地方实习,观察。大三准备考研夯实基础,找一个长期的合适兼职,暑假考驾照。大四继续做考研准备,读完三百本书,寒假兼职。朝中兽医方向考研,考研成功,继续深入学...https://m.wenshubang.com/zhiyeguihuafanwen/2679779.html
12.软件工程专业毕业设计十篇实行新的毕业设计方案,学校聘请设计院或者施工单位的工程技术人员同辅导老师一同主持答辩、考核。在答辩中,帮助学生修改设计中不合理的部分,使学生的毕业设计趋于完善。工程技术人员和辅导教师从学生的设计质量、设计工作量、出勤情况、与设计院工程技术人员的协调关系等方面综合给出设计成绩,比以往的成绩更真实,更全面。https://www.mingkanw.com/w/keyidq4whyoi.html
13.个性宠物店铺装修设计攻略设计解码4、宠物店内部的整体色调 一家宠物店内部的整体色调是非常重要的。如果整体色调够亮丽,就会吸引客户主动进店观赏以及停留。反之,宠物店的内部整体色调太过简单,吸引路人的眼球就会非常困难。自然吸引客户主动进店的机率就会变小很多。大多情况下,建议宠物店整天色调采用一些暖色调,这样给人一种温馨的感觉。同时宠物也...http://www.cdlyzs.com/index.php?m=content&c=index&a=show&catid=5&id=223
14.南京公装装修公司商业办公室装修设计南京店铺装修设计南京饺子混沌小吃店古今融合装修设计方案效果图-南京博妍工装公司 南京港式火锅店装修设计案例效果图 南京异域风情火锅店装修设计案例效果图 南京古朴典雅中式火锅店装修设计案例效果图 轻工业风烘焙店装修设计-案例效果图 南京自然可爱宠物店装修设计方案效果图 https://www.njboyanzs.com/
15.宠物店创业计划书(精选7篇)现在的宠物行业这么热门,发展的速度犹如火箭一般,很多人也会进入宠物行业创业开店,下面是关于宠物店创业计划书的内容,欢迎阅读! 宠物店创业计划书 篇1 一、摘要 动物是人类的朋友,近年来宠物狗已经逐渐被人类所喜欢,并已进入了人们的家庭生活。“家有宠物狗https://www.ruiwen.com/chuangyejihuashu/2088182.html
16.2020中国银行业老年金融创新趋势报告系列(上篇)宠物店老板关掉店铺专心护理重病的母亲,送走母亲后却无法再次就业,只能卖掉与母亲共同生活的房子以维持生计…… 靠养老金生活的老人,只是因生病、受伤便再也无法依靠自己的收入生活下去而破产。这样的案例,正在不断发生。 一旦步入老年,这些情况在谁身上都有可能发生。尤其是孤身一人生活的老人,没有家人照料,医疗费、...https://www.thepaper.cn/newsDetail_forward_7549678