IT星球论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 149|回复: 0

数据库垂直拆分,水平拆分利器,cobar升级版mycat

[复制链接]

1997

主题

1

好友

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

优秀会员 助人为乐 辛勤工作 技术精英 多才多艺 优秀班竹 灌水天才 星球管理 宣传大使 灌水之王 财富勋章 版主勋章 动漫勋章 勤奋会员 论坛精英 PS高手 心 8 闪游皮肤 双鱼座 8★8➹ 志愿者 乖

发表于 2016-2-18 12:20:26 |显示全部楼层
数据库垂直拆分,水平拆分利器,cobar升级版mycat
数据库垂直拆分,水平拆分利器,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

修改配置文件:
  1. <?xml version="1.0"?>
  2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3. <mycat:schema xmlns:mycat="http://org.opencloudb/">
  4.     #数据库名称是TESTDB,sqlMaxLimit设置limit防止错误sql查询大量数据
  5.     <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
  6.         #自动分库规则
  7.         <!-- auto sharding by id (long) -->
  8.         <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
  9.         #全局配置表,所有数据均同步到每个数据库。
  10.         <!-- global table is auto cloned to all defined data nodes ,so can join
  11.             with any table whose sharding node is in the same data node -->
  12.         <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
  13.         <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />

  14.         <!-- random sharding using mod sharind rule -->
  15.         <table name="hotnews" primaryKey="ID" dataNode="dn1,dn2,dn3" rule="mod-long" />
  16.         <table name="employee" primaryKey="ID" dataNode="dn1,dn2"
  17.             rule="sharding-by-intfile" />
  18.         #关联子表配置,不太明白
  19.         <table name="customer" primaryKey="ID" dataNode="dn1,dn2"
  20.             rule="sharding-by-intfile">
  21.             <childTable name="orders" primaryKey="ID" joinKey="customer_id"
  22.                 parentKey="id">
  23.                 <childTable name="order_items" joinKey="order_id"
  24.                     parentKey="id" />
  25.             </childTable>
  26.             <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
  27.                 parentKey="id" />
  28.         </table>
  29.     </schema>
  30.     #配置多个dataNode,制定dataHost和数据库名称。
  31.     <dataNode name="dn1" dataHost="localhost1" database="db1" />
  32.     <dataNode name="dn2" dataHost="localhost1" database="DB2" />
  33.     <dataNode name="dn3" dataHost="localhost1" database="db3" />
  34.     #配置dataHost的读写分配。同时MySQL也要配置好,Master-Slave或Master-Master
  35.     <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
  36.         writeType="0" dbType="mysql" dbDriver="native">
  37.         <heartbeat>select user()</heartbeat>
  38.         <!-- can have multi write hosts -->
  39.         <writeHost host="hostM1" url="localhost:3306" user="root"
  40.             password="123456">
  41.             <!-- can have multi read hosts -->
  42.             <!-- <readHost host="hostS1" url="localhost:3306" user="root" password="123456"
  43.                 /> -->
  44.         </writeHost>
  45.         <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
  46.     </dataHost>


  47. </mycat:schema>
复制代码
wrapper.conf是mycat的配置文件启动参数等

rule.xml 是配置规则xml

还有几个配置文件慢慢研究

创建数据库
  1. CREATE DATABASE db1 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  2. CREATE DATABASE db2 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
  3. CREATE DATABASE db3 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
复制代码
服务启动:/bin/mycat start

/bin/mycat这个问题同时可以作为service,拷贝到/etc/init.d/目录下即可。


3,登陆mycat服务和管理端

登陆mycat服务:(端口8066)
  1. # mysql -utest -ptest -h 127.0.0.1 -P8066
  2. Warning: USING a password ON the command line interface can be insecure.
  3. Welcome TO the MySQL monitor.  Commands END WITH ; OR \g.
  4. Your MySQL connection id IS 1
  5. Server version: 5.5.8-mycat-1.3 MyCat Server (OpenCloundDB)

  6. Copyright (c) 2000, 2015, Oracle AND/OR its affiliates. ALL rights reserved.

  7. Oracle IS a registered trademark OF Oracle Corporation AND/OR its
  8. affiliates. Other names may be trademarks OF their respective
  9. owners.

  10. TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.

  11. mysql> SHOW DATABASES;
  12. +----------+
  13. | DATABASE |
  14. +----------+
  15. | TESTDB   |
  16. +----------+
  17. 1 ROW IN SET (0.02 sec)

  18. mysql> USE TESTDB;
  19. Reading TABLE information FOR completion OF TABLE AND COLUMN names
  20. You can turn off this feature TO GET a quicker startup WITH -A

  21. DATABASE changed
  22. mysql> SHOW TABLES;
  23. +------------------+
  24. | TABLES IN TESTDB |
  25. +------------------+
  26. | company          |
  27. | customer         |
  28. | customer_addr    |
  29. | employee         |
  30. | goods            |
  31. | hotnews          |
  32. | orders           |
  33. | order_items      |
  34. | travelrecord     |
  35. +------------------+
  36. 9 ROWS IN SET (0.00 sec)

  37. mysql> CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100));
  38. Query OK, 0 ROWS affected (0.05 sec)

  39. mysql> EXPLAIN CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100));
  40. +-----------+---------------------------------------------------------------------+
  41. | DATA_NODE | SQL                                                                 |
  42. +-----------+---------------------------------------------------------------------+
  43. | dn1       | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
  44. | dn2       | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
  45. | dn3       | CREATE TABLE company(id INT NOT NULL PRIMARY KEY,name VARCHAR(100)) |
  46. +-----------+---------------------------------------------------------------------+
  47. 3 ROWS IN SET (0.01 sec)

  48. 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');
  49. Query OK, 3 ROWS affected (0.37 sec)

  50. Query OK, 3 ROWS affected (0.01 sec)

  51. Query OK, 3 ROWS affected (0.00 sec)

  52. mysql> SELECT * FROM company ;
  53. +----+--------+
  54. | id | name   |
  55. +----+--------+
  56. |  1 | hp     |
  57. |  2 | ibm    |
  58. |  3 | oracle |
  59. +----+--------+
  60. 3 ROWS IN SET (0.01 sec)
复制代码
使用管理端登陆:(端口9066)
  1. #  mysql -utest -ptest -h 127.0.0.1 -P9066
  2. Warning: USING a password ON the command line interface can be insecure.
  3. Welcome TO the MySQL monitor.  Commands END WITH ; OR \g.
  4. Your MySQL connection id IS 2
  5. Server version: 5.5.8-mycat-1.3 CobarManager@Alibaba

  6. Copyright (c) 2000, 2015, Oracle AND/OR its affiliates. ALL rights reserved.

  7. Oracle IS a registered trademark OF Oracle Corporation AND/OR its
  8. affiliates. Other names may be trademarks OF their respective
  9. owners.

  10. TYPE 'help;' OR '\h' FOR help. TYPE '\c' TO clear the CURRENT INPUT statement.

  11. mysql> SHOW @@help;
  12. +--------------------------------------+-----------------------------------+
  13. | STATEMENT                            | DESCRIPTION                       |
  14. +--------------------------------------+-----------------------------------+
  15. | clear @@slow WHERE datanode = ?      | Clear slow SQL BY datanode        |
  16. | clear @@slow WHERE schema = ?        | Clear slow SQL BY schema          |
  17. | KILL @@connection id1,id2,...        | KILL the specified connections    |
  18. | offline                              | CHANGE MyCat STATUS TO OFF        |
  19. | online                               | CHANGE MyCat STATUS TO ON         |
  20. | reload @@config                      | Reload ALL config FROM file       |
  21. | reload @@route                       | Reload route config FROM file     |
  22. | reload @@USER                        | Reload USER config FROM file      |
  23. | ROLLBACK @@config                    | ROLLBACK ALL config FROM memory   |
  24. | ROLLBACK @@route                     | ROLLBACK route config FROM memory |
  25. | ROLLBACK @@USER                      | ROLLBACK USER config FROM memory  |
  26. | SHOW @@backend                       | Report backend connection STATUS  |
  27. | SHOW @@cache                         | Report system cache usage         |
  28. | SHOW @@command                       | Report commands STATUS            |
  29. | SHOW @@connection                    | Report connection STATUS          |
  30. | SHOW @@connection.SQL                | Report connection SQL             |
  31. | SHOW @@DATABASE                      | Report DATABASES                  |
  32. | SHOW @@datanode                      | Report dataNodes                  |
  33. | SHOW @@datanode WHERE schema = ?     | Report dataNodes                  |
  34. | SHOW @@datasource                    | Report dataSources                |
  35. | SHOW @@datasource WHERE dataNode = ? | Report dataSources                |
  36. | SHOW @@heartbeat                     | Report heartbeat STATUS           |
  37. | SHOW @@parser                        | Report parser STATUS              |
  38. | SHOW @@processor                     | Report processor STATUS           |
  39. | SHOW @@router                        | Report router STATUS              |
  40. | SHOW @@server                        | Report server STATUS              |
  41. | SHOW @@SESSION                       | Report front SESSION details      |
  42. | SHOW @@slow WHERE datanode = ?       | Report datanode slow SQL          |
  43. | SHOW @@slow WHERE schema = ?         | Report schema slow SQL            |
  44. | SHOW @@SQL WHERE id = ?              | Report specify SQL                |
  45. | SHOW @@SQL.detail WHERE id = ?       | Report EXECUTE detail STATUS      |
  46. | SHOW @@SQL.EXECUTE                   | Report EXECUTE STATUS             |
  47. | SHOW @@SQL.slow                      | Report slow SQL                   |
  48. | SHOW @@threadpool                    | Report threadPool STATUS          |
  49. | SHOW @@TIME.CURRENT                  | Report CURRENT TIMESTAMP          |
  50. | SHOW @@TIME.startup                  | Report startup TIMESTAMP          |
  51. | SHOW @@version                       | Report Mycat Server version       |
  52. | stop @@heartbeat name:TIME           | Pause dataNode heartbeat          |
  53. | switch @@datasource name:INDEX       | Switch dataSource                 |
  54. +--------------------------------------+-----------------------------------+
  55. 39 ROWS IN SET (0.03 sec)

  56. mysql> SHOW @@backend;
  57. +------------+------+---------+-----------------+------+--------+--------+---------+------+--------+----------+------------+--------+---------+------------+
  58. | processor  | id   | mysqlId | host            | port | l_port | net_in | net_out | life | closed | borrowed | SEND_QUEUE | schema | txlevel | autocommit |
  59. +------------+------+---------+-----------------+------+--------+--------+---------+------+--------+----------+------------+--------+---------+------------+
  60. | Processor0 |   12 |      33 | 127.0.0.1 | 3306 |  42505 |    596 |     501 | 3384 | FALSE  | FALSE    |          0
  61. .......

  62. 17 ROWS IN SET (0.03 sec)

  63. mysql> SHOW @@connection;
  64. +------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
  65. | PROCESSOR  | ID   | HOST      | PORT | LOCAL_PORT | SCHEMA | CHARSET | NET_IN | NET_OUT | ALIVE_TIME(S) | RECV_BUFFER | SEND_QUEUE | txlevel | autocommit |
  66. +------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
  67. | Processor0 |    2 | 127.0.0.1 | 9066 |      35952 | NULL   | utf8    |    156 |    4107 |            40 |        4096 |          0 | NULL    | NULL       |
  68. | Processor0 |    1 | 127.0.0.1 | 8066 |      16525 | TESTDB | utf8    |   2005 |    5132 |          3461 |        4096 |          0 | 3       | TRUE       |
  69. +------------+------+-----------+------+------------+--------+---------+--------+---------+---------------+-------------+------------+---------+------------+
  70. 2 ROWS IN SET (0.02 sec)

  71. mysql> SHOW @@heartbeat;
  72. +--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
  73. | NAME   | TYPE  | HOST            | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME    | STOP  |
  74. +--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
  75. | hostM1 | mysql | 127.0.0.1 | 3306 |       1 |     0 | idle   |   30000 | 0,0,0        | 2015-03-03 14:45:00 | FALSE |
  76. +--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+
  77. 1 ROW IN SET (0.01 sec)

  78. mysql> SHOW @@datanode;
  79. +------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
  80. | NAME | DATHOST        | INDEX | TYPE  | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME |
  81. +------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
  82. | dn1  | localhost1/db1 |     0 | mysql |      0 |    9 |   50 |      27 |          0 |        0 |       0 |            -1 |
  83. | dn2  | localhost1/db2 |     0 | mysql |      0 |    4 |   50 |      26 |          0 |        0 |       0 |            -1 |
  84. | dn3  | localhost1/db3 |     0 | mysql |      0 |    3 |   50 |      17 |          0 |        0 |       0 |            -1 |
  85. +------+----------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+
  86. 3 ROWS IN SET (0.01 sec)

  87. mysql> SHOW @@cache;
  88. +-------------------------------------+-------+------+--------+------+------+---------------+---------------+
  89. | CACHE                               | MAX   | CUR  | Access | HIT  | PUT  | LAST_ACCESS   | LAST_PUT      |
  90. +-------------------------------------+-------+------+--------+------+------+---------------+---------------+
  91. | SQLRouteCache                       | 10000 |    1 |      8 |    0 |    1 | 1425364473193 | 1425363891040 |
  92. | TableID2DataNodeCache.TESTDB_ORDERS | 50000 |    0 |      0 |    0 |    0 |             0 |             0 |
  93. | ER_SQL2PARENTID                     |  1000 |    0 |      0 |    0 |    0 |             0 |             0 |
  94. +-------------------------------------+-------+------+--------+------+------+---------------+---------------+
  95. 3 ROWS IN SET (0.05 sec)
复制代码
4,总结

初步安装测试了下mycat组件,还是非常不错的,确实比起cobar有不少的进步。

同时他们开发团队也说了,解决了cobar之前存在的问题。

有了全局表,这样可以使用join了,同时增加读写分离。

规则增加了不少,能满足大部分需求。

和cobar一样,mycat可以直接伪装成一个mysql服务器,对业务进行垂直拆分,水平拆分。平滑的进行数据扩展。

保证在原有系统上进行优化。接下来继续研究mycat,非常好的解决方案。






数据库垂直拆分,水平拆分利器,cobar升级版mycat

该会员没有填写今日想说内容.
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

回顶部