深入浅出Mysql数据库开发优化与管理维护笔记 22 磁盘IO的问题和数据分布



作为应用系统的持久化层,不管数据库采取了什么样的cache机制,数据最终都是要存在磁盘上.

实际上我们对sql优化,数据库对象优化,数据库参数优化以及应用优化等,大部分都是想通过减少或延缓磁盘读写来减轻I/O的压力.


磁盘阵列(RAID

RAIDRedundant Array of Inexpensive Disks的缩写,通常叫做磁盘阵列.RAID是按照一定策略将数据分布到若干物理磁盘上,这样不仅增强了数据存储的可靠性,而且可以提高数据的读写性能.(因为分布实现了数据并行读写)

RAID 0:也叫条带化,连续以位或字节为单位分割数据,并行读/写于多个磁盘上,因此具有很高的数据传输率,但它没有数据冗余,因此并不能算是真正的RAID结构。RAID 0只是单纯地提高性能,并没有为数据的可靠性提供保证,而且其中的一个磁盘失效将影响到所有数据。因此,RAID 0不能应用于数据安全性要求高的场合.缺点是数据无冗余,可靠性差.


RAID 1:也叫磁盘镜像,它是通过磁盘数据镜像实现数据冗余,在成对的独立磁盘上产生互 为备份的数据。当原始数据繁忙时,可直接从镜像拷贝中读取数据,因此RAID 1可以提高读取性能。RAID 1是磁盘阵列中单位成本最高的,但提供了很高的数据安全性和可用性。当一个磁盘失效时,系统可以自动切换到镜像磁盘上读写,而不需要重组失效的数据.缺点是容量一定需要2倍的磁盘.


RAID 10:RAID1RAID0的结合,也叫RAID1+0.先对磁盘做镜像,在条带化,使其兼具RAID1的可靠性和RAID0的优良并发读写性.缺点是容量一定需要2倍的磁盘.

RAID 4:RAID 4RAID0一样,也将数据条块化并分布于不同的磁盘上,但条块单位为块或记录。另外RAID 4使用一块磁盘作为奇偶校验盘,每次写操作都需要访问奇偶盘,这时奇偶校验盘会成为写操作的瓶颈,因此RAID 4在商业环境中也很少使用。


RAID5:RAID 5RAID 4的改进.不单独指定的奇偶盘,而是在所有磁盘上交叉地存取数据及奇偶校验信息。在RAID 5上,读/写指针可同时对阵列设备进行操作,提供了更高的数据流量。RAID 5更适合于小数据块和随机读写的数据。缺点是写性能不如以上,在出现坏盘时,读性能会下降.


选择合适的RAID级别

1.如果数据读写都很频繁,可靠性要求高,最好选择RAID 10.

2.如果数据读写频繁,写相对较少,对可靠性有一定要求,可以选择RAID 5

3.如果数据读写都很频繁,但可靠性要求不高,可以选择RAID 0 .



使用Symbolic Links 分布 I/O

Mysql的数据库名和表名与文件系统的目录名和文件名是相对应的,默认情况下所有的数据库和表都放在参数默认定义的目录下.这样如果不使用RAID或逻辑卷,所有的表都放在一个磁盘设备上,无法发挥多磁盘并行读写的优势!我们可以使用操作系统的符号链接(Symbolic links)将不同的数据库或表或索引指向不同的物理磁盘,从而达到分布磁盘I/O的目的.

1.将一个数据库指向其他物理磁盘,先在目标磁盘上建立一个目录,然后在创建从mysql 目录到目标目录的符号链接.

Shell> mkdir /otherdisk/databases/test

Shell> ln -s /otherdisk/databases/test /path/to/datadir


2.myisam(其他存储引擎的表不支持)表的数据文件或索引文件指向其他物理磁盘.

对于新建的表,可以通过在create table语句中增加data directoryindex directory选项来完成:

如:create table test(id int primary key)type = myisam ,data directory = '/disk2/data' ,index directory = '/disk3/index' ;


对于已有的表,可以先将其数据文件(.MYD)或索引文件(.MYI)转移到目标磁盘,然后再建立符号链接即可.注表定义文件(.frm)必须位于Mysql默认目录下.


3.Window下使用符号链接是通过在Mysql数据文件目录下创建包含目标路径并以.sym结尾的文本文件来实现的.假如mysql的数据文件目录是C:\mysql\data ,需要把数据库foo存放到D:\data\foo,可以如下实现.

首先创建目录D:\data\foo,然后创建文件C:\mysql\data\foo.sym,在其中输入D:\data\foo,这样在数据库foo创建的表都会存储到D:\data\foo目录下.



提示:使用symbolic links存在一定的安全风险,如果不使用symbolic links,应通过启动参数skip-symbolic-links禁用这一功能.





禁止操作系统更新文件的atime属性

atimelinux系统下的文件属性,每当读取文件时操作系统都会更改atime.对于atime的使用基本不会用到但是atime会影响I/O的性能.所以我们可以关闭修改atime属性以减轻磁盘I/O的负担.

1.修改文件系统配置文件/etc/fstab,指定noatime选项:

LABEL=/home/homeext3noatime12

2.重新mount文件系统:

#mount -oremount /home



用裸设备(Raw Device)存放InnoDB的共享表空间

Myisam存储引擎有自己的缓存机制,但数据文件的读写完全依赖于操作系统,操作系统磁盘I/O缓存对Myisam的存取很重要.InnoDBMyisam不同,它类似Oracle的数据缓存机制来Cache索引和数据,操作系统的磁盘I/O缓存对其性能不仅没有帮助,甚至还有反作用.因此在InnoDB缓存充足的情况下,可以考虑使用Raw Device来存放InnoDB共享表空间.

1.修改Mysql配置文件,innodb_data_file_path参数增加裸设备文件名并指定newraw属性:

[mysqld]

Innodb_data_home_dir =

Innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:2Gnewraw


2.启动Mysql,使其完成分区初始化工作,然后关闭mysql,此时还不能创建或修改InnoDB:

3.innodb_data_file_path中的newraw改成raw:

[mysqld]

Innodb_data_home_dir =

Innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw


4.重新启动既可使用.



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章