文章内容来源《MySQL DBA 修炼之道》
一、架构篇
1. 软件架构中数据库的定位
- 数据库一般位于整个软件架构的后端,而不直接服务于用户。
- 数据的展示、业务逻辑处理都是由程序来实现,例如Java。
- 软件架构的分类 :
- 双层架构 server-client : 如JDBC。
- 三层架构 : 程序和数据库之间有一个中间服务器,如Web服务器,中间件,再由中间服务器转发请求给数据库服务器。这种模式称为"三层架构"。
- 三层架构目前应用最广,探讨下:
- (1)表现层 : 直接与用户交互的界面。
- (2)业务逻辑层 : 负责业务逻辑与数据处理,也就是服务器,可以是PHP、Java EE、ASP.NET等应用服务。
网站处理网络访问请求的过程可能是这样的,由nginx接收用户请求,并将动态请求转发给后端的服务器,服务器处理完请求将结果返回给nginx,nginx再返回给用户,有时也称该层为中间件。
- (3) 数据访问层:直接操作数据库,负责增加、删除、修改、查找等操作。
2. MySQL的基础架构
Mysql是一种关系型数据库产品。关系型数据库是建立在关系模型基础上的数据库。现实世界中,实体与实体之间都是有联系的,这种联系一般可以用关系模型来表示。
数据库产品架构一般可以分为应用层、逻辑层、物理层。
(1) 应用层:负责与客户端交互,建立连接、记住连接状态,响应请求,返回数据和控制信息。
(2)逻辑层 : 负责具体的查询、事务、存储、恢复等。
当客户端有用户发起查询请求时,数据库就会分配一个线程来处理,由【查询处理器】解析并生成执行计划,然后交给【执行器】执行,执行器有时需要访问更底层的【事务管理器、存储管理器】来操作数据;事务管理器主要负责事务管理与并发控制,其中确保事务的"ACID"特性,通过锁管理器来控制并发;存储管理器主要负责存储管理,其中日志管理器确保数据持久化,存储管理器还包括一个缓冲器,用它来确定磁盘和内存缓冲之间的数据传输。
(3)物理层:物理磁盘上的文件,包括日志文件、数据文件等。
参照图片,尝试理解一下:
- Connection Pool:可以理解为应用层,负责连接建立,验证,保持连接等功能。
- Management Service : 可以理解为逻辑处理层,负责调度其它组件,完成业务逻辑与数据处理。
- Fiile System 与 Files & Logs :可以理解为物理层。也就是真正的物理文件。
3. 客户端与数据库交互过程架构图
(1) Client发布查询流程,调用Connetion Handler获取连接,发布查询。
(2)Connetion Handler,首先查询Query Cache,如果缓存中有结果集直接返回,没有结果集则调用Parser解析查询,再调用Optinizer优化器生成【执行计划】。
什么是执行计划?SQL是声明性语言。它只告诉数据库要查什么,但是怎么查却没讲。数据库要做的就是基于算法和统计信息计算出一条最优的访问路径,这个工作就是由优化器来完成的。
(3)然后运行执行计划,通过Pluggable Storage Engine API从存储引擎中获取数据,并返回给客户端。
4. MySQL权限
MySQL的权限包括两个方面。
(1) 服务器检查是否允许你连接
(2)假设可以连接,服务将检查你发出的每个请求,查看你是否有足够的权限实施它。
Mysql通过IP+端口、用户名、密码三要素来验证用户。
shell
shell>mysql -h localhost -u root -proot1234 -P 3306
本机电脑还可以省略 -h -P
mysql -u root -proot1234
4.1 赋予权限和回收权限
程序账号有增加、删除、查询、修改这四项功能。
演示 : 赋予查询、插入、修改、删除权限,并进行密码设置。
mysql>grant select,insert,update,delete on db_name.* to username@'10.%' identified by 'password';
回收上面所赋予的权限
mysql>revoke select,insert,update,delete on db_name.* from username@'10.%';
5. 长连接、短连接、线程池
当数据库服务器和客户端位于不同主机时,就需要建立网络连接来进行通信。
5.1 短连接
短连接是指程序和数据库通信时需要建立连接,执行操作后,连接关闭。简单来说:每次操作数据库都需要打开和关闭数据库连接。
短连接弊端:在慢速网络下使用短连接,连接开销就很大;在生产繁忙的系统中,连接也可能会受到系统端口的数的限制。(连接断开后,端口不会被马上回收利用,而是要经历FIN阶段的等待,直到可以被回收利用为止,这样就会导致端口资源不够用。
解决办法1 : 扩大端口数量
解决办法2 : MySQL配置监听多个IP地址,这样就增加了端口资源。
5.2 长连接
长连接指程序之间的连接在建立之后,就一直打开,被后续程序调用。使用长连接的初衷是减少连接的开销。
当受到一个永久连接的请求时,程序会检查是否存在一个相同的永久连接。如果存在,则直接将使用这个连接;如果不存在,则建立新的连接。所谓相同的连接,指的是相同的用户名和密码到相同主机的连接。
对于高并发的业务,推荐使用长连接或连接池。但是维持连接也是需要内存的。现代的操作系统可以拥几千个数据库连接,但是大部分都是睡眠状态的,这样的操作也会导致内存浪费。
对于扩展性好的站点来说,其实大部分的访问并不需要连接数据库。如果用户需要频繁访问数据库,会造成性能问题,这是长短连接都无法解决的,所以应该进行合理的设计和优化来避免性能问题。
Java中有连接池技术。在研发的过程中,研发工程师、系统运维工程师、DBA需要保持沟通,确定合理的连接策略,千万不要不假思索的就采用长连接。
5.3 连接池
由于数据库创建和销毁连接的开销很大,或者相对于执行的具体数据操作,连接所消耗的资源过多,此时就需要添加连接池来改进性能。
6. 存储引擎
InnoDB引擎
InnoDB 是MySQL默认引擎,它的优点:
- 灾害恢复性好
- 支持4种级别的事务,默认的事务隔离级别是可重复读,它的事务支持是通过多版本并发控制的MVCC。
- 使用行级锁。
- 对于InnoDB引擎中的表,其数据的物理组织形式是簇表,数据按照主键来组织,也就是说逐渐索引和数据是在一起的,数据按主键的顺序物理分布。
- 实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取。
- 支持外键。
- 支持热备份。
7. MySQL的复制架构 主从模式
复制模式有以下几种:
- 主从模式 A->B
- 主主模式 A<-->B
- 链式复制 A -> B -> C
- 环形复制 A ->B -> C -> A
8. 基础概念
单点故障
单点故障指系统中的某个部分,一旦失败,将会导致整个系统无法工作。为了消除单点故障,一般需要增加冗余组件或冗余系统。比如服务器的电源冗余、网卡冗余、磁盘raid阵列、冗余的服务器,备用的数据中心等。如果要设计高可用的服务,单点故障时需要尽量避免的。
读写分离
由于数据库只能接受有限的读请求,对于读请求较多的应用,数据库可能会成为瓶颈,为了增加读的能力,提高扩展性,因此引入了读写分离技术。比如:利用复制技术配置多个从库,以承担更多的读请求,或者应用程序直接访问数据库,或者通过一个负载均衡软件分发读请求。写入操作和一些读操作仍然访问主库。由于MySQL的复制时异步的,所以要留意复制延时对于读写分离的影响。