磁盘I/O问题:
使用磁盘阵列:
- RAID(磁盘阵列)就是按照一定策略将数据分布到若干物理磁盘上,这样就增强了数据存储的可靠性,而且可以提高数据读写的整体性能。
常见RAID级别及其特性:
- 按数据分布和冗余方式,可将RAID分为几种级别:
如何选择RAID级别:
- 根据应用的读写特性,可靠性要求,预算可以从以下几个方面考虑选择RAID级别:
1. 数据读写都很频繁,可靠性要求也很高,最好选择RAID10;
2. 数据读写频繁,写相对较少,对可靠性有一定要求,可选择RAID5;
3. 数据读写都很频繁,但可靠性要求不高,可以选择RAID0。
虚拟文件卷或软RAID:
- 在不具备硬件条件下,可以使用一个软RAID技术,如Linux下的lvm2。
使用Symbolic Links分布I/O:
- 我们可以利用操作系统的符号连接(Symbolic Links)将不同的数据库或表,索引指向不同的屋里磁盘,从而达到分布磁盘I/O的目的。
- 将一个数据库指向其他物理磁盘,如:
mkdir /otherdisk/databases/test
ln -s /otherdisk/database/test /path/to/datadir/test
- 对于MyISAM存储类型的表,可以使用DATA DIRECTORY和INDEX DIRECTORY指定目录:
-- 对于新建表
CREATE TABLE test(
id INT PRIMARY KEY,
name VARCHAR(20)) TYPE = MyISAM DATA DIRECTORY = '/disk2/data' INDEX DIRECTORY = '/disk3/index'
-- 对于已存在的表
可将表的数据文件(.MYD)和索引文件(.MYI)移动到目标目录,再建立符号连接,但表的定义文件(.frm)必须位于MySQL的数据文件目录下。
- 在Windows下使用符号链接。
1. 创建目录D:\data\foo;
2. 创建文件C:\mysql\data\foo.sym,在其中输入D:\data\foo。
NOTE:Symbolic Links存在一定的安全风险,如果不使用Symbolic Links,应通过启动参数skip-symbolic-links禁用这一功能。
禁止操作系统更新文件的atime属性:
# 可修改/etc/fstab, 如
/dev/sda3 /home ext4 defaults,noatime 0 2
# 重新mount分区
sudo mount -a
用裸设备(Raw Device)存在InnoDB的共享表空间:
- 修改MySQL配置文件,在innodb_data_file_path添加裸设备名称,并指定newraw属性:
......
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdd1:3Gnewraw;/dev/hdd2:3Gnewraw
......
- 启动MySQL,使其完成分区初始化工作,然后关闭MySQL。此时还不能创建或修改InnoDB表。
- 将innodb_data_file_path中的newraw改成raw:
......
class=programlisting[mysqld]
innodb_data_home_dir=
innodb_data_file_path=/dev/hdd1:3Graw;/dev/hdd2:2Graw
- 重新启动MySQL即可。
不吝指正。