一、分库分表
1. 水平切分
A. 定义:它是将同一个表中的记录拆分到多个结构相同的表(不同库)中;
B. 优点:可以将数据分布到集群的不同节点上,从而缓存单个数据库的压力;
C. 缺点:跨界点join性能差、事务复杂;
2. 垂直切分
A. 定义:是将一张表按列切分成多个表,通常是按照列的关系密集程度进行切分;
B. 优点:方便实现动静分离,冷热分离的数据库表的设计模式,数据维护相对简单;
C. 缺点:主键会出现冗余,需要管理冗余列,并会引起Join操作,且事务变得复杂;
3. 涉及到问题
A. 分片策略;
B. 事务支持:分布式事务;
C. 跨库链表查询;
D. 跨节点的count、order by、group by及聚合函数等;
E. ID唯一性;
4. 数据库分片方案
A. 客户端代理:分片逻辑在应用端,封装在jar包中,例如Sharding-JDBC;
B. 中间件代理:在应用和数据中间加了一个代理层,分片逻辑统一维护在中间件服务中,例如Mycat;
二、主从复制
异步的同步到从库的操作,由于主从同步的异步性,从库与主库的数据会短时间内不一致。
2. 工作原理
A. binlog线程:Master服务器在每个事务更新数据完成之前,将该操作记录串行地写入到二进制日志文件(Binary Log);
B. I/O线程:Slave服务器中I/O线程在不停地监听Master的二进制日志是否有更新,如果没有它会睡眠等待Master产生新的日志事件,如果有新的日志事件,则会将其拷贝至Slave服务器中的中继日志(Relay Log);
C. SQL线程:Slave服务器中SQL线程从中继日志读取事件,并重做其中的事件从而更新Slave的数据,使其与Master中的数据一致。
3. 复制方式
A. 异步复制:是MySQL默认的复制方式,主库在执行完客户端提交的事务后会立即将结果返给客户端,并不关心从库是否已经接收并处理,这样就会有一个问题,主如果crash掉了,此时主上已经提交的事务可能并没有传到从上,如果此时,强行将从提升为主,可能导致新主上的数据不完整;
B. 半同步复制:介于异步复制和全同步复制之间,主库在执行完客户端提交的事务后不是立刻返回给客户端,而是等待至少一个从库接收到并写到relay log中才返回给客户端。相对于异步复制,半同步复制提高了数据的安全性,同时它也造成了一定程度的延迟,这个延迟最少是一个TCP/IP往返的时间;
全同步复制:指当主库执行完一个事务,所有的从库都执行了该事务才返回给客户端。因为需要等待所有从库执行完该事务才能返回,所以全同步复制的性能必然会收到严重的影响;
C. GTID模式:
D. 多源复制:
三、读写分离
1. 定义:主服务器处理写操作以及实时性要求比较高的读操作,而从服务器处理读操作。
2. 作用
A. 主从服务器负责各自的读和写,极大程度缓解了锁的争用;
B. 从服务器可以使用 MyISAM,提升查询性能以及节约系统开销;
C. 增加冗余,提高可用性。