MyCat数据库分片

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/nangeali/article/details/82077982

水平分片

采用横向切割
把商品表分片,存储到三个数据节点上

数据节点
每一个数据节点,就是一个数据库
每一个数据库,就是一个数据节点

一个mysql实例上,可以有多个数据库
数据库版本 : mysql-5.6

节点1、3
ip:192.168.25.134
数据库名 : db1、db3

节点2
ip:192.168.25.166
数据库名 : db2

Mycat安装

可以单独安装一台服务器
也可以安装到某一个节点上
这里,安装到节点1上

配置schema.xml

Schema.xml作为MyCat中重要的配置文件之一
管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource

Schema标签
用于定义MyCat实例中的逻辑库

Table标签
定义了MyCat中的逻辑表

dataNode标签
定义了MyCat中的数据节点
也就是我们通常说所的数据分片

dataHost标签
在mycat逻辑库中也是作为最底层的标签存在
直接定义了具体的数据库实例、读写分离配置和心跳语句

注意

Linux下,mysql默认区分大小写
设置不区分大小写,在MySQL的配置文件中my.ini中添加
lower_case_table_names = 1

配置信息

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">

    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!-- auto sharding by id (long) -->
        <table name="TB_ITEM" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
        <table name="TB_USER" primaryKey="ID" type="global" dataNode="dn1,dn2" />
    </schema>
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost2" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />
    <dataHost name="localhost1" 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="hostM1" url="192.168.25.134:3306" user="root"
            password="root">
            <!-- can have multi read hosts -->

        </writeHost>
    </dataHost>
    <dataHost name="localhost2" 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="hostM1" url="192.168.25.166:3306" user="root"
            password="root">
            <!-- can have multi read hosts -->
        </writeHost>
    </dataHost>
</mycat:schema>

schema,一个数据库
table,一个数据表,存放到三个数据节点
DataNode,一个数据节点,对应一个数据库
dataHost,一个数据节点,对应一个dataHost

配置server.xml

保存mycat需要的系统配置信息
最常用的配置用户名、密码及权限

配置信息

<user name="test">
    <property name="password">test</property>
    <property name="schemas">TESTDB</property>
    <property name="readOnly">true</property>
</user>

配置rule.xml

rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义
可以灵活的对表使用不同的分片算法
或者对表使用相同的算法但具体的参数不同。

这个文件里面主要有tableRule和function这两个标签
在具体使用过程中,可以按照需求添加tableRule和function
这里,此配置文件可以不用修改,使用默认即可

创建表
配置完毕后,重新启动mycat
使用mysql客户端连接mycat,创建表

商品表

DROP TABLE IF EXISTS `tb_item`;
CREATE TABLE `tb_item` (
  `id` bigint(20) NOT NULL COMMENT '商品id,同时也是商品编号',
  `title` varchar(100) NOT NULL COMMENT '商品标题',
  `sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点',
  `price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分',
  `num` int(10) NOT NULL COMMENT '库存数量',
  `barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码',
  `image` varchar(500) DEFAULT NULL COMMENT '商品图片',
  `cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目',
  `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架,3-删除',
  `created` datetime NOT NULL COMMENT '创建时间',
  `updated` datetime NOT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  KEY `cid` (`cid`),
  KEY `status` (`status`),
  KEY `updated` (`updated`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品表';

插入数据

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('1', 'new2 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待', '清仓!仅北京,武汉仓有货!', '29900000', '99999', '', 'http://image.taotao.com/jd/4ef8861cf6854de9889f3db9b24dc371.jpg', '560', '1', '2015-03-08 21:33:18', '2015-04-11 20:38:38');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('5000000', 'new8- 三星 W999 黑色 电信3G手机 双卡双待双通', '下单送12000毫安移动电源!双3.5英寸魔焕炫屏,以非凡视野纵观天下时局,尊崇翻盖设计,张弛中,尽显从容气度!', '1100', '99999', '', 'http://image.taotao.com/jd/d2ac340e728d4c6181e763e772a9944a.jpg', '560', '1', '2015-03-08 21:27:54', '2015-04-12 17:10:43');

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('5000001', '阿尔卡特 (OT-979) 冰川白 联通3G手机', '清仓!仅上海仓有货!', '30900', '99999', null, 'http://image.taotao.com/jd/a69d0d09a1a04164969c2d0369659b1a.jpg', '560', '1', '2015-03-08 21:33:18', '2015-03-08 21:33:18');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('10000000', '阿尔卡特 (OT-927) 单电版 炭黑 联通3G手机 双卡双待', '清仓!仅北京,武汉仓有货!', '24900', '99999', null, 'http://image.taotao.com/jd/9c1fcdf2bf20450788195c707da00a87.jpg', '560', '1', '2015-03-08 21:33:18', '2015-03-08 21:33:18');

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('10000001', '阿尔卡特 (OT-986+) 玫红 AK47 加强版 联通3G手机', '仅上海,广州,沈阳仓有货!预购从速!', '49900', '99999', null, 'http://image.taotao.com/jd/65e2007d41dc4e3cb308833a1a910f8d.jpg', '560', '1', '2015-03-08 21:32:31', '2015-03-08 21:32:31');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('15000000', '阿尔卡特 (OT-986+) 曜石黑 AK47 加强版 联通3G手机', '少量库存,抢完即止!<a  target=\"blank\"  href=\"http://sale.jd.com/act/bxYeI1346g.html?erpad_source=erpad\">“领券更优惠!”</a>', '49900', '99999', null, 'http://image.taotao.com/jd/b3251c85da8e4302b7389f3371dd0a68.jpg', '560', '1', '2015-03-08 21:31:36', '2015-03-08 21:31:36');

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('15000001', '三星 B9120 钛灰色 联通3G手机 双卡双待双通', '下单即送10400毫安移动电源!再赠手机魔法盒!', '439900', '99999', null, 'http://image.taotao.com/jd/c1775819c7e44b1c903f27514e70b998.jpg', '560', '1', '2015-03-08 21:29:27', '2015-03-08 21:29:27');

分片测试

配置的分片规则为“auto-sharding-long”
mycat会根据此规则自动分片

每个datanode中保存一定数量的数据
根据长整型id进行分片

测试结果
Datanode1:1~5000000
Datanode2:5000000~10000000
Datanode3:10000001~15000000

当15000000以上的id插入时报错
[Err] 1064 - can’t find any valid datanode :TB_ITEM -> ID -> 15000001

解决方法
需要添加节点,存储更多的数据

猜你喜欢

转载自blog.csdn.net/nangeali/article/details/82077982