1. 程序必须通过Fabric-aware connectors来连接mysql实现路由,目前只支持PHP,Python 和Java;
2. fabric state store和fabric note当前是单点,虽然fabric-aware连接器可以缓存路由信息(可以配置ttl值);
3. fabric state store(backing store)和fabric note当前是单点,mysqlfabric进程本身不提供容错,出现故障时需要重启,当mysql fabric不可用时,fabric-aware连接器能够通过本地的cache继续路由操作(配置ttl值);– 在测试过程中 backing store挂了 是致命伤(如果能在非常短时间内恢复则没有问题) 即使backint store恢复 也不能正常插入 不知到是脚本问题 还是确实如此
4. mysql实例进行恢复后,fabric不会自动改变实例的状态,需要手工修改;
5. 自动把slaves都设置为read_only 这点值得表扬。
6. 基于GTID的复制本身存在一些限制。
7. 使用fabric不需要对slave配置vip,不像MHA和MMM等需要对vip进行管理;
8. 使用fabric实现mysql复制高可用,以组为单位对mysql实例进行管理,可以管理多个HA组;
9. mysql实例需要指出gtid,也是就要升级到mysql 5.6.10以上版本;
查看mysqlfabric命令帮助:
mysqlfabric help:显示简短的语法信息和帮忙命令
mysqlfabric help commands: 列出所有可用命令和描述
mysqlfabric help groups: 列出可用命令组
mysqlfabric help [group] [command]: 提供命令的详细帮助信息
常用相关命令
mysqlfabricgroup create my_group #创建HA组
mysqlfabricgroup destroy my_group #删除HA组
mysqlfabricgroup add my_group 10.1.1.208:3306 #添加组成员
mysqlfabricgroup remove my_group c505ce10-9bc0-11e4-bfd4-000c290e7abe #移出组成员
mysqlfabricgroup lookup_servers m_ygroup #查看组成员
mysqlfabricgroup promote my_group –slaves=10.1.1.207:3306 #选举master
mysqlfabric group demote my_group #降级在组中的任何primary,不会重新选取一个新master,千万不能在业务进行期间做此操作,同时也不会关闭故障检测。
mysqlfabric groupactivate my_group #激活自动故障转移
mysqlfabric group deactivate my_group #禁用自动故障转移
mysqlfabric server set_status server_uuid status #变更服务器状态
mysqlfabrichelp manage #manage命令帮助
mysqlfabrichelp group #group命令帮助
mysqlfabrichelp server #server命令帮助
架构图
mysql-fabric
1
2
|
mysql> install plugin rpl_semi_sync_master SONAME ‘semisync_master.so’;
mysql> install plugin rpl_semi_sync_slave SONAME ‘semisync_slave.so’;
|
— Mysql安装好后,每个fabric管理的实例需要开启gtid、二进制日志(不需要启动复制,由fabric完成),将以下配置放到[mysqld]段下面:
1
|
vim /etc/my.cnf
|
添加以下内容
1
2
3
4
5
6
7
8
9
10
11
12
|
———— GTIDs主从 ————————
log_bin
log_slave_updates
gtid_mode=on
enforce_gtid_consistency
———— semi 半同步 ———————
rpl_semi_sync_master_enabled=1
rpl_semi_sync_master_timeout=1000
rpl_semi_sync_slave_enabled=1
———— 把master_info 和 relay_log记录在表——————–
master_info_repository=TABLE
relay_log_info_repository=TABLE
|
配置Mysql Fabric
1
|
mysql> grant all on fabric.* to fabric@‘10.1.1.210’ identified by ‘fabric’;
|
1
|
mysql> grant all on *.* to fabric@‘10.1.1.210’ identified by ‘fabric’;
|
1
|
# vim /etc/mysql/fabric.cfg
|
修改以下内容
1
2
3
4
5
6
7
|
[storage]
address = 10.1.1.210:3306 — backingstore (mysql实例) 的地址
password = fabric — 在backingstore授权的密码
[servers]
password = fabric — 在受管理的mysql上授权的密码
[protocol.xmlrpc]
address = 0.0.0.0:32274 — 修改监听地址
|
— 其他参数解释 请查看/mysql/MySQL Utilities/mysqlFabric/fabric.cfg 配置文件详解
运行fabric
使用fabric创建mysql复制高可用组
查看组信息
— 查看健康情况
配置主从用户
选出master
# mysqlfabric help group promote
group promote group_id [–slave_id=NONE] [–update_only] [–synchronous]
— 如果只是想更新state store,跳过复制配置,使用–update_only参数。
— 如果slave没有提供,将选择一个最好的候选者,候选者必须开启二进制日志,同时跟master属于同一个组,跟master延时小。进行故障切换操作,选择这个候选者,同时将其他slave指向到新的master,同时更新state store。
— 执行同样的命名将设置不同的服务器为primary,同时降级当前primary并选取一个新的。如果当前primary错误,执行同样的命令能手动触发选取一个新的primary。
—————— 把primary降级——————————–
mysqlfabric group demote my_group
— 使用group demote降级在组中的任何primary,不会重新选取一个新master,千万不能在业务进行期间做此操作,同时也不会关闭故障检测。
——————————————————————–
启用故障检测( failover )
模拟故障
# mysqlfabric help server set_status
server set_status server_id status [–update_only] [–synchronous]
Set a server’s status.
支持的状态值为primary,secondary,spare,faulty。
——————————————————————————–
使用python 测试连接数据库和插入数据时故障切换
— 应用程序通过fabric-aware连接器连接到fabric,获取服务器、组信息。
— 创建数据库和表和授权用户 — 在master 206上操作
1
2
|
create database db01;
create table t1(id int,name char(3));
|
1
|
grant all on db01.* to user_db01@‘10.1.1.210’ identified by ‘redhat’;
|
— 在210上编写脚本
— 脚本达到无限插入数据并插入失败重新提交
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#!/usr/bin/env python
#coding:utf-8
import sys
import time
import mysql.connector
from mysql.connector import fabric
def main():
try:
conn = mysql.connector.connect(
fabric = {“host”:“10.1.1.210”,“port”:32274,“username”:“admin”,
“password”:“fabric”}, #指定使用xml-rpc连接fabric的用户名和密码
user=“user_db01”,database=“db01”,password=“redhat”,autocommit=True #指定访问受管理mysql实例的用户名和密码
)
f = open(‘/tmp/python_insert’,‘a+’) #日志文件路径
flag = 1
while 1 < 10: #死循环
try:
time.sleep(0.01)
print >> f,‘INSERT INTO t1 VALUES (%s,”a”)’%flag
conn.set_property(group=“my_group”,mode=fabric.MODE_READWRITE) #连接到此HA组 并且指定模式为READ_WRITE 写在循环体里面是因为如果不重新拿状态 failover是不会响应的
cur = conn.cursor()
cur.execute(‘INSERT INTO t1 VALUES (%s,”a”)’%flag) #只有这句话有可能抛出错误 如果抛出错误 这句话以下的语句则不会执行
print >> f,‘insert ok’ #如果没有错误 则往文件输出 ok
f.flush()
flag += 1
except Exception,e:
print >> f,e #如果抛出错误 则把错误写到日志文件
f.flush()
except Exception,e:
print >> f,e
f.flush()
finally:
f.close()
conn.close()
if __name__ == ‘__main__’:
main()
|
1
|
# python /tmp/fabric_test.py
|
模拟故障
1
|
# mysqladmin -predhat shutdown
|
1
2
3
4
5
6
|
# mysqlfabric group lookup_servers my_group
————————————————— 输出如下 ———————————–
9507aa71–9280–11e5–88d8–525400ef6331 10.1.1.207:3306 SECONDARY READ_ONLY 1.0
e0424b22–9ee9–11e5–99c6–52540082b02e 10.1.1.208:3306 PRIMARY READ_WRITE 1.0
f9d3f20e–9ee8–11e5–99c0–525400b3b967 10.1.1.206:3306 FAULTY READ_ONLY 1.0
————————————————————————————————————
|
— 查看日志文件
——————— 截取日志重点如下————————–
模拟mysqlfabric故障
— 模拟backing store 的mysqld故障
— 模拟fabric node( fabric进程 )故障
— 把fabric关掉
1
|
# mysqlfabric manage stop
|
— 查看日志
1
2
3
4
5
6
|
vim /etc/mysql/fabric.cfg
修改以下内容
ttl = 999999999 — 随便调大测试
mysqlfabric manage stop — 重启mysqlfabric 使配置生效
mysqlfabric manage start —daemon
|
— 结果一模一样 压根不是调大TTL值就能解决的 致命伤啊
组维护
1、找出哪些服务器在组中,查看组状态
1
|
# mysqlfabric group lookup_servers my_group
|
2、从组中移除mysql实例
— 有时需要将secondaries离线进行维护,在停止服务之前,需要先从组中移除它,避免fabric错误检查触发任何动作:
1
2
3
4
5
|
——————————— 命令介绍 ———————————————————————–
# mysqlfabric help group remove
group remove group_id server_id [—synchronous]
Remove a server from a group.
——————————————————————————
|
— 如从my_group组中移除server_uuid为7bd52611-2d44-11e4-af5f-3ecad7c2f82a的实例:
1
|
# mysqlfabric group remove my_group 7bd52611-2d44-11e4-af5f-3ecad7c2f82a
|
— 然后可以重新添加到组,将自动开启复制:
1
|
# mysqlfabric group add my_group 10.1.1.206:3306
|
3、添加一个全新的Mysql实例(实例IP为172.17.0.51)到HA group组
— 查看前面的创建过程即可
4、降级primary
— primary不能从组中移除,使用group demote关闭在组中的任何primary,不会重新选取一个新master,同时也不会关闭故障检测。
1
|
# mysqlfabric group demote my_group
|
5、手动提升一个服务组,选取一个master
1
|
# mysqlfabric group promote my_group
|
6、移除组(使用group destroy)
— 如果组没有服务器,是空的,能移除组
1
|
# mysqlfabric group destroy my_test
|
— 也能强制的移除非空的组(使用–force):
1
|
# mysqlfabric group destroy my_test –force
|
文章转载来自:ttlsa.com