今天抽空来整个测试环境,搭建mycat对mysql进行分库分表。做个记录方便以后查看。
环境部署
首先是下载mycat http://www.mycat.io/ 我下的是1.6.6-release
然后java jdk 我下的1.8
docker 的安装,pull mysql的镜像 (mysql:last版本是8 也可以pull5.6|5.7)
docker run -p 3307:3306 --name mysql -v $PWD/conf:/etc/mysql/conf.d -v $PWD/logs:/logs -v $PWD/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql
容器启动后 进入容器再次设置root密码(不然连接会报错 2059 -authentication plugin 'caching_sha2_password'……)
docker exec -it mysql bash
mysql -uroot -p123456
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
我又找2台linux 重复mysql 容器创建步骤
192.168.1.19 是master 运行mycat 也是分库hostM1
192.168.1.242 192.168.1.243 是分库物理host
将 mycat 传到master的linux上去 解压
tar -zxvf xxxx.tar
mv /usr/local/Mycat
将jdk 解压
mv /usr/local/java
vi /etc/profile
添加以下环境变量
export MYCAT_HOME=/usr/local/Mycat
export JAVA_HOME=/usr/local/java
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=$JAVA_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
立即生效
source /etc/profile
然后就是mycat 的3个配置文件了
1 server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="defaultSqlParser">druidparser</property>
<property name="mutiNodeLimitType">1</property>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
</system>
<!-- 任意设置登陆 mycat 的用户名,密码,数据库 -->
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">TESTDB</property>
</user>
</mycat:server>
2 rule.xml (这里采用最简单的取模的规则分表)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="role1">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">3</property>
</function>
</mycat:rule>
3 schema.xml (这里是3台物理机)
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="user" primaryKey="id" dataNode="dn1,dn2,dn3" rule="role1" />
<table name="product" primaryKey="id" dataNode="dn1,dn2,dn3" rule="role1" />
</schema>
<!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->
<dataNode name="dn1" dataHost="dataHost1" database="db1" />
<dataNode name="dn2" dataHost="dataHost2" database="db2" />
<dataNode name="dn3" dataHost="dataHost3" database="db3" />
<!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->
<dataHost name="dataHost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM1" url="192.168.1.19:3307" user="root" password="123456">
<readHost host="hostS1" url="192.168.1.19:3308" user="root" password="123456" />
</writeHost>
</dataHost>
<dataHost name="dataHost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM2" url="192.168.1.242:3307" user="root" password="123456"/>
</dataHost>
<dataHost name="dataHost3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM3" url="192.168.1.243:3307" user="root" password="123456"/>
</dataHost>
</mycat:schema>
然后3个xml放到/usr/local/Mycat/conf 下
启动mycat
cd /usr/local/Mycat
./mycat console
#也可以
./mycat start
tail -f -n 10 /usr/local/Mycat/logs/mycat.log
出现 MyCAT Server startup successfully. see logs in logs/mycat.log 则开启成功了!
这里踩过个坑!开启mycat ,报如下错误 (原因是其他host没有建数据库db2 db3)
成功之后 用Navicat 连接 192.168.1.19:8066 root 123456
然后创建表
CREATE TABLE `user` (
`ID` int(11) NOT NULL,
`NAME` varchar(100) default NULL,
`SEX` int(11) NOT NULL,
PRIMARY KEY (`ID`)
)
插入数据看看
-- 这个会报错 1064 - partition table, insert must provide ColumnList
INSERT INTO `user` VALUES ('1', 'mycat', '1');
INSERT INTO `ussr` VALUES ('2', 'mydog', '2');
-- 解决方法
insert into user(id,name,sex) values(1,'a1',2);
insert into user(id,name,sex) values(2,'a2',1);
insert into user(id,name,sex) values(3,'a3',1);
insert into user(id,name,sex) values(4,'a4',2);
insert into user(id,name,sex) values(5,'a5',1);
insert into user(id,name,sex) values(6,'a6',1);
再去3个库看看数据分布情况
以上简单的mycat搭建配置就成功了 这只是最简单的测试,离上线产品还老远了!
后续再研究下 主从复制 读写分离 和 其他的分表规则,之后再结合程序实现全局唯一ID生成 实现高可用等等……