MySQL集群性能優(yōu)化指南
譯文【51CTO精選譯文】MySQL集群是一款實(shí)時(shí)、可擴(kuò)展的事務(wù)性數(shù)據(jù)庫。其設(shè)計(jì)初衷在于為對(duì)實(shí)時(shí)性能要求較高的應(yīng)用程序打造一套嵌入式電信數(shù)據(jù)庫,并實(shí)現(xiàn)運(yùn)營(yíng)商級(jí)別的可用性。不過MySQL集群也可以通過擴(kuò)展實(shí)現(xiàn)諸多企業(yè)級(jí)解決方案,例如移動(dòng)支付系統(tǒng)、實(shí)時(shí)分析、數(shù)據(jù)流與分析以及內(nèi)容管理等事務(wù)。MySQL集群的橫向擴(kuò)展能力足以滿足密集型工作負(fù)載的需求,其集群架構(gòu)如下圖所示:
整信集群由三類節(jié)點(diǎn)構(gòu)成:數(shù)據(jù)節(jié)點(diǎn)、應(yīng)用程序節(jié)點(diǎn)以及管理節(jié)點(diǎn)。
- 數(shù)據(jù)節(jié)點(diǎn)通常負(fù)責(zé)數(shù)據(jù)訪問與存儲(chǔ)事務(wù)。
- 應(yīng)用程序節(jié)點(diǎn)提供由應(yīng)用程序邏輯層及應(yīng)用API指向數(shù)據(jù)節(jié)點(diǎn)的鏈接。
- 管理節(jié)點(diǎn)在集群配置體系中的作用至關(guān)重要,并在網(wǎng)絡(luò)分區(qū)環(huán)境下負(fù)責(zé)負(fù)載指派。
在本文中,我們將共同探討提升MySQL集群性能的***實(shí)踐方案。通過這些方案,大家將能在各類工作負(fù)載中實(shí)現(xiàn)游刃有余的資源分配效果。
最適合MySQL集群的應(yīng)用程序
MySQL集群能確保來自應(yīng)用程序或者SQL節(jié)點(diǎn)的更新立即被用于集群體系中的每一個(gè)節(jié)點(diǎn)。表格被劃分至一系列商用節(jié)點(diǎn)當(dāng)中,從而實(shí)現(xiàn)數(shù)據(jù)庫的橫向可擴(kuò)展性。
MYSQL集群在數(shù)據(jù)庫層處理表格劃分,這就避免了對(duì)應(yīng)用程序?qū)拥挠绊憽_@一特性能夠大大簡(jiǎn)化應(yīng)用程序的開發(fā)與維護(hù)工作。在事務(wù)性工作負(fù)載方面,MySQL集群還能提供非常強(qiáng)大的數(shù)據(jù)吞吐能力。另外,這套集群可以利用多個(gè)并行SQL節(jié)點(diǎn),且每個(gè)節(jié)點(diǎn)都提供多個(gè)連接。
最適合MySQL集群的應(yīng)用程序包括:
- 交易平臺(tái)/系統(tǒng);
- 支付網(wǎng)關(guān);
- 用戶配置管理;
- 多人網(wǎng)絡(luò)游戲;
- IMS服務(wù);
- DHCP寬帶接入;
- VoIP及視頻會(huì)議。
識(shí)別性能問題
我們一直建議大家對(duì)延遲及事務(wù)數(shù)據(jù)吞吐量等性能指標(biāo)進(jìn)行重復(fù)檢測(cè)方針。另一大關(guān)注重點(diǎn)在于考量數(shù)據(jù)庫的特定變更及其可用性。大家應(yīng)該在變更實(shí)際部署前進(jìn)行性能測(cè)試,并在優(yōu)化技術(shù)安置完畢后再次進(jìn)行測(cè)試。
在某些情況下,我們可能無意中遇上必須滿足的特殊需求。通過迭代流程,大家可以追蹤目標(biāo)的當(dāng)前進(jìn)展。除了檢測(cè)應(yīng)用程序的整體性能,大家還應(yīng)該考慮個(gè)別事務(wù)的性能表現(xiàn)。某些查詢請(qǐng)求可能需要很長(zhǎng)時(shí)間才能執(zhí)行完畢。
如果大家利用SQL對(duì)接入MySQL Enterprise Monitor的數(shù)據(jù)庫進(jìn)行查詢,那么不妨試試Query Analyzer--它能追蹤所有負(fù)載較高的事務(wù)。如果大家沒有接入Enterprise Monitor,那么MySQL慢速查詢?nèi)罩疽沧阋詭椭覀冋页鎏幚磉^程過長(zhǎng)的事務(wù)。我們可以通過對(duì)long_query_time變量的設(shè)定選擇日志中到底應(yīng)該保留哪些慢速查詢(即慢到何種程度)。變量數(shù)值的單位是"秒",將該數(shù)值設(shè)為"0"則代表在日志中記錄下所有查詢請(qǐng)求。
由于對(duì)long_query_time變量所做出的變更不會(huì)馬上體現(xiàn)在活動(dòng)連接當(dāng)中,因此大家需要?jiǎng)h除當(dāng)前連接然后重新建立。
MySQL集群在數(shù)據(jù)節(jié)點(diǎn)內(nèi)保留著全部細(xì)節(jié)信息。這部分?jǐn)?shù)據(jù)可由名為NDBINFO的虛擬數(shù)據(jù)庫直接使用。舉例來說,NDBINFO能夠顯示磁盤頁面緩沖區(qū)的使用信息。所謂磁盤頁面緩沖區(qū),其實(shí)是各個(gè)數(shù)據(jù)節(jié)點(diǎn)根據(jù)表格進(jìn)行磁盤操作時(shí)的緩存。通常情況下,其緩沖命中率越高、則性能表現(xiàn)越好。調(diào)整這部分緩存的大小會(huì)對(duì)系統(tǒng)產(chǎn)生顯著影響。大家可以通過mysql命令行訪問磁盤頁面緩沖數(shù)據(jù)。#p#
性能優(yōu)化
訪問模式
要想讓MySQL集群部署發(fā)揮出與預(yù)期相符的性能,最重要的一點(diǎn)在于了解數(shù)據(jù)庫結(jié)構(gòu)。有一點(diǎn)需要注意--MySQL集群表格中的數(shù)據(jù)并不會(huì)被保存在MySQL服務(wù)器當(dāng)中。這些數(shù)據(jù)實(shí)際上被劃分至由多個(gè)數(shù)據(jù)節(jié)點(diǎn)構(gòu)成的資源池當(dāng)中,如下圖所示。
表格中的各行將被拆分成多個(gè)區(qū)塊,每個(gè)數(shù)據(jù)節(jié)點(diǎn)保留一個(gè)區(qū)塊的主片段及另一個(gè)區(qū)塊的次片段。
如果查詢需要多次網(wǎng)絡(luò)跳轉(zhuǎn),例如由服務(wù)器向數(shù)據(jù)節(jié)點(diǎn)或者在不同數(shù)據(jù)節(jié)點(diǎn)之間,那么性能與可擴(kuò)展性都可能受到影響。因此,要想讓MySQL集群獲得***性能表現(xiàn),我們必須盡量減少網(wǎng)絡(luò)跳轉(zhuǎn)次數(shù)。表格劃分基于主鍵散列,但我們可以對(duì)其進(jìn)行重寫以提高性能。簡(jiǎn)單的訪問模式是創(chuàng)建可擴(kuò)展且高性能解決方案的關(guān)鍵。
網(wǎng)絡(luò)跳轉(zhuǎn)的必要次數(shù)取決于來自各分支結(jié)構(gòu)的結(jié)果集與接合深度。如果表格的接合深度過大,那么指向數(shù)據(jù)節(jié)點(diǎn)的每一次跳轉(zhuǎn)也將耗費(fèi)更多時(shí)間。要想獲得***性能,我們需要利用主鍵查找--其完成時(shí)間是恒定的,與數(shù)據(jù)庫規(guī)模及數(shù)據(jù)節(jié)點(diǎn)數(shù)目沒有關(guān)系。
使用AQL
通過使用AQL(即適應(yīng)性查詢本地化),性能改善將體現(xiàn)得更為明顯。
AQL能夠?qū)⒉樵冇蒑ySQL服務(wù)器指派向全部數(shù)據(jù)節(jié)點(diǎn),且查詢由本地?cái)?shù)據(jù)副本負(fù)責(zé)執(zhí)行。然后它會(huì)向MySQL服務(wù)器發(fā)回合并結(jié)果集,從而最終實(shí)現(xiàn)減少網(wǎng)絡(luò)跳轉(zhuǎn)、提高性能表現(xiàn)的目的。
AQ能幫助MySQL集群高效處理涉及大量復(fù)雜查詢事務(wù)的用例。
為了獲得更理想的使用效果,大家可以在變更表格模式(包括添加、刪除索引或者執(zhí)行其它重要變更)后在某一臺(tái)MySQL服務(wù)器中運(yùn)行OPTIMIZE TABLE <tab-name>。
在實(shí)際使用環(huán)境中的測(cè)試結(jié)果顯示,AQL能夠?qū)⒋罅坎樵兪聞?wù)的整體效率提升70倍。在測(cè)試中,一套網(wǎng)絡(luò)內(nèi)容存儲(chǔ)管理系統(tǒng)中包含有十一套復(fù)雜表格,在對(duì)其進(jìn)行正常查詢時(shí),整個(gè)流程需要耗時(shí)87秒。但在AQL的幫助下,整個(gè)流程的時(shí)耗被直接縮短至1.26秒。
在默認(rèn)情況下,AQL受到全局變量ndb_join_pushdown的控制。為了能夠讓AQL切實(shí)起效,我們需要對(duì)其進(jìn)行如下規(guī)則修改:
- 要加入的列必須使用同一種數(shù)據(jù)類型,包括VARCHAR長(zhǎng)度列在內(nèi)。
- 無法對(duì)指向BLOB或TEXT列的連接起效。
- 不支持顯式封鎖,但我們可以通過基于NDB存儲(chǔ)引擎鎖定的隱式行實(shí)現(xiàn)同等效果。
- 無法對(duì)明顯由HASH或者RANGE進(jìn)行劃分的連接起效。
分布感知應(yīng)用
在利用MySQL集群向表格中添加行時(shí),每一行都?xì)w屬于一個(gè)分區(qū)。每個(gè)分區(qū)又都由集群中的一個(gè)特定數(shù)據(jù)節(jié)點(diǎn)所掌控。只有事務(wù)需要的全部數(shù)據(jù)都被劃分到同一個(gè)分區(qū)當(dāng)中時(shí),集群性能才能實(shí)現(xiàn)***。這意味著我們要利用一個(gè)單獨(dú)數(shù)據(jù)節(jié)點(diǎn)來取消在多個(gè)節(jié)點(diǎn)之間往復(fù)傳輸所帶來的延遲提升。
MySQL集群默認(rèn)通過主鍵散列對(duì)數(shù)據(jù)進(jìn)行劃分。我們可以指定主鍵中的特定字段并將其提交給散列算法,從而改變默認(rèn)方案。
大家也可以利用分區(qū)裁剪方案。分區(qū)裁剪流程是指通過單一數(shù)據(jù)節(jié)點(diǎn)進(jìn)行索引掃描,其延遲改善效果取決于數(shù)據(jù)節(jié)點(diǎn)的數(shù)量及結(jié)果集的大小。數(shù)據(jù)節(jié)點(diǎn)越多、需要取回的記錄越少,改進(jìn)的效果也就越好。
下圖顯示了分區(qū)裁剪對(duì)性能的提升情況。
分區(qū)裁剪能夠有效降低小型結(jié)果集的延遲狀況,但對(duì)較大的結(jié)果集而言反倒會(huì)提高延遲表現(xiàn)。上圖中的紅色條形代表分區(qū)裁剪后的延遲數(shù)字。
在這種情況下,應(yīng)用程序分布機(jī)制對(duì)于新增額外節(jié)點(diǎn)的識(shí)別能力就成了保證性能改善的關(guān)鍵。
使用連接池
MySQL集群在多個(gè)數(shù)據(jù)節(jié)點(diǎn)進(jìn)行大量并行操作時(shí)的吞吐能力***。有鑒于此,我們必須同時(shí)利用多臺(tái)MySQL服務(wù)器且應(yīng)用程序的各個(gè)線程全部接入這些服務(wù)器。要訪問數(shù)據(jù)節(jié)點(diǎn),mysqld進(jìn)程會(huì)默認(rèn)使用單獨(dú)的NDB API連接。由于大量應(yīng)用程序線程同時(shí)搶占這一條連接,我們需要設(shè)置一套互斥機(jī)制以避免吞吐操作發(fā)生沖突。
一種方案是讓每個(gè)應(yīng)用線程都使用其專用的mysqld進(jìn)程,但這不僅浪費(fèi)資源、同時(shí)也會(huì)增加應(yīng)用程序的復(fù)雜性。
更為高效的方案是如上圖所示,建立由mysqld進(jìn)程向數(shù)據(jù)節(jié)點(diǎn)的多條NDB API連接。
為了使用連接池,每條(來自mysqld)連接都需要在config.ini文件中擁有自己的[mysqld]或者[api]分節(jié)號(hào),然后在my.cnf文件中將ndbcluster-connection-pool值設(shè)置為大于1。另外,我們也絕不能在啟動(dòng)mysqld進(jìn)程的同時(shí)將ndb-node-ida作為命令行選項(xiàng)。在我們的測(cè)試實(shí)例中,單一mysqld進(jìn)程擁有四個(gè)NDB API連接。
上圖顯示了連接池所帶來的性能提升。一般來說,應(yīng)用程序的性能普遍能獲得70%的提升,但在某些特殊情況下、其提升幅度可能超過150%。
添加節(jié)點(diǎn)以實(shí)現(xiàn)擴(kuò)展
MySQL集群在設(shè)計(jì)思路中納入了橫向擴(kuò)展考量。能夠添加額外的MySQL服務(wù)器或者數(shù)據(jù)節(jié)點(diǎn),大家可以顯著提升整體性能。
我們還能夠向處于運(yùn)行狀態(tài)的MySQL集群中添加新的MySQL服務(wù)器或者節(jié)點(diǎn)組。也就是說,我們完全不必關(guān)機(jī)并重新加載集群。現(xiàn)有表格中的數(shù)據(jù)將被重新劃分到所有接入數(shù)據(jù)節(jié)點(diǎn)當(dāng)中。最安全的處理方式是使用MySQL Cluster Manager。這款集群管理器能自動(dòng)處理關(guān)于額外節(jié)點(diǎn)添加的所有事務(wù),而且我們不必?fù)?dān)心整個(gè)過程會(huì)造成任何服務(wù)丟失。
總結(jié)
在過去九年中(自2004年起),MySQL集群已經(jīng)逐步成為一款成熟的解決方案,能夠滿足極端性能水平要求以及高達(dá)99.99%的嚴(yán)格正常運(yùn)行標(biāo)準(zhǔn)。正如在文章開頭所說,自適應(yīng)查詢本地化、參數(shù)調(diào)整以及分布感知等特性令MySQL集群在性能方面更上一層樓,從而有能力服務(wù)于更廣泛的應(yīng)用組合方案。作為數(shù)據(jù)庫技術(shù)的核心要素,實(shí)時(shí)監(jiān)控與報(bào)告功能的強(qiáng)化也幫助數(shù)據(jù)庫開發(fā)人員及管理員們得以更好地在MySQl集群中擴(kuò)展自己的用例。
原文鏈接:
http://www.agileload.com/agileload/blog/2013/03/11/optimizing-the-performance-of-mysql-cluster