- 無效索引:如果一個索引始終無法被查詢使用,它的存在只能增加數(shù)據(jù)庫的維護開銷,開發(fā)者應(yīng)該及時刪除這些索引。通過MySQL 5.7 sys庫schema_unused_indexes視圖,可以查看當前實例哪些索引從沒有被使用。
容量規(guī)劃
數(shù)據(jù)庫的運行依賴計算、存儲、網(wǎng)絡(luò)等多種資源,通過對各種資源的使用情況分析,對資源進行合理的規(guī)劃配置,是數(shù)據(jù)庫穩(wěn)定運行的必要條件。
- CPU: 通常使用CPU利用率衡量CPU的繁忙程度,通過top命令,開發(fā)者可以查看CPU利用率實時變化。CPU 利用率持續(xù)超過80%,預(yù)示計算資源已經(jīng)接近飽和,如果開發(fā)者已經(jīng)做過SQL優(yōu)化,則需要使用更高配置的CPU。通過查看7天內(nèi)CPU利用率超過80%的時間占整體時間的百分比,以及單次持續(xù)時間超過一定閾值,則可視為CPU擴容的觸發(fā)條件。
- IO:大部分數(shù)據(jù)庫應(yīng)用都是的IO Bound類型,IO 處理能力直接決定了數(shù)據(jù)庫的性能。IO 利用率統(tǒng)計了一秒內(nèi)IO請求隊列非空的時間比例,IO利用率越高就表示硬盤越繁忙。但是IO 利用率100%并不表示系統(tǒng)已經(jīng)無法處理更多的IO請求。IOPS和每秒IO字節(jié)數(shù)可以從存儲設(shè)備的層次更準確的描述IO負載。每一個存儲設(shè)備都有IOPS和每秒IO字節(jié)數(shù)的上限,任意一個達到上限,就會成為IO處理能力的瓶頸,在傳統(tǒng)機械硬盤中,隨機IO主要受到IOPS的限制,順序IO主要受帶寬限制。除此之外,我們還可以從應(yīng)用的角度,使用一次IO請求的響應(yīng)時間來描述IO負載,一次IO請求的響應(yīng)時間包括其在隊列中的等待時間和實際IO處理時間之和。通過iostats開發(fā)者可以很方便的收集這些數(shù)據(jù)。如果這些指標在一段時間內(nèi)持續(xù)接近設(shè)定上限,則可以認為IO 過載,通過擴大內(nèi)存,讓更多的讀寫請求命中緩存可以緩解硬盤IO。另外,使用更高配置的存儲設(shè)備,例如固態(tài)硬盤,也可以大幅提高系統(tǒng)的IO處理能力。
- 存儲空間:存儲空間不足會導(dǎo)致嚴重的系統(tǒng)故障,數(shù)據(jù)庫可能會宕機,更為嚴重的是數(shù)據(jù)庫進程存活,但是無法響應(yīng)服務(wù),從而造成基于進程的宕機監(jiān)控失效。根據(jù)7天內(nèi)數(shù)據(jù)庫中存儲數(shù)據(jù)的變化,我們可以按照一定的擬合算法,估算出未來3天內(nèi)數(shù)據(jù)的增長情況,來判斷實例是否存在存儲空間不足的風險。
- 內(nèi)存:使用InnoDB存儲引擎的MySQL數(shù)據(jù)庫在實例啟動時,就會預(yù)分配一塊固定大小的內(nèi)存空間,所有讀寫請求都會在該空間中完成,如果內(nèi)存中緩存了用戶讀寫的數(shù)據(jù),則直接讀取內(nèi)存,如果內(nèi)存中沒有用戶讀寫的數(shù)據(jù),則需要將數(shù)據(jù)先從硬盤中l(wèi)oad進內(nèi)存中,由于內(nèi)存的讀寫速度遠遠快于硬盤,這就使得讀寫請求是否命中內(nèi)存決定了讀寫請求的處理速度。內(nèi)存空間越大,緩存數(shù)據(jù)越多,命中的幾率也就越大。所以我們可以使用緩存命中率來衡量內(nèi)存空間大小是否滿足應(yīng)用的需求。在MySQL中,show engine innodb status 命令的Buffer pool hit rate可以度量近一段時間范圍內(nèi)Buffer pool的命中情況。
- 網(wǎng)絡(luò):網(wǎng)絡(luò)帶寬在數(shù)據(jù)庫返回記錄較多的情況下,也可能會成為系統(tǒng)的瓶頸。一般我們使用每秒網(wǎng)絡(luò)流入和流出字節(jié)數(shù)來衡量網(wǎng)絡(luò)流量是否達到帶寬限制。在云環(huán)境下,每臺虛擬機或者容器都是有一定的網(wǎng)絡(luò)帶寬配額,私有網(wǎng)絡(luò)的配額相對比較大,公網(wǎng)配額與用戶付費相關(guān);使用iftop 可以查看當前系統(tǒng)的網(wǎng)絡(luò)流量;
服務(wù)安全
- 弱密碼:MySQL的登陸認證使用的是IP和賬戶密碼的方式,很多開發(fā)者為了方便記憶,習(xí)慣將數(shù)據(jù)庫密碼設(shè)置為弱密碼,這實際是非常危險的。數(shù)據(jù)庫中的數(shù)據(jù)很多涉及敏感業(yè)務(wù),弱密碼非常容易被破解,對數(shù)據(jù)庫中的數(shù)據(jù)是一個嚴重安全隱患。MySQL系統(tǒng)庫mysql庫下的user表的password字段保存了所有用戶的密碼,MySQL使用的是兩次sha-1的不可逆加密算法,所以我們無法通過password字段獲取用戶的密碼內(nèi)容,但是我們可以通過將常見弱密碼制成彩虹表,模擬MySQL的加密算法,匹配password字段,即可發(fā)現(xiàn)數(shù)據(jù)庫中的弱密碼賬號。
- 網(wǎng)絡(luò)安全