數據庫

歐洲最大MySQL用戶之一,Booking.com數據庫構架探秘!

廣告
廣告

吳鑫 Booking.com數據庫工程師Team Lead

2015年加入總部位于阿姆斯特丹的Booking.com數據團隊,現任數據庫工程師團隊負責人,主要是負責Booking.com里MySQL相關的運營和研發。具有超過10年MySQL的工作經驗,曾經在瑞典擔任數據庫顧問,解決不同公司的MySQL問題。

摘要: Booking.com于1996年成立于荷蘭阿姆斯特丹,是全球規模最大的酒店預訂網站之一,隸屬于Booking Holdings Inc.(納斯達克上市公司:BKNG),擁有超過160萬家住宿合作伙伴,遍布全球229個國家和地區,日均客房預訂量超過150萬間。

Booking.com使用MySQL做為主要的數據庫解決方案,目前是歐洲最大的MySQL用戶之一。本文主要會分享Booking.com的數據庫構架?如何實現數據庫的高可用性,如何自動化維護和管理大數量級的服務器, 以及如何實現測試環境每日更新億萬數量級的在線數據。

Booking.com數據庫構架

Booking.com的MySQL約有數千臺服務器,上百個集群,多個數據中心。 數據中心同時實現了異地容災和異地多活。數據中心間的切換只需要數十秒的時間

上圖是我們一個比較常規的MySQL集群構架圖. 一個數據鏈一般分為三層,最上層是主服務器,下面是IM(Intermediate Master),拖帶著不同的從服務器。

之所以會分成三個層級是因為兩個原因:

首先為了滿足異地容災的需求,各個數據中心必須要有一套完整的復制鏈路以確保程序持續穩定的運行,所以需要配備兩個以上的IM。

另一個原因是網絡帶寬的限制。我們的集群小的只有5-10臺服務器,大的有200-300臺服務器。目前單個服務器的標準網絡帶寬是10G。大家知道Master slave是通過binlog傳輸的,如果一個IM下掛載太多的從服務器,會直接用掉所有的網絡帶寬,所以我們用多個IM來進行網絡帶寬的分流。我們所有服務器的硬件配置都是一樣的,這樣的優勢是主服務器宕機后,任何一臺從服務器都能升級成新的主服務器。

這個是一個比較詳細的構架圖,我們在主服務器上會綁定一個cname,然后應用程序通過cname在主服務器上進行寫操作。從服務器會根據不同的應用程序種類劃分到不同的數據庫池里面,從而提供讀的請求。之所以會分成不同的數據庫池,也是因為請求是分優先級的,而且請求的數量級也不通。以圖里面的兩個數據庫池為例,一個是frontend-pool,這一類型的SQL語句一般都比較簡短,而且對響應速度要求很高。而第二個cronjob-pool 一般是一些定時任務的語句。這類型的語句一般會比較復雜,而且有時需要花幾秒或者幾十秒才能完成。把不同類型的請求分開可以避免它們之間的互相影響。另外一個優勢是當查詢語句都基本相似的時候,hot data會緩存在innodb_buffer_pool里,這樣減少了直接的磁盤讀取,提高了響應速度。

我們的數據庫池是通過zookeeper來進行管理的。如果一個從服務器宕機,或者添加新的從服務器,我們會用內部研發的zooRoster和zooAnimal在MySQL端和應用程序端自動添加和刪除。

我們除了有對應用提供服務的從服務器,每個集群還有一些特殊的從服務器。比如用于備份,數據克隆,以及24小時延時的從服務器。延時的從服務器是為了更快的進行線上的數據恢復。

自動化案例分析

由于我們有大量的服務器,但是團隊人數只有個位數,所以基本上所有的系統維護都是通過自動化實現的。我們內部研發的Booking Admin(badmin)軟件,它能實現操作系統和MySQL版本的自動升級。對指定任務進行自動執行,其中包括數據庫的備份與恢復。也能通過監測服務器和數據庫的狀態對數據池進行自動添加和刪除的操作。

我們有幾百萬個表,每天開發人員都會添加新表或者更改表結構,我們開發了一套系統,開發人員可以在網頁上提交對表結構修改的語句,然后后臺會自動對提交的語句進行檢測,其中包括語法是否正確,以及是否符合公司內部的要求。如果提交的語句有問題,會實時給出修改建議。如果通過檢測,DDL語句會在主服務器上自動運行。

接下來給大家詳細介紹一下如何進行數據庫的讀寫擴展。

首先介紹一下,我們是如何擴展讀操作。這個相對來說比較簡單,當badmin檢測到服務器容量不夠,它會自動的往數據庫池里面添加服務器。

上圖是這個添加服務器的具體流程。

● badmin 檢測到容量不夠, 自動像ProvisionAPI請求新建服務器

● ProvisionAPI根據集群的類型提供相應的服務器配置

● 服務器系統安裝完成會被設置成needs-setup的狀態,在這個狀態下MySQL和部分系統配置安裝完成。以上幾個過程大概需要十到十五分鐘的時間。

● 配置完成后接下來進行數據的克隆。一共有三種方式可供選擇

○   從克隆從服務器上進行文件的rsync操作

○   從備份進行恢復

○   如果需要克隆的服務器很多,會自動進行Torrent的方式進行

● MySQL克隆完成后會進入到installed的狀態,此時MySQL的主從復制已經開始執行,但是會有一定的數據延遲。

● 在主從庫數據一致后,我們不會直接把服務器放到線上進行使用,而是通過tcpdump線上同一個數據庫池里面的SQL語句進行一個warmup的過程。

● 當innodb_buffer_pool達到一定的百分比,服務器被設置成live狀態,此時會在數據庫池里面被激,接收線上請求。

接下來是對寫擴展的介紹,主要通過對數據庫進行表分離來實現。

以上圖為例,對DB1的tableB和tableC進行表分離。

● 首先搭建一個新的復制鏈DB2

● 把tableB和tableC復制到DB2上,然后再DB2通過replication filter從DB1上進行主從復制

● DB2搭建相應的數據庫池,然后將讀操作從DB1分離到DB2上

● DB2 主數據庫的cname是指向在DB1服務器,所以寫操作還是在DB1上。

● 修改所有應用程序的數據庫DB2配置,然后等待所有應用程序的rollout。

● 當所有的tableB和tableC的流量分離到DB2上后,進行寫操作的分離

○   DB2的cname指向到DB2的主服務器,此時tableB,tableC的寫操作是宕機的,這個過程大概是5-10秒

○   在DB2的主服務器上去掉replication filter,寫分離完成。

高可用性解決方案

我們的高可用解決方式是用的開源軟件orchestrator。https://github.com/github/orchestrator 軟件的原開發者曾經任職于Booking.com,所以很多功能符合我們的需求。

orchestrator是一個對MySQL Replication的拓撲管理和可視化的工具。當有新的mysql節點添加或者刪除時,它會自動對拓撲進行更新,也可以隨時改MySQL在數據鏈里的層級。它提供網頁的界面操作,也可以通過命令行進行操作。它可以自動檢測MySQL的宕機,并且進行自動的恢復。

上圖orchestrator的主界面,里面包含了所有集群的總信息。其中藍色的數字表示集群的大小,紅色的表示有多少服務器在這個幾群里目前是無法連接上的,黃色的部分表示有多少現在是有延遲的。

這是一個MySQL Replication集群的界面。Orchestrator自身是沒有Intermediate Master這個概念的。只要服務器下面拖拽了一個從服務器,如果這個服務器宕機了就會進行自動恢復。它會把下面的從服務器自動的掛載到其他的性能優良的服務器上。

測試環境的搭建

我們所有的應用程序的測試系統都是搭建在虛擬機上的。每個程序員可以有一套或者多套自己的獨立完整的測試系統。數據庫的測試系統也是搭建在虛擬機上,并且95%的數據都是線上數據,而且每24小時會將線上的數據更新到測試系統中。需要更新的數據量是PB級別。

上圖是我們的一個測試系統構架,左邊是我們的線上環境,右邊是我們的測試環境。

測試環境有4種不同類型的數據庫

● snapbox: 和線上連接并實時接收線上的數據更新

● master – slave: 每24小時更新一次,開發者可以在這個數據鏈路上進行各種讀寫測試

● rdbprod: 實時接收線上數據更新,如果開發者想對線上數據進行讀操作的測試,可以將配置文件切換到rdbprod上。

測試系統的存儲方式用的是ISCSI,所以每次更新的時候master和slave是對snapbox上的iscsi做snapshot。由于測試系統是每24小時更新一次,所以所有的數據改變在系統更新后都會自動刪除。

我們一共有兩套測試系統,這樣做的目的是為了保持測試系統能隨時在線提供服務。每次做snapshot的時候,主從服務器是不能訪問的,這個過程短則5-10分鐘,長則30-40分鐘。兩套系統會被分成active和passive兩個狀態。主從服務器的cname一直指向active set。當passive set成果的做完了snapshot的操作,cname會自動切換到passive set上。這樣宕機的過程只有5-10秒的時間。

老魚,企業級老編一枚,你若有故事,歡迎聯系!

百度云加快人才梯隊調整,李彥宏卸任執行董事

上一篇

搜索引擎百度已死,但其他業務在重生

下一篇

你也可能喜歡

歐洲最大MySQL用戶之一,Booking.com數據庫構架探秘!

長按儲存圖像,分享給朋友

ITPUB 每周精要將以郵件的形式發放至您的郵箱


微信掃一掃

微信掃一掃
双色球常规走势图 河北十一选五最简单技巧 水果店赚钱套路 幸运飞艇助力计划 高频彩计划软件下载 湖北11选5任三预测 北京pk赛车20分钟一期 广州上班族赚钱方式 能兑换奖品的捕鱼平台 天津快乐十分人工计划 河南快三摇奖福彩开奖结果 必赢客手机版计划pk10 鱼丸游戏红黑梅方