日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL Fabric 实践

發布時間:2023/12/15 数据库 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL Fabric 实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL Fabric能提供MySQL的HA和Sharding方案.

自從2014年5月28日Oracle發布了Fabric,用于MySQL的HA配置管理。這是原生的官方產品,可以放心使用,Fabric增強了HA效率。它讓一切都變得簡單了。

介紹
MySQL Fabric是一套數據庫服務器場(Database Server Farm)的架構管理系統。

  • MySQL Fabric是什么?

MySQL Fabric能“組織”多個MySQL數據庫,是應用系統將大于幾TB的表分散到多個數據庫,即數據分片(Data Shard)。在同一個分片內又可以含有多個數據庫,并且由Fabric自動挑選一個適合的作為主數據庫,其他的數據庫配置成從數據庫,來做主從復制。在主數據庫掛掉時,從各個從數據庫中挑選一個提升為主數據庫。之后,其他的從數據庫轉向新的主數據庫復制新的數據。注意:這里說的“自動”是指由MySQL Fabric在后臺完成,而不需要用戶手動更改配置。最重要的是,MySQL Fabric是GPL的開源軟件,也就是在符合GPL的規范下,你可以自由的使用和修改這個軟件。

  • MySQL Fabric要解決的問題

    為什么做數據分片?當你的應用需要處理的表大于1TB的數據時,Data Shard常常是必須的。這么大的表,無論在查詢、更新的效率上,或者是備份、更改結構所需要的時間上,都會造成很大的問題。然而當你將這么大的表分散到多個數據庫服務器上,又會使每一臺數據庫服務器都有可能是單個故障點。只要有一臺掛掉就會使整個系統的操作發生問題。另一方面,應用端的程序也會因為每個查詢都要依其查詢條件(where子句的內容)分別指向不同的數據庫而變得更加復雜。再者,當數據分片的結構改變時(例如增加一個數據庫),會使應用端的所有程序都必須修改,從而導致維護變得極為復雜。

    為了解決應用程序復雜度增加的問題,有人在應用程序和數據庫服務器之間增加一個代理(proxy)或者成為switch,應用程序所有對數據庫的指令先送到proxy,再由proxy判斷要轉到哪個數據庫。下圖就是這個方案的示意圖。這也許可以解決應用程序難以維護的問題,但是當應用端的數量增加,數據庫分片增加,或者系統壓力增加時,這個switch會成為容量及性能的瓶頸和單點故障(當它宕掉時,應用端找不到數據庫),而且所有的數據庫指令均需要傳兩次(先到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的從數據庫中找一個合適的提升為主服務器。其他的從數據庫則轉向新的主數據庫繼續復制數據。

  • 數據庫服務器場(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操作變得更簡單。

  • 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管理節點,而依存于應用端的分表配置直接送到正確的數據庫。而應用程序的效率不會因為做了表的拆分而有任何降低。

  • ===========
    操作:

    Fabric目前被打包到了MySQL Utilities中,下載MySQL Utilities就可以了,目前版本是:1.5.6,各個平臺都有對應的版本,mac、Linux及windows。

    我們在同一個機器上布置MySQL的各個服務,如下:

    function IP PORT
    backing store 3316
    MySQL master 3326
    MySQL slave 3336
    Fabric 管理進程 32274

    • 安裝
      安裝了mysql fabric后,可以使用的對應命令為mysqlfabric.
      在console中執行mysqlfabric,可以看到命令輸出,則安裝成功。

      – 注意: mysqlfabric需要使用connector。需要先安裝Connector/Python。

    shell> mysqlfabric help Usage: mysqlfabric [--param, --config] <grp> <cmd> [arg, ...]. MySQL Fabric 1.6.2 - MySQL server farm management framework Options:--version-h, --help--param=CONFIG_PARAMS--config=FILE show program's version number and exit show this help message and exit Override a configuration parameter. Read configuration from FILE. Basic commands:help <grp> <cmd> Show help for commandhelp commands List all commandshelp groups List all groups
    • 建立Backing Store帳號

    Backing Store用于存儲整個HA集群的服務器等相關配置,它需要一個MySQL實例來存儲這些信息,這個實例的版本需要跟其它在HA中的MySQL實例版本保持一致,而且必須是5.6.10及更高的版本,我們在本例中選擇3316實例來使用。

    首先,你需要一個帳號來連接Backing Store的MySQL實例,這個帳號需要有對fabric數據庫的管理員級權限,我們在3316端口的實例上建帳號,具體如下:

    CREATE USER ‘fabric’@’10.165.17.175’ IDENTIFIED BY ‘secret’;
    GRANT ALL ON fabric.* TO ‘fabric’@’10.165.17.175’;

    • Fabric配置文件

    Fabric配置文件默認位置是:/etc/mysql/fabric.cfg

    修改其中的[storage]部分,具體如下:

    [storage] auth_plugin = mysql_native_password database = fabric user = fabric address = 10.165.17.175:3316 connection_delay = 1 connection_timeout = 6 password = secret connection_attempts = 6

    其中address = 10.165.17.175:3316是Backing Store的MySQL實例,password = secret是上一步中建立連接fabric數據庫的用戶密碼。

    修改其中的[servers]部分,具體如下:

    [servers] password = secret user = fabric

    其中是password = secret 是HA環境中各實例的連接密碼。

    • 填充Backing Store信息

    我們通過Fabric來填充3306端口實例中的fabric數據庫,具體如下:

    mysqlfabric manage setup [INFO] 1408115689.486792 - MainThread - Initializing persister: user (fabric), server (10.165.17.175:3306), database (fabric). Finishing initial setup ======================= Password for admin user is not yet set. Password for admin/xmlrpc: Repeat Password: Password set.

    操作期間會提示Fabric的管理員帳戶admin沒有設置密碼,按提示將密碼設置成admin就可以了。

    我們再查看3316端口的實例里面發生了什么變化,具體如下:

    mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | 51linux.net | | fabric | | mysql | | performance_schema | +--------------------+ 5 rows in set (0.00 sec)mysql>

    可以看到多了一個fabric數據庫,它里面存儲的就是Fabric的一些配置信息。

    • 配置HA中主從MySQL節點帳號

    本例中3691和3692實例是需要做成HA的,它們也要建個管理員權限的帳號,注意,帳號名也要跟3306實例保持一致,也需要是fabric,具體如下:

    CREATE USER 'fabric'@'10.165.17.175' IDENTIFIED BY 'secret'; GRANT ALL ON *.* TO 'fabric'@'10.165.17.175';

    同時,由于fabric是基于GTID主從復制,所以這些實例中必須要啟用GTID,它們的配置文件要有這些參數:

    log-bin gtid-mode=ON enforce-gtid-consistency log_slave_updates
    • 啟動fabric

    我們用下面的命令來啟動fabric:

    mysqlfabric manage start [INFO] 1408116209.229260 - MainThread - Initializing persister: user (fabric), server (10.165.17.175:3306), database (fabric). [INFO] 1408116209.233982 - MainThread - Loading Services. [INFO] 1408116209.253620 - MainThread - Fabric node starting. [INFO] 1408116209.261853 - MainThread - Starting Executor. [INFO] 1408116209.262001 - MainThread - Setting 5 executor(s). [INFO] 1408116209.262691 - Executor-0 - Started. [INFO] 1408116209.264825 - Executor-1 - Started. [INFO] 1408116209.266648 - Executor-2 - Started. [INFO] 1408116209.268395 - Executor-3 - Started. [INFO] 1408116209.269961 - MainThread - Executor started. [INFO] 1408116209.273374 - MainThread - Starting failure detector. [INFO] 1408116209.274144 - Executor-4 - Started. [INFO] 1408116209.275816 - XML-RPC-Server - XML-RPC protocol server ('127.0.0.1', 32274) started. [INFO] 1408116209.276112 - XML-RPC-Server - Setting 5 XML-RPC session(s). [INFO] 1408116209.276654 - XML-RPC-Session-0 - Started XML-RPC-Session. [INFO] 1408116209.278426 - XML-RPC-Session-1 - Started XML-RPC-Session. [INFO] 1408116209.280368 - XML-RPC-Session-2 - Started XML-RPC-Session. [INFO] 1408116209.281599 - XML-RPC-Session-3 - Started XML-RPC-Session. [INFO] 1408116209.282699 - XML-RPC-Session-4 - Started XML-RPC-Session.
    • 建立HA服務器組

    這個HA服務器組,用于把參與HA的所有MySQL實例都填加進來:

    mysqlfabric group create my_group Password for admin: Procedure : { uuid = 292621fd-cddc-4cbb-8c0d-d8a264156679,finished = True,success = True,return = True,activities = }

    這樣我們就創建了一個組名為my_group的HA服務器組。

    • 填加HA組的成員

    我們首先填加3691,具體如下:

    mysqlfabric group add my_group 10.165.17.175:3691 Password for admin: Procedure : { uuid = 8d1c11f8-adc4-4321-8307-6296caeb07c1,finished = True,success = True,return = True,activities = }

    接下來填3692,具體如下:

    mysqlfabric group add my_group 10.165.17.175:3692 Password for admin: Procedure : { uuid = b1fa3cb9-b86f-4b1a-88cb-e84babb2ab02,finished = True,success = True,return = True,activities = }

    如果屏幕回顯示無error,那么說明成功填加了成員。我們也可以查看一下my_group里面的成員信息,具體如下:

    mysqlfabric group lookup_servers my_group Password for admin: Command : { success = Truereturn = [{'status': 'SECONDARY', 'server_uuid': '6914a176-2370-11e4-af48-00163e004141', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '10.165.17.175:3691'}, {'status': 'SECONDARY', 'server_uuid': 'a8a69428-2366-11e4-af09-00163e004141', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '10.165.17.175:3692'}]activities = }

    大家可以看到,這2個實例都不是PRIMARY,說明剛剛搭建完的環境,系統是不會選舉出PRIMARY的。

    • 選舉一個主庫

    選舉的方法也非常簡單,具體如下:

    mysqlfabric group promote my_group Password for admin: Procedure : { uuid = 529380b9-10ef-409f-a1a9-9430ab9845a3,finished = True,success = True,return = True,activities = }

    可見執行成功了,并沒有返回error。

    接下來我們再次驗證一下HA集群中各服務器情況。

    mysqlfabric group lookup_servers my_group Password for admin: Command : { success = Truereturn = [{'status': 'SECONDARY', 'server_uuid': '6914a176-2370-11e4-af48-00163e004141', 'mode': 'READ_ONLY', 'weight': 1.0, 'address': '10.165.17.175:3691, {'status': 'PRIMARY', 'server_uuid': 'a8a69428-2366-11e4-af09-00163e004141', 'mode': 'READ_WRITE', 'weight': 1.0, 'address': '10.165.17.175:3692}]activities = }

    可見Fabric已經隨機選舉了一個Master角色。

    • 激活故障自動切換

    即使Fabric選出了Master角色,但當這個Master宕機時,Fabric并不會自動將Secondary角色切換成Master角色,所以我們需要將HA配置成可以自動切換角色的樣子,具體如下:

    mysqlfabric group activate my_group Password for admin: Procedure : { uuid = 518b7dad-06a4-45a8-bfd5-241396706b88,finished = True,success = True,return = True,activities = }

    當然,我們也可以依據具體需求取消Fabric故障自動切換。

    • 測試HA

    在這個實驗中,我們將3691實例停止,再看看Fabric的狀態:

    mysqlfabric group lookup_servers my_group Password for admin: Command : { success = Truereturn = [{'status': 'PRIMARY', 'server_uuid': '6914a176-2370-11e4-af48-00163e004141', 'mode': 'READ_WRITE', 'weight': 1.0, 'address': '10.165.17.175:3691}, {'status': 'FAULTY', 'server_uuid': 'a8a69428-2366-11e4-af09-00163e004141', 'mode': 'READ_WRITE', 'weight': 1.0, 'address': '10.165.17.175:3692}]activities = }

    其中3692實例的狀態已經變成了“FAULTY”,可以看出Fabric自動檢測到了這個故障,并且選舉了slave重新當了primary角色。我不得不說就是這個功能,是它吸引我的原因之一。

    • 其他
      Fabric也提供了phtyon和Java的API,可以供軟件開發人員直接使用,以后的軟件開發人員,不是再直接連接到MySQL實例,而是連接到Fabric,由Fabric來統一分發請求,這有些象MySQL Proxy,但它的應用前景要比MySQL Proxy更寬更廣。

    總結

    以上是生活随笔為你收集整理的MySQL Fabric 实践的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。