——————————–
最初為了解決著名的bug#989,在MySQL5.5中開始引入了meta data lock;mdl允許一個(gè)事務(wù)涉及到的表、庫信息直到事務(wù)結(jié)束都被維持,這樣如果一條事務(wù)內(nèi)的某個(gè)STATEMENT完成后,其他session發(fā)出一條DDL就會被阻塞;這解決了DDL/DML并發(fā)導(dǎo)致的復(fù)制中斷問題。
不過用過5.5的人都知道,這玩意兒實(shí)際上太令人討厭了,尤其是那陰魂不散的“wait for global read lock”或者“wait for table lock”之類的。當(dāng)備份時(shí)的大查詢,再來個(gè)DDL,哐當(dāng)~故障發(fā)生..直接堵死…
在我們的內(nèi)部alisql-5.5版本中,我們使用的是和facebook類似的辦法(好吧,就是我直接從fb port過來的),即增加接口替換掉flush tables with read lock, 只創(chuàng)建一個(gè)read view ,外加返回當(dāng)前binlog位點(diǎn);另外percona也實(shí)現(xiàn)了一種類似的辦法來繞過ftwrl,具體點(diǎn)擊文檔連接以及percona的博客, 不展開說了。
MDL解決了bug#989,卻引入了一個(gè)新的熱點(diǎn),所有的mdl對象由于存到全局對象里;對于熱點(diǎn),最正常的想法當(dāng)然是對其進(jìn)行分區(qū),不過這也是Mark Callaghan在report了bug#66473后才加入的,當(dāng)時(shí)Mark觀察到MDL_map::mutex的鎖競爭非常高,進(jìn)而推動官方改變;
在MySQL5.6.8版本,引入了新參數(shù)metadata_locks_hash_instances來控制對mdl hash的分區(qū)數(shù)(Rev:4350);
Oracle的QA dimitrik 對該特性的評測
不過后面的測試又發(fā)現(xiàn)哈希函數(shù)有問題,類似類似somedb.someprefix1….somedb.someprefix8的hash key值相同,都被hash到同一個(gè)桶下面了.相當(dāng)于hash分區(qū)沒生效。??樱?!具體怎么算的可以看bug#66473后面Dmitry Lenev的分析。
另外Mark也提出了質(zhì)疑,innodb的hash計(jì)算函數(shù)比my_hash_sort_bin要更高效, Oracle的開發(fā)人員重開了個(gè)bug#68487來跟蹤該問題,并在MySQL5.6.15對hash key計(jì)算函數(shù)進(jìn)行優(yōu)化,包括fix 上面說的hash計(jì)算問題(Rev:5459),使用MurmurHash3算法來計(jì)算mdl key的hash值,(有空看看幾種hash函數(shù)到底哪個(gè)性能更好)
往后直到MySQL5.6.18版本都沒有針對mdl部分的單獨(dú)優(yōu)化;很顯然,后面也不會在5.6版本里出現(xiàn)了,因?yàn)閙dl優(yōu)化已經(jīng)在5.7.4版本里展開了。包含3個(gè)worklog
1. WL#7304
簡化DML操作對MDL鎖的持有/釋放;大體思路是把MDL鎖拆分成兩類,一類是DML的mdl(也成為unobtrusive lock),之間互相兼容,另一類是DDL的mdl(也稱為obtrusive lock),與其他鎖互斥;
針對DML的MDL,避免了復(fù)雜的鎖檢查和對m_waiting/m_granted鏈表的維護(hù),改而使用計(jì)數(shù)器的方式來實(shí)現(xiàn)(稱為fast-path);不過相應(yīng)的對DDL的MDL鎖的管理邏輯就變的復(fù)雜了。沒有細(xì)看,貌似fast-path的mdl在遇到?jīng)_突時(shí)會進(jìn)行轉(zhuǎn)換,將其加入到m_granted列表中,并從m_fast_path_state移除
PATCH(Rev:7067, Rev:7129)
2. WL#7305
使用Lock free的hash對象來管理MDL;由于鎖沖突被移除,因此metadata_locks_hash_instances及metadata_locks_cache_size在之后的版本中可能被棄用;
基本思路是使用LF_HASH(lock free hash, 而不是分區(qū)的hash)來實(shí)現(xiàn)MDL_MAP
PATCH(Rev:7249)
3. WL#7306
這個(gè)實(shí)際上是對WL#7304和WL#的進(jìn)一步優(yōu)化,針對dml的mdl鎖(也就是所謂fast path),在檢查沖突和釋放時(shí)都需要施加m_rwlock鎖,新的改進(jìn)移除讀寫鎖,改使用原子操作
PATCH(Rev:7586)
這三個(gè)worklog是在5.7.4版本中的主要影響性能的大改動之一,官方對MySQL5.7.4的測試數(shù)據(jù),這部分的改進(jìn)必然有所貢獻(xiàn)。
后續(xù)的新的改進(jìn)計(jì)劃目前還沒看到,現(xiàn)在worklog上的更新總要等到實(shí)現(xiàn)之后才會更新,讓我們拭目以待吧…
聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com