版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/liupeifeng3514/article/details/82797417
需求及环境分析
1、需求
把 tb_item 表分片存储到三个数据节点上。
2、安装环境分析
一台 mycat服务器:
- mycat-server:10.73.150.4
两台 mysql 数据库服务器:
- mysql-server-01:10.73.150.54
- 数据库名 : db1、db3
- mysql-server-02:10.73.150.197
- 数据库名 : db2
一、安装相关的软件
Mysql 的安装请参考:MySql 服务器的安装与配置(解压安装方式)
MyCat的安装请参考:MyCat 之路 | Linux 下的安装配置
二、配置三台服务器的 /etc/hosts 文件
三台服务器的 /etc/hosts 文件保持一致,以其中一台服务器为例:
[root@mycat-server ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.73.150.4 mycat-server
10.73.150.54 mysql-server-01
10.73.150.197 mysql-server-02
三、配置 MyCat 服务器
配置 /usr/local/mycat/conf/schema.xml
[root@mycat-server conf]# vim schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="small" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</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="mysql-server-01:3306" user="root" password="888888">
<!-- 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="mysql-server-02:3306" user="root" password="888888">
<!-- can have multi read hosts -->
</writeHost>
</dataHost>
</mycat:schema>
配置 /usr/local/mycat/conf/server.xml
[root@mycat-server conf]# vim server.xml
<user name="root">
<property name="password">123456</property>
<property name="schemas">small</property>
</user>
四、启动服务器
1、先启动两台 Mysql 服务器
[root@mysql-server-01 bin]# service mysqld start
Starting MySQL... SUCCESS!
[root@mysql-server-01 bin]# service mysqld status
SUCCESS! MySQL running (104755)
2、在启动 MyCat 服务器
[root@mycat-server conf]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
3、查看 MyCat 服务器是否启动成功
tail -500 /usr/local/mycat/logs/mycat.log
注意:若是Linux版本的Mysql,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。
扫描二维码关注公众号,回复: 3273052 查看本文章![]()
在MySQL的配置文件中/etc/my.cnf 的 [mysqld] 中增加一行
lower_case_table_names=1
五、进行测试
1、我们使用 Navicat 连接MyCat服务器
2、创建表
执行如下建表语句,执行之后可以看到数据库 db1,db2,db3 下都创建了 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`)
) COMMENT='商品表';
3、插入数据
执行以下脚本观察一下数据库的变化:
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('536563', '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 ('562379', '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 ('605616', '阿尔卡特 (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 ('635906', '阿尔卡特 (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 ('679532', '阿尔卡特 (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 ('679533', '阿尔卡特 (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 ('691300', '三星 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');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('738388', '三星 Note II (N7100) 云石白 联通3G手机', '经典回顾!超值价格值得拥有。', '169900', '99999', null, 'http://image.taotao.com/jd/089b79cbe19f454dab24cce65f2e9602.jpg', '560', '1', '2015-03-08 21:28:16', '2015-03-08 21:28:16');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('741524', '三星 Note II (N7100) 钛金灰 联通3G手机', '下单赠12000毫安移动电源', '169900', '99999', null, 'http://image.taotao.com/jd/29e1b92dc7e146489ce46a2262479a0f.jpg', '560', '1', '2015-03-08 21:28:30', '2015-03-08 21:28:30');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('816448', '三星 Note II (N7100) 钻石粉 联通3G手机', '经典回顾!超值特惠!', '169900', '99999', null, 'http://image.taotao.com/jd/5a45e88aeca046ec88d7b7ffbc47092a.jpg', '560', '1', '2015-03-08 21:28:44', '2015-03-08 21:28:44');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('816753', '夏普(SHARP)LCD-46DS40A 46英寸 日本原装液晶面板 智能全高清液晶电视', '要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=\"blank\" href=\"http://item.jd.com/1278686.html\">还有升级版安卓智能新机46DS52供您选择!</a>', '379900', '99999', null, 'http://image.taotao.com/jd/2e45ff47f2e7424cb6d95fb9f05151bd.jpg', '76', '1', '2015-03-08 21:27:39', '2015-03-08 21:27:39');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('830972', '飞利浦 老人手机 (X2560) 深情蓝 移动联通2G手机 双卡双待', '赠:九安血压计+8G内存!超长待机,关爱无限,更好用!飞利浦简单健康老人手机!外观圆滑,手感极佳!', '48900', '99999', null, 'http://image.taotao.com/jd/4f1d41baa6c84219a622f20a4f1c32bb.jpg', '560', '1', '2015-03-08 21:28:30', '2015-03-08 21:28:30');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('832739', '中兴 U288 珠光白 移动3G手机', '好评过万!超大彩屏,超大字体,超大按键,超大音量,一键SOS紧急呼叫 !', '19900', '99999', null, 'http://image.taotao.com/jd/4021f8a1ffcc4ae2a313c2012d9f35c8.jpg', '560', '1', '2015-03-08 21:28:44', '2015-03-08 21:28:44');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('844022', '三星 SCH-W899 亮金色 电信3G手机 双卡双待双通', '双3.3英寸魔焕炫屏,CG双网双待,臻尊体验,心系天下!', '299900', '99999', null, 'http://image.taotao.com/jd/e638243d8341474293be09ad157546b8.jpg', '560', '1', '2015-03-08 21:28:01', '2015-03-08 21:28:01');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('847276', '飞利浦 老人手机 (X2560) 喜庆红 移动联通2G手机 双卡双待', '超长待机,关爱无限,更好用!飞利浦简单健康老人手机!外观圆滑,手感极佳!', '48900', '99999', null, 'http://image.taotao.com/jd/657c61e5018043f89d9fe0f9a1519884.jpg', '560', '1', '2015-03-08 21:28:30', '2015-03-08 21:28:30');
再执行以下脚本,观察一下数据库的变化(id 不同):
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('5000000', '夏普(SHARP)LCD-52DS51A 52英寸 日本原装液晶面板 内置WIFI智能全高清液晶电视', '要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=\"blank\" href=\"http://item.jd.com/1278664.html\">还有升级版安卓智能新机52DS52供您选择!</a>', '549900', '99999', null, 'http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg', '76', '1', '2015-03-08 21:27:45', '2015-03-08 21:27:45');
再执行以下脚本,观察一下数据库的变化:
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('5000001', '夏普(SHARP)LCD-52DS51A 52英寸 日本原装液晶面板 内置WIFI智能全高清液晶电视', '要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=\"blank\" href=\"http://item.jd.com/1278664.html\">还有升级版安卓智能新机52DS52供您选择!</a>', '549900', '99999', null, 'http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg', '76', '1', '2015-03-08 21:27:45', '2015-03-08 21:27:45');
再执行以下脚本,观察一下数据库的变化:
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('10000000', '夏普(SHARP)LCD-52DS51A 52英寸 日本原装液晶面板 内置WIFI智能全高清液晶电视', '要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=\"blank\" href=\"http://item.jd.com/1278664.html\">还有升级版安卓智能新机52DS52供您选择!</a>', '549900', '99999', null, 'http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg', '76', '1', '2015-03-08 21:27:45', '2015-03-08 21:27:45');
再执行以下脚本,观察一下数据库的变化:
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('10000001', '夏普(SHARP)LCD-52DS51A 52英寸 日本原装液晶面板 内置WIFI智能全高清液晶电视', '要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=\"blank\" href=\"http://item.jd.com/1278664.html\">还有升级版安卓智能新机52DS52供您选择!</a>', '549900', '99999', null, 'http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg', '76', '1', '2015-03-08 21:27:45', '2015-03-08 21:27:45');
再执行以下脚本,观察一下数据库的变化:
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('15000000', '夏普(SHARP)LCD-52DS51A 52英寸 日本原装液晶面板 内置WIFI智能全高清液晶电视', '要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=\"blank\" href=\"http://item.jd.com/1278664.html\">还有升级版安卓智能新机52DS52供您选择!</a>', '549900', '99999', null, 'http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg', '76', '1', '2015-03-08 21:27:45', '2015-03-08 21:27:45');
再执行以下脚本,观察一下数据库的变化:
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('15000001', '夏普(SHARP)LCD-52DS51A 52英寸 日本原装液晶面板 内置WIFI智能全高清液晶电视', '要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=\"blank\" href=\"http://item.jd.com/1278664.html\">还有升级版安卓智能新机52DS52供您选择!</a>', '549900', '99999', null, 'http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg', '76', '1', '2015-03-08 21:27:45', '2015-03-08 21:27:45');
发现执行最后一条语句的时候发生了错误。
由于配置的分片规则为“auto-sharding-long”,所以mycat会根据此规则自动分片。每个datanode中保存一定数量的数据。根据id进行分片,经测试id范围为:
- Datanode1:1~5000000
- Datanode2:5000000~10000000
- Datanode3:10000001~15000000
当15000000以上的id插入时报错:
[Err] 1064 - can't find any valid datanode :TB_ITEM -> ID -> 15000001
此时需要添加节点了。
附、配置过程中的问题
查看启动成功的另一种方式
# 一前端控制体的方式启动,日志会打印在窗口上
[root@mycat-server conf]# /usr/local/mycat/bin/mycat console
可以看到如下启动成功的信息: