自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

為什么MySQL要升級(jí)組復(fù)制?一分鐘系列

開(kāi)發(fā) 開(kāi)發(fā)工具
思路比結(jié)論重要,為什么比是什么重要,今天就花1分鐘,說(shuō)下這里面架構(gòu)演進(jìn)的思路。

[[437919]]

之前發(fā)了《Galera,MySQL主從之外的另一種選擇》之后,很多朋友在評(píng)論里留言:

  • “這不就是Oracle Rac嗎?”
  • “這不就是MGR嗎?”

思路比結(jié)論重要,為什么比是什么重要,今天就花1分鐘,說(shuō)下這里面架構(gòu)演進(jìn)的思路。

畫(huà)外音:大家不想聽(tīng)底層細(xì)節(jié),就不深入細(xì)節(jié)了。

最早的數(shù)據(jù)庫(kù)都是單機(jī)的,其最大的痛點(diǎn)是啥?

無(wú)法線性擴(kuò)展。

磁盤(pán)能力無(wú)法線性擴(kuò)展,內(nèi)存能力無(wú)法線性擴(kuò)展,計(jì)算能力無(wú)法線性擴(kuò)展。

如今,喜歡創(chuàng)造概念的架構(gòu)師們,把這種架構(gòu)稱為“Shared Everything”架構(gòu)。

如上圖所示,DISK/MEM/CPU 都耦合在一個(gè)DBMS進(jìn)程內(nèi),必須部署在一臺(tái)服務(wù)器上,完全處于競(jìng)爭(zhēng)態(tài),無(wú)法線性擴(kuò)展,并行處理較差。

數(shù)據(jù)庫(kù)單機(jī)部署,就是典型的“Shared Everything”架構(gòu)。

如何來(lái)提升系統(tǒng)的并行能力呢?

最容易想到的,就是把無(wú)狀態(tài)的邏輯計(jì)算部分,從DBMS進(jìn)程內(nèi)拆分出來(lái),做成可擴(kuò)展的微服務(wù)集群,實(shí)現(xiàn)“計(jì)算與存儲(chǔ)分離”。

如上圖所示:

(1)CPU邏輯計(jì)算拆分出了獨(dú)立的進(jìn)程,可以集群部署,能夠線程擴(kuò)展;

(2)DISK/MEM 仍耦合在一個(gè)進(jìn)程內(nèi),仍處于競(jìng)爭(zhēng)態(tài),無(wú)法線性擴(kuò)展;

Oracle Rac,就是典型的“Shared Disk”架構(gòu),核心思路是“計(jì)算與存儲(chǔ)分離”。

存儲(chǔ)部分磁盤(pán)IO仍有集中的資源競(jìng)爭(zhēng),還有沒(méi)有進(jìn)一步的優(yōu)化空間呢?

最容易想到的,就是把數(shù)據(jù)打散,分布到不同的數(shù)據(jù)庫(kù)實(shí)例上,每部分?jǐn)?shù)據(jù)享有單獨(dú)的資源。

如上圖所示:

(1)把整體數(shù)據(jù)存儲(chǔ)分為了N份,每份之間沒(méi)有交集;

(2)每份數(shù)據(jù)的 DISK/MEM/CPU 都在一個(gè)DBMS進(jìn)程內(nèi),部署在一臺(tái)服務(wù)器上;

(3)每份數(shù)據(jù)的資源之間的沒(méi)有競(jìng)爭(zhēng);

沒(méi)錯(cuò),這就是“水平切分”,它是典型的”Shared Nothing”架構(gòu)。

對(duì) Shared Everything/Disk/Nothing 這些高大上的名詞,進(jìn)一步認(rèn)識(shí)了不?

事情還沒(méi)完,水平切分存在什么問(wèn)題呢?

水平切分雖然是一種可擴(kuò)展架構(gòu),能夠?qū)崿F(xiàn)線性擴(kuò)展資源,但它會(huì)使得調(diào)用方失去數(shù)據(jù)的全局視野,使得調(diào)用方能力受限:

(1)無(wú)法實(shí)現(xiàn)全局JOIN;

(2)無(wú)法實(shí)現(xiàn)全局排序;

(3)無(wú)法支持集函數(shù);

(4)原訪問(wèn)一次DBMS的操作,需要調(diào)用多次;

(5)…

并把一些原本屬于DBMS職責(zé)的工作,轉(zhuǎn)嫁到調(diào)用方。

如何解決“線性擴(kuò)展能力”,同時(shí)又解決“失去全局視野”與“調(diào)用方能力受限”的問(wèn)題呢?

最容易想到的方案是,數(shù)據(jù)庫(kù)主從集群,每份數(shù)據(jù)都進(jìn)行復(fù)制,每個(gè)實(shí)例都獨(dú)享 DISK/MEM/CPU資源,避免實(shí)例之間的資源競(jìng)爭(zhēng)。

如上圖所示:

(1)把整體數(shù)據(jù)存儲(chǔ)分復(fù)制了N份,每份之間數(shù)據(jù)都一樣;

(2)每份數(shù)據(jù)的 DISK/MEM/CPU 都在一個(gè)DBMS進(jìn)程內(nèi),部署在一臺(tái)服務(wù)器上;

(3)每份數(shù)據(jù)的資源之間的沒(méi)有競(jìng)爭(zhēng);

理想很豐滿,現(xiàn)實(shí)很骨干,思路沒(méi)問(wèn)題,但實(shí)際執(zhí)行“復(fù)制”的過(guò)程中,會(huì)碰到一些問(wèn)題。

以MySQL為例,有3種常見(jiàn)的復(fù)制方式:

(1)異步復(fù)制

(2)半同步復(fù)制

(3)組復(fù)制

第一種,異步復(fù)制(Asynchronous Replication)

又叫主從復(fù)制(Primary-Secondary Replication),是互聯(lián)網(wǎng)公司用的最多的數(shù)據(jù)復(fù)制與數(shù)據(jù)庫(kù)集群化方法,它的思路是,從庫(kù)執(zhí)行串行化后的主庫(kù)事務(wù)。

其核心原理如上圖所示:

(1)第一條時(shí)間線:主庫(kù)時(shí)間線;

  • 主庫(kù)執(zhí)行事務(wù)
  • 主庫(kù)事務(wù)串行化binlog
  • binlog同步給從庫(kù)
  • 主庫(kù)事務(wù)提交完成

(2)第二條/第三條時(shí)間線:從庫(kù)時(shí)間線;

  • 收到relay log
  • 執(zhí)行和主庫(kù)一樣的事務(wù)
  • 生成自己的binlog(還可以繼續(xù)二級(jí)從庫(kù))
  • 從庫(kù)事務(wù)提交完成

從這個(gè)時(shí)間線可以看到:

(1)主庫(kù)事務(wù)提交

(2)從庫(kù)事務(wù)執(zhí)行

是并行執(zhí)行的,主庫(kù)并不能保證從庫(kù)的事務(wù)一定執(zhí)行成功,甚至不能保證從庫(kù)一定收到相關(guān)的請(qǐng)求,這也是其稱作“異步復(fù)制”的原因。

第二種,半同步復(fù)制(Semi-synchronous Replication)

為了解決異步復(fù)制中“不能保證從庫(kù)一定收到請(qǐng)求”等問(wèn)題,對(duì)異步復(fù)制做了升級(jí)。

其核心原理如上圖所示:

(1)第一條時(shí)間線:主庫(kù)時(shí)間線;

  • 主庫(kù)執(zhí)行事務(wù)
  • 主庫(kù)事務(wù)串行化binlog
  • binlog同步給從庫(kù)
  • 等從庫(kù)確認(rèn)收到請(qǐng)求,主庫(kù)事務(wù)才提交完成

(2)第二條/第三條時(shí)間線:從庫(kù)時(shí)間線;

  • 收到relay log
  • 執(zhí)行和主庫(kù)一樣的事務(wù),并給主庫(kù)一個(gè)確認(rèn)
  • 生成自己的binlog(還可以繼續(xù)二級(jí)從庫(kù))
  • 從庫(kù)事務(wù)提交完成

從這個(gè)時(shí)間線可以看到:

(1)主庫(kù)收到從庫(kù)的ACK,才會(huì)提交;

(2)從庫(kù)收到請(qǐng)求后,事務(wù)提交前,會(huì)給主庫(kù)一個(gè)ACK;

半同步復(fù)制存在什么問(wèn)題呢?

(1)主庫(kù)的性能,會(huì)受到較大的影響,事務(wù)提交之前,中間至少要等待2個(gè)主從之間的網(wǎng)絡(luò)TTL;

(2)從庫(kù)仍然有延時(shí),主從之間數(shù)據(jù)仍然不一致;(3)主從角色有差異,主節(jié)點(diǎn)仍然是單點(diǎn);

大數(shù)據(jù)量,高并發(fā)量的互聯(lián)網(wǎng)業(yè)務(wù),一般不使用“半同步復(fù)制”,更多的公司仍然使用“異步復(fù)制”的模式。

最后是MySQL5.7里,新提出的MySQL組復(fù)制。

第三種,組復(fù)制(MySQL Group Replication,MGR)

MGR有一些帥氣的能力:

(1)解決了單點(diǎn)寫(xiě)入的問(wèn)題,一個(gè)分組內(nèi)的所有節(jié)點(diǎn)都能夠?qū)懭?

(2)最終一致性,緩解了一致性問(wèn)題,可以認(rèn)為大部分實(shí)例的數(shù)據(jù)都是最新的;

(3)高可用,系統(tǒng)故障時(shí)(即使是腦裂),系統(tǒng)依然可用;

如上圖所示:

(1)首先,分組內(nèi)的MySQL實(shí)例不再是“主從”關(guān)系,而是對(duì)等的“成員”關(guān)系,故每個(gè)節(jié)點(diǎn)都可以寫(xiě)入;

(2)其次,增加了一個(gè)協(xié)商共識(shí)的認(rèn)證(certify)環(huán)節(jié),多數(shù)節(jié)點(diǎn)達(dá)成一致的事務(wù)才能提交;

畫(huà)外音:Garela也是此類機(jī)制。

和MySQL傳統(tǒng)的復(fù)制不同,MGR的核心是分布式共識(shí)算法,類似于Paxos。

基于上一篇《Galera,MySQL主從之外的另一種選擇》的留言,似乎大部分人都非常熟悉算法的底層內(nèi)核,本篇就先不展開(kāi)了。

畫(huà)外音:感興趣的人多的話,再展開(kāi)細(xì)講。

不知不覺(jué)寫(xiě)了幾千字了,收個(gè)尾做個(gè)總結(jié)吧。

三類常見(jiàn)數(shù)據(jù)庫(kù)架構(gòu)

  • Shared Everything:數(shù)據(jù)庫(kù)單機(jī)系統(tǒng),資源競(jìng)爭(zhēng);
  • Shared Disk:Oracle Rac,計(jì)算與存儲(chǔ)分離;
  • Shared Nothing:水平切分,復(fù)制集群,資源完全隔離;

三類常見(jiàn)復(fù)制方式

  • 異步復(fù)制:傳統(tǒng)主從,互聯(lián)網(wǎng)公司最常用;
  • 半同步復(fù)制:從庫(kù)確認(rèn),主庫(kù)才提交;
  • 組復(fù)制:MySQL 5.7的新功能,核心在于分布式共識(shí)算法;

知其然,知其所以然。思路比結(jié)論更重要。

畫(huà)外音:對(duì)不起,讀完本文不止1分鐘。

【本文為51CTO專欄作者“58沈劍”原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)聯(lián)系原作者】

戳這里,看該作者更多好文 

 

責(zé)任編輯:趙寧寧 來(lái)源: 51CTO專欄
相關(guān)推薦

2017-03-30 19:28:26

HBase分布式數(shù)據(jù)

2021-08-06 08:50:45

加密貨幣比特幣區(qū)塊鏈

2020-05-21 19:46:19

區(qū)塊鏈數(shù)字貨幣比特幣

2018-06-26 05:23:19

線程安全函數(shù)代碼

2017-07-06 08:12:02

索引查詢SQL

2022-07-18 06:16:07

單點(diǎn)登錄系統(tǒng)

2018-07-31 16:10:51

Redo Undo數(shù)據(jù)庫(kù)數(shù)據(jù)

2017-02-21 13:00:27

LoadAverage負(fù)載Load

2017-07-25 09:55:13

微服務(wù)架構(gòu)種類

2020-09-23 06:54:51

路由表接口數(shù)據(jù)包

2017-01-05 14:16:28

連接池數(shù)據(jù)代碼

2021-11-02 09:20:23

區(qū)塊鏈比特幣架構(gòu)

2016-09-12 17:28:45

云存儲(chǔ)應(yīng)用軟件存儲(chǔ)設(shè)備

2018-12-12 22:51:24

Java包裝語(yǔ)言

2020-07-09 07:37:06

數(shù)據(jù)庫(kù)Redis工具

2020-07-17 07:44:25

云計(jì)算邊緣計(jì)算IT

2011-02-21 17:48:35

vsFTPd

2023-03-10 13:29:00

MySQLCount函數(shù)

2015-11-12 10:32:40

GitHub控制系統(tǒng)分布式

2016-12-16 11:05:00

分布式互斥線程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)