作爲應用系統的持久化層,不管數據庫採取了什麼樣的cache機制,數據最終都是要存在磁盤上.
實際上我們對sql優化,數據庫對象優化,數據庫參數優化以及應用優化等,大部分都是想通過減少或延緩磁盤讀寫來減輕I/O的壓力.
磁盤陣列(RAID)
RAID是Redundant Array of Inexpensive Disks的縮寫,通常叫做磁盤陣列.RAID是按照一定策略將數據分佈到若干物理磁盤上,這樣不僅增強了數據存儲的可靠性,而且可以提高數據的讀寫性能.(因爲分佈實現了數據並行讀寫)
RAID 0:也叫條帶化,連續以位或字節爲單位分割數據,並行讀/寫於多個磁盤上,因此具有很高的數據傳輸率,但它沒有數據冗餘,因此並不能算是真正的RAID結構。RAID 0只是單純地提高性能,並沒有爲數據的可靠性提供保證,而且其中的一個磁盤失效將影響到所有數據。因此,RAID 0不能應用於數據安全性要求高的場合.缺點是數據無冗餘,可靠性差.
RAID 1:也叫磁盤鏡像,它是通過磁盤數據鏡像實現數據冗餘,在成對的獨立磁盤上產生互 爲備份的數據。當原始數據繁忙時,可直接從鏡像拷貝中讀取數據,因此RAID 1可以提高讀取性能。RAID 1是磁盤陣列中單位成本最高的,但提供了很高的數據安全性和可用性。當一個磁盤失效時,系統可以自動切換到鏡像磁盤上讀寫,而不需要重組失效的數據.缺點是容量一定需要2倍的磁盤.
RAID 10:是RAID1和RAID0的結合,也叫RAID1+0.先對磁盤做鏡像,在條帶化,使其兼具RAID1的可靠性和RAID0的優良併發讀寫性.缺點是容量一定需要2倍的磁盤.
RAID 4:RAID 4同RAID0一樣,也將數據條塊化並分佈於不同的磁盤上,但條塊單位爲塊或記錄。另外RAID 4使用一塊磁盤作爲奇偶校驗盤,每次寫操作都需要訪問奇偶盤,這時奇偶校驗盤會成爲寫操作的瓶頸,因此RAID 4在商業環境中也很少使用。
RAID5:RAID 5是RAID 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 directory和index 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屬性
atime是linux系統下的文件屬性,每當讀取文件時操作系統都會更改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的存取很重要.但InnoDB與Myisam不同,它類似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.重新啓動既可使用.