淘宝网数据库架构从垂直拆分走向水平拆分,MySQL则在大规模水平集群的架构设计中收到关注,2012年整个淘宝网核心交易系统已经全部运行在基于PC服务器的MySQL数据库集群中,全部实例数超2000个,MySQL单库经受了最高达6.5万的QPS
基础1-6
应用7-9
集群10~
第一章 MySQL架构与历史
MySQL逻辑架构
- 第一层,服务层(为客户端服务):为请求做连接处理、授权认证、安全等
- 第二层,核心层,包括查询解析、分析、优化、缓存以及所有的内置函数,所有跨存储引擎的功能:存储过程、触发器、视图等
- 第三层,存储引擎,负责MySQL中数据的存储和提取
并发控制
主要讨论MySQL在两个层面的并发控制:服务器层和存储引擎层。并发景点的办法就是加锁。
读写锁
读锁:又叫共享锁,相互不阻塞;
写锁:又叫排他锁,一个写锁会阻塞其他的写锁和读锁;
锁粒度
一种提高共享资源并发性的方式就是让锁定的对象更有选择性。大多数商业数据库系统都是在表上施加行级锁(row level lock)。而MySQL则提供了多种选择,每种MySQL存储引擎都可以实现自己的锁策略和锁粒度。
表锁:最基本的锁策略,也是开销最小的策略,锁定整张表;
行级锁:可以最大程度的支持并发,也带来了最大的锁开销。
事务
事务就是一组原子性的SQL查询,或者说一个独立的工作单元,要么全部执行成功,要么全部执行失败。
ACID特性
- 原子性(atomicity):一个事务必须被视为一个不可分割的最小工作单元;
- 一致性(consistency):数据库总是从一个一致性的状态转移到另外一个一致性的状态
- 隔离性(isolation):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。
- 持久性(durability):一旦事务提交,则所做的修改就会永久保存到数据库中。
隔离级别,SQL标准中定义了四种隔离级别(依次增强)
- READ UNCOMMITTED(未提交读):事务可以读取未提交的数据,这也被称为脏读(Dirty Read)
- READ COMMITTED(提交读):大多数数据库系统默认的隔离级别(但MySQL不是),一个事务从开始到提交前,所做的任何修改对其他事务都是不可见的。也叫作不可重复读(Nonrepeatable read),因为两次执行同样的查询,可能会得到不一样的结果。
- REPEATABLE READ(可重复读):MySQL默认事务隔离级别,解决了脏读的问题,保证在同一个事务中多次读取同样记录的结果是一致的。但无法解决幻读的问题,即当某个事务在读取某个范围内的记录时,另外 一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的记录时,会产生幻行。
- SERIALIZABLE(可串行化):最高的隔离级别,通过强制事务串行执行,避免了幻读的问题。
死锁
死锁是指两个或多个事务在同一资源上相互占用,并穷求锁定对象占用的资源,从而导致二星循环的现象。为了解决这种问题,数据库系统实现了各种死锁检测和死锁超时机制。死锁发生以后,只有部分或者完全回滚其中一个事务,才能打破死锁。
多版本并发控制
MySQL的大多数事务型存储引擎实现的都不是简单的行级锁,基于提升并发性能的考虑,它们一般都同时实现了多版本并发控制(MVCC)。MVCC的实现是通过保存数据在某个时间点的快照来实现的。
MySQL基准测试
为什么需要基准测试
因为基准测试时唯一方便有效的、可以学习系统在给定的工作负载下会发生什么的方法。基准测试可以观察系统在不同的压力下的行为,评估系统的容量,掌握哪些是重要的变化,或者观察系统如何处理不同的数据。
测试何种指标
- 吞吐量:单位时间内的事务处理数(TPS)
- 响应时间或者延迟:用于测试任务所需要的整体时间
- 并发性:关注同时工作的线程数或者连接数,当并发性增加时,需要测量吞吐量是否下降,响应时间是否变长
- 可扩展性:给系统增加一倍的资源(比如两倍CPU),就可以获得两倍的吞吐量,同时性能也必须在可以接受的范围
获取系统性能和状态:如CPU使用率、磁盘IO、网络流量统计、SHOW GLOBAL STATUS计数器等。
服务器性能剖析
最常碰到的三个性能相关的服务请求是:如何确认服务器是否达到了性能最佳的状态,找出某条语句为什么执行不够快,以及诊断被用户描述成“停顿”、“堆积”或者“卡死”的某些间歇性疑难故障。
看不下去了,未完待续……
参考:
《高性能MySQL》