一、简介

  • 分库:将原本一个数据库中的数据,拆分到多个数据库进行保存,然后我们通过访问一个数据库,在MyCat中成为逻辑库。
  • 分表:如果一个数据表的数据量已经超过千万,那么查询速度会比较慢,这时候可以考虑进行分表操作,将一个表的数据保存到多个表中,这样可以控制单表的数据量。

二、作用

分库分表的作用可以通过下表对比可见:

分库分表作用
  分库分表前 分库分表后
并发情况 MySql单机部署,扛不住高并发需求 MySql从单台机器到多台机器,并发访问效率提高不少
磁盘使用情况 单机磁盘使用几乎爆满 拆分为多个库,每个库的磁盘使用率大大降低
SQL执行性能 单个数据表的数据量太大,查询缓慢 单个数据表数据量减少,查询效率大大提高

三、如何进行分库分表

  • 水平拆分:就是表一张表的数据给弄到多个库的多个表进行保存,但是每个库里面的表结构都是一样的, 只不过每个库表放的数据不同,所有库表的数据加起来就是全部数据。   意义:就是将数据均匀地拆分到更多的库中,然后用多个库来扛更多的并发,还有就是用多个库的存储容量来进行扩容。
水平拆分简单示例:database1: 192.168.1.12   user(id,name,age)
database2: 192.168.1.11   user(id,name,age)两个数据库中的数据表结构都一样,只是根据某种规则,比如按id的范围,如果id在某个范围内就将该条数据保存在database1; 如果在另外一个范围内就保存在database2中。
  • 垂直拆分:就是一个表有很多字段,给拆分到多个表中或者是多个库上去。每个库表的数据表结构都不同,每个库表只包含部分字段。一般来说,会将较少的访问频率比较高的表放到同一张表中,然后将较多的访问频率比较低的字段放到另外一张表中。因为数据库是有缓存的,你访问频率高的字段少,在缓存中存放的行越多,查询性能就越好。
垂直拆分示例:database1 : 192.168.1.12
basic_student_info(id,xm,sfzjh,zzmm,xh) 这个表主要用于保存学生信息经常出现的字段expand_student_info(id,dh,mz,syd) 这个表主要用于保存学生信息中不太常见的字段将一个数据字段比较多的表拆为两个表进行保存,两边数据库表的结构不一致。

四、分库分表方式

  • a. 按range进行:每个库一段连续的数据,一般按时间范围进行拆分,较少用,会产生热点问题,大量的流量都打在最新的数据上。
  • range拆分的好处在于扩容的时候很简单,只需要预备好,给每个月的数据准备一个数据库,到了一个新的月份,自然就保存到别的库上面去了,缺点就是大量的请求,都是访问最新的数据
  • b. 按照某个字段hash一下均匀分散,较常见。
  • hash的好处就是平均分配每个库的数据量和请求压力;缺点就是扩容起来比较麻烦,会有一个数据迁移的难点,之前的数据需要重新计算hash然后分发到不同的数据库或表中。

五、示例

下面通过一个简单的示例说明一下MyCat是如何进行分库分表的。环境信息:

centos7.0
主机: 192.168.1.12、192.168.1.13
mycat:1.6
需要jdk环境变量

这里主要要配置几个文件: schema.xml 、server.xml 、sequence_conf.properties等

【a】编辑server.xml,修改逻辑库的地址(即我们后面配置数据源的时候就只需要连接这个逻辑库即可)

vim server.xml
<user name="root"><property name="password">123456</property><property name="schemas">mycat_order</property><!-- 表级 DML 权限设置 --><!--            <privileges check="false"><schema name="TESTDB" dml="0110" ><table name="tb01" dml="0000"></table><table name="tb02" dml="1111"></table></schema></privileges>           --></user><user name="user"><property name="password">123456</property><property name="schemas">mycat_order</property><property name="readOnly">true</property></user>

这里配置了一个逻辑库mycat_order以及加了两个用户root/123456和user/123456. 这里为了测试范围分片规则,所以server.xml中还需要修改本地序列化规则:

注意:需要修改为0,才能使用本地序列化的值。

【b】创建数据库和表:这里需要在两台服务器1.12和1.11上面都执行。

--t_order 、 t_order_detailCREATE TABLE `t_order` (`order_id` INT(20) NOT NULL COMMENT '订单ID',`user_id` INT(11) DEFAULT NULL COMMENT '用户ID',`pay_mode` TINYINT(4) DEFAULT NULL COMMENT '支付方式',`amount` FLOAT DEFAULT NULL COMMENT '金额',`order_date` DATETIME DEFAULT NULL COMMENT '订单时间',PRIMARY KEY (`order_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8CREATE TABLE `t_order_detail` (`od_id` INT(20) NOT NULL COMMENT '订单详情ID',`order_id` INT(20) DEFAULT NULL COMMENT '订单ID',`goods_id` INT(20) DEFAULT NULL COMMENT '商品ID',`unit_price` FLOAT DEFAULT NULL COMMENT '单价',`qty` INT(11) DEFAULT NULL,PRIMARY KEY (`od_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

登录Mysql:

 mysql -u root -p0905

创建数据库:

create database test_mycat;show database;

use test_mycat;

分别执行上面的两条创建表语句:

订单表:

订单详情表:

show tables;

因为测试mycat分库分表,所以需要在另外一台服务器上面执行上面的创建表语句。

mysql -uroot -p0905show databases;create database test_mycat;use test_mycat;

show tables;

至此,192.168.2.11 和192.168.2.12两台服务器上的数据库和表都一模一样。

【c】编辑schema.xml:配置数据节点datanode、datahost等信息

vim schema.xml
<schema name="mycat_order" checkSQLschema="false" sqlMaxLimit="100"><table name="t_order"  dataNode="dn1,dn2" rule="mod-long"><childTable name="t_order_detail" primaryKey="od_id" joinKey="order_id" parentKey="order_id"></childTable></table></schema><dataNode name="dn1" dataHost="host1" database="test_mycat" /><dataNode name="dn2" dataHost="host2" database="test_mycat" /><dataHost name="host1" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="host1" url="192.168.1.12:3306" user="root"password="0905"></writeHost></dataHost><dataHost name="host2" maxCon="1000" minCon="10" balance="0"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="host2" url="192.168.1.11:3306" user="root"password="0905"></writeHost></dataHost>

【d】编辑rule.xml: 配置根据主表的主键ID 即order_id进行分库分表

vim rule.xml
<tableRule name="mod-long"><rule><columns>order_id</columns><algorithm>mod-long</algorithm></rule></tableRule>

接着继续修改mod-long规则的数据节点个数,因为这里只用到了两个节点(两个数据库服务器)。

 <function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- how many data nodes --><property name="count">2</property></function>

【e】vim sequence_conf.properties : 配置序列化ID

vim sequence_conf.properties
ORDER.HISIDS=
ORDER.MINID=1001
ORDER.MAXID=2000
ORDER.CURID=1000ORDERDETAIL.HISIDS=
ORDERDETAIL.MINID=1001
ORDERDETAIL.MAXID=2000
ORDERDETAIL.CURID=1000

【f】启动MyCat:

cd ./bin/

./mycat startnetstat -ntlp :查看mycat是否启动

【g】测试

mysql -uroot -p123456 -h127.0.0.1 -P8066show databases;可以查看逻辑库的名字:mycat_order

use mycat_order;show tables;

select * from t_order;select * from t_order_detial;

ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0

如果碰到上面的错误,检查一下schema.xml有没有写错,如果没有错再检查一下mysql防火墙有没有开启,重启一下防火墙。(笔者就是在使用sqlyong连接两台服务器上面的mysql时都不成功,重启完防火墙就好了。)

【h】插入数据测试分库分表

INSERT INTO `t_order`(`order_id`,`user_id`,`pay_mode`,`amount`)
VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,101,1,111.1);INSERT INTO `t_order`(`order_id`,`user_id`,`pay_mode`,`amount`)
VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,102,5,222.2);INSERT INTO `t_order`(`order_id`,`user_id`,`pay_mode`,`amount`)
VALUES (NEXT VALUE FOR MYCATSEQ_ORDER,103,7,333.3);
select * from t_order;

【i】vim sequence_conf.properties : 可以看到ORDER.CURID=1003记录了当前序列已经到了1003,说明本地序列配置生效。

vim sequence_conf.properties 

【j】测试订单详情表数据分表情况

插入数据库数据:

INSERT INTO `t_order_detail`(`od_id`,`order_id`,`goods_id`,`unit_price`,`qty`)
VALUES (NEXT VALUE FOR MYCATSEQ_ORDERDETAIL,1003,55,10,20);INSERT INTO `t_order_detail`(`od_id`,`order_id`,`goods_id`,`unit_price`,`qty`)
VALUES (NEXT VALUE FOR MYCATSEQ_ORDERDETAIL,1002,66,20,30);INSERT INTO `t_order_detail` (`od_id`,`order_id`,`goods_id`,`unit_price`,`qty`
)
VALUES(NEXT VALUE FOR MYCATSEQ_ORDERDETAIL,1001,77,30,40) ;

逻辑数据库中的数据分布:

实际物理库中数据分布:

至此,一个比较简单的分库分表示例就完成了,笔者也是周末琢磨了一天才弄出来的,所以做个笔记总结一下,希望能帮到有需要的朋友,后面还会陆续研究其他分片规则。

MyCat分库分表入门示例相关推荐

  1. MyCat分库分表入门

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

  2. 细讲MyCat分库分表策略

    作为服务端模式的典型代表,MyCat不仅提供了丰富的分库分表策略,也提供了非常灵活的读写分离策略,并且其对客户端的侵入性是非常小的.本文主要讲解MyCat主要提供的分库分表策略,并且还会讲解MyCat ...

  3. mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置

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

  4. docker二进制安装mysql_Docker搭建MySQL读写分离主从模式 分布式数据库中间件Mycat分库分表应用...

    一.MySQL读写分离主从模式 1. 下载镜像 docker pull mysql 当前最新版本:mysql Ver 8.0.19 for Linux on x86_64 (MySQL Communi ...

  5. ShardingSphere-Proxy 分库分表 简单示例

    ShardingSphere-Proxy 分库分表 简单示例 简要说明     对一张简单的订单表数据表进行水平分库分表,拆分2个库,每个库16张表并在新结构在演示常见的增删改查操作 环境配置 设置M ...

  6. MySQL单表膨胀优化之MyCat分库分表

    MySQL的单表达到多少量级时性能会下降?宽表在千万量级,窄表要好一点在1200W左右.但是MySQL单表达到1500W时性能开始急剧下降! 事实上MySQL单表可以存储10亿级数据,只是这时候性能比 ...

  7. 利用MyCAT分库分表

    文章目录 MyCAT分库分表 一.分库分表简介 二.垂直切分---分库 1.思想 2.配置实现 三.水平切分 MyCAT分库分表 一.分库分表简介 在业务数据量过多的时候,而且数据不断持续增长的情况下 ...

  8. MyCat分库分表和读写分离

    文章目录 1.MyCat 1.1.MyCat简介 1.2.Mycat对多数据库的支持 1.3.MyCAT架构 1.4.MyCat分库分表 1.5.MyCat下载与安装 1.5.1.下载mycat 1. ...

  9. mycat分库分表与读写分离

    mycat分库分表与读写分离 Dockerfile搭建mycat 1.创建mycat的配置文件 #新建目录 mkdir /docker/mycat#切换目录 cd /docker/mycat#下载my ...

  10. mycat分库分表demo

    关于Mycat,它是一个阿里的开源项目,用来解决分库分表的海量数据存储和查询优化,关于它的简介,可以直接参考介绍:Mycat简介. 下面对自己的demo做个记录: 我之前从192.168.68.3克隆 ...

最新文章

  1. 剖析一个再次调整的seo排名案例
  2. 安卓怎么显示res文件夹中的html_使用Android WebView加载现有的.html文件
  3. ubuntu chmod更改权限
  4. (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  5. java校验参数防止攻击_程序员写接口参数校验,总是太多if else?一招让你避免体力活...
  6. [POJ3233] Matrix Power Series(矩阵快速幂)
  7. python 求解二次规划(quadprog)
  8. java把字符串转为日期_Java程序将字符串转换为日期
  9. 360影视php采集接口,苹果CMS后台联盟采集API接口数据
  10. Android 热点开启流程
  11. PredRNN++: Towards A Resolution of the Deep-in-Time Dilemma in Spatiotemporal Predictive Learning 翻译
  12. 计算机改显存会有啥影响,显卡内存越大越好吗?显存对计算机速度(全文)的影响...
  13. 网站建设中如何打造最优seo优化页面
  14. Rejecting mapping update to [XXx] as the final mapping would have more than 1 type: 报错
  15. 信号与系统——基本概念
  16. 怎么禁用笔记本触摸板
  17. c语言程序表达语句,《C语言程序设计》讲稿.doc
  18. Windows 10 右键 在此处打开 CMD
  19. 一顿饭的时间,教你怎样快速使用 动态代理ip 做一个获取Steam 热销商品 的方法
  20. 效法羲和驭天马,志在长空牧群星

热门文章

  1. php hidden属性,微信小程序关于组件的hidden属性的使用建议
  2. edp协议 netty_EdpProtoDebugger-EdpProtoDebugger(EDP协议调试分析工具)下载 v2.0官方版--pc6下载站...
  3. TSAP(1) : DateTimes
  4. 阿里云云计算 44 云计算常见威胁
  5. 易筋SpringBoot 2.1 | 第六篇:JdbcTemplate访问MySQL
  6. pdf打开时缩放_常用的极速PDF阅读器热门问题解答大全
  7. 理解Visual Studio 解决方案文件格式(.sln)
  8. 数中唯一只出现一次的数字
  9. python函数 range()和arange()
  10. conda常用命令和基础知识整理