Amazon新一代雲端關係資料庫Aurora(下)

来源:https://www.cnblogs.com/163yun/archive/2018/05/10/9020736.html
-Advertisement-
Play Games

本文由 網易雲 發佈。 作者:郭憶 本篇文章僅限內部分享,如需轉載,請聯繫網易獲取授權。 故障恢復 MySQL基於Check point的機制,周期性的建立redo log與數據頁的一致點。一旦資料庫重啟,從記錄的Check point開始,根據redo log,對相應的數據頁進行更新,對於已經提交 ...


本文由  網易雲 發佈。

 

作者:郭憶

本篇文章僅限內部分享,如需轉載,請聯繫網易獲取授權。

 

 

故障恢復

 

MySQL基於Check point的機制,周期性的建立redo log與數據頁的一致點。一旦資料庫重啟,從記錄的Check point開始,根據redo log,對相應的數據頁進行更新,對於已經提交的事務則確保事務更新持久化到硬碟的數據頁中,對於未提交事務,利用數據頁對應的roll pointer指針找到對應的undo log,進行回滾。MySQL 一般5分鐘一個check point,在故障恢復過程中,由一個線程負責redo log的回放,整個過程資料庫實例完全是停服的。

 

與MySQL 相同的是Aurora 在故障恢復過程時,首先也必須要找到一個一致性點,但是與MySQL不同的時,這個一致不要求所有的數據頁是一致的,Aurora只要求找到VDL,確保日誌的一致性。

 

基於read quorum機制,Aurora可以確保對於每一個PG,讀到滿足writer quorum的redo log record,從而建立VDL。對於每個存儲節點,大於VDL的redo log記錄將被刪除。另外,雖然論文中並沒有提,但是由於Aurora的Cache是獨立於資料庫進程的,所以當僅是資料庫實例重啟時,Cache內Page LSN大於VDL的數據頁同樣也需要被清理掉,因為這部分數據頁對應的redo log並沒有持久化到存儲系統中。

 

建立VDL後,資料庫即可以開始進行正常的讀寫訪問。對於沒有被提交的事務,由於undo寫入的同時也會寫redo,並且存在在同一個MTR中,所以undo也是完整的,根據undo可以完成對事務的回滾。但是與MySQL不同的是未提交事務的回滾是後臺非同步在存儲節點完成的。同時,Aurora的redo log的更新是根據page待修改記錄的多少來按需進行合併的,並且由於底層存儲系統redo log和數據頁分散在多個存儲節點的segment上,所以可以並行進行數據頁的合併。

 

經過AWS 官方的測試,Aurora在10W 寫QPS的壓力下,故障恢復只需要10秒。另外值得一提的是,與MySQL Buffer Cache是進程內分配的記憶體空間不同,Aurora的Buffer Cache是獨立於資料庫進程的,這樣做的一個好處就是資料庫宕機以後,不會丟失熱點,當然這也僅限於資料庫實例宕機,如果是系統宕機,就沒用了。

 

 

性 能

 

測試對象為Aurora,MySQL 5.6,MySQL5.7,分別在5種規格下(最大規格為32 vcpus,244G記憶體,最小的規格為2 vcpu,15G 記憶體,每種規格為前一個規格的一半vcpu和記憶體)的sysbench 純讀和純寫的壓測。測試數據量為1G,所以是全記憶體的測試。

 

 

 

性能對比還是很明顯的,得益於大幅減少的跨網路IO以及基於log-structured storage的數據結構,Aurora在r3.8xlarge規格下寫可以達到每秒12W。由於Aurora可以創建多個只讀實例,所以Aurora在r3.8xlarge規格下讀可以達到60W(文章中並沒有提及是否 使用了Aurora,但是在全記憶體場景下,筆者猜測,應該是基於多個replica達到的)


 

更多高級特性

 

線上修改表結構

 Aurora的Online DDL相較於MySQL在實現上也非常有特色,Aurora目前僅支持線上加列(列允許為空),MySQL 5.6開始,加列操作也支持線上,但是體驗較差,我們首先來看一下MySQL 5.6的線上加列過程:

 

MySQL 5.6 的線上加列分為3個過程:

Prepare: 持有MDL(MetaDataLock)排它鎖,創建新的frm文件,更新記憶體數據字典,生成臨時idb文件(記錄增量),釋放排它鎖;

Execute:逐行遍歷每一條記錄,按照新的表結構構造記錄,所有的更新操作都被記錄在idb文件中;

Commit: 重新持有排它鎖,將臨時idb文件中的更新回放到表中,如果更新頻率非常高,這個時間可能會比較長,最後臨時文件被刪除,rename新表。

 

這樣一個流程實際讓我們想到了利用Percona的Xtrabackup對資料庫線上備份和恢復的過程,允許拷貝期間數據的短暫不一致,然後利用拷貝數據期間的row_log日誌最終確保所有數據的一致性。

 

這樣的設計滿足了線上修改表結構的需求,但是由於存在全表拷貝,耗時往往非常長,同時最後階段的加鎖時間也不確定,在DBA 使用過程中,往往提心吊膽。

 

Aurora的設計則顯得更為巧妙,很容易讓人聯想到LVM的Copy-on-write線上snapshot設計,修改過程僅僅只是修改原數據,並不涉及具體的數據拷貝,數據的拷貝是在該數據被修改時才完成的。

 

在Aurora中執行一條線上加列的DDL操作非常快,這是因為處理該請求系統只是在一個Schema Version Table的系統表中增加一行記錄。接下來的DML,Aurora採用了modify-on-write的策略,以Page為單位,如果一個page的LSN大於加列DDL的LSN,則說明,該page已經被修改了schema,所以在DML發生前,就需要將該數據頁按照新的schema格式進行存儲。對於讀操作,如果這個數據頁還沒被修改過,則直接在記憶體裡面加一個空列進行返回給客戶端。

 

由於Aurora的Online DDL只是增加一條資料庫記錄,所以速度相比MySQL快了很多個數量級。

 

 


地理位置空間索引

Aurora 與MySQL 5.6一致,支持空間數據類型(Point、POLYGON...)和空間關係函數(ST_Contains、ST_Distance...), MySQL 5.7 InnoDB也開始支持空間地理索引,對大數據集下的查詢性能有很大的提升。Aurora 也支持空間地理索引,但是與MySQL 5.7 R Tree的實現方式不同,他是通過空間填充曲線對多維數據進行降維,基於B Tree實現的,這個與MongoDB更為類似。

 

 

MySQL 5.7的Spatial Index實際是根據最小邊界矩形來構建的R Tree。樹頂端的兩個節點代表的分別是最外層的兩個矩形,每一個子樹就是該矩形內的所有的節點。然後再根據最小邊界矩形規則,構建子節點。當我們要查詢某個範圍內的所有節點時,可以通過這個範圍跟各個矩形是否有重疊來確認查詢範圍,從最頂端的兩個節點代表的矩形開始查找。如果有重疊,就需要查詢該子樹內的節點。基於R-tree實現的空間地理索引的缺點在於構建成本比較高昂。

Aurora的實現則是將多維數據首先利用一定的演算法(時間空間曲線Z-index)進行降維,轉換成字元串,然後利用B-Tree方式進行存儲。

 

線上Point-in-time Restore

MySQL 企業版有一個對DBA很有用的功能就是Flash back,可以實現將資料庫線上回滾到指定的時間點,對於誤操作或者新上線BUG導致的數據修複非常有用,原理上他是基於Row格式的Binlog(會保存修改的前項和後項)進行逆向執行到指定位置實現的。

Aurora提供了兩種針對上述場景的修複功能,線上PITR(Point-in-time restore)和離線PITR,前者是在原實例的基礎上直接進行數據回滾,恢復期間資料庫是可用的,後者是通過備份恢復出一個新的實例,恢復期間新的實例是不可用的。

與MySQL 基於binlog的逆向執行不同,Aurora是基於redo log record來實現的。Aurora底層每個存儲節點都會定期對存儲節點上所有segment進行快照,與LVM類似,只備份元數據,如果某個segment中的某個block數據被重新寫,則需要首先將數據拷貝到指定的區域(purchased rewind storage),然後更新該block。

當我們要進行數據恢復時,首先我們找到要恢復的時間點以前最近的所有存儲節點上segement快照,然後根據該快照對應的lsn之後的redo log record就可以完成數據的修複。(rewind window 內的redo log record是不會被清理的)

在很多場景下,我們一次是無法精確定位到我們需要的時間點的,這時候,Aurora會根據redo log recod的可見性來快速實現時間點的前進和後退。如圖所示,當我們從t2時間點恢復到t1時間點時,我們只需要將t1-t2之間的redo log record不可見即可。當我們希望從t4回滾到t3時,我們只需要將t3-t4和t1-t2之間的redo log record設置不可見即可,當然這必須滿足MTR的原子性要求。

 

總  結

 

做架構設計的人有一個共識,沒有最完美的架構設計,只有最適合的架構設計。Aurora 應該說就是這種理念最完美的詮釋。在計算與存儲分離的雲基礎設施之上,通過僅傳輸redo log,大幅減少跨網路的IO數據傳輸,將產生大量IO的數據頁合併和持久化交由本地存儲來解決,大幅減緩了網路延遲對資料庫性能的影響。

另外,基於log-structured storage的數據頁合併,相比Check point,可以更加高效的合併針對同一個數據頁的更新,這些無疑提高了資料庫的寫入性能。多個replica共用同一個storage volume,多副本併發讀取,大幅提高了資料庫的讀性能。總體來說,

Aurora 對於雲端資料庫的架構設計具有劃時代的意義,充分利用了雲基礎設施的架構特性,將資料庫性能做到極致。

 

參考文檔

1. Amazon Aurora: Design Considerations for High Throughput Cloud-Native Relational Databases SIGMOD’17, May 14 – 19, 2017, Chicago, IL, USA.

2. AWS 2016 re:Invent Amazon Aurora Deep Dive

3. AWS Aurora blog: https://aws.amazon.com/tw/blogs/database/category/aurora/?nc1=h_ls

4. Percona live 2016 Amazon Aurora Deep Dive

5. https://dev.mysql.com/

 

網易有數:企業級大數據可視化分析平臺。面向業務人員的自助式敏捷分析平臺,採用PPT模式的報告製作,更加易學易用,具備強大的探索分析功能,真正幫助用戶洞察數據發現價值。可點擊這裡免費試用

 

瞭解 網易雲 :
網易雲官網:https://www.163yun.com/
新用戶大禮包:https://www.163yun.com/gift
網易雲社區:https://sq.163yun.com/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Linux發行版本:基於linux內核提供桌面環境及辦公套件的操作系統 (Linux內核只有一個) 1. 啟動終端的快捷鍵: ctr + alt + t 2. 終端字體放大: ctr+shift+'+' 3. 終端字體縮小: ctr+'-' 4. ls : 查看當前目錄的文件信息 4.1 ls 路徑 ...
  • usr/bin/ld: cannot find -lxxx問題總結 linux下編譯應用程式常常會出現如下錯誤: /usr/bin/ld: cannot find -lxxx 意思是編譯過程找不到對應庫文件。其中,-lxxx表示鏈接庫文件 libxxx.so。 註:有時候,由於庫文件是編譯過程臨時生 ...
  • 1、簡述osi七層模型和TCP/IP四層模型 OSI七層模型 TCP/IP四層模型 2、簡述iproute家族命令 ip命令: ip [OPTIONS] OBJECT {COMMAND|help} ip link:network device configuration. ip link set D ...
  • 本文主要是總結一些常用的在實際運用中常用的一些mysql時間日期以及轉換的函數 1.now() :返回當前日期和時間 2.curdate() :返回當前日期 3. dayofweek(data) : 返回日期 data 是星期幾 (1 = 星期日,2 =星期一...7=星期六,ODBC標準) 4.w ...
  • Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於記憶體亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。(百度百科 0.0) 下載:http://www.redis.cn/ 1、將下載的redis-4.0.9.tar.gz放置/usr/local目錄下,並解壓: t ...
  • 博主在工作中,常常需要使用sql語句來進行查詢,總結髮現,靈活使用這幾個要點,就可以應付大部分簡單情況。 一.連接:根據兩個或多個表中的列之間的關係,從這些表中查詢數據。 JOIN或INNER JOIN: 返回左表和右表中相互匹配的行 LEFT JOIN: 返回左表和右表中相互匹配的行,及左表中不相 ...
  • 在MySQL中,my.cnf是參數文件(Option Files),類似於ORACLE資料庫中的spfile、pfile參數文件,照理說,參數文件my.cnf中的都是系統參數(這種稱呼比較符合思維習慣),但是官方又稱呼其為系統變數(system variables),那麼到底這個叫系統參數或系統變數... ...
  • 1. 日期轉化為字元串 (以2016年10月20日為例) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') strDateTime from dual; --獲取年-月-日 時:分:秒 --顯示結果為:2016-10-20 12:35:21 select ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...