MySQL技术白皮书 | ||||||||||||||||
1. 摘要 MySQL是一种开放源码的关联数据库管理系统,MySQL数据库服务器具有快速、可靠和易于使用的特点,MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中。 本文档主要描述了MySQL数据库的各种使用特点。 2. 关键词 MySQL,HA,innoDB,mysql cluster,iscsi 3. 名词解释 缩略语 英文全名 中文解释 HA High availability 高可靠性 4. 概述 4.1. 该技术产生的背景 由于网站通常都是由小做大,在初期很少投入的情况下使用免费的mysql数据库,随着网站越来越大数据量、访问量都对数据库要求越来越高,单台mysql数据库服务器已经难以满足网站的需求,而且对数据库的安全级别也提高了,就出现了mysql的HA技术以及mysql服务器群,甚至多种数据库技术混合使用。 4.2. 该技术目前实现的情况 随着各个网站对数据库的要求理解不同,mysql的组网方式也是五花八门,本文档也无法将所有mysql组网技术提到,只能做个抛砖引玉。 5. 基础知识 5.1. MySQL数据库 MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。 由于MySQL是开放源代码的,因此任何人都可以在General Public License的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。 MySQL关系型数据库于1998年1月发行第一个版本。它使用系统核心提供的多线程机制提供 完全的多线程运行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等编程语言的编程接口(APIs),支持多种字段类型并且提供了完整的操作符支持查询中的SELECT和WHERE操作。 时至今日 mysql 和 php 的结合绝对是完美.很多大型的网站也用到mysql数据库。 5.2. 高可用性HA(High Availability) 是通过尽量缩短因日常维护操作(计划)和突发的系统崩溃(非计划)所导致的停机时间,以提高系统和应用的可用性。它与被认为是不间断操作的容错技术有所不同。HA系统是目前企业防止核心计算机系统因故障停机的最有效手段。 6. 技术原理描述 6.1. MySQL遵循标准的SQL规范 SQL是用于访问数据库的最常用标准化语言,它是由ANSI/ISO SQL标准定义的。SQL标准自1986年以来不断演化发展,有数种版本, 目前MySQL使用的是ANSI/ISO SQL组织2003年发布的版本。使得MySQL的应用在往大型商用数据库迁移减少成本。 6.2. MySQL的组网方式 6.2.1. 单台MySQL服务器 整个网站只有一台MySQL的数据库服务器提供数据服务。甚至连web服务也在一起。 拓扑如下图:
6.2.2. 多台MySQL服务器,将不同的应用数据放在不同的MySQL数据库中 随着数据访问量的增大,数据库写入、更新、查询引起的IO消耗越来越多,数据库反应越来越慢,导致了整个系统变慢,本着分散IO的目的,就按不同的应用分配到不同的数据库服务器中,使用户的操作分散在各台不同的服务器,减轻了单台服务器的负担提高了效率。 应用逻辑图如下:
网络拓扑如下:
6.2.3. 多台MySQL服务器,采用读写分离 随着网站的发展,查询业务是整个数据库提供服务乃至整个网站提供服务的核心,在写操作不是非常大的情况下,提供mysql服务器做写业务,剩下的mysql服务器都只提供查询业务,保证了向用户提供的查询业务的顺畅,这种方式就是读写分离。 为实现读写分离,按mysql服务器的功能分为主从mysql服务器,主服务器提供源数据给从服务器,其中主MySQL服务器执行所有的数据库写操作,将做过的操作写入数据库日志中,主服务器再将这些写入日志的操作同步到从MySQL服务器中去执行,所以从服务器得到主服务器数据有时间差,多台从MySQL服务器执行用户查询的操作,对主MySQL服务器采用HA方式,保证没有单点故障。 应用逻辑图如下:
网络拓扑如下:
主从服务器之间没有心跳数据,主服务器将sql操作语句(insert,update,delete这些对数据产生影响的操作)传送给从服务器,他们之间通信是通过tcp/ip协议,3306端口传送sql命令的ascii码,没有固定长度,由于操作是用户发起,主从服务器之间没有固定流量,主服务器上执行的sql语句在从服务器上也会执行一遍。 传送的数据报文如下:
也是由于主从服务器之间通过3306端口同步数据,从服务器数量不能太多,否则会严重影响到主服务器的性能。 6.2.4. 多台MySQL服务器,采用MySQL推出的mysql cluster技术 Mysql cluster是mysql公司推出的应用,将数据存储在数据节点服务器的内存中,通过mysql节点查询数据,由于该技术还不够完善,目前没有见到其商用案例。 Mysql cluster中数据节点服务器与管理服务器之间通过tcp端口35595发心跳包,,由管理节点发出28字节询问包,数据节点回应100字节心跳包,再由管理节点回0字节的ack包。 mySql节点向数据节点端口35595发送36字节tcp心跳包,数据节点回ack。mySql节点查询返回的数据也通过35595 tcp端口发送返回数据,返回二进制数据。 应用逻辑图如下:
网络拓扑如下:
6.2.5. 多台mysql服务器采用不同技术混合使用 读写分离,应用分离,用户分离,根据网站的不同访问情况将不同的mysql数据库分成不同的数据库群,形成复杂的数据库群应用。 例如以下拓扑图:
7. 典型应用描述 YouTube网站 维基百科 淘宝、阿里巴巴都有部分采用 新浪等 8. MySQL的存储引擎 8.1. innoDB存储引擎 随着oracle收购了mysql后推出了mysql5.5的版本,mysql默认数据库引擎就修改为innodb,InnoDB给MySQL提供 了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非 锁定读。这些特色增加 了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。 InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的innodb已经初步具备了oracle的一些特征,使得mysql数据库的性能越来越好。Innodb具备了数据文件、回滚段,分区表,存储过程,支持数据文件建立在裸设备中(原来都是oracle才具有的功能),对事务支持越来越好,数据读取速度更快,支持大型数据库表。 8.2. MyISAM存储引擎 MyISAM基于更老的ISAM代码,但有很多有用的扩展,MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持。 9. MySQL的HA技术 9.1. 采用共享存储方式 Mysql数据库数据文件存放在共享存储中(如网络存储、磁盘阵列,NFS网络文件系统),两台Mysql服务器做主备,服务器之间通过心跳软件发送网络心跳信号,当侦测到主服务器宕掉时,备用服务器接管所有的资源,取得vip成为主数据库服务器。 其拓扑图如下:
9.2. DRBD方式 将mysql的数据库数据通过drbd软件复制成本地远程两份,当数据库出现问题时,其数据可以从远程路径中找到并成为新的数据库,从而达到数据的高可用性。 拓扑如下:
9.3. 主从方式(异步方式) 一台mysql主服务器负责写操作,将数据库操作写成日志文件,再将写入日志文件的内容通过网络传送给从mysql数据库服务器,从而达到数据的高可用性(主从服务器数据有时间差)。 9.4. 主从方式(半同步方式) 一台mysql主服务器负责写操作,同步将操作通过网络直接通知从mysql数据库服务器,当网络出现问题时,这种同步方式自动转为复制日志文件的异步操作,从而达到数据的高可用性。 9.5. 多主服务器方式 多台mysql服务器互为主从服务器,向其中任何一台数据库写数据,该数据库的所有数据操作都将通过网络传送给给其他mysql数据库服务器,从而达到数据的高可用性。 拓扑如下:
9.6. Mysql cluster实现HA 只要将Mysql cluster的复制数据配置改为2个以上就能达到数据备份在不同节点的作用,保证不会单点故障。 10. MySQL数据库实现过程举例 普通中型网站最常用的方式
这个拓扑中两台mysql服务器互做主从关系,它们之间运行ha软件,vip在其中一台服务器上,当ha软件检测到master服务器出问题的时候就会将vip挪给salve的服务器,让它成为master,剩下的服务器都是mysql的从服务器,只从vip的服务器上取日志将数据同步到本机中,对外提供查询服务。 11. Mysql数据包特点 Mysql是基于tcp/ip进行通信的,默认tcp通信端口为3306,通信内容基本是ascii码。以下是mysql通信包解析图:
11.1. 用户大量查询数据包的特点
Web服务器与mysql服务器之间,主要的包分布比例如下:
其中包长再80-319之间主要sql的查询语句,包长640以上主要是返回数据,40-79之间的包主要是通讯包。 当用户在web端发送select请求时:
mysql服务器与网络存储netapp之间的数据包统计信息如下:
11.2. 纯粹的数据库操作语句(insert),相关数据包特点
Web服务器与mysql服务器之间数据包统计如下:
在主mysql数据库服务器与从mysql数据库服务器之间的包统计结果如下:
12. 测试不同交换机对mysql的影响 根据mysql的各种组网方式对网络时延的敏感性分析,选择以下两种情形检查mysql查询对交换机时延的敏感性。 12.1. 测试交换机时延对mysql cluster的影响 网络拓扑如下图:
根据mysql cluster的组网特点,一共5台服务器,其中一台做管理节点兼做lvs服务器(mgm node+lvs),在剩下的4台服务器上部署ndb node(mysql cluster的数据节点,mysql cluster所有的数据都放在ndb节点中,做两份数据拷贝,保证任何一台服务器损坏的情况下不影响整个系统运行,就是没有单点故障),在其中的3台服务器上部署Mysql node(提供用户查询入口,通过lvs将用户请求平均分配在这三台mysql node中),在剩下的一台中部署web服务器。用户通过调用web服务器,将数据库请求送往lvs节点,由lvs将数据库请求平均分配给3台mysql接入节点上,由3台mysql接入节点到4台数据节点中查询数据。 通过在web端发起并发的数据库查询请求,两种交换机的时延对查询的时延没有造成任何影响。 12.2. 测试交换机时延对mysql网络存储的影响 网络拓扑如下:
在一台服务器上安装mysql server,将其innodb的数据文件放在通过iscsi连接的netapp网络存储中,在mysql server中建innodb数据表。在web端发起对mysql innodb数据库表的查询,这样mysql的查询就通过iscsi访问到达骨干交换机6080或者6210直到netapp网络存储。 通过对innodb的全表扫描、并发全表扫描、并发多次查询数据,没有发现两款交换机时延对查询速度有影响。 通过测试软件sysbench测试mysq innodb性能(测试数据5000000条记录,32个线程,采用innodb引擎,确保测试数据通过iscsi访问网络存储),没发现两款交换机的时延对mysql的读写性能造成任何影响。
|