数据库分区、分库分表

分区

分区表: 
当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。

分区表是由多个相关的底层表实现,这些底层表也是由句柄对象表示,所以我们也可以直接访问各个分区,存储引擎管理分区的各个底层表和管理普通表一样(所有的底层表都必须使用相同的存储引擎),分区表的索引只是在各个底层表上各自加上一个相同的索引,从存储引擎的角度来看,底层表和一个普通表没有任何不同,存储引擎也无须知道这是一个普通表还是一个分区表的一部分。

事实上,这个方案也不错,它对用户屏蔽了sharding的细节,即使查询条件没有sharding column,它也能正常工作(只是这时候性能一般)。不过它的缺点很明显:很多的资源都受到单机的限制,例如连接数,网络吞吐等!虽然每个分区可以独立存储,但是分区表的总入口还是一个MySQL示例。从而导致它的并发能力非常一般,远远达不到互联网高并发的要求!

至于网上提到的一些其他缺点比如:无法使用外键,不支持全文索引。我认为这都不算缺点,21世纪的项目如果还是使用外键和数据库的全文索引,我都懒得吐槽了!

所以,如果使用分区表,你的业务应该具备如下两个特点:

  1. 数据不是海量(分区数有限,存储能力就有限);

  2. 并发能力要求不高;

 什么时候使用分区表: 
1、表的大小超过2GB。 
2、表中包含历史数据,新的数据被增加都新的分区中。 

https://blog.csdn.net/wohiusdashi/article/details/81129564

分库分表

有一定知名度的分库分表中间件:

  • 阿里的TDDL,DRDS和cobar,

  • 开源社区的sharding-jdbc(3.x已经更名为sharding-sphere);

  • 民间组织的MyCAT;

  • 360的Atlas;

  • 美团的zebra

这么多的分库分表中间件全部可以归结为两大类型:

  • CLIENT模式

  • PROXY模式

CLIENT模式代表有阿里的TDDL,开源社区的sharding-jdbc(sharding-jdbc的3.x版本即sharding-sphere已经支持了proxy模式)。架构如下:

但是,无论是CLIENT模式,还是PROXY模式。几个核心的步骤是一样的:SQL解析,重写,路由,执行,结果归并

水平分库分表查询问题

分布式全局唯一ID

在很多中小项目中,我们往往直接使用数据库自增特性来生成主键ID,这样确实比较简单。而在分库分表的环境中,数据分布在不同的分片上,不能再借助数据库自增长特性直接生成,否则会造成不同分片上的数据表主键会重复。简单介绍下使用和了解过的几种ID生成算法。

1. Twitter的Snowflake(又名“雪花算法”)

2. UUID/GUID(一般应用程序和数据库均支持)

3. MongoDB ObjectID(类似UUID的方式)

4. Ticket Server(数据库生存方式,Flickr采用的就是这种方式) 

分布式全局唯一ID生成策略

zookeeper生成全局id

分片字段该如何选择

在开始分片之前,我们首先要确定分片字段(也可称为“片键”)。很多常见的例子和场景中是采用ID或者时间字段进行拆分。这也并不绝对的,我的建议是结合实际业务,通过对系统中执行的sql语句进行统计分析,选择出需要分片的那个表中最频繁被使用,或者最重要的字段来作为分片字段。

常见分片规则:连续分片、随机分片

当需要使用分片字段进行范围查找时,连续分片可以快速定位分片进行高效查询,大多数情况下可以有效避免跨分片查询的问题。后期如果想对整个分片集群扩容时,只需要添加节点即可,无需对其他分片的数据进行迁移。但是,连续分片也有可能存在数据热点的问题,就像图中按时间字段分片的例子,有些节点可能会被频繁查询压力较大,热数据节点就成为了整个集群的瓶颈。而有些节点可能存的是历史数据,很少需要被查询到。

随机分片其实并不是随机的,也遵循一定规则。通常,我们会采用Hash取模的方式进行分片拆分,所以有些时候也被称为离散分片。随机分片的数据相对比较均匀,不容易出现热点和并发访问的瓶颈。但是,后期分片集群扩容起来需要迁移旧的数据。使用一致性Hash算法能够很大程度的避免这个问题,所以很多中间件的分片集群都会采用一致性Hash算法。离散分片也很容易面临跨分片查询的复杂问题。



链接:https://www.jianshu.com/p/b525834faa60

https://mp.weixin.qq.com/s/3ZxGq9ZpgdjQFeD2BIJ1MA

https://mp.weixin.qq.com/s/m0eva_jadEsFrUoE7LXmZA

原文地址:https://www.cnblogs.com/dingpeng9055/p/12841444.html