Google Cloud Spanner內部機制,您的設備不支持google play 服務Google Cloud Spanner內部機制我們已經(jīng)了解了有關Google Cloud Spanner的更多內部信息。我們從Youtube上閱讀了Spanner白皮書的某些部分以及深入的內部內容。我們在此處共享了視頻鏈接,但......
我們已經(jīng)了解了有關Google Cloud Spanner的更多內部信息。我們從Youtube上閱讀了Spanner白皮書的某些部分以及深入的內部內容。我們在此處共享了視頻鏈接,但我們希望將所有學習總結在一個地方。特別感謝Deepti Srivastava(Spanner產(chǎn)品經(jīng)理)在Google Cloud Next Event中介紹了Spanner的深潛課程。
MySQL的痛苦:
在2005年,2006年,Google大規(guī)模使用MySQL。Google Adwords是使用90多個MySQL Shards存儲數(shù)據(jù)的最大平臺之一。由于進行了一些維護,他們重新分配了MySQL群集。這個過程花了2年時間才能完成。Google知道它們的發(fā)展非常迅速,而這類數(shù)據(jù)庫在將來會很痛苦。這就是Spanner的誕生方式。
BigTable和Spanner:
一旦他們決定構建分布式的新東西,Big Table團隊便是開始為Spanner流程工作的團隊。因為BigTable使用分布式過程,存儲和高可用性(或其他一些原因)。
巨人:
Colossus是從GFS派生的分布式文件系統(tǒng)。超級數(shù)據(jù)庫需要高性能的文件系統(tǒng)。此項目由BigTable團隊啟動,BigTable由Colossus提供支持。因此,Spanner也成為了文件系統(tǒng)的巨像。
為什么選擇Spanner?
Google Adwords是基于MySQL的堆棧,新系統(tǒng)需要具有關系數(shù)據(jù)庫的基本要素,例如ACID合規(guī)性,而不受規(guī)模的限制。MySQL的痛苦在于重新分片。因此,他們想要像傳統(tǒng)的NoSQL分片這樣的分片功能,這些功能將負責重新分片和重新平衡。加上更多可用性,水平擴展和全球分布。
Spanner架構:
Spanner是一個全球數(shù)據(jù)庫系統(tǒng),每個區(qū)域至少需要3個分片。每個分片將位于每個區(qū)域中。用Spanner的術語來說,分片稱為Split。如果您提供了1個Node Spanner群集,則您將在不同區(qū)域上獲得另外2個對您不可見的節(jié)點。并且計算層和存儲層是分離的。Paxos算法用于一次維護一位領導者,其余節(jié)點將成為跟隨者。
基于分區(qū),我們將在存儲層中有更多的拆分(碎片)。每個分片將被復制到其他區(qū)域。例如:如果您在A區(qū)上有一個名為S1的分片,它將被復制到B區(qū)和C區(qū)。復制基于Leader跟隨器方法進行。因此,Paxos將有助于維持法定人數(shù),并有助于在失敗期間選擇新的Leader。如果您在此Split上編寫內容,則Spanner API會知道Leaders。因此,寫入將直接轉到具有“前導分割”的區(qū)域。每個拆分都有自己的領導者區(qū)域。
全球強一致性:
當我觀看Spanner的深潛視頻時,他們正在討論強大的一致性。Spanner支持所有節(jié)點(全局)之間的強一致性。如果您在美國地區(qū)寫東西,則可以從亞洲地區(qū)或任何其他地區(qū)讀取相同的數(shù)據(jù)。他們如何實現(xiàn)這種邏輯?它稱為TrueTime。
TrueTime:
Spanner在分布于多個數(shù)據(jù)中心的全球所有節(jié)點之間同步并維持相同的時間。硬件內置原子鐘以維持時間。如果您查看服務器硬件機架,則該服務器有4個時間服務器。2臺服務器與GPS連接,其余2臺與原子振蕩器連接。有2種不同的振蕩器品牌,可以實現(xiàn)更好的故障轉移處理。GPS時間服務器將與振蕩器同步,以每30秒間隔同步全球數(shù)據(jù)中心的時間。
現(xiàn)在,讓我們嘗試了解這如何TrueTime幫助Spanner保持一致。
與TrueTime的一致性
要了解一致性和TrueTime之間的關系,我們必須了解Spanner中的寫操作如何工作。在每次寫操作期間,Spanner會拾取當前的TrueTime值,并且此TrueTime時間戳記將為寫操作創(chuàng)建一個順序。因此,每次提交都附帶了時間戳。
例如:如果要在節(jié)點1上寫入數(shù)據(jù),它將使用TrueTime時間戳提交數(shù)據(jù),并將數(shù)據(jù)和時間戳復制到其他節(jié)點。在所有節(jié)點上,此時間戳都相同。假設我們在節(jié)點1上提交了此數(shù)據(jù),如果您正在從節(jié)點B讀取相同的數(shù)據(jù),那么Spanner API會向Split的負責人詢問最后提交的數(shù)據(jù)的時間戳,如果時間戳與Node A的時間戳相匹配,則數(shù)據(jù)將從節(jié)點B返回,否則將等待,直到節(jié)點A將數(shù)據(jù)同步到節(jié)點B,然后它將返回數(shù)據(jù)。
單行寫操作的生命周期:
這是單個寫入操作的生命周期。我們正在寫一行將轉到拆分2的行?,F(xiàn)在,Spanner API將了解誰是拆分2的領導者節(jié)點,然后請求將進入Zone B節(jié)點(藍色指示是領導者)。然后它將獲取鎖,將其寫入拆分。寫入完成后,它將請求發(fā)國際快遞區(qū)域A和C節(jié)點以進行寫入。它將等待大多數(shù)節(jié)點的確認。領導者分裂一旦獲得了大部分的認可,便會將成功響應發(fā)快遞給客戶。
多行寫操作:
如果要在單個事務中寫入數(shù)據(jù),但數(shù)據(jù)位于不同的拆分中,則Spanner將以不同的方式處理它。例如:我們必須更新2行。
第1行在Split1中C區(qū)是Leader Split
第2行位于Split2中B區(qū)是Leader Split
當我們啟動事務時,Spanner API將理解這些行處于不同的拆分中。他們將隨機選擇一個協(xié)調器區(qū)域。在我們的示例中,API選擇了區(qū)域C為協(xié)調器區(qū)域。對于多行操作將執(zhí)行以下步驟。
選擇協(xié)調器區(qū)域。(C區(qū))
同時獲取兩個領導者分組上的數(shù)據(jù)鎖。
在兩個領導者拆分上添加新數(shù)據(jù)。領導者拆分將新數(shù)據(jù)復制到跟隨者拆分。然后從跟隨者拆分中獲得確認(兩個拆分將等待獲得確認)。
然后,區(qū)域B拆分將向協(xié)調器區(qū)域的拆分發(fā)快遞一條消息,表明它已完成更新并準備提交。
然后,區(qū)域C中的Split1將告訴Split2,繼續(xù)并提交數(shù)據(jù)。同時,拆分1也將提交。
提交請求將轉到所有拆分(領導者和關注者),并永久提交數(shù)據(jù)。
然后,成功響應將傳遞給客戶。
讀操作的壽命:
從Spanner讀取數(shù)據(jù)時,將從最近的關注者拆分中獲取數(shù)據(jù)。讓我們用一個例子來解釋一下。請參考下圖。
我們想從MyTable讀取值123的數(shù)據(jù)。此值存儲在Split 2中?,F(xiàn)在,一旦請求到達Spanner Frontend服務器,它將了解誰是最近的關注者拆分,并將請求轉發(fā)到該拆分。在我們的情況下,區(qū)域A是最近的拆分。請求到達拆分后,該拆分將請求Leader拆分以獲取最后提交的TrueTime。然后它將時間戳與自己的時間戳進行比較。如果兩者都匹配,它將把數(shù)據(jù)提供給應用程序。如果時間戳不匹配,則領導者分組將要求跟隨者等待,直到將數(shù)據(jù)同步到該區(qū)域。然后拆分將為數(shù)據(jù)提供服務。
過期/時間限制為:
Spanner支持MVCC。因此,它將舊數(shù)據(jù)保留一段時間。如果我們的應用程序可以很好地獲取舊數(shù)據(jù)(早于X秒),則無需等待領導者分裂的數(shù)據(jù)同步。例如,我們必須告訴Split我們使用15秒的舊數(shù)據(jù)就可以了,然后它將檢查提交的時間戳,該時間少于15秒,然后將舊數(shù)據(jù)提供給應用程序。
多區(qū)域Spanner:
上面說明的所有方案都適用于單個區(qū)域(區(qū)域級別)內的群集。但是,Spanner是為全球規(guī)模和多區(qū)域部署而構建的。在多區(qū)域設置中,體系結構和寫/讀操作將略有不同。在單區(qū)域概念中,我們至少需要3個區(qū)域才能創(chuàng)建集群。區(qū)域同時支持讀取和寫入。但是在多區(qū)域概念中,一個大洲將充當領導者,而其他大洲將成為追隨者。用Spanner的話來說,我們擁有更多地區(qū)的歐洲大陸將成為法定人數(shù)。所有寫操作都將到達該大陸的任何地區(qū)。在仲裁大陸中,將有2個區(qū)域托管數(shù)據(jù)節(jié)點,而1個區(qū)域將托管見證服務器進行故障轉移。其他大洲將具有只讀副本節(jié)點。
多區(qū)域一致性:
在多區(qū)域群集中,寫操作始終在Quorum大陸上執(zhí)行。假設美國地區(qū)是R/W大陸,那么如果您從美國地區(qū)發(fā)快遞寫請求,則Spanner API會將其發(fā)國際快遞最近的地區(qū),一旦提交了數(shù)據(jù),則成功響應將轉到客戶。如果您要從亞洲地區(qū)發(fā)快遞寫請求,則亞洲地區(qū)的API服務器會將請求放入Google的內部網(wǎng)絡中,然后將請求發(fā)國際快遞美國地區(qū)的API服務器。然后,該美國地區(qū)API服務器將提交數(shù)據(jù),并將成功響應發(fā)快遞給亞洲地區(qū)客戶。
對于讀取,該過程與單個區(qū)域的概念相同,如果TrueTime匹配,則將從本地區(qū)域提供數(shù)據(jù),否則將等待直到數(shù)據(jù)同步到本地區(qū)域然后再提供給客戶端。
結論:
我們介紹了Spanner的大多數(shù)內部概念。但是,在Cloud Spanner中還有很多事情要學習。請參考下面的Google Cloud Next活動視頻鏈接。
特別聲明:以上文章內容僅代表作者本人觀點,不代表ESG跨境電商觀點或立場。如有關于作品內容、版權或其它問題請于作品發(fā)表后的30日內與ESG跨境電商聯(lián)系。
二維碼加載中...
使用微信掃一掃登錄
使用賬號密碼登錄
平臺顧問
微信掃一掃
馬上聯(lián)系在線顧問
小程序
ESG跨境小程序
手機入駐更便捷
返回頂部