MySQL分片高可用集群之Fabric部署使用

Fabric是Oracle公司开发的既有分片又有读写分离的MySQL集群管理工具,虽然个人觉得目前版本还有很多缺陷,但应该会逐步完善,将来会是一个不错的工具。

第一步:下载并安装 Fabric

Fabric可以从MySQL官网下载,她属于MySQL Utilites里,官方下载地址是http://dev.mysql.com/downloads/utilities/

我下载的是源码版的,mysql-utilities-1.5.6.zip,因为是Python所写,所以安装跟C语言的不同:

$ unzip mysql-utilities-1.5.6.zip

$ cd mysql-utilities-1.5.6/

$ python setup.py build

$ sudo python setup.py install

安装好后,原先的python脚本去掉了py后缀,默认放在/usr/local/bin/目录下,可直接执行。

第一步:部署 MySQL5.6 多实例

运行Fabric前,我们要先准备若干各数据库,根据我们的需要配置不同数量的数据库,我们先部署基本的读写分离的主从方式,Fabric的需要的利用MySQL的GTID特性进行主从复制,因此需要MySQL5.6以上版本,另外由于MariaDB的GTID特性跟MySQL不同,Fabric不支持MariaDB,使用MariaDB的话有报错。所以只能用MySQL5.6以上版本。

我们至少需要部署3个MySQL实例才能看到Fabric的功效,

作用地址端口数据文件路径配置文件路径 
Fabric元数据库localhost10000/dev/shm/data/fa00fabric/fa00.cnf 
业务数据库 1localhost10011/dev/shm/data/fa11fabric/fa11.cnf 
localhost10012/dev/shm/data/fa12fabric/fa12.cnf

TIP:由于我在一台电脑上启动了很多数据库,因此将数据文件都放在了内存硬盘中,我的机器默认有的是/dev/shm,其他的机器根据会有所不同,如/run/shm等,这个路径选择无关紧要,只要事先创建父目录。因为使用内存硬盘,MySQL自身的内存需求降低,我降低了MySQL需要的内存使用量,这个也根据自己的情况选择。注:生产环境不可这样配置。

下面我们还是先修改配置文件,需要修改的内容如下:(以fa00.cnf举例)

# 请自行调整前面6行的数字,每个数据库都不能相同,这里是改了最后两个00对应的数字。

[client]

port            = 10000

socket          = /tmp/fa00.sock

 

[mysqld]

port            = 10000

socket          = /tmp/fa00.sock

datadir        = /dev/shm/data/fa00

server-id      = 10000

user            = lyw

 

# 主从复制相关

log-bin=mysql-bin

gtid-mode              = on

log-slave-updates      = true

enforce-gtid-consistency= true

# 文件、内存大小,节约内存。

innodb_buffer_pool_size = 32M

innodb_log_file_size    = 5M

修改好3个文件配置文件 fa00.cnf,fa11.cnf,fa12.cnf 后,我们初始化数据,并且启动,这次我们采用批量操作的方式,减少工作量。在mysql目录下创建如下脚本init_start.sh和初始化数据库文件fabric.sql,并执行init_start.sh,即可创建所有数据库,并启动。

fabric.sql 内容为:

use mysql;

delete from user where user='';

flush privileges;

grant all on *.* to 'fabric'@'%' identified by '123456';

create database lyw;

reset master;

init_start.sh 内容为:

#! /bin/bash

mkdir -p /dev/shm/data

for cnf in `ls fabric/*.cnf`

do

        scripts/mysql_install_db --defaults-file=$cnf

        bin/mysqld --defaults-file=$cnf &

done

# 等待一下,让mysqld启动完成,

sleep 3

 

for cnf in `ls fabric/*.cnf`

do

        bin/mysql --defaults-file=$cnf -uroot < fabric.sql

done

准备好脚本后,执行init_start.sh即完成所有数据库的初始化和启动工作,可以启动mysql客户端检查下数据库是否都初始化好。Fabric不需要主动执行change master to这行sql语句来开启主从,而是交由Fabric自身去执行。到此数据库以准备好,接下来开始真正的Fabric配置。

第三步:Fabric 读写分离主从配置

fabric的默认配置文件路径为/usr/local/etc/mysql/fabric.cfg,其他安装方法会是/etc/mysql/fabric.cfg(其他系统根据自己情况配置)因此为了方便后面的操作,我们还是使用这个配置文件,当然也可以用--config 参数指定配置文件。

fabric.cfg内容如下:

[DEFAULT]

prefix = /usr/local

sysconfdir = /usr/local/etc

logdir = /var/log

# storage 配置的是fabric元数据存储的数据库

[storage]

address = localhost:10000

user = fabric

password = 123456

database = fabric

auth_plugin = mysql_native_password

connection_timeout = 6

connection_attempts = 6

connection_delay = 1

 

[servers]

user = fabric

password = 123456

backup_user = fabric_backup

backup_password = secret

restore_user = fabric_restore

restore_password = secret

unreachable_timeout = 5

 

# fabric对外的协议,这里是xmlrpc协议

[protocol.xmlrpc]

address = localhost:32274

threads = 5

user = admin

password = 123456

disable_authentication = yes

realm = MySQL Fabric

ssl_ca =

ssl_cert =

ssl_key =

 

# fabric对外的协议,这里是mysql协议,能用mysql连接,但是不能跟普通数据库一样操作

[protocol.mysql]

address = localhost:32275

user = admin

password = 123456

disable_authentication = yes

ssl_ca =

ssl_cert =

ssl_key =

 

[executor]

executors = 5

 

[logging]

level = INFO

url = file:///var/log/fabric.log

 

[sharding]

mysqldump_program = /usr/bin/mysqldump

mysqlclient_program = /usr/bin/mysql

 

[statistics]

prune_time = 3600

 

[failure_tracking]

notifications = 300

notification_clients = 50

notification_interval = 60

failover_interval = 0

detections = 3

detection_interval = 6

detection_timeout = 1

prune_time = 3600

 

[connector]

ttl = 1


配置好后,需要初始化fabric的元数据
 

$ mysqlfabric manage setup

。。。。。。

Finishing initial setup

=======================

Password for admin user is not yet set.

Password for admin/xmlrpc:                这里需要设置admin的密码

Repeat Password:                          重复输入密码

Password set.

Password set.

这时fa00这个数据库已经有了fabric的元数据,我们可以用mysql客户端查看。

然后启动

$ mysqlfabric manage start


自此虽然启动了fabric,但是还没有和前面配置的后两个业务数据库产生联系,接下来我们需要用命令行建立联系。我先看一下mysqlfabric的分组相关帮助,

$ mysqlfabric help group

Commands available in group 'group' are:

    group activate group_id  [--synchronous]

    group description group_id  [--description=NONE] [--synchronous]

    group deactivate group_id  [--synchronous]

    group create group_id  [--description=NONE] [--synchronous]

    group remove group_id server_id  [--synchronous]

    group add group_id address  [--timeout=NONE] [--update_only] [--synchronous]

    group health group_id 

    group lookup_servers group_id  [--server_id=NONE] [--status=NONE] [--mode=NONE]

    group destroy group_id  [--synchronous]

    group demote group_id  [--update_only] [--synchronous]

    group promote group_id  [--slave_id=NONE] [--update_only] [--synchronous]

    group lookup_groups  [--group_id=NONE]


我们首先需要创建一个组group-1:

$ mysqlfabric group create group-1

然后将两个业务数据库10011和10012放入这个组中:

$ mysqlfabric group add group-1 127.0.0.1:10011

$ mysqlfabric group add group-1 127.0.0.1:10012


然后可以查看这时group-1这个组的状态

$ mysqlfabric group lookup_servers group-1

Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e

Time-To-Live: 1

 

                        server_uuid        address    status      mode weight

------------------------------------ --------------- --------- --------- ------

d4919ca2-754a-11e5-8a5e-34238703623c 127.0.0.1:10011 SECONDARY READ_ONLY    1.0

d6597f06-754a-11e5-8a5e-34238703623c 127.0.0.1:10012 SECONDARY READ_ONLY    1.0

从status 和 mode 这两个字段可以看出,这个时候刚加入的两个服务器还没有正式生效,都是作为从库只读的身份,两个库还没有建立实质的联系,我们需要将其中一个数据库提升为可写的主:

$ mysqlfabric group promote group-1

 

$ mysqlfabric group lookup_servers group-1

Fabric UUID:  5ca1ab1e-a007-feed-f00d-cab3fe13249e

Time-To-Live: 1

                        server_uuid        address    status      mode weight

------------------------------------ --------------- --------- ---------- ------

d4919ca2-754a-11e5-8a5e-34238703623c 127.0.0.1:10011 SECONDARY  READ_ONLY    1.0

d6597f06-754a-11e5-8a5e-34238703623c 127.0.0.1:10012  PRIMARY READ_WRITE    1.0

用promote命令提升后,其中一台会被提升为主数据库,其他的都为从。主从也可以通过mysql客户端查看,在从库执行下面的命令显示如下,主库执行则没有信息

mysql> show slave status \G;

*************************** 1. row ***************************

              Slave_IO_State: Waiting for master to send event

                  Master_Host: 127.0.0.1

                  Master_User: fabric

                  Master_Port: 10012

                Connect_Retry: 60

              Master_Log_File: mysql-bin.000001

          Read_Master_Log_Pos: 151

              Relay_Log_File: lyw-hp-relay-bin.000002

                Relay_Log_Pos: 361

        Relay_Master_Log_File: mysql-bin.000001

            Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

                          。。。。。。


至此主从方式以基本可用,我们迫不及待地想要尝试下客户端如何使用了。官方提供python和java两种客户的,因此如果用Fabric,业务语言最好是这两种。

相关推荐