MySQL分库分表

一、Mycat下载安装

         下载地址为 Index of /icon-default.png?t=LBL2http://dl.mycat.org.cn/

本次以Linux系统为例下载

使用xftp将压缩包移动到/opt目录下,进行解压

tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

解压完成后会得到mycat文件夹,将mycat文件夹拷贝到/usr/local目录下

cp -r  mycat /usr/local/

 进入mycat目录下

需要修改三个配置文件,都在conf文件夹下

 修改server.xml

vim server.xml

 修改的内容为:

为了区分mycat与mysql的用户,将mycat的默认用户名由root改为mycat

保存退出!

修改schema.xml

vim schema.xml

 

 显示TESTDB库中有如下表,但是实际上并不存在,所以我们需要先删除掉这些table标签,切换到显示行号

 

 需要从第6行删到第32行,并添加数据节点

删除完成后,就变为

 再配置

 再把多余的注释删掉,就变成了

然后保存退出

验证数据库访问情况 

测试访问windows数据库

mysql -uroot -h 192.168.0.103 -P 3306 -p

 可能会报 Access denied for user 'root'@'192.168.0.100' (using password: YES)

原因是没有开放权限

开启权限:登录mysql,输入

GRANT ALL PRIVILEGES on *.* to 'root'@'%' identified by '密码';

之后还需要在windows的mysql配置文件中配置

skip-grant-tables

之后重启mysql服务,就可以连接上了

 使用远程方式访问本机mysql也访问成功

二、启动Mycat

     进入到刚刚复制到usr/local中的mycat文件夹中,进入bin目录

运行 

./mycat console

  

 表示控制台启动,方便查看错误

  

  启动成功! 

三、进入Mycat

 运行

mysql -umycat -h 192.168.0.100 -P 8066 -p

 

 mycat 为 配置文件中修改的用户名,密码还是为123456 ,ip为本机ip,端口号为8066,

 查看库与表

 

 发现库为默认的TESTDB库,表为主机上的mytbl表,并且这个表示从属于testmaster555这个库的

通过在主机上添加一条

insert into mytbl values (20,@@hostname);

 就可以判断mycat中查询的是那一个MySQL上的表!

 发现查询的是主机上的表,也一直会是查主机上的表,是因为没有开启负载均衡

开启负载均衡

编辑schema.xml

 我们把balance改为2

 随机分配,那么mycat查看时,就会以随机的机制查询两台mysql数据库上的数据!!

四、Mycat分库

  分库都是在mycat上做的操作,所以,我们还是要修改mycat的  schema.xml 配置文件

  修改结果为 

 一点一点解释:

 

 代表在mycat的TESTB库中创建一个customer表,数据节点为dn2(下面有解释)

创建了两个数据节点为dn1,dn2,dn2位mycat库中customer表的数据节点,并且主机起名为host2,数据库名字为orderxss。(dn1同理)

 

  创建两个主机,只解释一个,另一个同理

  创建一个host2的主机,与数据节点dn2的主机host2相对应 balance要变为0,不开启读写分离机制 ,因为是分库操作,所以不存在读写分离,也就没有必要启用<readHost>标签,只需要<writeHost>标签即可,<writeHost>中host的值要唯一,不能重复,配置自己的ip以及端口号,用户名,密码

配置完后,保存退出,然后要在两个数据库都创建 orderxss 这个库,否则mycat将启动报错!

mycat成功启动后,我们可以尝试创建一个customer表,注意:一定要在mycat中创建,因为我们访问数据库也是通过mycat来访问的!

创建完成后,发现customer表存在于0.100这个mysql的orderxss中,因为 customer表的datanode为dn2,而dn2的主机为192.168.0.100,故建立在0.100这个ip的mysql上,再创建不是customer的表,发现,其他表都存在与0.103这个ip的mysql中,因为mycat默认的datanode为dn1,dn1对应的ip为192.168.0.103,所以其他表都会被创建进0.103的orderxss数据库中 。

所以当通过mycat来查询customer这个表时,mycat就会查询0.100这个地址的mysql,其他表会查询0.103这个地址的mysql,故实现了mycat分库!

五、Mycat分表

  创建一张表为

create table orders(
   id int auto_increment,
   order_type int,
   customer_id int,
   amount decimal(10,2),
   primary key(id)
);

   以这张表为例,最好是使用customer_id来分表,这样既保证了效率,也不会增加服务器的压力

修改schema.xml配置文件

增加

 

 rule表示分表规则,dataNode表示分为两个数据节点,也就是分为两个表

 保存退出

修改rule.xml

增加一个表规则

 命名与schema.xml配置文件的rule相同,columns表示以哪一字段分表,algorithm表示规则是什么,这里的规则为mod-long,也就是取模

  

 默认为3,因为我们只有2个dataNode,所以修改为2

 之后保存退出

 我们还要在0.103上的orderxss库中创建orders表,这样mycat启动才不会报错

成功启动后,测试数据

在mycat中运行

insert into orders(id,order_type,customer_id,amount) values (2,101,100,100100);
insert into orders(id,order_type,customer_id,amount) values (3,101,101,100100);
insert into orders(id,order_type,customer_id,amount) values (4,101,101,100100);
insert into orders(id,order_type,customer_id,amount) values (5,101,101,100100);
insert into orders(id,order_type,customer_id,amount) values (6,101,100,100100);

 运行完成后发现

 

并没有以主键递增的方式排序,这是因为我们是通过查询两个库的两张表来实现最终的查询6条记录的,也就是,126在一个库的一张表中,345在另一个库的一张表中,所以查询结果就是如此!

 跨计算机进行连接查询是不能实现的,所以,连接的表也需要进行分表

 创建

create table orders_detail(
   id int auto_increment,
   detail varchar(2000),
   order_id int,
   primary key(id)
);

  修改schema.xml配置文件

  添加

  

 <childTable>标签表示子表,也就是orders_detail表跟着orders表的分表方式进行分表,joinKey为根据哪一字段进行分表,parentKey表示与父表进行关联的是哪一字段,更爱完成后,保存退出,之后就联查也可以查询出来

 全局表

 全局表就为每一个库里有拥有这个表的全部数据

 配置如下

  修改schema.xml配置文件

  添加

  

 配置完成后,dict_order_type表就为全局表,每个库中都有它的全部数据!

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值