Mysql Fabric用來管理mysql服務,提供擴展性和容易使用的系統,管理mysql分片和高可用部署(當前實現了兩個特性:高可用和使用數據分片的橫向擴展,能單獨使用或結合使用這兩個特性。)。
架構圖:
應用請求一個擴展的mysql鏈接器版本,使用XML-RPC協議訪問Fabric,當前可使用python和J鏈接器。Fabric管理啓動
GTIDs(全局事務標識)的mysql集合,檢查和維護服務器之間的一致性。集合中的服務器叫高可用組。不屬於Fabric高可用組的成員實例,叫備用存儲(backing store)。
Fabric組織服務器在一個組(叫高可用組),管理不一樣分片或簡單提供高可用。例如若是使用標準異步複製,Fabric能夠配置自動監控mysql服務狀態。若是組中當前master錯誤,組中有一個服務器能變成master,它選擇一個新的服務器作爲master。
除了高可用操做如故障轉移和切換,Fabric也容許分片操做,如分片建立和移除。
高可用和數據分片在兩個層實現:
一、mysqlfabric進程處理任何管理請求,接收經過mysqlfabric命令行接口或其餘支持XML/RPC接口的進程的管理任務。當使用HA特性,該進程能監控master服務器,當master故障時能進行故障恢復,提高一個slave爲新的master。mysql服務器的狀態存儲在state store(一個mysql數據庫實例),mysqlfabric進程也複製給鏈接器提供存儲路由信息;
二、應用代碼使用mysql鏈接器訪問數據庫,從特定程序語言轉換指令到Mysql wire protocol,與mysql服務器進程進行通訊。Fabric-aware鏈接器存儲從mysql fabric取來的路由信息緩存,使用這些信息發送事務或查詢到正確的mysql服務器。當前支持Fabric-aware mysql鏈接器的有PHP、python和Java。該方法避免了發送全部查詢到proxy引發的瓶頸。
高可用:
Mysql Fabric使用HA group管理兩個或更多Mysql服務器,在任什麼時候候,僅僅一個服務器爲Primary(mysql master),其餘服務器爲Secondaries(mysql slave)。使用Mysql複製(異步或半同步)容許數據安全的複製。
mysql fabric提供兩個HA可用性功能:
一、故障檢測和提高
fabric進程監控HA group中的mysql master,若是服務器錯誤,將選擇一個slave並提高到master(HA group中全部其餘slave將重新master接收更新);
二、路由數據庫請求
當fabric提高一個新的master,更新state store,新的路由信息將收錄到鏈接器,並存儲到緩存中。經過這種方式,應用不須要知道拓撲改變和寫請求須要發送到不一樣的目標。
橫向擴展-分片:
當因單個Mysql服務器(或HA group)因存儲容量或寫性能限制,mysql fabric能使用橫向擴展數據庫服務,分割數據到多個mysql服務器組。每一個組能夠是單個Mysql實例或HA group。
由管理員決定數據在服務器之間怎樣進行分片,建立分片映射。
fabric支持兩種shard key方法:
一、HASH
二、RANGE
當應用須要訪問分片數據庫,須要指定sharding key,Fabric-aware鏈接器將應用正確的range或hash映射和路由事務到正確分片;
mysql fabric能分離一個存在的分片到兩個新的分片和更新state store,同時緩存路由數據到鏈接器。同時也支持從一個HA group移動分片到另一個mysql服務組。
一個單事務或查詢僅僅訪問到單個shard,重要的選擇shard keys基於理解數據和應用訪問模式。
global tables寫到'global group',任何附加或改變到這些表的數據將自動複製到全部其餘組。模式改變也屬於global group,複製到全部其餘服務器,確保一致性。
分片架構圖:
Fabric使用python語言編寫,包括一個特殊的庫實現全部功能。與Fabric交互,一個特殊的工具mysqlfabric提供一套命令,使用它建立和管理組,定義和維護分片等。
Fabric前提需求:
一、Mysql server版本>= 5.6.10,須要支持GTID;
二、Python版本 >= 2.6;
三、python鏈接器 >= 1.2.1,J鏈接器 >= 5.1.27;
四、一個mysql實例(mysql版本必須爲5.6或以上版本)用於安裝backing store,該服務不是Fabric HA組的成員;
五、應用利用Fabric,必須有一個Fabric-aware鏈接器安裝在運行應用的系統上;
安裝Mysql Fabric:
環境:
下載Fabric連接:
下載頁面:
安裝:
tar xvf mysql-utilities-1.4.4.tgz
cd mysql-utilities-1.4.4
python setup.py install
配置Mysql Fabric:
一、須要建立一個帳號訪問backing store,用戶帳號對數據庫fabric必須有徹底權限:
# mysql -uroot -h172.17.0.49 -p
MySQL [(none)]> grant all on fabric.* to fabric@'172.17.42.1' identified by 'fabric@123';
要保證用戶root@'%'有with grant option受權,否則不能再給其餘用戶進行受權。
172.17.42.1爲運行Fabric Node的服務器IP地址,根據實際狀況進行替換,帳號和密碼也根據實際狀況進行替換。
二、對fabric進行管理的全部mysql服務器,須要對全部數據庫建立擁有徹底權限的用戶,Mysql Fabric使用一樣的用戶賬戶訪問到全部Mysql服務器進行管理:
# mysql -uroot -h172.17.0.50 -padmin@123
MySQL [(none)]> grant all on *.* to fabric@'172.17.42.1' identified by 'fabric@456';
# mysql -uroot -h172.17.0.47 -padmin@123
MySQL [(none)]> grant all on *.* to fabric@'172.17.42.1' identified by 'fabric@456';
Query OK, 0 rows affected (0.00 sec)
# mysql -uroot -h172.17.0.48 -padmin@123
MySQL [(none)]> grant all on *.* to fabric@'172.17.42.1' identified by 'fabric@456';
Query OK, 0 rows affected (0.00 sec)
建議不要使用root,爲fabric建立單獨的帳號。
三、修改fabric配置文件:
默認配置文件:/usr/local/etc/mysql/fabric.cfg
在[storage]段設置backing store的用戶帳號和密碼;
詳細配置文件以下:
# cat /etc/mysql/fabric.cfg
[DEFAULT] #若是請求的選項沒有在命令行指定,或沒有在配置文件找到,Fabric將查看該段的信息
prefix =
sysconfdir = /etc #配置文件存放目錄
logdir = /var/log #日誌文件存儲位置,絕對路徑,由守護進程建立
[storage] #配置backing store相關的選項
address = 172.17.0.49:3306 #指定state store的mysql實例地址和端口
user = fabric #鏈接到mysql實例的用戶名
password = fabric@123 #認證密碼,也能設置空密碼
database = fabric #存儲Fabric表的數據庫
auth_plugin = mysql_native_password #設置使用的認證插件
connection_timeout = 6 #中斷請求以前等待的最大時間,單位秒
connection_attempts = 6 #建立鏈接的最大嘗試次數
connection_delay = 1 #連續嘗試建立鏈接之間的延時時間,默認1s
[servers]
user = fabric
password =
[protocol.xmlrpc] #該段定義Fabric接收經過XML-RPC協議的請求
address = 0.0.0.0:32274 #標識Fabric使用的主機和端口,接收XML-RPC請求
threads = 5 #XML-RPC會話線程的併發建立數,決定多少併發請求Fabric能接受
user = admin #用戶名,認證命令行請求
password = #用戶密碼,認證命令行請求
disable_authentication = no #是否啓用命令行請求須要認證,默認要認證
realm = MySQL Fabric
ssl_ca = #使用ssl認證方式,指定PEM格式文件,包含信任SSL證書的列表
ssl_cert = #SSL認證文件,用於建立安全的鏈接
ssl_key = #SSL key文件
[executor] #經過XML-RPC接收到的請求,映射到程序能當即執行或經過隊列執行者,保證衝突的請求處理按序執行。一般讀操做當即執行經過XML-RPC會話線程,寫操做經過執行者
executors = 5 #多少線程用於執行者
[logging] #設置Fabric日誌信息記錄到哪裏,若是不是開啓爲後臺進程,將打印日誌到標準輸出
level = INFO #日誌級別,支持DEBUG,INFO,WARNING,ERROR,CRITICAL
url = file:///var/log/fabric.log #存儲日誌的文件,能爲絕對或相對路徑(如是相對路徑,將參照default段logdir參數指定的日誌目錄)
[sharding] #Fabric使用mysqldump和mysql客戶端程序,
執行移動和分離shards,指定程序的路徑
mysqldump_program = /usr/bin/mysqldump
mysqlclient_program = /usr/bin/mysql
[statistics]
prune_time = 3600 #刪除大於1h的
條目
[failure_tracking] #鏈接器和其餘外部實體能報告錯誤,fabric保持跟蹤服務器健康狀態和採起相應的行爲,如提高一個新的master,若是一個服務器時不穩定的,但不是master,將簡單的標記爲錯誤。
notifications = 300 #多少次報告錯誤後,將標誌服務器不可用
notification_clients = 50 #多少不一樣源報告錯誤
notification_interval = 60 #評估錯誤數的統計時間
failover_interval = 0 #爲了不整個系統不可用,自上次提高間隔多少秒後,新master才能選取
detections = 3 #爲了緩解fabric,提供內建的錯誤檢查,若是錯誤檢查啓動監控一個組,須要連續嘗試3(默認)次訪問當前master都錯誤後,才能
提高新master,
detection_interval = 6 #連續檢查之間的間隔時間
detection_timeout = 1 #錯誤檢查程序嘗試鏈接到一個組中服務器的超時時間
prune_time = 3600 #在錯誤日誌中保留多久的錯誤信息
[connector] #Fabric-aware鏈接器鏈接到Fabric,獲取組、shards、服務器的信息,緩存結果到本地的時長,以提升性能。
ttl = 1 #緩存生存時間,單位s,決定多長時間,鏈接器考慮一個信息從Fabric獲取是有效的
[client]
password =
四、State store建立fabric數據庫和相關表:使用以上受權用戶
# mysqlfabric manage setup --param=storage.user=fabric --param=storage.password=fabric@123
[INFO] 1409095183.577010 - MainThread - Initializing persister: user (fabric), server (172.17.0.49:3306), database (fabric).
Finishing initial setup
=======================
Password for admin user is not yet set.
Password for admin/xmlrpc:
Repeat Password:
Password set.
若是xmlrpc密碼沒有設置,將提示進行設置。
若是數據庫已經存在,將報如下錯:
[INFO] 1409095063.460048 - MainThread - Initializing persister: user (fabric), server (172.17.0.49:3306), database (fabric).
Error: ("Command (CREATE DATABASE fabric, ()) failed: 1007 (HY000): Can't create database 'fabric'; database exists", 1007)
五、查看建立的表:
# mysql -ufabric -h172.17.0.49 -pfabric@123 -e "show tables from fabric";
+-------------------+
| Tables_in_fabric |
+-------------------+
| checkpoints | #存儲程序執行信息,在crash後,能安全的恢復執行程序
| error_log | #服務器錯誤報告信息
| group_replication | #定義複製,global groups和分片組,主要用於shard splitting,moving和global updates
| group_view |
| groups | #包含管理組信息
| log |
| permissions | #包含權限信息,訪問到不一樣fabric子系統,當前僅僅定義了core子系統
| proc_view |
| role_permissions | #表關聯的角色和權限
| roles | #包含用戶角色的信息
| servers | #包含fabric管理的全部服務器信息
| shard_maps | #包含名字和分片屬性的映射
| shard_ranges | #分片索引和使用映射分片key到分片
| shard_tables | #全部分片的表
| shards | #存儲每一個分片標識
| user_roles |
| users | #標識用戶有什麼權限訪問到不一樣子系統的功能
+-------------------+
六、開啓和中止mysql fabric Nodes:
使用mysqlfabric命令開啓和中止mysql fabric節點。
# mysqlfabric manage start
[INFO] 1409095475.657850 - MainThread - Initializing persister: user (fabric), server (172.17.0.49:3306), database (fabric).
[INFO] 1409095475.661201 - MainThread - Loading Services.
[INFO] 1409095475.672051 - MainThread - Fabric node starting.
[INFO] 1409095475.731098 - MainThread - Starting Executor.
[INFO] 1409095475.731155 - MainThread - Setting 5 executor(s).
[INFO] 1409095475.731395 - Executor-0 - Started.
[INFO] 1409095475.731866 - Executor-1 - Started.
[INFO] 1409095475.732208 - Executor-2 - Started.
[INFO] 1409095475.732892 - Executor-3 - Started.
[INFO] 1409095475.733379 - Executor-4 - Started.
[INFO] 1409095475.733472 - MainThread - Executor started.
[INFO] 1409095475.738050 - MainThread - Starting failure detector.
[INFO] 1409095475.738533 - XML-RPC-Server - XML-RPC protocol server ('0.0.0.0', 32274) started.
[INFO] 1409095475.738774 - XML-RPC-Server - Setting 5 XML-RPC session(s).
[INFO] 1409095475.739004 - XML-RPC-Session-0 - Started XML-RPC-Session.
[INFO] 1409095475.739263 - XML-RPC-Session-1 - Started XML-RPC-Session.
[INFO] 1409095475.739442 - XML-RPC-Session-2 - Started XML-RPC-Session.
[INFO] 1409095475.739922 - XML-RPC-Session-3 - Started XML-RPC-Session.
[INFO] 1409095475.740434 - XML-RPC-Session-4 - Started XML-RPC-Session.
打印日誌到標準輸出,監聽在[protocol.xmlrpm]段定義的端口。放置fabric到後臺,使用--daemonize選項(
mysqlfabric manage start --daemonize),將打印日誌到syslog(配置文件默認定義在/var/log/fabric.log ).
查看啓動的xmlrpm監聽端口:
# netstat -ntlp|grep python
tcp 0 0 0.0.0.0:32274 0.0.0.0:* LISTEN 15713/python
中止fabric:
# mysqlfabric manage stop
Password for admin: #輸入xmlrpc的密碼
Command :
{ success = True
return = True
activities =
}
日誌:
[INFO] 1409095626.823267 - XML-RPC-Session-1 - Executor has stopped.
[INFO] 1409095626.823651 - XML-RPC-Session-1 - Fabric node stopped.
一、<<MySQL Fabric A Guide to Managing MySQL High Availability and Scaling Out>>、<<MySQL Fabric >>