苦逼的人生,开始了新一轮调研。这次是上面要看 MySQL Fabric 分片性能,好吧,开搞。

1 啥是 MySQL Fabric

其实就是一个Python进程和应用端的Connector的组合。来一张官方图:

看到了吧,Fabric就是会启动一个python daemon进程作为xml rpc服务器,应用端的Connector会自动连接这个服务器获取信息判断该连接哪个MySQL服务器。Fabric服务器还会监控各个HA组,出现问题时自动切换主从。尼玛这性能能好才有鬼呢!

2 前置条件

  • 需要 MySQL 版本 > 5.6.
  • 需要单独一台 MySQL 作为Fabric服务器的 backing store.
  • 各个受控的 MySQL 服务器要求打开: gtid_mode (GTID), bin_log (binary logging), 和 log_slave_updates ,并且 server_id 不能有冲突.
  • 需要 Python > 2.6.
  • 如果是写Java程序的话, Connector/J 版本 > 5.1.27.

3 安装 Fabric

官方文档说从1.6开始Fabric从MySQL Utilities里独立出来了,但是坑爹的是看了半天论坛又发现并没有1.6的包。最新就是1.5.6,请老实下载MySQL Utilities 1.5.6并安装吧,少年!

这里先提供一份我的 fabric.cnf 配置文件,具体就是配置 Fabric 的数据库信息,受控服务器的3种账号,客户端连接 Fabric 服务器使用 XmlRpc 或 MySQL 协议的信息。我这里把disable_authentication 打开了,取消连接 Fabric 时需要的验证,因为需要验证的情况我没试成功,总是 Permission Denie.

#fabric.cnf

[DEFAULT]

prefix =

sysconfdir = /home/will

logdir = /var/log

[storage]

address = 10.202.8.33:23308

user = root

password = root123

database = mysql_fabric

auth_plugin = mysql_native_password

connection_timeout = 6

connection_attempts = 6

connection_delay = 1

[servers]

user = root

password = root123

backup_user = root

backup_password = root123

restore_user = root

restore_password = root123

unreachable_timeout = 5

[protocol.xmlrpc]

address = 10.202.8.33:32274

threads = 5

user = admin

password = root123

disable_authentication = yes

realm =

ssl_ca =

ssl_cert =

ssl_key =

[protocol.mysql]

address = 10.202.8.33:32275

user = admin

password = root123

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

4 安装数据库

做分片需要至少2台分片用服务器,1台全局服务器存不分片数据(这台的数据会同步的前2台分片服务器上),1台做back store,总共4台MySQL。记得打开: gtid_mode (GTID), bin_log (binary logging), 和 log_slave_updates。我这里打算用mysqld_multi启动多台实例,哈哈48 核,192G内存的机器。

#my.cnf

[mysqld1]

port            = 23306

socket          =/home/will/mysql/mysql.sock

datadir         =/home/will/mysql/data

pid-file        =/home/will/mysql/mysql.pid

user            =mysql

log-bin         =master-bin

log-bin-index   =master-bin.index

binlog_format   = ROW

binlog-row-image= minimal

binlog-do-db    =rcc_will

server-id       =1

symbolic-links  =0

character_set_server=utf8

skip-external-locking

innodb_flush_log_at_trx_commit = 2

default-storage-engine =innodb

slave-skip-errors=all

max_binlog_size=200M

enforce-gtid-consistency = ON

gtid-mode = ON

log_slave_updates

master_info_repository = TABLE

relay_log_info_repository = TABLE

[mysqld2]

port            = 23307

socket          = /home/will/mysql2/mysql.sock

datadir         =/home/will/mysql2/data

pid-file        =/home/will/mysql2/mysql.pid

user            =mysql

server-id       =2

log-bin         =master-bin

log-bin-index   =master-bin.index

binlog_format   = ROW

binlog-row-image= minimal

binlog-do-db    =rcc_will

symbolic-links  =0

character_set_server=utf8

skip-external-locking

innodb_flush_log_at_trx_commit = 2

default-storage-engine =innodb

slave-skip-errors=all

max_binlog_size=200M

enforce-gtid-consistency = ON

gtid-mode = ON

log_slave_updates

master_info_repository = TABLE

relay_log_info_repository = TABLE

[mysqld_back]

port            = 23308

socket          = /home/will/mysql3/mysql.sock

datadir         =/home/will/mysql3/data

pid-file        =/home/will/mysql3/mysql.pid

user            =mysql

server-id       =3

symbolic-links  =0

character_set_server=utf8

skip-external-locking

innodb_flush_log_at_trx_commit = 2

default-storage-engine =innodb

slave-skip-errors=all

max_binlog_size=200M

enforce-gtid-consistency = ON

gtid-mode = ON

log_slave_updates

master_info_repository = TABLE

relay_log_info_repository = TABLE

[mysqld_global]

port            = 23309

socket          = /home/will/mysql4/mysql.sock

datadir         =/home/will/mysql4/data

pid-file        =/home/will/mysql4/mysql.pid

user            =mysql

server-id       =4

log-bin         =master-bin

log-bin-index   =master-bin.index

binlog_format   = ROW

binlog-row-image= minimal

binlog-do-db    =rcc_will

symbolic-links  =0

character_set_server=utf8

skip-external-locking

innodb_flush_log_at_trx_commit = 2

default-storage-engine =innodb

slave-skip-errors=all

max_binlog_size=200M

enforce-gtid-consistency = ON

gtid-mode = ON

log_slave_updates

master_info_repository = TABLE

relay_log_info_repository = TABLE

5 初始化Fabric

先初始化 Backing Store 即 Fabric 服务器的 MySQL:

mysqlfabric --config=./fabric.cnf manage setup

再启动 Fabric 服务器:

mysqlfabric manage start

6 分组搞分片

Fabric的HA是按组来搞得,每个组的服务器组成主从并且可以自动切换。我这里每组就一台好了,主要是测分片嘛。

先来3个组:

mysqlfabric --config=./fabric.cnf group create my_group1

mysqlfabric --config=./fabric.cnf group create my_group2

mysqlfabric --config=./fabric.cnf group create my_group_global

再把服务器加入:

mysqlfabric --config=./fabric.cnf group add my_group1 10.202.8.33:23306

mysqlfabric --config=./fabric.cnf group add my_group2 10.202.8.33:23307

mysqlfabric --config=./fabric.cnf group add my_group_global 10.202.8.33:23309

搞起HA:

mysqlfabric --config=./fabric.cnf group promote my_group1

mysqlfabric --config=./fabric.cnf group promote my_group2

mysqlfabric --config=./fabric.cnf group promote my_group_global

激活自动切换,这步可选:

mysqlfabric --config=./fabric.cnf group activate my_group1

mysqlfabric --config=./fabric.cnf group activate my_group2

mysqlfabric --config=./fabric.cnf group activate my_group_global

定义分片的mapping(全局组,分片策略HASH):

mysqlfabric --config=./fabric.cnf sharding create_definition HASH my_group_global

给定义好的mapping(id 1)添加分片的table和列:

mysqlfabric --config=./fabric.cnf sharding add_table 1 db_will.db_users name

添加分片组:

mysqlfabric --config=./fabric.cnf sharding add_shard 1 "my_group1, my_group2" --state=ENABLED

7 创建数据库

这里需要在mysqld_global那台机器上手动create database db_will,然后就自动同步到其他服务器了。

8 Java客户端

// 数据源
FabricMySQLDataSource ds = new FabricMySQLDataSource();
ds.setServerName("10.202.8.33");
ds.setPort(32274);
ds.setDatabaseName("db_will");
ds.setFabricShardTable("db_users");
ds.setUser("root");
ds.setPassword("root123"); //创建表
JDBC4FabricMySQLConnection conn = (JDBC4FabricMySQLConnection) ds.getConnection();
Statement stat = conn.createStatement();
stat.execute(“CREATE TABLE `db_users` ( … ”); //插入数据
JDBC4FabricMySQLConnection conn = (JDBC4FabricMySQLConnection) ds.getConnection();
PreparedStatement stat = conn.prepareStatement("insert into db_users (`name`) values (?)");
for (long i = 0; i < 20 * 1024 * 1024; i++) {
conn.setShardKey(String.valueOf(i));
stat.setString(1, String.valueOf(i));
stat.executeUpdate();
} //查询数据
conn.setShardKey(imsi);
ResultSet rs = stat.executeQuery("SELECT * FROM `db_users` WHERE name=" + name);

可以看到主要是通过conn.setShardKey来实现选择分片组的。

9 性能

插入20M的数据,尼玛花了5个小时,每秒也就1000条吧。

然后增删改查基本都在20毫秒的级别。

最后同时查询也就能达到130个连接,再多就挂了,python服务器撑不住啊。

MySQL Fabric 分片性能测试的更多相关文章

  1. 甲骨文推出MySQL Fabric,简化MySQL的高可用性与可扩展性

    北京,2014年5月28日——为了满足当下对Web及云应用需求,甲骨文宣布推出MySQL Fabric.MySQL Fabric是一款可简化管理MySQL数据库群的整合式系统.该产品通过故障检测和故障 ...

  2. Mysql Fabric实现学习笔记

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

  3. MySQL Fabric和MyBatis的整合过程中遇到的问题

    这是我昨天在整合MySQL Fabric和MyBatis时遇到的问题,花了大半天才解决的问题,解决的过程中在网上查找了很久,都没有找到解决的方案.现在记下来,希望能够帮助有同样问题的朋友.如果各位朋友 ...

  4. mysql几种性能测试的工具使用

    mysql几种性能测试的工具使用 近期由于要比较mysql及其分支mariadb, percona的性能,了解了几个这方面的工具,包括:mysqlslap sysbench tpcc-mysql,做一 ...

  5. MySQL加密的性能测试

    这是对MySQL进行加密性能测试的两篇文章系列之二.在第一篇中,我专门使用MySQL的内置的对SSL的支持来 做压力测试,产生了一些令人惊讶的结果. AD:WOT2015 互联网运维与开发者大会 热销 ...

  6. MySQL Fabric部署

    架构描写叙述: 一台主机上安装4个MySQL 服务,当中一个MySQL服务用于存储MySQL Fabric后台数据:另外3个MySQL服务用于主从架构測试.一个主+两个从. 第一部分:二进制方式安装M ...

  7. HBase 高性能获取数据(多线程批量式解决办法) + MySQL和HBase性能测试比较

    摘要:   在前篇博客里已经讲述了通过一个自定义 HBase Filter来获取数据的办法,在末尾指出此办法的性能是不能满足应用要求的,很显然对于如此成熟的HBase来说,高性能获取数据应该不是问题. ...

  8. 【MySQL】Sysbench性能测试

    两台MySQL配置不一样,要测试下性能差别 [m1] long_query_time = 0.1 log_slave_updates innodb_flush_log_at_trx_commit [m ...

  9. mysql分区/分片

    一.分区概念 mysql 5.1 以后支持分区, 有点类似MongoDB中的分片概念. 就是按照一定的规则, 将一个数据库表分解成很多细小的表, 这些细小的表可以是物理的分区, 就是在不同的位置. 但 ...

随机推荐

  1. 在线程池使用Callable和Runnable的区别以及如何关闭线程

    一.区别总结: Callable定义的方法是call,而Runnable定义的方法是run. Callable的call方法可以有返回值,而Runnable的run方法不能有返回值,这是核心区别. C ...

  2. 图解 & 深入浅出Java初始化与清理:构造器必知必会

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  3. 彻底解决Google浏览器CSS居中问题

    div做的界面时,又出现CSS hack(CSS兼容浏览器问题)在IE内核浏览器或者firefox浏览器中都能居中,没有居中的可以用其特殊标签来设定居中,如下划线 _ IE6优先识别,!importa ...

  4. 各种字符串Hash函数比较(转)

    常用的字符串Hash函数还有ELFHash,APHash等等,都是十分简单有效的方法.这些函数使用位运算使得每一个字符都对最后的函数值产生影响.另外还有以MD5和SHA1为代表的杂凑函数,这些函数几乎 ...

  5. 制作便携版 FireFox 火狐浏览器

    Firefox是一款可高度自定义的开源浏览器: 你可以访问 火狐DIY 定制自己的Firefox安装包, 此外,你还可以自己动手定制一款可以放在U盘随身携带的便携版Firefox火狐浏览器. 制作便携 ...

  6. Flex Error #2156问题

    出现这个问题是因为应用程序使用了特殊端口,修改端口就可以解决. 特殊端口列表 A security change has been made in Adobe Flash Player 9.0.115 ...

  7. [转载]逐步建设企业DevOps能力

    当软件行业进入互联网时代,市场对软件产品和服务的交付提出了更高的要求:不仅要快速实现需求,而且要快速发布上线,并且必须保证业务可靠.高效运行.为了满足这些要求,IT组织需要强有力的流程.技术和人员作为 ...

  8. js-二维数组和多维数组

    一.二维数组的表示 myarray[][] 二.二维数组的定义 方法一: var a = new Array(); for(var i=0;i<3;i++){ //一维长度为3 a[i] = n ...

  9. office2016 软件全集 官方下载免费完整版(含破解文件)不含垃圾软件 win10完美激活

    office2016官方下载免费完整版是新一代办公软件,office2016官方下载免费完整版已经分享到下面,office2016官方下载免费完整版包括了Word.Excel.PowerPoint.O ...

  10. 关于window.onload,window.onbeforeload与window.onunload

    ★  window.onload  当页面加载完毕的时候执行,即在当前页面进行其他操作之前执行.如,刚进入某个网页的弹窗提示. (  与window.onload相近的可以参考我写的另外一篇记录&qu ...