Mysql数据库架构介绍

Posted aserendipper

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql数据库架构介绍相关的知识,希望对你有一定的参考价值。

一、mysql单例数据库架构
1、Mysql体系介绍

  • 网络连接层:提供与Mysql服务器建立连接的支持
  • 核心服务层:主要包含系统管理和控制工具、连接池、SQL接口、解析器、查询优化器和缓存六个部分
  • 存储引擎:负责Mysql中数据的存储与提取,与底层系统文件进行交互
  • 文件系统:负责将数据库的数据和日志存储在文件系统之上,并完成与存储引擎的交互,是文件的物理存储层

2、SQL运行过程

3、InnoDB内存和存储结构

优势:擅长处理事务,具有自动崩溃恢复的特性
内存结构:内存结构主要包括Buffer pool、Change Buffer、Adaptive Hash Index和Log Buffer四大组件
* 内存Page:Free Page、Clean Page(真正的缓存)、Dirty Page
* 链表管理:Free List、Flush List、LRU List
存储结构:InnoDB磁盘主要包含Tablespaces、InnoDB Data Dictionary、Doublewrite Buffer、Redo Log和Undo Logs

(1)Buffer pool

  • 缓冲池(buffer pool)是一种常见的降低磁盘访问的机制,在MySQL启动的时候,向操作系统申请的一片连续的内存空间,然后按照默认的16kb(操作系统的页4KB)划分为一个个的缓存页,此时这些缓存页是空闲的,随着程序的运行才会有磁盘上的页被缓存到Bufffer Pool中。默认配置下Buffer Pool只有128MB
  • 缓冲池通常以页(page)为单位缓存数据,InnoDB会把存储的数据划分为若干个页,以页作为磁盘和内存交互的基本单位,一个页的默认大小为16KB。每个缓存页都会创建一个控制块,控制块包括缓存页的表空间、页号、缓存页地址、链表节点等

(2)Change Buffer
是一个提高INSERT、DELETE、UPDATE等写时效率的写缓存。应用在非唯一普通索引页(唯一索引必须进行唯一性检查,需要读取磁盘)、不在缓冲池中(在缓存池中则直接修改缓存池中的页)、对页进行了写操作,并不会立刻将磁盘页加载到缓冲池,而仅仅记录缓冲变更(Buffer Change),等未来数据被读取时,再将数据合并恢复到缓冲池的技术。写缓冲的目的是降低写操作的磁盘IO,提升数据库性能。

(3)Binlog
用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中,由Server层进行记录。使用场景分别是主从复制和数据恢复。日志格式包含三种
STATMENT:基于sql语句的复制,每一条会修改数据的sql语句会记录到binlog中(缺点:更新时使用sysdate)
ROW:基于行的复制,记录哪条数据被修改的信息
MIXED:基于STATMENT和ROW两种模式的混合复制

(4)Redo log
用于解决数据库事务提交还未刷入磁盘,服务器down机导致的数据丢失问题。记录事务对数据页做了哪些修改,不去直接刷新磁盘。包括两个部分,一个是内存中的日志缓冲(redo log buffer),另一个是磁盘上的日志文件(redo log file)。mysql每执行一条DML语句,先将记录写入redo log buffer,后续某个时间点再一次性将多个操作记录写到redo log file。这种先写日志,再写磁盘的技术就是WAL(Write-Ahead Logging)技术。
因为redo log是InnoDB特有的,且日志上的记录落盘后会被覆盖掉。因此需要binlog和redo log二者同时记录,才能保证当数据库发生宕机重启时,数据不会丢失。

(5)Undo log
实现MVCC和事务回滚,undo日志版本链是指一行数据被多个事务依次修改过后,在每个事务修改完后,Mysql会保留修改前的数据undo回滚日志,并且用两个隐藏字段trx_id和roll_pointer把这些undo日志串联起来形成一个历史记录版本链。

(6)Free List(空闲链表)
为了标记哪些页是空闲页,将空闲缓存页的控制块作为链表的节点,串起来形式Free链表。当需要从磁盘中加载一个页到Buffer Pool中时,就从Free链表中取出一个空闲的缓存页,并且把该缓存页对应的控制块的信息填上,然后把该缓存页对应的控制块从Free链表中移除
(7)Flush List
更新数据时,不需要每次写入磁盘,而是将Buffer Pool对应的缓存页标记为脏页,然后再由后台线程将脏页写入到磁盘。为了知道哪些缓存页是脏的,于是有了Flush链表,与Free链表类似,区别在于Flush链表的元素都是脏页.
InnoDB更新操作采用的是Write Ahead Log策略,即先写日志,再写入磁盘,通过redo log日志让MySQL拥有了崩溃恢复能力。
(8)LRU List

  • 缓冲池的常见管理算法是LRU,memcache,OS,InnoDB都使用了这种算法
  • InnoDB对普通LRU进行了优化
    • 将缓冲池分为老生代和新生代,入缓冲池的页,优先进入老生代,页被访问,才进入新生代,以解决预读失效的问题
    • 页被访问,且在老生代停留时间超过配置阈值的,才进入新生代,以解决批量数据访问,大量热数据淘汰的问题

4、TableSpace

Segment:数据段、索引段、回滚段
Extent:一个段包含多个区、一个区包含64个页
Page:一个页包含多条记录
Row:用户写入的实际数据

5、Page

  • File Header:主要包含FIL_PAGE_PREV、FIL_PAGE_NEXT一页指针和下一页指针(页在磁盘上的偏移量)
  • Page Header:标记记录位置和UserRecords统计
  • Infimum&Supremum Records:描述是最小的记录和最大记录的开区间
  • Free Space:UserRecords和Free、不够申请新的页
  • Page Directoy:每写入一定数量Records作为一个Slot,在定位到Page后根据slot提升查找性能
  • File Trailer:低4位Checksum、高4位和File Header的LSN一致

6、InnoDB线程模型

  • IO Thread:大量AIO读写处理,提高数据库性能(Read Thread、Write Thread、Log Thread、Insert Buffer Thread)
  • Purge Thread:事务提交后,其使用的Undo日志将不再需要,因此需要Purge Thread回收Undo日志
  • Page Cleaner Thread:将脏数据刷新到磁盘,脏数据刷盘后相应的Redo Log也就可以覆盖,即可以同步数据,又能达到Redo Log循环使用的目的,会调用Write Thread线程处理
  • Master Thread:负责调度其他各线程,优先级最高,作用是将缓冲池中的数据异步刷新到磁盘,保证数据一致性。包含:脏页的刷新、Undo页回收、Redo日志刷新、合并写缓冲等

7、备份机制

  • 传统备份
    • MySQLDump逻辑全备+逻辑Binlog日志
    • XtraBackup物理全备(Copy文件+Redo增量)+逻辑Binlog日志
  • 快照备份
    • 基于ECS云盘快照+逻辑Binlog日志

二、Mysql数据复制
1、Mysql数据复制原理

  • Binlog:主备复制基于Binlog日志
  • Dump Thread:为每个Slave的I/O Thread启动一个Dump线程,用于向其发送Binary Log Events
  • I/O Thread:向Master请求二进制日志事件,并保存于中继日志中
  • SQL Thread:从中继日志中读取日志事件,在本地完成重放

2、Mysql复制架构

3、Mysql复制模式

三、Mysql高可用及进阶
1、Mysql高可用原理

2、Keepalived架构

  • 背景:业界传统高可用方案
  • Core:keepalived的核心,负责主进程的启动和维护,全局配置文件的加载解析
  • Check:负责HealthChecker,包括了各种健康检查方式,以及对应的配置的解析包括LVS的配置解析;可基于脚本检查对IPVS后端服务器健康状况进行检查
  • VRRP:VRRP进行通信,通过竞选机制确定主备,主优先级高于备,主会一直发送VRRP广播包,告诉备它还活着,此时备不会抢占主,当主不可用时(即备监听不到主发送的广播包),备会启动相关服务接管资源,保证业务连续性。但无法进行第三方仲裁、会出现脑裂情况

3、MHA架构

  • MHA背景:业界方案
  • MHA组成:包括Manager节点和Node节点,管理节点一般独占机器,Node节点一般和每台MySQL Server在一起
  • MHA工作原理:Node节点通过解析各MySQL日志来进行一些操作,Manager节点将和每个Node节点通信,判断其Node上的MySQL是否正常。若发现故障,则直接把它的Slave提升为Master,其他的Slave都挂到新Master上,此过程对用户透明

4、MGR架构

  • 特性:核心解决异步复制和半同步复制数据一致性问题,可保证实物不丢失
  • 多数派:基于Paxos协议,若干节点组成复制组,一个事务发起提交,必须经过半数节点以上的决议通过,才可正常提交
  • 集群模式
    • 多主:客户端可随机向MySQL节点写入数据
    • 单主:集群选出新主节点提供写,源主和其他节点提供读

MySQL高级知识- MySQL的架构介绍

[TOC]

1、MySQL 简介

概述
  • MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。
  • MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

  • Mysql是开源的,所以你不需要支付额外的费用。
  • Mysql支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
  • MySQL使用标准的SQL数据语言形式。
  • Mysql可以允许于多个系统上,并且支持多种语言。这些编程语言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
  • Mysql对PHP有很好的支持,PHP是目前最流行的Web开发语言。
  • MySQL支持大型数据库,支持5000万条记录的数据仓库,32位系统表文件最大可支持4GB,64位系统支持最大的表文件为8TB。
  • Mysql是可以定制的,采用了GPL协议,你可以修改源码来开发自己的Mysql系统。

高级MySQL涉及到知识
  • mysql内核
  • sql优化攻城狮
  • mysql服务器的优化
  • 各种参数常量设定
  • 查询语句优化
  • 主从复制
  • 软硬件升级
  • 容灾备份
  • sql编程
  • 完整的mysql优化需要很深的功底,大公司甚至有专门的DBA写上述

2、MySQL Linux版的安装

  • 此次安装的是 MySQL 5.5, 安装环境 CentOS 6.5
  • 版本下载地址 官网下载地址
  • 检查当前系统是否安装过MySQL
    • 查询命令: rpm -qa|grep -i mysql
    • 删除命令: rpm -e --nodeps RPM包全名
  • 安装mysql服务端(注意提示)
  • 安装mysql客户端
  • 查看MySQL安装时创建的mysql用户和mysql组
    • # cat /etc/passwd | grep mysql
    • # cat /etc/group | grep mysql
  • mysql服务的启+停
    • 查看MySQL启停状态: # ps -ef | grep mysql
    • 启停操作:
      • # /etc/init.d/mysql start
      • # /etc/init.d/mysql stop
      • 或者
      • #service mysql start
      • #service mysql stop
    • 设置MySQL 自启服务
      • #chkconfig mysql on 设置自动启动
      • # chkconfig --list | grep mysql 检查是否设置了自动启动
    • 修改配置文件位置
      • 拷贝当前5.5版本: cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
      • 5.6版本 cp /usr/share/mysql/my-default.cnf /etc/my.cnf
    • 修改字符集和数据存储路径
      • 查看字符集
        • show variables like ‘character%‘;
        • show variables like ‘%char%‘;
        • 默认的是客户端和服务器都用了latin1,所以会乱码。
      • 修改字符集,修改之前copy 的配置文件。(详细后续代码)
      • MySQL的安装位置
        • 在linux下查看安装目录 ps -ef|grep mysql
路径解释备注
/var/lib/mysql/ mysql数据库文件的存放路径 /var/lib/mysql/atguigu.cloud.pid
/usr/share/mysql 配置文件目录 mysql.server命令及配置文件
/usr/bin 相关命令目录 mysqladmin mysqldump等命令
/etc/init.d/mysql 启停相关脚本  

[client]
#password = your_password
port = 3306
socket = /var/lib/mysql/mysql.sock

# 这一行需要设置字符集
default-character-set=utf8
 
# The MySQL server
[mysqld]
port = 3306

# 还有这三行
character_set_server=utf8
character_set_client=utf8
collation-server=utf8_general_ci

socket = /var/lib/mysql/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU‘s*2 for thread_concurrency
thread_concurrency = 8
 
[mysql]
no-auto-rehash
# 还有这一行
default-character-set=utf8

3、Mysql配置文件

主要配置文件
  • 二进制日志log-bin
    • 主从复制
  • 错误日志log-error
    • 默认是关闭的,记录严重的警告和错误信息,每次启动和关闭的详细信息等。
  • 查询日志log
    • 默认关闭,记录查询的sql语句,如果开启会减低mysql的整体性能,因为记录日志也是需要消耗系统资源的
  • 数据文件
    • 两系统
      • windows
        • D:\devSoft\MySQLServer5.5\data目录下可以挑选很多库
      • Linux:
        • 默认路径 #cd /var/lib/mysql/
        • 看看当前系统中的全部库后再进去 #ls -1F | grep ^d
    • frm文件: 存放表结构
    • myd文件: 存放表数据
    • myi文件: 存放表索引
  • 如何配置
    • Windows: my.ini文件
    • Linux: /etc/my.cnf文件

4、Mysql逻辑架构介绍

总体概览
  • 和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。
    • 1、连接层
      • 最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。
    • 2、服务层
      • 第二层架构主要完成大多少的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。
    • 3、引擎层
      • 存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。后面介绍MyISAM和InnoDB
    • 4、存储层
      • 数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。
查询说明
  • 首先,mysql的查询流程大致是:
    • mysql客户端通过协议与mysql服务器建连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析
    • 有一系列预处理,比如检查语句是否写正确了,然后是查询优化(比如是否使用索引扫描,如果是一个不可能的条件,则提前终止),生成查询计划,然后查询引擎启动,开始执行查询,从底层存储引擎调用API获取数据,最后返回给客户端。怎么存数据、怎么取数据,都与存储引擎有关。
    • 然后,mysql默认使用的BTREE索引,并且一个大方向是,无论怎么折腾sql,至少在目前来说,mysql最多只用到表中的一个索引。

5、Mysql存储引擎

  • 查看命令
    • 查看当前的MySQL 提供什么存储引擎
      • mysql> show engines;
    • 看你的 MySQL 当前默认的存储引擎:
      • show variables like ‘%storage_engine%‘;
  • MyISAMInnoDB
  • 阿里巴巴、淘宝用哪个
    • Percona 为 MySQL 数据库服务器进行了改进,在功能和性能上较 MySQL 有着很显著的提升。该版本提升了在高负载情况下的 InnoDB 的性能、为 DBA 提供一些非常有用的性能诊断工具;另外有更多的参数和命令来控制服务器行为。
    • 该公司新建了一款存储引擎叫xtradb完全可以替代innodb,并且在性能和并发上做得更好,
    • 阿里巴巴大部分mysql数据库其实使用的percona的原型加以修改。

以上是关于Mysql数据库架构介绍的主要内容,如果未能解决你的问题,请参考以下文章

LAMP架构介绍,MYSQL和MariaDB介绍,MYSQL安装

LAMP架构介绍,MYSQL和MariaDB介绍,MYSQL安装

美团MySQL实时同步到数据仓库架构与实践

LNMP架构介绍 MySQL安装 PHP安装 Nginx介绍

Mysql数据库架构介绍

MySQL高级知识- MySQL的架构介绍