Mysql Fabric實現學習筆記

jopen 10年前發布 | 89K 次閱讀 MySQL 數據庫服務器
Mysql Fabric用來管理mysql服務,提供擴展性和容易使用的系統,管理mysql分片和高可用部署(當前實現了兩個特性:高可用和使用數據分片的橫向擴展,能單獨使用或結合使用這兩個特性。)。

架構圖:
Mysql Fabric實現學習筆記

應用請求一個擴展的mysql連接器版本,使用XML-RPC協議訪問Fabric,當前可以使用python和J連接器。Fabric管理啟動 GTIDs(全局事務標識)的mysql集合,檢查和維護服務器之間的一致性。集合中的服務器叫高可用組。不屬于Fabric高可用組的成員實例,叫備用存儲(backing store)。

Fabric組織服務器在一個組(叫高可用組),管理不同分片或簡單提供高可用。例如如果使用標準異步復制,Fabric可以配置自動監控mysql服務狀態。如果組中當前master錯誤,組中有一個服務器能變成master,它選擇一個新的服務器做為master。

除了高可用操作如故障轉移和切換,Fabric也允許分片操作,如分片創建和移除。

高可用和數據分片在兩個層實現:
1、 mysqlfabric進程處理任何管理請求,接收通過mysqlfabric命令行接口或其他支持XML/RPC接口的進程的管理任務。當使用HA特 性,該進程能監控master服務器,當master故障時能進行故障恢復,提升一個slave為新的master。mysql服務器的狀態存儲在 state store(一個mysql數據庫實例),mysqlfabric進程也復制給連接器提供存儲路由信息;

2、 應用代碼使用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實現學習筆記

mysql fabric提供兩個HA可用性功能:
1、故障檢測和提升
fabric進程監控HA group中的mysql master,如果服務器錯誤,將選擇一個slave并提升到master(HA group中所有其他slave將從新master接收更新);

2、路由數據庫請求
當fabric提升一個新的master,更新state store,新的路由信息將收錄到連接器,并存儲到緩存中。通過這種方式,應用不需要知道拓撲改變和寫請求需要發送到不同的目標。

Mysql Fabric實現學習筆記

橫向擴展-分片:
當因單個Mysql服務器(或HA group)因存儲容量或寫性能限制,mysql fabric能使用橫向擴展數據庫服務,分割數據到多個mysql服務器組。每個組可以是單個Mysql實例或HA group。
Mysql Fabric實現學習筆記

由管理員決定數據在服務器之間怎樣進行分片,創建分片映射。

fabric支持兩種shard key方法:
1、HASH
2、RANGE

當應用需要訪問分片數據庫,需要指定sharding key,Fabric-aware連接器將應用正確的range或hash映射和路由事務到正確分片;

mysql fabric能分離一個存在的分片到兩個新的分片和更新state store,同時緩存路由數據到連接器。同時也支持從一個HA group移動分片到另外一個mysql服務組。

Mysql Fabric實現學習筆記

一個單事務或查詢僅僅訪問到單個shard,重要的選擇shard keys基于理解數據和應用訪問模式。

global tables寫到'global group',任何附加或改變到這些表的數據將自動復制到所有其他組。模式改變也屬于global group,復制到所有其他服務器,確保一致性。
Mysql Fabric實現學習筆記

分片架構圖:
Mysql Fabric實現學習筆記

Fabric使用python語言編寫,包括一個特殊的庫實現所有功能。與Fabric交互,一個特殊的工具mysqlfabric提供一套命令,使用它創建和管理組,定義和維護分片等。

Fabric前提需求:
1、Mysql server版本>= 5.6.10,需要支持GTID;
2、Python版本 >=   2.6;
3、python連接器 >=   1.2.1,J連接器 >=   5.1.27;
4、一個mysql實例(mysql版本必須為5.6或以上版本)用于安裝backing store,該服務不是Fabric HA組的成員;
5、應用利用Fabric,必須有一個Fabric-aware連接器安裝在運行應用的系統上;

安裝Mysql Fabric:
環境:
Mysql Fabric實現學習筆記

下載Fabric鏈接:

下載頁面:

安裝:
      
  1. tar xvf mysql-utilities-1.4.4.tgz
  2. cd mysql-utilities-1.4.4
  3. python setup.py install

配置Mysql Fabric:
1、需要創建一個賬號訪問backing store,用戶賬號對數據庫fabric必須有完全權限:
      
  1. # mysql -uroot -h172.17.0.49 -p
  2. 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地址,根據實際情況進行替換,賬號和密碼也根據實際情況進行替換。

2、對fabric進行管理的所有mysql服務器,需要對所有數據庫創建擁有完全權限的用戶,Mysql Fabric使用同樣的用戶帳戶訪問到所有Mysql服務器進行管理:
      
  1. # mysql -uroot -h172.17.0.50 -padmin@123
  2. MySQL [(none)]> grant all on *.* to fabric@'172.17.42.1' identified by 'fabric@456';
  3. # mysql -uroot -h172.17.0.47 -padmin@123
  4. MySQL [(none)]> grant all on *.* to fabric@'172.17.42.1' identified by 'fabric@456';
  5. Query OK, 0 rows affected (0.00 sec)
  6. # mysql -uroot -h172.17.0.48 -padmin@123
  7. MySQL [(none)]> grant all on *.* to fabric@'172.17.42.1' identified by 'fabric@456';
  8. Query OK, 0 rows affected (0.00 sec)

建議不要使用root,為fabric創建單獨的賬號。

3、修改fabric配置文件:
默認配置文件:/usr/local/etc/mysql/fabric.cfg
在[storage]段設置backing store的用戶賬號和密碼;
詳細配置文件如下:
      
  1. # cat /etc/mysql/fabric.cfg    
  2. [DEFAULT] #如果請求的選項沒有在命令行指定,或沒有在配置文件找到,Fabric將查看該段的信息
  3. prefix = 
  4. sysconfdir = /etc #配置文件存放目錄
  5. logdir = /var/log #日志文件存儲位置,絕對路徑,由守護進程創建
  6. [storage] #配置backing store相關的選項
  7. address = 172.17.0.49:3306 #指定state store的mysql實例地址和端口
  8. user = fabric #連接到mysql實例的用戶名
  9. password = fabric@123 #認證密碼,也能設置空密碼
  10. database = fabric #存儲Fabric表的數據庫
  11. auth_plugin = mysql_native_password #設置使用的認證插件
  12. connection_timeout = 6 #中斷請求之前等待的最大時間,單位秒
  13. connection_attempts = 6 #創建連接的最大嘗試次數
  14. connection_delay = 1 #連續嘗試創建連接之間的延時時間,默認1s
  15. [servers]
  16. user = fabric
  17. password = 
  18. [protocol.xmlrpc] #該段定義Fabric接收通過XML-RPC協議的請求
  19. address = 0.0.0.0:32274 #標識Fabric使用的主機和端口,接收XML-RPC請求
  20. threads = 5 #XML-RPC會話線程的并發創建數,決定多少并發請求Fabric能接受
  21. user = admin #用戶名,認證命令行請求
  22. password = #用戶密碼,認證命令行請求
  23. disable_authentication = no #是否啟用命令行請求需要認證,默認要認證
  24. realm = MySQL Fabric
  25. ssl_ca =  #使用ssl認證方式,指定PEM格式文件,包含信任SSL證書的列表
  26. ssl_cert =  #SSL認證文件,用于創建安全的連接
  27. ssl_key =  #SSL key文件
  28. [executor] #通過XML-RPC接收到的請求,映射到程序能立即執行或通過隊列執行者,保證沖突的請求處理按序執行。 通常讀操作立即執行通過XML-RPC會話線程,寫操作通過執行者
  29. executors = 5 #多少線程用于執行者
  30. [logging] #設置Fabric日志信息記錄到哪里,如果不是開啟為后臺進程,將打印日志到標準輸出
  31. level = INFO #日志級別,支持DEBUG,INFO,WARNING,ERROR,CRITICAL
  32. url = file:///var/log/fabric.log #存儲日志的文件,能為絕對或相對路徑(如是相對路徑,將參照default段logdir參數指定的日志目錄)
  33. [sharding] #Fabric使用mysqldump和mysql客戶端程序,執行移動和分離shards,指定程序的路徑
  34. mysqldump_program = /usr/bin/mysqldump
  35. mysqlclient_program = /usr/bin/mysql
  36. [statistics]
  37. prune_time = 3600 #刪除大于1h的條目
  38. [failure_tracking] #連接器和其他外部實體能報告錯誤,fabric保持跟蹤服務器健康狀態和采取相應的行為, 如提升一個新的master,如果一個服務器時不穩定的,但不是master,將簡單的標記為錯誤。
  39. notifications = 300 #多少次報告錯誤后,將標志服務器不可用
  40. notification_clients = 50 #多少不同源報告錯誤
  41. notification_interval = 60 #評估錯誤數的統計時間
  42. failover_interval = 0 #為了避免整個系統不可用,自上次提升間隔多少秒后,新master才能選取
  43. detections = 3 #為了緩解fabric,提供內建的錯誤檢查,如果錯誤檢查啟動監控一個組, 需要連續嘗試3(默認)次訪問當前master都錯誤后,才能提升新master,
  44. detection_interval = 6 #連續檢查之間的間隔時間
  45. detection_timeout = 1 #錯誤檢查程序嘗試連接到一個組中服務器的超時時間
  46. prune_time = 3600 #在錯誤日志中保留多久的錯誤信息
  47. [connector] #Fabric-aware連接器連接到Fabric,獲取組、shards、服務器的信息,緩存結果到本地的時長,以提高性能。
  48. ttl = 1 #緩存生存時間,單位s,決定多長時間,連接器考慮一個信息從Fabric獲取是有效的
  49. [client]
  50. password = 

4、State store創建fabric數據庫和相關表:使用以上授權用戶
      
  1. # mysqlfabric manage setup --param=storage.user=fabric --param=storage.password=fabric@123
  2. [INFO] 1409095183.577010 - MainThread - Initializing persister: user (fabric), server (172.17.0.49:3306), database (fabric).
  3. Finishing initial setup
  4. =======================
  5. Password for admin user is not yet set.
  6. Password for admin/xmlrpc: 
  7. Repeat Password: 
  8. 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)

5、查看創建的表:
      
  1. # mysql -ufabric -h172.17.0.49 -pfabric@123 -e "show tables from fabric";
  2. +-------------------+
  3. | Tables_in_fabric  |
  4. +-------------------+
  5. | checkpoints       | #存儲程序執行信息,在crash后,能安全的恢復執行程序
  6. | error_log         | #服務器錯誤報告信息
  7. | group_replication | #定義復制,global groups和分片組,主要用于shard splitting,moving和global updates?
  8. | group_view        |
  9. | groups            | #包含管理組信息
  10. | log               |
  11. | permissions       | #包含權限信息,訪問到不同fabric子系統,當前僅僅定義了core子系統
  12. | proc_view         |
  13. | role_permissions  | #表關聯的角色和權限
  14. | roles             | #包含用戶角色的信息
  15. | servers           | #包含fabric管理的所有服務器信息
  16. | shard_maps        | #?包含名字和分片屬性的映射
  17. | shard_ranges      | #分片索引和使用映射分片key到分片
  18. | shard_tables      | #所有分片的表
  19. | shards            | #存儲每個分片標識
  20. | user_roles        |
  21. | users             | #標識用戶有什么權限訪問到不同子系統的功能
  22. +-------------------+

6、開啟和停止mysql fabric Nodes:
使用mysqlfabric命令開啟和停止mysql fabric節點。
      
  1. # mysqlfabric manage start
  2. [INFO] 1409095475.657850 - MainThread - Initializing persister: user (fabric), server (172.17.0.49:3306), database (fabric).
  3. [INFO] 1409095475.661201 - MainThread - Loading Services.
  4. [INFO] 1409095475.672051 - MainThread - Fabric node starting.
  5. [INFO] 1409095475.731098 - MainThread - Starting Executor.
  6. [INFO] 1409095475.731155 - MainThread - Setting 5 executor(s).
  7. [INFO] 1409095475.731395 - Executor-0 - Started.
  8. [INFO] 1409095475.731866 - Executor-1 - Started.
  9. [INFO] 1409095475.732208 - Executor-2 - Started.
  10. [INFO] 1409095475.732892 - Executor-3 - Started.
  11. [INFO] 1409095475.733379 - Executor-4 - Started.
  12. [INFO] 1409095475.733472 - MainThread - Executor started.
  13. [INFO] 1409095475.738050 - MainThread - Starting failure detector.
  14. [INFO] 1409095475.738533 - XML-RPC-Server - XML-RPC protocol server ('0.0.0.0', 32274) started.
  15. [INFO] 1409095475.738774 - XML-RPC-Server - Setting 5 XML-RPC session(s).
  16. [INFO] 1409095475.739004 - XML-RPC-Session-0 - Started XML-RPC-Session.
  17. [INFO] 1409095475.739263 - XML-RPC-Session-1 - Started XML-RPC-Session.
  18. [INFO] 1409095475.739442 - XML-RPC-Session-2 - Started XML-RPC-Session.
  19. [INFO] 1409095475.739922 - XML-RPC-Session-3 - Started XML-RPC-Session.
  20. [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監聽端口:
      
  1. # netstat -ntlp|grep python
  2. tcp        0      0 0.0.0.0:32274           0.0.0.0:*               LISTEN      15713/python   

停止fabric:
      
  1. # mysqlfabric manage stop
  2. Password for admin: #輸入xmlrpc的密碼
  3. Command :
  4. { success     = True
  5.   return      = True
  6.   activities  = 
  7. }

日志:
[INFO] 1409095626.823267 - XML-RPC-Session-1 - Executor has stopped.
[INFO] 1409095626.823651 - XML-RPC-Session-1 - Fabric node stopped.

參考:
1、<< MySQL Fabric  A Guide to Managing MySQL High  Availability and Scaling Out >>、<<MySQL Fabric  >>




 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!