背景
阿里开源的一个数据库中间件,专门为大数据量的项目做分库分表用的。有如下特点:
一个彻底开源的,面向企业应用开发的大数据库集群
支持事务、ACID、可以替代MySQL的加强版数据库
一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
一个新颖的数据库中间件产品
官网地址: http://www.mycat.org.cn/
mycat权威指南: http://www.mycat.org.cn/document/mycat-definitive-guide.pdf
mycat架构
话不多说,一张mycat架构图就能让你知道mycat的角色以及作用。
mycat1.6版本架构如下:
由图可知,mycat位于数据库和应用层(APP)之间,它的角色就是帮我们管理数据库集群,而提供应用统一访问数据库接口。
垂直分库
垂直分库通俗来说就是按照功能划分,将不同的数据放在不同的数据库中。
水平分表
水平分表通俗来说就是某表数据量太大了,那么我们很自然地想到是加多一个表来存储数据,这样查询速度才会更快。那么水平分表就是表结构是一样的,只不过存的数据不一样而已。
逻辑库和逻辑表
逻辑库:通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。
逻辑表:分布式数据库中,对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分片库中,也可以不做数据切分,不分片,只有一个表构成。
mycat基本配置
当我们数据量特别大的时候需要分库分表的时候,那么我们可以考虑使用mycat。那么mycat具体如何做到分库分表的呢?接下来就要学习mycat的三大配置文件进行灵活配置就可以实现分库分表啦啦啦。。。
mycat主要的三大配置文件: server.xml、schema.xml、rule.xml
这三个配置文件位于mycat的安装目录的conf目录中。
server.xml
该文件几乎包含了所有 mycat 需要的系统配置信息。其中包括对外(应用)访问端口,编码,连接超时时间,最大连接数,事务级别,用户密码以及逻辑库等信息。
详细可以阅读下面的配置:
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
| <!DOCTYPE mycat:server SYSTEM "server.dtd"> <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="serverPort">8066</property> <property name="managerPort">9066</property> <property name="nonePasswordLogin">0</property> <property name="bindIp">0.0.0.0</property> <property name="frontWriteQueueSize">2048</property> <property name="charset">utf8</property> <property name="txIsolation">2</property> <property name="processors">8</property> <property name="idleTimeout">1800000</property> <property name="useSqlStat">0</property> <property name="useGlobleTableCheck">0</property> <property name="sqlExecuteTimeout">300</property> <property name="sequnceHandlerType">1</property> <property name="defaultMaxLimit">100</property> <property name="maxPacketSize">104857600</property> </system> <user name="root"> <property name="password">123456</property>
<property name="schemas">shop_db</property> </user> </mycat:server>
|
更多关于server.xml的配置可参考以下文章:
http://suo.im/6lJTHF http://suo.im/6lJTK5 http://suo.im/6613kS
schema.xml
作为MyCat中重要的配置文件之一,它主要管理着MyCat的逻辑库、表、分片规则、DataNode以及DataHost。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。
标签解析:
更多详细可以参考配置文件说明:
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 40 41 42 43 44 45 46 47 48
| <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="shop_db" checkSQLschema="false" sqlMaxLimit="100"> <table name="region_info" dataNode="orddb,custdb,prodb" primaryKey="region_id" type="global"/> <table name="order_cart" dataNode="orddb" primaryKey="cart_id"/> <table name="order_customer_addr" dataNode="orddb" primaryKey="customer_addr_id"/> <table name="order_detail" dataNode="orddb" primaryKey="order_detail_id"/> <table name="order_master" dataNode="orddb01,orddb02,orddb03,orddb04" rule="order_master" primaryKey="order_id" autoIncrement="true"/> <table name="customer_balance_log" dataNode="custdb" primaryKey="balance_id"/> <table name="customer_inf" dataNode="custdb" primaryKey="customer_inf_id"/> <table name="customer_level_inf" dataNode="custdb" primaryKey="customer_level"/> <table name="customer_login" dataNode="custdb" primaryKey="customer_id"/> <table name="customer_login_log" dataNode="custdb" primaryKey="login_id"/> <table name="customer_point_log" dataNode="custdb" primaryKey="point_id"/> <table name="product_brand_info" dataNode="prodb" primaryKey="brand_id"/> <table name="product_category" dataNode="prodb" primaryKey="category_id"/> <table name="product_comment" dataNode="prodb" primaryKey="comment_id"/> <table name="product_info" dataNode="prodb" primaryKey="product_id"/> <table name="product_supplier_info" dataNode="prodb" primaryKey="supplier_id"/> </schema> <dataNode name="orddb" dataHost="mysql10" database="order_db"/> <dataNode name="custdb" dataHost="mysql11" database="customer_db"/> <dataNode name="prodb" dataHost="mysql12" database="product_db"/> <dataNode name="orddb01" dataHost="mysql10" database="orddb01"/> <dataNode name="orddb02" dataHost="mysql10" database="orddb02"/> <dataNode name="orddb03" dataHost="mysql11" database="orddb01"/> <dataNode name="orddb04" dataHost="mysql12" database="orddb01"/> <dataNode name="mycat" dataHost="mysql10" database="mycat"/>
<dataHost balance="3" maxCon="1000" minCon="10" name="mysql10" writeType="0" switchType="1" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="192.168.56.10" url="192.168.56.10:3306" password="123456" user="im_mycat"/> </dataHost> <dataHost balance="3" maxCon="1000" minCon="10" name="mysql11" writeType="0" switchType="1" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="192.168.56.11" url="192.168.56.11:3306" password="123456" user="im_mycat"/> </dataHost> <dataHost balance="3" maxCon="1000" minCon="10" name="mysql12" writeType="0" switchType="1" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="192.168.56.12" url="192.168.56.12:3306" password="123456" user="im_mycat"/> </dataHost> </mycat:schema>
|
关于更多ER图关系配置和其他参数意义。可参考以下文件或者《mycat权威指南》
rule.xml
它的功能主要体现在以下两个方面:
1、配置水平分片的分片规则
2、配置分片规则所对应的分片函数
1 2 3 4 5 6 7 8 9 10 11 12
| <!DOCTYPE mycat:rule SYSTEM "rule.dtd"> <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="order_master"> <rule> <columns>customer_id</columns> <algorithm>mod-long</algorithm> </rule> </tableRule> <function name="mod-long" class="io.mycat.route.function.PartitionByMod"> <property name="count">4</property> </function> </mycat:rule>
|
其中的function的name必须是唯一的,以上就是hash取模4的分片算法。
常见的分片算法:
- 简单取模-PartitionByMod
- 哈希取模-PartitionByHashMod
- 分片枚举-PartitionByFileMap
- 字符串范围取模分片
参考
声明
本文属于转载:原文(一篇秒懂mycat)