一、整体架构

1、192.168.189.130:mysql master服务,两个数据库db_store、db_user,db_store做了主从复制

  db_user:

    用户表users为分片表

    数据字典表data_dictionary为全局表

    用户地址表user_address为ER表和用户表有关联

  db_store(做了主从复制):

    门店表store、店员表employee为非分片表,就是mysql中普通的表

2、192.168.189.131:mysql slave服务,两个数据库db_store、db_user,db_store做了主从复制

   同192.168.189.130

3、192.168.189.132:mycat服务

  db_user:逻辑库

    users、data_dictionary、user_address逻辑表

  db_store:逻辑库

    store、employee逻辑表

二、mycat配置 /root/data/program/mycat/conf

1、schema.xml

  1. <?xml version="1.0"?>
  2. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  3. <mycat:schema xmlns:mycat="http://io.mycat/">
  4.  
  5. <schema name="db_store" checkSQLschema="false" sqlMaxLimit="100">
  6. <table name="store" dataNode="db_store_dataNode" primaryKey="storeID"/>
  7. <table name="employee" dataNode="db_store_dataNode" primaryKey="employeeID"/>
  8. </schema>
  9.  
  10. <schema name="db_user" checkSQLschema="false" sqlMaxLimit="100">
  11. <table name="data_dictionary" type="global" dataNode="db_user_dataNode1,db_user_dataNode2" primaryKey="dataDictionaryID"/>
  12. <table name="users" dataNode="db_user_dataNode$1-2" rule="mod-userID-long" primaryKey="userID">
  13. <childTable name="user_address" joinKey="userID" parentKey="userID" primaryKey="addressID"/>
  14. </table>
  15. </schema>
  16.  
  17. <!-- 节点配置 -->
  18. <!-- db_store -->
  19. <dataNode name="db_store_dataNode" dataHost="db_storeHOST" database="db_store" />
  20.  
  21. <!-- db_user -->
  22. <dataNode name="db_user_dataNode1" dataHost="db_userHOST1" database="db_user" />
  23. <dataNode name="db_user_dataNode2" dataHost="db_userHOST2" database="db_user" />
  24.  
  25. <!-- 节点主机配置 -->
  26. <!-- 配置db_store的节点主机 -->
  27. <dataHost name="db_storeHOST" maxCon="1000" minCon="10" balance="1"
  28. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  29. <heartbeat>select user()</heartbeat>
  30. <!-- can have multi write hosts -->
  31. <writeHost host="hostM1" url="192.168.189.130:3306" user="root" password="123456">
  32. <!-- can have multi read hosts -->
  33. <readHost host="hostS1" url="192.168.189.131:3306" user="root" password="123456" />
  34.  
  35. </writeHost>
  36.  
  37. </dataHost>
  38.  
  39. <!-- 配置db_user的节点主机 -->
  40. <dataHost name="db_userHOST1" maxCon="1000" minCon="10" balance="0"
  41. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  42. <heartbeat>select user()</heartbeat>
  43. <writeHost host="userHost1" url="192.168.189.130:3306" user="root" password="123456">
  44. </writeHost>
  45. </dataHost>
  46.  
  47. <dataHost name="db_userHOST2" maxCon="1000" minCon="10" balance="0"
  48. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  49. <heartbeat>select user()</heartbeat>
  50. <!-- can have multi write hosts -->
  51. <writeHost host="userHost2" url="192.168.189.131:3306" user="root" password="123456">
  52. </writeHost>
  53. </dataHost>
  54.  
  55. </mycat:schema>

2、server.xml配置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- - - Licensed under the Apache License, Version 2.0 (the "License");
  3. - you may not use this file except in compliance with the License. - You
  4. may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
  5. - - Unless required by applicable law or agreed to in writing, software -
  6. distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
  7. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
  8. License for the specific language governing permissions and - limitations
  9. under the License. -->
  10. <!DOCTYPE mycat:server SYSTEM "server.dtd">
  11. <mycat:server xmlns:mycat="http://io.mycat/">
  12. <system>
  13. <property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
  14. <property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
  15.  
  16. <property name="sequnceHandlerType">2</property>
  17. <!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
  18. <!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
  19. <!-- <property name="processorBufferChunk">40960</property> -->
  20. <!--
  21. <property name="processors">1</property>
  22. <property name="processorExecutor">32</property>
  23. -->
  24. <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
  25. <property name="processorBufferPoolType">0</property>
  26. <!--默认是65535 64K 用于sql解析时最大文本长度 -->
  27. <!--<property name="maxStringLiteralLength">65535</property>-->
  28. <!--<property name="sequnceHandlerType">0</property>-->
  29. <!--<property name="backSocketNoDelay">1</property>-->
  30. <!--<property name="frontSocketNoDelay">1</property>-->
  31. <!--<property name="processorExecutor">16</property>-->
  32. <!--
  33. <property name="serverPort">8066</property> <property name="managerPort">9066</property>
  34. <property name="idleTimeout">300000</property> <property name="bindIp">0.0.0.0</property>
  35. <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> -->
  36. <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
  37. <property name="handleDistributedTransactions">0</property>
  38.  
  39. <!--
  40. off heap for merge/order/group/limit 1开启 0关闭
  41. -->
  42. <property name="useOffHeapForMerge">1</property>
  43.  
  44. <!--
  45. 单位为m
  46. -->
  47. <property name="memoryPageSize">1m</property>
  48.  
  49. <!--
  50. 单位为k
  51. -->
  52. <property name="spillsFileBufferSize">1k</property>
  53.  
  54. <property name="useStreamOutput">0</property>
  55.  
  56. <!--
  57. 单位为m
  58. -->
  59. <property name="systemReserveMemorySize">384m</property>
  60.  
  61. <!--是否采用zookeeper协调切换 -->
  62. <property name="useZKSwitch">true</property>
  63.  
  64. </system>
  65.  
  66. <!-- 全局SQL防火墙设置 -->
  67. <!--
  68. <firewall>
  69. <whitehost>
  70. <host host="127.0.0.1" user="mycat"/>
  71. <host host="127.0.0.2" user="mycat"/>
  72. </whitehost>
  73. <blacklist check="false">
  74. </blacklist>
  75. </firewall>
  76. -->
  77.  
  78. <user name="root">
  79. <property name="password">123456</property>
  80. <property name="schemas">db_store,db_user</property>
  81.  
  82. <!-- 表级 DML 权限设置 -->
  83. <!--
  84. <privileges check="false">
  85. <schema name="TESTDB" dml="0110" >
  86. <table name="tb01" dml="0000"></table>
  87. <table name="tb02" dml="1111"></table>
  88. </schema>
  89. </privileges>
  90. -->
  91. </user>
  92.  
  93. </mycat:server>

3、rule.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- - - Licensed under the Apache License, Version 2.0 (the "License");
  3. - you may not use this file except in compliance with the License. - You
  4. may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
  5. - - Unless required by applicable law or agreed to in writing, software -
  6. distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
  7. WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
  8. License for the specific language governing permissions and - limitations
  9. under the License. -->
  10. <!DOCTYPE mycat:rule SYSTEM "rule.dtd">
  11. <mycat:rule xmlns:mycat="http://io.mycat/">
  12. <tableRule name="rule1">
  13. <rule>
  14. <columns>id</columns>
  15. <algorithm>func1</algorithm>
  16. </rule>
  17. </tableRule>
  18.  
  19. <tableRule name="rule2">
  20. <rule>
  21. <columns>user_id</columns>
  22. <algorithm>func1</algorithm>
  23. </rule>
  24. </tableRule>
  25.  
  26. <tableRule name="sharding-by-intfile">
  27. <rule>
  28. <columns>sharding_id</columns>
  29. <algorithm>hash-int</algorithm>
  30. </rule>
  31. </tableRule>
  32. <tableRule name="auto-sharding-long">
  33. <rule>
  34. <columns>id</columns>
  35. <algorithm>rang-long</algorithm>
  36. </rule>
  37. </tableRule>
  38. <tableRule name="mod-long">
  39. <rule>
  40. <columns>id</columns>
  41. <algorithm>mod-long</algorithm>
  42. </rule>
  43. </tableRule>
  44.  
  45. <tableRule name="mod-userID-long">
  46. <rule>
  47. <columns>userID</columns>
  48. <algorithm>mod-long</algorithm>
  49. </rule>
  50. </tableRule>
  51.  
  52. <tableRule name="sharding-by-murmur">
  53. <rule>
  54. <columns>id</columns>
  55. <algorithm>murmur</algorithm>
  56. </rule>
  57. </tableRule>
  58. <tableRule name="crc32slot">
  59. <rule>
  60. <columns>id</columns>
  61. <algorithm>crc32slot</algorithm>
  62. </rule>
  63. </tableRule>
  64. <tableRule name="sharding-by-month">
  65. <rule>
  66. <columns>create_time</columns>
  67. <algorithm>partbymonth</algorithm>
  68. </rule>
  69. </tableRule>
  70. <tableRule name="latest-month-calldate">
  71. <rule>
  72. <columns>calldate</columns>
  73. <algorithm>latestMonth</algorithm>
  74. </rule>
  75. </tableRule>
  76.  
  77. <tableRule name="auto-sharding-rang-mod">
  78. <rule>
  79. <columns>id</columns>
  80. <algorithm>rang-mod</algorithm>
  81. </rule>
  82. </tableRule>
  83.  
  84. <tableRule name="jch">
  85. <rule>
  86. <columns>id</columns>
  87. <algorithm>jump-consistent-hash</algorithm>
  88. </rule>
  89. </tableRule>
  90.  
  91. <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
  92. <!-- how many data nodes -->
  93. <property name="count">2</property>
  94. </function>
  95.  
  96. <function name="murmur"
  97. class="io.mycat.route.function.PartitionByMurmurHash">
  98. <property name="seed">0</property><!-- 默认是0 -->
  99. <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
  100. <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
  101. <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 -->
  102. <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
  103. 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 -->
  104. </function>
  105.  
  106. <function name="crc32slot"
  107. class="io.mycat.route.function.PartitionByCRC32PreSlot">
  108. <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
  109. </function>
  110. <function name="hash-int"
  111. class="io.mycat.route.function.PartitionByFileMap">
  112. <property name="mapFile">partition-hash-int.txt</property>
  113. </function>
  114. <function name="rang-long"
  115. class="io.mycat.route.function.AutoPartitionByLong">
  116. <property name="mapFile">autopartition-long.txt</property>
  117. </function>
  118.  
  119. <function name="func1" class="io.mycat.route.function.PartitionByLong">
  120. <property name="partitionCount">8</property>
  121. <property name="partitionLength">128</property>
  122. </function>
  123. <function name="latestMonth"
  124. class="io.mycat.route.function.LatestMonthPartion">
  125. <property name="splitOneDay">24</property>
  126. </function>
  127. <function name="partbymonth"
  128. class="io.mycat.route.function.PartitionByMonth">
  129. <property name="dateFormat">yyyy-MM-dd</property>
  130. <property name="sBeginDate">2015-01-01</property>
  131. </function>
  132.  
  133. <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">
  134. <property name="mapFile">partition-range-mod.txt</property>
  135. </function>
  136.  
  137. <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">
  138. <property name="totalBuckets">3</property>
  139. </function>
  140. </mycat:rule>

三、效果

1、db_user库users表

往mycat逻辑库db_user的逻辑表users插入数据,根据分片规则,userID取模,最后数据分别存在master  db_user users和slave db_user users中

分片规则:

  1. schema.xml:
  2. <schema name="db_user" checkSQLschema="false" sqlMaxLimit="100">
  3. <table name="data_dictionary" type="global" dataNode="db_user_dataNode1,db_user_dataNode2" primaryKey="dataDictionaryID"/>
  4. <table name="users" dataNode="db_user_dataNode$1-2" rule="mod-userID-long" primaryKey="userID">
  5. <childTable name="user_address" joinKey="userID" parentKey="userID" primaryKey="addressID"/>
  6. </table>
  7. </schema>
  8.  
  9. rule.xml
  10. <tableRule name="mod-userID-long">
  11. <rule>
  12. <columns>userID</columns>
  13. <algorithm>mod-long</algorithm>
  14. </rule>
  15. </tableRule>
  16.  
  17. <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
  18. <!-- how many data nodes -->
  19. <property name="count">2</property>
  20. </function>

1、mycat逻辑库db_user中逻辑表users

2、master服务db_user库中users表

3、slave服务db_user库中users表

2、db_user库data_dictionary表

数据字典表(data_dictionary)是全局表因此master、slave都会保存完整数据

1、mycat

2、master

3、slave

3、db_user库user_address表

用户地址表(user_address)是ER表,master、slave分别保存各自users对应的地址

1、mycat

2、master

3、slave

MYCAT分库分表的更多相关文章

  1. MySQL+MyCat分库分表 读写分离配置

    一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件.运行在代码应用和MySQL数据库之间的应用. 前身 : cor ...

  2. 《MyCat分库分表策略详解》

    在我们的项目发展到一定阶段之后,随着数据量的增大,分库分表就变成了一件非常自然的事情.常见的分库分表方式有两种:客户端模式和服务器模式,这两种的典型代表有sharding-jdbc和MyCat.所谓的 ...

  3. MyCat | 分库分表实践

    引言 先给大家介绍2个概念:数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式. 切分模式 一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之 ...

  4. mycat 分库分表

    单库分表已经在上篇写过了,这次写个分库分表,不同在于配置文件上的一点点不同 <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> &l ...

  5. MyCat分库分表入门

    1.分区 对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后 ...

  6. 3.Mysql集群------Mycat分库分表

    前言: 分库分表,在本节里是水平切分,就是多个数据库里包含的表是一模一样的. 只是把字段散列的分到不同的库中. 实践: 1.修改schema.xml 这里是在同一台服务器上建立了4个数据库db1,db ...

  7. 分布式数据库中间件 MyCat | 分库分表实践

    MyCat 简介 MyCat 是一个功能强大的分布式数据库中间件,是一个实现了 MySQL 协议的 Server,前端人员可以把它看做是一个数据库代理中间件,用 MySQL 客户端工具和命令行访问:而 ...

  8. Mycat分库分表(一)

    随着业务变得越来越复杂,用户越来越多,集中式的架构性能会出现巨大的问题,比如系统会越来越慢,而且时不时会宕机,所以必须要解决高性能和可用性的问题.这个时候数据库的优化就显得尤为重要,在说优化方案前,先 ...

  9. mycat分库分表 看这一篇就够了

    ​ 之前我们已经讲解过了数据的切分,主要有两种方式,分别是垂直切分和水平切分,所谓的垂直切分就是将不同的表分布在不同的数据库实例中,而水平切分指的是将一张表的数据按照不同的切分规则切分在不同实例的相同 ...

随机推荐

  1. Tomcat & Servlet

    javaWeb javaWeb是指使用java技术实现所有web程序的技术的总称.我们称之为javaWeb. 1.请求和响应(成对出现) 2.Web资源的分类 web资源分为两大类,分别是静态资源和动 ...

  2. 【转】STM32和ARM的区别

    转自:http://www.cnblogs.com/nuc-boy/archive/2012/09/11/2680157.html 这个问题大概2009年的时候很多人就在问,请看09年的时候大家给出的 ...

  3. Mock.js的简易使用

    一:安装 npm install mockjs --save-dev 二:引入 在src目录下创建mock.js文件,输入以下代码: // 引入mockjs const Mock = require( ...

  4. ajax 异步请求 代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. Ajax进阶 FormData对象

    Ajax基础:http://www.cnblogs.com/-beyond/p/7919369.html xhr 2.0及FormData介绍 FormData对象 其实和 XMLHttpReques ...

  6. 【Mysql】—— 索引的分类

    注意:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引.MyISAM和InnoDB存储引擎:只支持BTREE索引,也就是说默认使用BTREE,不能够更换.MEMORY/HEAP存储引 ...

  7. BZOJ1827[USACO 2010 Mar Gold 1.Great Cow Gathering]——树形DP

    题目描述 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场 ...

  8. xml和对象 转换

    //测试数据 static List<User> list = new List<User>() { new User(){id=1001 ,name="语文&quo ...

  9. Java 8新特性之 并行和并行数组(八恶人-8)

    Jody Domingre 多莫歌·乔迪 “How you doing, dummy?” 你还好吗,傻瓜 一.基本介绍 Java8不仅增加了Stream,而且还增加了parallelStream(并行 ...

  10. bzoj 2599: [IOI2011]Race (点分治 本地过了就是过了.jpg)

    题面:(复制别人的...) Description 给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小. Input 第一行 两个整数 n, k第二..n行 每行三个整数 表示一条无向边的 ...