深入淺出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.重新啓動既可使用.



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