AWS于2018年正式推出Amazon Aurora全球數(shù)據(jù)庫。Aurora全球數(shù)據(jù)庫主要支持兩類主要用例,其一為災難恢復類解決方案,旨在以更優(yōu)的恢復點目標(RPO)與恢復時間目標(RTO)處理區(qū)域整體故障,同時最大程度降低受保護數(shù)據(jù)庫集群遭受的性能影響。使用Aurora全球數(shù)據(jù)庫,我們通??梢詫崿F(xiàn)5秒以內的RPO與1分鐘以內的RTO。即使寫入工作負載巨大,新的災難恢復方案對源集群及目標集群的性能影響也將被控制在可忽略不計的水平。
Aurora全球數(shù)據(jù)庫的第二大主要用例,是在最多5個遠程區(qū)域中建立Amazon Aurora集群的讀取副本,用以服務這些區(qū)域周邊的鄰近用戶。與直接接入地理跨度更大的主區(qū)域相比,訪問位置更接近的本地附近區(qū)域將為用戶帶來更低的讀取延遲。
下圖所示,為在兩個區(qū)域之間使用MySQL邏輯復制的示例。隨著查詢數(shù)量的逐步增加,我們在目標集群上觀察到的復制時間延遲也開始呈指數(shù)級增長。此外,測試配置中能夠處理的查詢數(shù)量峰值約為每秒35000次。
相比之下,下圖所示為使用Aurora全球數(shù)據(jù)庫時,相同工作負載與實例大小情況下的對應性能表現(xiàn)。其中復制時間延遲始終保持在1秒以內,每秒查詢峰值約為20萬次(5.7倍)。
讀取副本寫入轉發(fā)
除了為各區(qū)域周邊的用戶提供更低的讀取延遲之外,運行在遠程區(qū)域當中的應用程序可能還需要執(zhí)行數(shù)據(jù)庫寫入。為此,應用程序需要執(zhí)行以下操作步驟:
·建立從各遠程區(qū)域指向主區(qū)域的連接。
·在應用程序代碼中將讀取與寫入流量拆分開來,保證將讀取數(shù)據(jù)發(fā)送至周邊區(qū)域的本地集群,并將寫入數(shù)據(jù)發(fā)送至主區(qū)域。
·管理寫入與后續(xù)讀取操作之間的一致性,因為Aurora全球數(shù)據(jù)庫將以異步方式進行復制,所以雖然延遲較低、但仍然存在數(shù)據(jù)復制滯后情況。如果未能正確加以管理,則此前應用程序對主區(qū)域執(zhí)行的寫入操作,不一定會正確體現(xiàn)在后續(xù)指向本地集群的讀取結果當中。
借助Aurora全球數(shù)據(jù)庫提供的讀取副本寫入轉發(fā)新功能,我們可以更輕松地立足遠程區(qū)域執(zhí)行寫入操作。通過寫入轉發(fā),應用程序先將寫入操作發(fā)送至本地讀取集群,再由該集群隨后以透明方式把寫入轉發(fā)至主區(qū)域。如此一來,應用程序即可將寫入操作發(fā)送至任意Aurora全球數(shù)據(jù)庫遠程集群,從而簡化應用程序的開發(fā)考量。下面來看寫入轉發(fā)機制的幾項主要優(yōu)點:
·托管解決方案–將遠程集群上發(fā)出的寫入操作,以透明方式轉發(fā)至主集群。
·無復制沖突–由于所有寫入均作用于主集群,因此不會發(fā)生與復制相關的更新沖突。
·簡單–您可以向遠程集群發(fā)出寫入操作,而后執(zhí)行讀取操作,這些操作將體現(xiàn)此前完成的寫入結果。
·靈活–您可以在多種讀取一致性級別中做出選擇,借此在一致性與性能之間取得平衡。
為了簡化應用程序開發(fā)并面向遠程Aurora全球數(shù)據(jù)庫集群執(zhí)行寫入,寫入轉發(fā)機制為用戶提供以下功能:
·使用跨Amazon骨干網絡,使用安全連接連通自動托管的遠程集群與主集群。
·我們可以對遠程集群中的同一實例執(zhí)行讀取與寫入操作,而無需額外拆分讀取與寫入流量,或者管理單獨的連接、會話或事務。
·提供多種一致性模式,幫助用戶在一致性與性能之間尋求平衡點。
Aurora全球數(shù)據(jù)庫寫入轉發(fā)功能的基本原理,在于接收來自遠程集群中某一實例上應用程序的寫入語句,而后將該語句與必要的上下文一同轉發(fā)至主集群,在該主實例上執(zhí)行寫入語句。該語句的任何執(zhí)行結果(包括警告與錯誤)都將返回至遠程實例,并最終返回至應用程序。整個過程對應用程序而言完全透明,我們只需要在集群上啟用寫入轉發(fā)功能,并為需要執(zhí)行寫入操作的各個會話設置一致性模式即可。
要使用寫入轉發(fā)功能,大家還需要注意以下幾點:
·您需要設置aurora_replica_read_consistency選項,在會話當中啟用寫入轉發(fā)功能。
·全面支持INSERT,UPDATE以及DELETE等操作,但不支持根據(jù)臨時表結果修改永久表的操作。
·可使用鎖定讀取(SELECT…FORUPDATE,SELECT…LOCKINSHARE MODE)。
·支持使用PREPARE與EXECUTE語法的預處理語句。
·不支持存儲過程,存儲過程必須在主集群上執(zhí)行。
·不支持DDL語句,DDL語句必須在主集群上執(zhí)行。
一致性模式
當應用程序面向遠程集群執(zhí)行寫入語句時,該語句的結果將在主集群上執(zhí)行,結果立即返回至應用程序。換言之,無論我們使用哪一種一致性模式,事務本身的持久性都將不受影響。但是,當主集群發(fā)生變更之后,相關結果需要一段時間才能被復制回遠程集群以實現(xiàn)遠程讀取。根據(jù)應用程序中的具體事務類型,我們可能需要/不需要保證寫入后讀取一致性。具體來看,我們可能希望首先等待復制完成,以確保最新讀取能夠體現(xiàn)上一項寫入操作帶來的變化;也可能希望保證較高的系統(tǒng)性能并繼續(xù)執(zhí)行下一條語句,而不必等待集群間復制完成。為了滿足這些具體要求,Aurora全球數(shù)據(jù)庫在寫入轉發(fā)當中提供多種可配置的一致性模式選項。
一致性模式的配置作用于會話層級,并由aurora_replica_read_consistency參數(shù)負責控制。在默認情況下,此參數(shù)將被設置為空值;大家需要將此選項設置為session,global或者eventual,而后才能使用寫入轉發(fā)功能。
會話一致性
在將aurora_replica_read_consistency設置為session之后,我們可以確保位于同一會話中的讀取操作首先等待上一項寫入操作,待復制完成后才實際執(zhí)行讀取。如此即可確保該會話中體現(xiàn)出寫入變更,并并不保證能夠體現(xiàn)其他會話發(fā)出的變更。
全局一致性
在將aurora_replica_read_consistency設置為global之后,我們可以確保讀取查詢將始終等待復制變更被追平在讀取操作開始時間點。這意味著遠程集群上執(zhí)行的讀取操作將能夠體現(xiàn)主集群上發(fā)生的所有變更。盡管這種模式能夠帶來最強大的寫入后讀取一致性,但同時也會給系統(tǒng)性能造成巨大影響。在使用此模式時,查詢的等待時間將至少等同于復制操作的滯后時間。
最終一致性
在將aurora_replica_read_consistency設置為eventual之后,讀取查詢將不再受到復制滯后的影響。由于遠程副本無需等待復制完成,讀取操作的延遲水平將大大降低,需要權衡的是,不確保寫之后緊接著讀操作能馬上看到之前寫操作的修改。需要注意的是,寫入操作仍然有效;在后續(xù)查詢當中,主集群將在正常應用寫入變更后將確認結果返回至遠程集群。需要注意的是,寫入操作的響應將即時完成,只是讀取操作的數(shù)據(jù)變更結果可能無法及時被復制至遠程集群。
在Aurora全球數(shù)據(jù)庫中設置寫入轉發(fā)
假定存在一個預配置集群,要在Aurora全球數(shù)據(jù)庫上啟用寫入轉發(fā)功能,我們首先需要創(chuàng)建一個全局集群。具體操作步驟如下:
·在Amazon RDS控制臺中,選擇Database。
·選擇您的源集群。
·在Actions下拉菜單中,選擇Add region。
·在Add an AWS Region頁面中的Global database identifier位置,為您的全局數(shù)據(jù)庫輸入一項名稱,例如globalcluste。此名稱即代表同時包含寫入與讀取區(qū)域的全球集群。
·在Secondary Region部分,選擇您的目標區(qū)域。本文示例選擇EU(Ireland)區(qū)域。
·在當前頁面中的其余設置部分,使用同樣的設置創(chuàng)建一個Aurora DB集群,但請注意考慮以下幾項設置區(qū)別:
·在Read replica write forwarding部分,選擇Enable read replica write forwarding。
在全局集群創(chuàng)建完成之后,控制臺上的視圖應如以下截屏所示。
到這里,寫入與讀取集群都已經在線啟動,并隨時準備接收流量。
在不同區(qū)域間寫入
要在讀取區(qū)域中執(zhí)行寫入操作,我們需要完成以下操作步驟:
·接入寫入?yún)^(qū)域內的集群,使用以下代碼創(chuàng)建一個新schema:
·在使用新表創(chuàng)建了新的schema之后,向寫入?yún)^(qū)域內的該表插入一行,而后選定對應結果。具體請參見以下代碼:
·接入讀取區(qū)域以確認該區(qū)域內的所有條目是否正常存在。詳見以下操作代碼:
·設置讀取一致性模式,插入一行,檢查當前表內容。詳見以下操作代碼:
·在執(zhí)行任何受支持語句之前,我們必須首先在會話層級設置 aurora_replica_read_ consistency模式。如果未設置這項參數(shù),則會引發(fā)以下異常
總結
Amazon Aurora全球數(shù)據(jù)庫允許用戶創(chuàng)建全局分布式應用程序,保證為遠程區(qū)域內的本地讀取操作提供支持。以此為基礎,您可以在災難恢復解決方案中實現(xiàn)極優(yōu)的RPO與RTO水平,也可以向世界各地的用戶提供延遲更低的讀取響應。通過寫入轉發(fā)功能,我們現(xiàn)在還能夠讓全局應用程序以更少的代碼變更在遠程區(qū)域內輕松執(zhí)行寫入操作。
歡迎大家即刻體驗Amazon Aurora全球數(shù)據(jù)庫與寫入轉發(fā)帶來的精彩體驗!
本篇作者
Steve Abraham
Amazon Web Services公司首席解決方案架構師。他與AWS客戶聯(lián)手為各類數(shù)據(jù)庫項目提供指導與技術幫助,引導客戶在實施AWS解決方案時獲得更高的價值回報。