持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第13天,点击查看活动详情
Mysql的分库分表概念简单介绍
1、分表的方式
当数据库数据达到一定程度后,数据库的查询效率会变的非常低,一般可以通过分库分表的方式来解决;
使用分库分表时,主要有垂直拆分和水平拆分两种拆分模式;
垂直拆分:
- 定义:就是当一张表中有许多字段,可以吧这个大表的字段垂直拆分成两个或者多个表;一般可以把经常使用的字段放在一个表,另外一些使用频率低的存放到另外的表;每张拆分的表的字段数据都只是全部数据的一部分;其中可以使用主键做关联来获得完整信息;
- 优点:
- 基于这种垂直拆分可以有很好的扩展性,根据也无需要增加字段;
- 行数据变小。每次读取从磁盘可以读取更多的数据;
- 基于数据的访问频率。可以差分成冷热分离的业务模式,提升系统性能;
- 缺点:
- 这种拆分方式只是减少了字段的宽度,但是当整体的数据很长的时候,实质上守规矩还是很庞大;
- 增加分布式事务的处理逻辑;
- 如果查询的数据设计多个分表,设计join操作。也会降低查询效率;
水平拆分:
- 定义:又叫横向拆分,他根据数据的行数据来拆分,把一张count很大的表拆分成n张表,每张表存放部分数据,每行记录则存储的是该行的全部记录;可以通过某种规定来实现,比如hash取模等;
- 优点:
- 存在单库大数据,高并发的性能瓶颈;
- 切分的表的结构相同,应用层改造较少,只需要增加路由规则即可;
- 提高了系统的稳定性和负载能力。
- 缺点
- 拆分规则难以抽象; 跨库Join性能较差;
- 分片事务的一致性难以解决;
- 数据扩容的难度和维护量极大。
2、主键生成策略
- UUID:
- 这种方式在分布式场景下可以作为分库分表的主键id,它不依托数据坤自身的id主键自增,它会生成一列字符串,保证分布式环境下的id唯一,但是通常我们使用Mysql的INNODB存储引擎,它的索引排序依托于自增主键的排序效率会比较高;
- COMB
- 就是有序的UUID
- SNOWFLAKE:
- 雪花算法
- Zookeeper分布式id
- redis分布式id
3、拆分的分片策略
描述:就是如何实现数据库或者表的拆分策略;
- 范围分片
- 就是根据我们自己规定的某个字段按照相应的范围进行分片,例如根据id,或者根据时间范围来分片;
- hash取模分
- 就是比如我们预估数据的数量级,按照预估的最大数据量。来规定一张表最多存放的数据,然后算出需要多少张表,作为取模的被除数,算法实现比较简单,根据散列之计算数据的分布,比较均匀;但是热点数据也分布比较散,不怎么集中,还有就是万一预设值跟实际值大了,那么后期得我扩容也比较麻烦;
- 一致性hash
- 一致性Hash是将数据按照特征值映射到一个首尾相接的Hash环上,同时也将节点(按照IP地址或者机器名Hash)映射到这个环上。对于数据,从数据在环上的位置开始,顺时针找到的第一个节 点即为数据的存储节点。一致性Hash在增加或者删除节点的时候,受到影响的数据是比较有限的,只会影响到Hash环相邻的节 点,不会发生大规模的数据迁移。
- 扩容:
- 扩容带来的问题:
- 数据如何迁移
- 数据分片规则的额变化问题
- 一般两种解决方案:
- 停机扩容
- 这种方式比较简单粗暴,就是停机扩容,把原有的分片规则重新定义,重新数据同步;
- 这种方式,即便是出现问题,直接回滚修改配置即可;
- 比较简单适用于堆高可用不是那么高要求的业务场景;
- 同时也是它的缺点,不具备高可用,操作失误可能会造成部分数据丢失;
- 平滑扩容
- 就是将数据库扩容成原来的两倍
- 大概步骤:
- 首先配置成双主模式进行数据同步
- 数据同步完成不配置双主双写
- 数据同步完成后,删除双主同步,修改数据库配置
- 停机扩容
- 扩容带来的问题:
TODO 时间紧急,写的简单,后续再完善把!!!!