思路比結論重要,為什么比是什么重要,今天就花1分鐘,說(shuō)下這里面架構演進(jìn)的思路。畫(huà)外音:大家不想聽(tīng)底層細節,就不深入細節了。最早的數據庫都是單機的,其最大的痛點(diǎn)是啥?磁盤(pán)能力無(wú)法線(xiàn)性擴展,內存能力無(wú)法線(xiàn)性擴展,計算能力無(wú)法線(xiàn)性擴展。如今,喜歡創(chuàng )造概念的架構師們,把這種架構稱(chēng)為“Shared Everything”架構。如上圖所示,DISK/MEM/CPU 都耦合在一個(gè)DBMS進(jìn)程內,必須部署在一臺服務(wù)器上,完全處于競爭態(tài),無(wú)法線(xiàn)性擴展,并行處理較差。數據庫單機部署,就是典型的“Shared Everything”架構。最容易想到的,就是把無(wú)狀態(tài)的邏輯計算部分,從DBMS進(jìn)程內拆分出來(lái),做成可擴展的微服務(wù)集群,實(shí)現“計算與存儲分離”。(1)CPU邏輯計算拆分出了獨立的進(jìn)程,可以集群部署,能夠線(xiàn)程擴展;(2)DISK/MEM 仍耦合在一個(gè)進(jìn)程內,仍處于競爭態(tài),無(wú)法線(xiàn)性擴展;Oracle Rac,就是典型的“Shared Disk”架構,核心思路是“計算與存儲分離”。存儲部分磁盤(pán)IO仍有集中的資源競爭,還有沒(méi)有進(jìn)一步的優(yōu)化空間呢?最容易想到的,就是把數據打散,分布到不同的數據庫實(shí)例上,每部分數據享有單獨的資源。(1)把整體數據存儲分為了N份,每份之間沒(méi)有交集;(2)每份數據的 DISK/MEM/CPU 都在一個(gè)DBMS進(jìn)程內,部署在一臺服務(wù)器上;沒(méi)錯,這就是“水平切分”,它是典型的”Shared Nothing”架構。對 Shared Everything/Disk/Nothing 這些高大上的名詞,進(jìn)一步認識了不?事情還沒(méi)完,水平切分存在什么問(wèn)題呢?水平切分雖然是一種可擴展架構,能夠實(shí)現線(xiàn)性擴展資源,但它會(huì )使得調用方失去數據的全局視野,使得調用方能力受限:(4)原訪(fǎng)問(wèn)一次DBMS的操作,需要調用多次;并把一些原本屬于DBMS職責的工作,轉嫁到調用方。如何解決“線(xiàn)性擴展能力”,同時(shí)又解決“失去全局視野”與“調用方能力受限”的問(wèn)題呢?最容易想到的方案是,數據庫主從集群,每份數據都進(jìn)行復制,每個(gè)實(shí)例都獨享 DISK/MEM/CPU 資源,避免實(shí)例之間的資源競爭。(1)把整體數據存儲分復制了N份,每份之間數據都一樣;(2)每份數據的 DISK/MEM/CPU 都在一個(gè)DBMS進(jìn)程內,部署在一臺服務(wù)器上;理想很豐滿(mǎn),現實(shí)很骨干,思路沒(méi)問(wèn)題,但實(shí)際執行“復制”的過(guò)程中,會(huì )碰到一些問(wèn)題。以MySQL為例,有3種常見(jiàn)的復制方式:第一種,異步復制(Asynchronous Replication)又叫主從復制(Primary-Secondary Replication),是互聯(lián)網(wǎng)公司用的最多的數據復制與數據庫集群化方法,它的思路是,從庫執行串行化后的主庫事務(wù)。(1)第一條時(shí)間線(xiàn):主庫時(shí)間線(xiàn);(2)第二條/第三條時(shí)間線(xiàn):從庫時(shí)間線(xiàn);從這個(gè)時(shí)間線(xiàn)可以看到:是并行執行的,主庫并不能保證從庫的事務(wù)一定執行成功,甚至不能保證從庫一定收到相關(guān)的請求,這也是其稱(chēng)作“異步復制”的原因。第二種,半同步復制(Semi-synchronous Replication)為了解決異步復制中“不能保證從庫一定收到請求”等問(wèn)題,對異步復制做了升級。(1)第一條時(shí)間線(xiàn):主庫時(shí)間線(xiàn); - 等從庫確認收到請求,主庫事務(wù)才提交完成(2)第二條/第三條時(shí)間線(xiàn):從庫時(shí)間線(xiàn); - 執行和主庫一樣的事務(wù),并給主庫一個(gè)確認從這個(gè)時(shí)間線(xiàn)可以看到:(1)主庫收到從庫的ACK,才會(huì )提交;(2)從庫收到請求后,事務(wù)提交前,會(huì )給主庫一個(gè)ACK;(1)主庫的性能,會(huì )受到較大的影響,事務(wù)提交之前,中間至少要等待2個(gè)主從之間的網(wǎng)絡(luò )TTL;(2)從庫仍然有延時(shí),主從之間數據仍然不一致;(3)主從角色有差異,主節點(diǎn)仍然是單點(diǎn);大數據量,高并發(fā)量的互聯(lián)網(wǎng)業(yè)務(wù),一般不使用“半同步復制”,更多的公司仍然使用“異步復制”的模式。最后是MySQL5.7里,新提出的MySQL組復制。第三種,組復制(MySQL Group Replication,MGR)(1)解決了單點(diǎn)寫(xiě)入的問(wèn)題,一個(gè)分組內的所有節點(diǎn)都能夠寫(xiě)入;(2)最終一致性,緩解了一致性問(wèn)題,可以認為大部分實(shí)例的數據都是最新的;(3)高可用,系統故障時(shí)(即使是腦裂),系統依然可用;(1)首先,分組內的MySQL實(shí)例不再是“主從”關(guān)系,而是對等的“成員”關(guān)系,故每個(gè)節點(diǎn)都可以寫(xiě)入;(2)其次,增加了一個(gè)協(xié)商共識的認證(certify)環(huán)節,多數節點(diǎn)達成一致的事務(wù)才能提交;畫(huà)外音:Garela也是此類(lèi)機制。和MySQL傳統的復制不同,MGR的核心是分布式共識算法,類(lèi)似于Paxos。畫(huà)外音:感興趣的人多的話(huà),再展開(kāi)細講。不知不覺(jué)寫(xiě)了幾千字了,收個(gè)尾做個(gè)總結吧。Shared Everything:數據庫單機系統,資源競爭;Shared Disk:Oracle Rac,計算與存儲分離;Shared Nothing:水平切分,復制集群,資源完全隔離;異步復制:傳統主從,互聯(lián)網(wǎng)公司最常用;組復制:MySQL 5.7的新功能,核心在于分布式共識算法;《緩沖池(buffer pool),這次徹底懂了!》
《寫(xiě)緩沖(change buffer),這次徹底懂了!》
《日志緩沖(log buffer),這次徹底懂了!》
《double write buffer,這次徹底懂了!》
《關(guān)于MySQL,這篇都沒(méi)人贊?》
Galera/MGR內核,后續還要寫(xiě)嗎?
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請
點(diǎn)擊舉報。