学习淘淘商城第一百零七课(Mycat的数据库分片)

一:需求

        把商品表分片存储在三个数据节点上

二:环境

        mysql节点1环境

        操作系统版本:centos6.8

        数据库版本:mysql-5.6

        mycat版本:1.4 release

        数据库名:db1、db3

        ip:192.168.156.41


         mysql节点2环境

         操作系统版本:centos6.8

         数据库版本:mysql-5.6

         mycat版本:1.4 release

          数据库名:db2

          ip:192.168.156.42


          Mycat安装到节点1上(需要安装jdk)

三:配置schema.xml文件

         3.1 schema.xml介绍

         schema.xml作为MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource。弄懂这些配置,是正确使用MyCat的前提。这里就一层层对该文件进行解析。
        schema 标签用于定义MyCat实例中的逻辑库(也就是说一个schema就是一个数据库连接)
        Table 标签定义了MyCat中的逻辑表
        dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。
        dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。

注意:若是LINUX版本的MYSQL,则需要设置为Mysql大小写不敏感,否则可能会发生表找不到的问题。另外,据我测试,使用mycat来建表的话,会乱码,要解决乱码问题就需要
设置一下数据库的编码格式。
在MySQL的配置文件中/etc/my.cnf中 [mysqld]下方增加两行,注意要给所有参与分片的linux系统的mysql都添加如下配置,配置好之后,重启mysql。
  lower_case_table_names = 1
    character_set_server=utf8

        重启mysql如下。

[root@mysql-server ~]# service mysqld restart
停止 mysqld:                                              [确定]
正在启动 mysqld:                                          [确定]
[root@mysql-server ~]#       

       为了方便操作schema.xml文件,我们可以用NodePad++来编辑schema.xml文件,大家可以参考:http://blog.csdn.net/u012453843/article/details/52987666这篇博客进行学习。

        schema.xml文件的内容如下图所示。

          schema.xml文件内容如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
        <!--一个schema就是一个数据库连接,一个连接可以有多个数据库-->
	<schema name="taotao" 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="localhost1" database="db3" />
	<dataNode name="dn3" dataHost="localhost2" database="db2" />
	<!--一个dataHost代表一个数据源-->
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<!--检测数据库是否可用-->
		<heartbeat>select user()</heartbeat>
		<!-- 在这里可以指定多个数据库,localhost表示mycat所在的数据库-->
		<writeHost host="hostM1" url="localhost:3306" user="root"
			password="root">
		</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>
		<!-- 在这里可以指定多个数据库,localhost表示mycat所在的数据库-->
		<writeHost host="hostM1" url="192.168.156.42:3306" user="root"
			password="root">
		</writeHost>
	</dataHost>
</mycat:schema>
         我们要进行分片的表是tb_item,如下图所示。

      配置好了schema.xml,我们还需要配置user信息,在server.xml文件中进行配置,如下图所示。

  

           修改的代码如下:两个用户都可以登录,只是权限不一样而已。

<!--taotao这个用户可读可写数据库-->
	<user name="taotao">
		<property name="password">root</property>
		<property name="schemas">taotao</property>
	</user>
    <!--user这个用户,只可读数据库-->
	<user name="user">
		<property name="password">user</property>
		<property name="schemas">taotao</property>
		<property name="readOnly">true</property>
	</user>
          下面我们启动mycat,启动后查看是否正常启动,如下所示。

[root@taotao-mysql mycat]# bin/mycat start
Starting Mycat-server...
[root@taotao-mysql mycat]# bin/mycat status
Mycat-server is running (1875).
[root@taotao-mysql mycat]# 
        下面我们便来连接mycat,如下图所示,需要注意的是,mycat的默认端口是8066,用户名和密码我们就用server.xml文件中配置的那个可读可写的用户名和密码。先进行连接测试,弹出对话框"连接成功"表明连接没问题,我们再点击"确定"。


        下面我们便在mycat这个数据库中新建tb_item这张表,建表语句如下:

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='商品表';
        在mycat数据库中建完表后,我们便可以到192.168.156.41和192.168.156.42这两台服务器的mysql数据库中去查看是否也生成同样的表,如下图所示,可以看到mycat所在的服务器(192.168.156.41)上的mysql中db1和db3这两个数据库中都有tb_item这张表,另一台服务器192.168.156.42上的db2数据库也有这张表。


       下面我们向mycat数据库中的tb_item表中添加20条商品记录,如下图所示。

          sql语句如下:

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');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('847278', '飞利浦 老人手机 (X2560) 硬朗黑 移动联通2G手机 双卡双待', '超长待机,关爱无限,更好用!飞利浦简单健康老人手机!外观圆滑,手感极佳!', '46900', '99999', null, 'http://image.taotao.com/jd/306b2287ce1c4b3bb541f37984d67929.jpg', '560', '1', '2015-03-08 21:28:09', '2015-03-08 21:28:09');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('855739', '三星 Galaxy S4 (I9500)16G版 皓月白 联通3G手机', '三星经典旗舰机!5英寸1080P高清屏+1300万像素主摄像头!', '188800', '99999', null, 'http://image.taotao.com/jd/c687f304b5164b1b84736b9a4d34a37c.jpg', '560', '1', '2015-03-08 21:27:42', '2015-03-08 21:27:42');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('856645', '三星 Galaxy S4 (I9500) 16G版 星空黑 联通3G手机', '年货特价来袭!三星经典旗舰机!', '188800', '99999', null, 'http://image.taotao.com/jd/2cd67c806e054435bce4c931a731493a.jpg', '560', '1', '2015-03-08 21:27:54', '2015-03-08 21:27:54');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('858025', '三星 I8552 白色 联通3G手机 双卡双待', '经济实惠机器~~开春入手好时机~', '79900', '99999', null, 'http://image.taotao.com/jd/d958a21cec814fdeab934d43b4fb2e06.jpg', '560', '1', '2015-03-08 21:27:49', '2015-03-08 21:27:49');
INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('860275', '长虹(CHANGHONG) 3D51C1080i 51英寸 快门式3D智能Android 电视(黑色)', '智能安卓系统 可自由安装应用程序 <a  target=\"blank\"  href=\"http://sale.jd.com/act/Kt0aHzbU7uR1M.html\">“点击进入长虹新年专场”</a>', '269900', '99999', null, 'http://image.taotao.com/jd/08dabc37342943ffb717632f9ee40685.jpg', '76', '1', '2015-03-08 21:27:35', '2015-03-08 21:27:35');
        插入完之后,我们到db1、db2、db3这三片进行查看,发现只有db1中的tb_item是有数据的。其余两个都没有数据。


      db3库中没有数据,如下图所示。


       db2库中没有数据,没有数据,如下图所示。


         为什么会有上面的情景呢?这是因为mycat进行分片后,每片最大的存储量是五百万(5000000),而我们在schema.xml文件中配置的分片规则是按照Long型的ID来分片,每片数据库存储的ID的编号大于它能存储的最大编号就会自动将数据存到下一个分片,我们现在分了3片,第1片能存储的最大ID编号是5000000,第2片能存储的最大ID编号是10000000,第三片能存储的最大ID编号是15000000。如下图所示。


        我们插入数据库中的最大ID才860275,远没有达到五百万,因此数据全都被存储到第1片(db1)上了。我们再存储一条ID为5000000的商品

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');
        插入成功后,我们查看db1,发现这条记录还是记录到了db1当中。


           我们再插入一条记录,这次把ID设为5000001,

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('5000001', '诺基亚(NOKIA) 106 (RM-962) 黑色 移动联通2G手机', '小机器,大能耐!防尘键盘,超长待机!支持FM收音机,手电筒功能!', '14900', '99999', null, 'http://image.taotao.com/jd/f22fd70d7d26492e88e3368e6d528779.jpg', '560', '1', '2015-03-08 21:28:16', '2015-03-08 21:28:16');
           插入成功后,我们发现db1当中没有这条数据,db3中有刚插入的数据,如下图所示。


          我们再插入两条商品,一个ID为10000000,另一个ID为10000001的商品

INSERT INTO TB_ITEM(ID,TITLE,SELL_POINT,PRICE,NUM,BARCODE,IMAGE,CID,STATUS,CREATED,UPDATED) VALUES ('10000000', '长虹(CHANGHONG)LED50C2080i 50英寸智能安卓LED液晶电视(黑色)', '智能安卓系统,可自由安装应用程序,让您的电视无所不能!<a  target=\"blank\"  href=\"http://sale.jd.com/act/Kt0aHzbU7uR1M.html\">“点击进入长虹新年专场”</a>', '339900', '99999', null, 'http://image.taotao.com/jd/4055ccf141a143c99a6d51e9107f96c1.jpg', '76', '1', '2015-03-08 21:27:39', '2015-03-08 21:27:39');
         插入成功后,我们再看看db3,发现db3只存了ID为10000000的商品。

          再看db2,发现存在了db2中,说明我们的分片没有问题。



  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值