数据库垂直拆分,水平拆分利器,cobar升级版mycat
1,关于Mycat
Mycat情报
基于阿里的开源cobar ,可以用于生产系统中,目前在做如下的一些改进:
非阻塞IO的实现,相对于目前的cobar,并发性能大大提升,而且不会陷入假死状态
优化线程池的分配,目前cobar的线程池分配效率不高
修复cobar一些BUG
参考impala中的impala front部分的Java代码,实现高效的Map-Reduce,能够处理上亿的大数据量
实现自动分片特性,目前cobar需要手工分片,并有一定的编程限制
官方网站:
https://github.com/MyCATApache/
好多文档,大多数都是word的,写的非常详细。
https://github.com/MyCATApache/Mycat-doc
Mycat是cobar重新优化开发的版本,和cobar的很多配置都类似。
可以参考之前写的cobar安装:
http://blog.csdn.net/freewebsys/article/details/44022421
2,安装Mycat服务
下载二进制安装文件
https://github.com/MyCATApache/Mycat-download
解压缩到/usr/local/mycat
修改配置文件:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
#数据库名称是TESTDB,sqlMaxLimit设置limit防止错误sql查询大量数据
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
#自动分库规则
<!-- auto sharding by id (long) -->
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
#全局配置表,所有数据均同步到每个数据库。
<!-- global table is auto cloned to all defined data nodes ,so can join
with any table whose sharding node is in the same data node -->
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
<!-- random sharding using mod sharind rule -->
<table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="mod-long" />
<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile" />
#关联子表配置,不太明白
<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
rule="sharding-by-intfile">
<childTable name="orders" primaryKey="ID" joinKey="customer_id"
parentKey="id">
<childTable name="order_items" joinKey="order_id"
parentKey="id" />
</childTable>
<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
parentKey="id" />
</table>
</schema>
#配置多个dataNode,制定dataHost和数据库名称。
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
#配置dataHost的读写分配。同时mysql也要配置好,Master-Slave或Master-Master
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="localhost:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
<!-- <readHost host="hostS1" url="localhost:3306" user="root" password="123456"
/> -->
</writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
</mycat:schema>
wrapper.conf是mycat的配置文件启动参数等
rule.xml 是配置规则xml
还有几个配置文件慢慢研究
创建数据库
CREATE DATABASE db1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE db2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE DATABASE db3 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
服务启动:/bin/mycat start
/bin/mycat这个问题同时可以作为service,拷贝到/etc/init.d/目录下即可。
3,登陆mycat服务和管理端
登陆mycat服务:(端口8066)
# mysql -utest -ptest -h 127.0.0.1 -P8066
Warning: USING a password ON the command line interface can be insecure.
Welcome TO the MySQL monitor. Commands END WITH ; OR \g.
Your MySQL connection id IS 1
Server version: 5.5.8-mycat-1.3 MyCat Server (OpenCloundDB)
Copyright (c) 2000, 2015, Oracle AND/OR its affiliates. ALL rights reserved.
Oracle IS a registered trademark OF Oracle Corporation AND/OR its
affiliates. Other names may be trademarks OF their respective
owners.
TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.
mysql> SHOW DATABASES;
+----------+
| DATABASE |
+----------+
| TESTDB |
+----------+
1 ROW IN SET (0.02 sec)
mysql> USE TESTDB;
Reading TABLE information FOR completion OF TABLE AND COLUMN names
You can turn off this feature TO GET a quicker startup WITH -A
DATABASE changed
mysql> SHOW TABLES;
+------------------+
| TABLES IN TESTDB |
+------------------+
| company |
| customer |
| customer_addr |
| employee |
| goods |
| hotnews |
| orders |
| order_items |
| travelrecord |
+------------------+
9 ROWS IN SET (0.00 sec)
mysql> CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100));
Query OK, 0 ROWS affected (0.05 sec)
mysql> EXPLAIN CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100));
+-----------+---------------------------------------------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------------------------------------------+
| dn1 | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
| dn2 | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
| dn3 | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
+-----------+---------------------------------------------------------------------+
3 ROWS IN SET (0.01 sec)
mysql> INSERT INTO company(id,name) VALUES(1,'hp'); INSERT INTO company(id,name) VALUES(2,'ibm'); INSERT INTO company(id,name) VALUES(3,'oracle');
Query OK, 3 ROWS affected (0.37 sec)
Query OK, 3 ROWS affected (0.01 sec)
Query OK, 3 ROWS affected (0.00 sec)
mysql> SELECT * FROM company ;
+----+--------+
| id | name |
+----+--------+
| 1 | hp |
| 2 | ibm |
| 3 | oracle |
+----+--------+
3 ROWS IN SET (0.01 sec)
使用管理端登陆:(端口9066)
# mysql -utest -ptest -h 127.0.0.1 -P9066
Warning: USING a password ON the command line interface can be insecure.
Welcome TO the MySQL monitor. Commands END WITH ; OR \g.
Your MySQL connection id IS 2
Server version: 5.5.8-mycat-1.3 CobarManager@Alibaba
Copyright (c) 2000, 2015, Oracle AND/OR its affiliates. ALL rights reserved.
Oracle IS a registered trademark OF Oracle Corporation AND/OR its
affiliates. Other names may be trademarks OF their respective
owners.
TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.
mysql> SHOW @@help;
+--------------------------------------+-----------------------------------+
| STATEMENT | DESCRIPTION |
+--------------------------------------+-----------------------------------+
| clear @@slow WHERE datanode = ? | Clear slow SQL BY datanode |
| clear @@slow WHERE schema = ? | Clear slow SQL BY schema |
| KILL @@connection id1,id2,... | KILL the specified connections |
| offline | CHANGE MyCat STATUS TO OFF |
| online | CHANGE MyCat STATUS TO ON |
| reload @@config | Reload ALL config FROM file |
| reload @@route | Reload route config FROM file |
| reload @@USER | Reload USER config FROM file |
| ROLLBACK @@config | ROLLBACK ALL config FROM memory |
| ROLLBACK @@route | ROLLBACK route config FROM memory |
| ROLLBACK @@USER | ROLLBACK USER config FROM memory |
| SHOW @@backend | Report backend connection STATUS |
| SHOW @@cache | Report system cache usage |
| SHOW @@command | Report commands STATUS |
| SHOW @@connection | Report connection STATUS |
| SHOW @@connection.SQL | Report connection SQL |
| SHOW @@DATABASE | Report DATABASES |
| SHOW @@datanode | Report dataNodes |
| SHOW @@datanode WHERE schema = ? | Report dataNodes |
| SHOW @@datasource | Report dataSources |
| SHOW @@datasource WHERE dataNode = ? | Report dataSources |
| SHOW @@heartbeat | Report heartbeat STATUS |
| SHOW @@parser | Report parser STATUS |
| SHOW @@processor | Report processor STATUS |
| SHOW @@router | Report router STATUS |
| SHOW @@server | Report server STATUS |
| SHOW @@SESSION | Report front SESSION details |
| SHOW @@slow WHERE datanode = ? | Report datanode slow SQL |
| SHOW @@slow WHERE schema = ? | Report schema slow SQL |
| SHOW @@SQL WHERE id = ? | Report specify SQL |
| SHOW @@SQL.detail WHERE id = ? | Report EXECUTE detail STATUS |
| SHOW @@SQL.EXECUTE | Report EXECUTE STATUS |
| SHOW @@SQL.slow | Report slow SQL |
| SHOW @@threadpool | Report threadPool STATUS |
| SHOW @@TIME.CURRENT | Report CURRENT TIMESTAMP |
| SHOW @@TIME.startup | Report startup TIMESTAMP |
| SHOW @@version | Report Mycat Server version |
| stop @@heartbeat name:TIME | Pause dataNode heartbeat |
| switch @@datasource name:INDEX | Switch dataSource |
+--------------------------------------+-----------------------------------+
39 ROWS IN SET (0.03 sec)
mysql> SHOW @@backend;
+------------+------+---------+-----------------+------+--------+--------+---------+------+--------+----------+------------+--------+---------+------------+
| processor | id | mysqlId | host | port | l_port | net_in | net_out | life | closed | borrowed | SEND_QUEUE | schema | txlevel | autocommit |
+------------+------+---------+-----------------+------+--------+--------+---------+------+--------+----------+------------+--------+---------+------------+
| Processor0 | 12 | 33 | 127.0.0.1 | 3306 | 42505 | 596 | 501 | 3384 | FALSE | FALSE | 0
.......
17 ROWS IN SET (0.03 sec)
mysql> SHOW @@connection;
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| PROCESSOR | ID | HOST | PORT | LOCAL_PORT | SCHEMA | CHARSET | NET_IN | NET_OUT | ALIVE_TIME(S) | RECV_BUFFER | SEND_QUEUE | txlevel | autocommit |
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
| Processor0 | 2 | 127.0.0.1 | 9066 | 35952 | NULL | utf8 | 156 | 4107 | 40 | 4096 | 0 | NULL | NULL |
| Processor0 | 1 | 127.0.0.1 | 8066 | 16525 | TESTDB | utf8 | 2005 | 5132 | 3461 | 4096 | 0 | 3 | TRUE |
+------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
2 ROWS IN SET (0.02 sec)
mysql> SHOW @@heartbeat;
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP |
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
| hostM1 | mysql | 127.0.0.1 | 3306 | 1 | 0 | idle | 30000 | 0,0,0 | 2015-03-03 14:45:00 | FALSE |
+--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
1 ROW IN SET (0.01 sec)
mysql> SHOW @@datanode;
+------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
+------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
| dn1 | localhost1/db1 | 0 | mysql | 0 | 9 | 50 | 27 | 0 | 0 | 0 | -1 |
| dn2 | localhost1/db2 | 0 | mysql | 0 | 4 | 50 | 26 | 0 | 0 | 0 | -1 |
| dn3 | localhost1/db3 | 0 | mysql | 0 | 3 | 50 | 17 | 0 | 0 | 0 | -1 |
+------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
3 ROWS IN SET (0.01 sec)
mysql> SHOW @@cache;
+-------------------------------------+-------+------+--------+------+------+---------------+---------------+
| CACHE | MAX | CUR | ACCESS | HIT | PUT | LAST_ACCESS | LAST_PUT |
+-------------------------------------+-------+------+--------+------+------+---------------+---------------+
| SQLRouteCache | 10000 | 1 | 8 | 0 | 1 | 1425364473193 | 1425363891040 |
| TableID2DataNodeCache.TESTDB_ORDERS | 50000 | 0 | 0 | 0 | 0 | 0 | 0 |
| ER_SQL2PARENTID | 1000 | 0 | 0 | 0 | 0 | 0 | 0 |
+-------------------------------------+-------+------+--------+------+------+---------------+---------------+
3 ROWS IN SET (0.05 sec)
4,总结
初步安装测试了下mycat组件,还是非常不错的,确实比起cobar有不少的进步。
同时他们开发团队也说了,解决了cobar之前存在的问题。
有了全局表,这样可以使用join了,同时增加读写分离。
规则增加了不少,能满足大部分需求。
和cobar一样,mycat可以直接伪装成一个mysql服务器,对业务进行垂直拆分,水平拆分。平滑的进行数据扩展。
保证在原有系统上进行优化。接下来继续研究mycat,非常好的解决方案。