转自:
https://www.2cto.com/database/201408/327941.html



Oracle在今年5月推出了一套为各方寄予厚望的MySQL产品 -- MySQL Fabric,从字面上不太能看出它是啥,但是从名称上还是有迹可循的。fabric是“织物”的意思,这意味着它是用来“织”起一片MySQL数据库。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再到数据库)。每个查询都会造成额外的负荷。

图片.png


MySQL Fabric的架构
MySQL Fabric采用不用的做法,其架构如下图所示。主要的特点是把switch合并到各应用端的connector中,以解决单一switch的单点故障和性能瓶颈。
图片.png


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推出正式发行版才两个多月,已经引起许多重量级MySQL用户的注意和使用。而Oracle也不吝于加大对它的投资,以加速其功能更加完善。现在已推出一个更新版,在最新版的MySQL Fabric加上了对SSL连接的支持,近期内对Fabric改良的重点将着重于使Fabric对应用程序更加透明化(例如单一SQL对shard table的查询条件可以跨shard)、支持更多的高可用方案、提供更加有好易用的GUI等。在此建议关心MySQL发展的朋友可以留意这个产品的发展,进一步试用它。将能的意见和心得反映给Oracle,如果您满意它所提供的功能和稳定性,可以将它加入您的投产系统正式营运,Fabric的开发团队会很欢迎大家对这个MySQL家族的新成员所做的任何贡献。本文的目的是介绍MySQL Fabric要解决的问题和Fabric的架构,至于详细的设定和操作,请容我在下一篇文章中以一个示例和各位分享,敬请期待。





转自:

https://my.oschina.net/anthonyyau/blog/307165


Mysql Fabric用来管理mysql服务,提供扩展性和容易使用的系统,管理mysql分片和高可用部署(当前实现了两个特性:高可用和使用数据分片的横向扩展,能单独使用或结合使用这两个特性)。
图片.png


应用请求一个扩展的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复制(异步或半同步)允许数据安全的复制。
图片.png


 mysql fabric提供两个HA可用×××:
1、故障检测和提升
fabric进程监控HA group中的mysql master,如果服务器错误,将选择一个slave并提升到master(HA group中所有其他slave将从新master接收更新);

2、路由数据库请求
当fabric提升一个新的master,更新state store,新的路由信息将收录到连接器,并存储到缓存中。通过这种方式,应用不需要知道拓扑改变和写请求需要发送到不同的目标。
图片.png

横向扩展-分片:
当因单个Mysql服务器(或HA group)因存储容量或写性能限制,mysql fabric能使用横向扩展数据库服务,分割数据到多个mysql服务器组。每个组可以是单个Mysql实例或HA group。
图片.png


由管理员决定数据在服务器之间怎样进行分片,创建分片映射。
fabric支持两种shard key方法:
1、HASH
2、RANGE

当应用需要访问分片数据库,需要指定sharding key,Fabric-aware连接器将应用正确的range或hash映射和路由事务到正确分片;
mysql fabric能分离一个存在的分片到两个新的分片和更新state store,同时缓存路由数据到连接器。同时也支持从一个HA group移动分片到另外一个mysql服务组。
图片.png



 一个单事务或查询仅仅访问到单个shard,重要的选择shard keys基于理解数据和应用访问模式。
global tables写到'global group',任何附加或改变到这些表的数据将自动复制到所有其他组。模式改变也属于global group,复制到所有其他服务器,确保一致性。
图片.png


分片架构图:

图片.png



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(供参考):
环境:

图片.png

下载Fabric链接:
http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-utilities-1.4.4.tgz

下载页面:
http://dev.mysql.com/downloads/tools/utilities

安装:

tar xvf mysql-utilities-1.4.4.tgz
cd mysql-utilities-1.4.4
python setup.py install



配置Mysql Fabric:
1、需要创建一个账号访问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地址,根据实际情况进行替换,账号和密码也根据实际情况进行替换。


2、对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创建单独的账号。


3、修改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 =


4、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)

5、查看创建的表:

# 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             | #标识用户有什么权限访问到不同子系统的功能
+-------------------+


6、开启和停止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.

参考:
1、<< MySQL Fabric  A Guide to Managing MySQL High  Availability and Scaling Out >>、<<MySQL Fabric  >>
2、官方手册: http://dev.mysql.com/doc/mysql-utilities/1.5/en/fabric.html





转自:
https://www.csdn.net/article/2014-08-20/2821300


MySQL原生HA方案 – Fabric体验之旅
摘要:众所周知,Fabric能提供MySQL的HA和Sharding方案,但是并没有具体的介绍其具体的表现和搭建部署流程。笔者所在团队亲身体验了此过程,虽然过程简单但是却充满着无穷的乐趣,也为未来的应用带来了福音。
还在为MySQL HA方案的选型头疼吗?现在不用了,自从2014年5月28日Oracle发布Fabric之后,一切都变得如此简单。因为是原生的官方产品,可以放心使用,由于这款产品大力的增强了HA效率,可以看出Oracle对云计算的支持力度,说明Oracle这个大象也可跳舞,而且还挺灵活的。
官方对Fabric的介绍主要是它提供了MySQL的HA和Sharding方案,本文主要讨论Fabric在MySQL HA方面的表现以及搭建部署流程。我的团队试着搭建了一下,简直无法再简单了,这对于DBA来说绝对是一个大福音,这个产品在接下来的几年中必然会被大量应用到生产环境中去,我的团队对这个产品的未来充满信心。
接下来我们将循序渐进的带领大家感受Fabric带来的乐趣。

1、实验环境
本例的实验环境是在一台CentOS主机中做的,机器上有3个MySQL实例,分别是3306、3691和3692,我们要做的就是用这3个实例达成HA效果

图片.png


2、下载
Fabric目前是被打包到了MySQL Utilities中,所以大家下载MySQL Utilities就可以了,下载地址是: http://dev.mysql.com/downloads/utilities/,目前版本是:1.4.4,在本例中我们下载的是 mysql-utilities-1.4.4-1.el6.noarch.rpm。

3、安装MySQL Utilities
rpm包的安装还是挺简单的,具体如下:

rpm -ivh mysql-utilities-1.4.4-1.el6.noarch.rpm
Preparing...                ########################################### [100%]
    1:mysql-utilities        ########################################### [100%]

装完后执行
mysqlfabric
如果有回显说明安装完毕。

4、建立Backing Store帐号
Backing Store用于存储整个HA集群的服务器等相关配置,它需要一个MySQL实例来存储这些信息,这个实例的版本需要跟其它在HA中的MySQL实例版本保持一致,而且必须是5.6.10及更高的版本,我们在本例中选择3306实例来使用。
首先,你需要一个帐号来连接Backing Store的MySQL实例,这个帐号需要有对fabric数据库的管理员级权限,我们在3306端口的实例上建帐号,具体如下:

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


5、Fabric配置文件
Fabric配置文件默认位置是:/etc/mysql/fabric.cfg
修改其中的[storage]部分,具体如下:

[storage]
auth_plugin = mysql_native_password
database = fabric
user = fabric
address = 10.165.17.175:3306
connection_delay = 1
connection_timeout = 6
password = secret
connection_attempts = 6
其中address = 10.165.17.175:3306是Backing Store的MySQL实例,password = secret是上一步中建立连接fabric数据库的用户密码。

修改其中的[servers]部分,具体如下:
[servers]
password = secret 
user = fabric
其中是password = secret 是HA环境中各实例的连接密码。


6、填充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就可以了。
我们再查看3306端口的实例里面发生了什么变化,具体如下:

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

可以看到多了一个fabric数据库,它里面存储的就是Fabric的一些配置信息。


7、配置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


8、启动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.


9、建立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服务器组。

10、填加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     = True
  return      = [{'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的。

11、选举一个主库
选举的方法也非常简单,具体如下:

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     = True
  return      = [{'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角色。

12、激活故障自动切换
即使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故障自动切换。

13、测试HA
在这个实验中,我们将3691实例停止,再看看Fabric的状态:

mysqlfabric group lookup_servers my_group
Password for admin: 
Command :
{ success     = True
  return      = [{'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角色。我不得不说就是这个功能,是它吸引我的原因之一。

14、后续学习
关于后续的学习,大家要看看官网的用户手册,里面还有很多HA维护的方法,如增减节点等问题,同时目前Fabric也提供了phtyon和Java的API,可以供软件开发人员直接使用,以后的软件开发人员,不是再直接连接到MySQL实例,而是连接到Fabric,由Fabric来统一分发请求,这有些象MySQL Proxy,但它的应用前景要比MySQL Proxy更宽更广。