一、Mycat下载安装
下载地址为 Index of /http://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表就为全局表,每个库中都有它的全部数据!