数据库技术之分库分表

推荐阅读:

MySQL之分区表介绍

区别于分区的是,分区一般都是放在单机里的,用的比较多的是时间范围分区,方便归档。只不过分库分表需要代码实现,分区则是mysql内部实现。分库分表和分区并不冲突,可以结合使用。

分库

需要分库的情形:

  1. 随着单库中的数据量越来越大,相应的,查询所需要的时间也越来越多,这个时候,数据的处理效率遇到了瓶颈
  2. 单库发生意外的时候,需要修复的是所有的数据,而多库中的一个库发生意外的时候,只需要修复一个库(当然,也可以用物理分区的方式处理这种问题)

通常,在读写分离之后,数据库的性能再次遇到瓶颈,就考虑分库。

我们通常称分库为垂直的,因为它相对水平分表、垂直分表的概念来说是垂直的,即按业务划分,通常是将库中的表按照功能模块、关系密切程度划分出来,部署到不同库上。

比如用户一个库,商品一个库,订单一个库。 一个购物网站对外提供服务时,会同时对用户、商品、订单表进行操作。没拆分之前, 全部都是落到单一的库上的,这会让数据库的单库处理能力成为瓶颈。如果垂直分库后还是将用户、商品、订单放到同一个服务器上,只是分到了不同的库,这样虽然会减少单库的压力,但是随着用户量增大,这会让整个数据库的处理能力成为瓶颈,还有单个服务器的磁盘空间、内存也会受非常大的影响。 所以我们要将其拆分到多个服务器上,这样上面的问题都解决了,以后也不会面对单机资源问题。

分表

分表分为水平分表和垂直分表,和我们之前介绍的水平分区和垂直分区的概念类似,mysql不支持垂直分区,但我们可以手动垂直分表,更可能是借助数据库中间件进行分库分表。

垂直分表

垂直分表解决的是一些非热点字段影响查询性能的问题,通常将热点字段和非热点字段划分开。而水平分表解决的是单表数据量(行数)大的问题。水平分表的方法和我们上次介绍的水平分区的方法很相似,可以通过range、list、hash等方法分表。

水平分表和垂直分表可以结合使用,分表配合分库使用还可以将表分到不同的数据库中。(我们称作分库分表)

常用的分库分表中间件

简单易用的组件:

  • 当当sharding-jdbc
  • 蘑菇街TSharding

强悍重量级的中间件:

  • sharding
  • TDDL Smart Client的方式(淘宝)
  • Atlas(Qihoo 360)
  • alibaba.cobar(是阿里巴巴(B2B)部门开发)
  • MyCAT(基于阿里开源的Cobar产品而研发)
  • Oceanus(58同城数据库中间件)
  • OneProxy(支付宝首席架构师楼方鑫开发)
  • vitess(谷歌开发的数据库中间件)

分库分表引起的问题

  • 分布式事务的问题,数据的完整性和一致性问题。
  • 数据操作维度问题:用户、交易、订单各个不同的维度,用户查询维度、产品数据分析维度的不同对比分析角度。
  • 跨库联合查询的问题,可能需要两次查询
  • 跨节点的 count、order by、group by 以及聚合函数问题,可能需要分别在各个节点上得到结果后在应用程序端进行合并
  • 额外的数据管理负担,如:访问数据表的导航定位
  • 额外的数据运算压力,如:需要在多个节点执行,然后再合并计算
  • 程序编码开发难度提升,没有太好的框架解决,更多依赖业务看如何分,如何合,是个难题

水平分表会影响索引查询,特别是分到了不同的库中,查询效率会变得较低,所以不要轻易地水平分表。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e6%95%b0%e6%8d%ae%e5%ba%93%e6%8a%80%e6%9c%af%e4%b9%8b%e5%88%86%e5%ba%93%e5%88%86%e8%a1%a8/

发表评论

电子邮件地址不会被公开。