共計 4680 個字符,預計需要花費 12 分鐘才能閱讀完成。
本文丸趣 TV 小編為大家詳細介紹“mysql fabric 的概念是什么”,內容詳細,步驟清晰,細節處理妥當,希望這篇“mysql fabric 的概念是什么”文章能幫助大家解決疑惑,下面跟著丸趣 TV 小編的思路慢慢深入,一起來學習新知識吧。
MySQL Fabric 是一個用于管理 MySQL 服務器群的可擴展框架,是 GPL 的開源軟件;也就是說在符合 GPL 的規范下,用戶可以自由的使用和修改這個軟件。mysql fabric 是處理任何管理請求的進程;使用 HA 特性時可以讓此進程負責監視主服務器并在發生故障時,開始故障轉移,將從服務器升級成主服務器。
MySQL Fabric 簡介
MySQL Fabric 是一個用于管理 MySQL 服務器群的可擴展框架。
MySQL Fabric 能“組織”多個 MySQL 數據庫,是應用系統將大于幾 TB 的表分散到多個數據庫,即數據分片(Data Shard)。在同一個分片內又可以含有多個數據庫,并且由 Fabric 自動挑選一個適合的作為主數據庫,其他的數據庫配置成從數據庫,來做主從復制。在主數據庫掛掉時,從各個從數據庫中挑選一個提升為主數據庫。之后,其他的從數據庫轉向新的主數據庫復制新的數據。注意:這里說的“自動”是指由 MySQL Fabric 在后臺完成,而不需要用戶手動更改配置。最重要的是,MySQL Fabric 是 GPL 的開源軟件,也就是在符合 GPL 的規范下,你可以自由的使用和修改這個軟件。
Fabric 框架實現了兩個特性:高可用性 (high availablity) 和使用數據分片的橫向擴展(sharding),這兩個特性既可以單獨使用,也可以結合使用。
這兩個特性都基于以下兩個層面實現:
mysql fabric 是處理任何管理請求的進程。使用 HA 特性時,還可以讓此進程負責監視主服務器并在發生故障時, 開始故障轉移,將從服務器升級成主服務器。MySQL Fabric-aware 連接器把從 MySQL Fabric 獲取的路由信息存儲到緩存中,然后憑借該信息將事務或查詢發送給正確的 MySQL 服務器。
高可用性
HA 組由兩個或更多個 MySQL 服務器組成;任何時刻,其中都有一臺服務器作為主服務器(MySQL 復制功能的主服務器),其他服務器則作為從服務器(MySQL 復制功能的從服務器)。HA 組的作用就是確保該組中保存的數據始終可訪問。MySQL 的復制功能可通過復制來確保數據安全,MySQL Fabric 的高可用性解決方案在此基礎上提供了兩個必不可少的額外要素:
故障檢測和升級 — MySQL Fabric 監視 HA 組中的主服務器,在主服務器發生故障時選擇一個從服務器并將其升級為主服務器數據庫請求路由 — 將寫入請求路由到主服務器以及將讀取請求在各個從服務器之間進行負載均衡的操作對應用是透明的,即使在故障轉移期間拓撲發生變化時也是如此
分片 — 橫向擴展
當接近一個 MySQL 服務器 (或 HA 組) 的容量或寫入性能極限時,MySQL Fabric 可在多個 MySQL 服務器“組”中對數據進行分區,從而支持數據庫服務器橫向擴展。請注意,一個組可以只包含一個 MySQL 服務器,也可以是一個 HA 組。管理員定義這些服務器之間的數據分片方式;指定應將哪些表的列用作分片鍵,以及是使用 HASH 映射還是 RANGE 映射將這些鍵映射至正確的分片, 如果需要進一步分片,MySQL Fabric 可以拆分現有分片;此外,還可以重新分配分片。
MySQL Fabric 要解決的問題
為什么做數據分片?當你的應用需要處理的表大于 1TB 的數據時,Data Shard 常常是 必須的。這么大的表,無論在查詢、更新的效率上,或者是備份、更改結構所需要的 時間上,都會造 成 很大的問題。然而當你將這么大的表分散到多個數據庫服務器上,又會使每一臺數據庫服 務器都有可能是單個故障點。只要 有一臺掛掉就會使整個系統 的操作發生問題。另一方面,應用端的程序也會因為每個查詢都要依其查詢條件 (where 子句的內容)分別指向不同的數據庫 而變得更加復雜。再者,當數據分片的 結構 改變時(例如增加一個數據庫),會使應用端的所有 程序都必須修改,從而導致 維護變得極為復雜。
為了解決應用程序復雜度增加的問題,有人在應用程序和數據庫服務器之間增加 一個代理 (proxy)或者成為 switch,應用程序所有對數據庫的指令先送到 proxy,再由 proxy 判斷要轉到 哪個數據庫。下圖就是這個方案的示意圖。這也許可以解決應用程 序難以維護的問題,但是 當應用端的數量增加,數據庫分片增加,或者系統壓力增 加時,這個 switch 會成為容量及性 能的瓶頸和單點故障(當它宕掉時,應用端找不到 數據庫),而且所有的數據庫指令均需要傳 兩次(先到 switch 再到數據庫)。每個查詢都會造成額外的負荷。
MySQL Fabric 的架構
MySQL Fabric 采用不用的做法,其架構如下圖所示。主要的特點是把 switch 合并到各應用端的 connector 中,以解決單一 switch 的單點故障和性能瓶頸。
MySQL Fabric 由三個部分構成:
1.MySQL Fabric 管理節點:
是一個 python 腳本,是整個架構的核心。
MySQL Fabric 管理節點主要的功能是管理整個數據庫服務器場(Database Server Farm), 它啟動時會找 /etc/mysql/fabric.cnf 這個配置文件,由它指定 fabric 背后當成存放 Server Farm 架構和配置之 repository 的 MySQL 數據庫位置、端口和連接賬號等信息。
Fabric 在初始化時(執行 mysqlfabric manage setup 命令),會在 MySQL 數據庫上開一個 schema(通常是名稱為 fabric 的 database),存放 Server Farm 的配置相關信息,如哪些服務器組由哪些數據庫構成,各服務器組中的主從服務器分別是哪些,等等。
MySQL Fabric 節點在設置配置時,會對 Server Farm 中各數據庫下達建立主從復制的命令(上圖的紅色線條)。
在正常運行時定期 ping 各組的主服務器,當發現主數據庫沒有正常運行時,它會啟動故障轉移程序,在該 server farm 的從數據庫中找一個合適的提升為主服務器。其他的從數據庫則轉向新的主數據庫繼續復制數據。
2. 數據庫服務器場(database server farm)
這是整個架構中的工作引擎,在傳統的數據庫應用中這是單一的 MySQL 數據庫,MySQL Fabric 則是以多個數據庫支持大數據量表 (TB 級以上) 和高可用性數據庫的需求。這些數據庫分成幾個高可用組 (HA Group),每個組包含一個以上的數據庫服務器,上圖中最下面的幾個灰色和淺藍色的方塊代表高可用組。如果高可用組中有多個數據庫,MySQL Fabric 會挑選(使用命令 mysqlfabric group promote 命令) 一個提升為主數據庫(Master),其他數據庫則成為從數據庫(Slave),從數據庫復制主數據庫的變化,完成設定同一高可用組內的主從復制。以后,Fabric 會定期件事這個主數據庫。當主數據宕掉之后,Fabric 會從高可用組內挑選一個提升為主數據庫,其他的數據庫會轉向這個新的主數據庫繼續復制。
另一方面,MySQL Fabric 也會只是應用端的 conector 對這些主從數據庫做讀寫分離,當應用程序對數據庫做讀寫兼有的操作時,connector 會將該指令提交給主數據庫。如果應用程序只會對數據庫進行讀操作,且連線的 read_only 參數設置為“ON”,則所有的查詢均輪流傳送到這幾個數據庫。借助讀寫分離,應用系統的資料處理能力得以增加。此外,如前面所述,MySQL Fabric 還能處理需要拆分到多個數據庫服務器的表(sharding tables),每一個高可用組都可能存放 shard table 的部分數據。應用端的 connector 會將對 shard table 的指令依 MySQL Fabric 的管理節點的設定送到不同的高可用組,這樣可使數據庫的容量隨著高可用組的數量增加而增長。同時,對非拆分的表所下的指令和所有的 DDL 會由 connector 送到全局高可用組(global group),全局高可用組的主數據庫被 MySQL Fabric 設置為其他高可用組的主數據庫。所有存拆分表的高可用組的主數據庫復制 global group 的變化,這么一來其他高可用組都有一份非拆分表的資料。從而使得 SQL 中拆分表對非拆分表的 JOIN 操作變得更簡單。
3. Connector
應用系統在運行時,每個 SQL 指令都會經由 connector 發送到數據庫。MySQL Fabric 所搭配的 connector 和一般使用單機的 MySQL 數據庫一樣,只是在較新版的 connector 是 fabric aware connector 多了一些能處理數據庫服務器場 (database server farm) 的功能。使他們能在建立數據庫連接時,以 XML-RPC 協議檢查 MySQL Fabric 的管理節點中 server farm 的配置,然后通過該連接下的查詢可依 fabric 的指示送到適合的數據庫。
如此一來,常見的 database shard 方案中可能造成性能瓶頸的 proxy 放到 connector 中,從而解決了這個問題。目前 MySQL Fabric 支持的技術有 java、python、PHP,即 Connector/J、Connector/Python 和 Connector/PHP 都是 Fabric-aware。
以 java 為例,JDBC driver 必須是 Connector/J 5.1.30 以后的版本,Fabric 的 Java 程序和一般對單機 MySQL 的查詢的 Java 程序差不多,只是在建立 database connection object 時 database connection URL 不是指向數據庫,改為指向 MySQL Fabric 管理節點(服務器的 IP 和端口通常是 32274)。
當查詢的表時全局表 (不做 table shard) 或 DDL(例如建表或改表結構)時,建立 connection object 的要加上 fabricServerGroup= 參數,之后通過這個 connection object 所下的 SQL 指令會送到 Global Group 的主數據庫,再由數據庫復制到其他的高可用組 (shard) 中。
如果 SQL 命令所要操作的表時分區表 (shard table),則建立 connection object 時要在參數加上 fabricShardTable= 參數,之后通過這個 connection object 所下的 SQL 命令會根據 MySQL Fabric 所設定的分表(shard) 原則送到各分區 (shard) 的高可用組。
這樣一來,應用程序對這些 shard table 下的 SQL 指令時,不需要在 SQL 中判斷要送到哪個數據庫,完全由 connector 在建立數據庫連接時向 MySQL Fabric 所查到的 server farm 的配置信息 (哪個數據庫屬于哪個 shard group,各 shard table 的拆分原則等) 所決定。而且這個配置在建立主連接后就緩存在 Connector 所在的應用端。
這樣,在每次下 SQL 指令時就不需要重復查詢 MySQL Fabric 管理節點,而依存于應用端的分表配置直接送到正確的數據庫。而應用程序的效率不會因為做了表的拆分而有任何降低。
讀到這里,這篇“mysql fabric 的概念是什么”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注丸趣 TV 行業資訊頻道。