1.MySQL主从同步
核心是二进制日志,二进制日志记录了所有的DDL语句和DML语句。
DDL数据定义语言,用于定义DB对象,例如表table、索引index等,
常见的命令:
- CREATE 创建数据库对象。
- ALTER 修改数据库对象结构。
- DROP 删除数据库对象。
DML数据操作语言,用于对DB中的数据进行操作,例如插入、更新、删除等。
常见的命令:
- INSERT 插入数据
- UPDATE 更新数据
- DELETE 删除数据
- SELECT 检索数据
可以说,DDL用于管理DB的结构,而DML用于对DB中的数据进行操作。
具体的主从同步流程:
- Master主库在事务提交时,会把数据变更记录在二进制日志文件Binlog中。
- 从库读取主库二进制日志文件Binlog,写入到从库的中继日志Relay log中。
- 从库重做中继日志中的事件,读取数据,再将数据写入到自己的DB中,这样就实现了数据的同步。
2.MySQL--分库分表
为什么要分库分表?
- 项目业务的数据太多,业务发展较快。
- 仅靠优化已解决不了性能问题。
- IO瓶颈、CPU瓶颈。等等。
拆分策略:
垂直拆分:
垂直分库:以表为依据,根据业务将不同的表拆分到不同库中。特点:1.按业务对数据分级管理、维护、监控、扩展。2.在高并发下,提高磁盘IO和数据量连接数。
垂直分表:以字段为依据,根据字段属性将不同字段拆分到不同表中。特点:1.冷热数据分离。 2.减少IO过度争抢,两表互不影响。
水平拆分:
水平分库:将一个库的数据拆分到多个库中。特点:1.解决了单库大数量,高并发的性能瓶颈问题。 2.提高了系统的稳定性和可用性。
水平分表:将一个表中的数据拆分到多个表中(可以在同一个库中)。特点:1.优化单表数据量过大产生的性能问题。 2.避免IO争抢并减少锁表的概率。
分库分表产生的问题:
- 分布式事务一致性问题
- 跨节点关联查询
- 跨节点分页、排序函数
- 主键避重
解决:使用分库分表中间件:sharding-sphere、mycat。