分库分表
1、为什么要分库分表?
- 数据库中的数据量不一定是可控的,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地数据操作,例如 增删改查的开销 也会越来越大;另外,若不进行分布式部署,而一台服务器的 资源 (CPU、磁盘、内存、IO 等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
- 所以,从 性能 和 可用性 角度考虑,会进行数据库拆分处理,具体地说,把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上,即 分库分表。
2、分库分表的具体实施策略
分库分表有 垂直切分 和 水平切分 两种方式,在复杂的业务场景中,也可能会选择两者结合的方式。
切分方式 |
定义 |
优点 |
缺点 |
应用场景 |
垂直切分 |
数据表 列 的拆分,把一张列比较多的表拆分为多张表,具体地,根据数据库里面数据表的相关性进行拆分 |
可以使行数据变小,在查询时减少读取的 Block 数,减少 I/O 次数;简化表结构,更易于维护 |
主键会出现冗余,需要管理冗余列;会引起 JOIN 操作;加大事务管理的难度 |
适合 表多 且 各项 业务逻辑 划分清晰、低耦合情景 |
水平切分 |
数据表 行 的拆分,是一种横向按业务维度切分的方式,保持数据表结构不变,通过某种策略存储数据分片 |
可支持非常大的数据量存储;应用端改造少 |
分片事务难以解决;会增加逻辑、部署、应用和运维的各种复杂度 |
水平拆分更适合进行 分库 或者 单表数据量大 且表中的数据本身就有独立性 |
3、分库分表存在哪些问题
进行分库分表操作后,可能会面临以下几类问题:
- 事务问题:分库分表后,就成了分布式事务。如果依赖数据库本身的分布式事务管理功能去执行事务,将付出高昂的性能代价; 如果由应用程序去协助控制,形成程序逻辑上的事务,又会造成编程方面的负担。
- 跨库跨表的 JOIN 问题:
在执行了分库分表之后,难以避免会将原本逻辑关联性很强的数据划分到不同的表、不同的库上,这时,表的关联操作将受到限制,我们无法 JOIN 位于不同分库的表,也无法 JOIN 分表粒度不同的表,结果原本一次查询能够完成的业务,可能需要多次查询才能完成。 - 额外的数据管理负担和数据运算压力:
额外的数据管理负担,最为常见的是数据的 定位问题 和数据的 增删改查 的重复执行问题,这些都可以通过应用程序来解决,但必然会引起额外的逻辑运算。 - ID 问题
- 数据库表被切分后,不能再依赖数据库⾃⾝的主键生成机制,所以需要⼀些手段来保证全局主键唯⼀。
主从复制
1、什么是 MySQL 主从复制?
- 主从复制使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。
- MySQL 支持单向、异步复制,复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。
2、MySQL主从同步的优点?
- 通过增加从服务器来提高数据库的性能,在主服务器上执行写入和更新,在从服务器上向外提供读功能,可以动态地调整从服务器的数量,从而调整整个数据库的性能。
- 提高数据安全,可以在从服务器上备份而不破坏主服务器相应数据。
- 在主服务器上生成实时数据,而在从服务器上分析这些数据,从而提高主服务器的性能 ;
- 数据备份。
3、如何实现MySQL的读写分离?
读写分离的基本原理是将数据库读写操作分散到不同的节点上,下⾯是基本架构图:
读写分离的基本实现是:
- 数据库服务器搭建主从集群,⼀主⼀从、⼀主多从都可以。
- 数据库主机负责读写操作,从机只负责读操作。
- 数据库主机通过复制将数据同步到从机,每台数据库服务器都存储了所有的业务数据。
- 业务服务器将写操作发给数据库主机,将读操作发给数据库从机。
4、MySQL主从复制流程和原理?
基本原理流程,是3个线程以及之间的关联:
- 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
- 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进自己的relay log中;
- 从:sql执行线程——执行relay log中的语句;
复制过程如下:
- 第一步:master在每个事务更新数据完成之前,将该操作记录串行地写入到binlog文件中。
- 第二步:salve开启一个I/O Thread,该线程在master打开一个普通连接,主要工作是binlog dump process。如果读取的进度已经跟上了master,就进入睡眠状态并等待master产生新的事件。I/O线程最终的目的是将这些事件写入到中继日志中。
- 第三步:SQL Thread会读取中继日志,并顺序执行该日志中的SQL事件,从而与主数据库中的数据保持一致。
- Binary log:主数据库的二进制日志;
- Relay log:从服务器的中继日志;