今日心血来潮搞了以下mycat这个分布式中间件,主要参考
https://blog.csdn.net/u013467442/article/details/56955846
建两个数据表:
users不分片,全放在db1
item分片,轮询dn2、dn3主机,分别放到db2、db3的数据库中。
这个网址进行配置。
IP | 主机名 | 数据库名 | 安装内容 |
---|---|---|---|
172.16.10.3 | dn3 | db3 | mysql |
172.16.10.2 | dn2 | db2 | mysql |
172.16.10.1 | dn1 | db1 | mysql、java、mycat |
mysql:
每台机都建一个用户
grant all on *.* to xxx@'%' identified by 'xxxx';
如提示ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
则输入:
set global validate_password_policy=0;
10.1:
create database db1;
CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL default '',
indate DATETIME NULL,
PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
10.2:
create database db2;
CREATE TABLE item (
id INT NOT NULL AUTO_INCREMENT,
value INT NOT NULL default 0,
indate DATETIME NULL ,
PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
10.3:
create database db3;
CREATE TABLE item (
id INT NOT NULL AUTO_INCREMENT,
value INT NOT NULL default 0,
indate DATETIME NULL ,
PRIMARY KEY (id)
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;
java:
https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载java
tar -zxvf xxx.tar.gz
mkdir -p /usr/java
mv xxx /usr/java/
vi /etc/profile
/etc/profile末尾加上:
export JAVA_HOME=/usr/java/jdk1.8.0_191
export JRE_HOME=/usr/java/jdk1.8.0_191/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
保存后
source /etc/profile
mycat:
http://dl.mycat.io/1.6-RELEASE/
下载linux版本
tar -zxvf xxx.tar.gz
mv xxx /home/mycat
开启:/home/mycat/bin/mycat start
停止:/home/mycat/bin/mycat stop
配置:
所有配置文件都在mycat/conf下:
server.xml:
最尾加上
<user name="test">
<property name="password">test</property>
<property name="schemas">TESTDB</property>
</user>
rule.xml:
新增:
<tableRule name="role1">
<rule>
<columns>id</columns><!--根据id分片-->
<algorithm>mod-long</algorithm><!--根据什么算法分片-->
</rule>
</tableRule>
修改:
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<property name="count">2</property><!--轮询多少台机-->
</function>
schema.xml:
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="users" primaryKey="id" dataNode="dn1" /> <!--user这个表不分片,只保存在users表-->
<table name="item" primaryKey="id" dataNode="dn2,dn3" rule="role1" /><!--在dn2、3之间轮询分片-->
</schema>
<dataNode name="dn1" dataHost="172.16.10.1" database="db1" />
<dataNode name="dn2" dataHost="172.16.10.2" database="db2" />
<dataNode name="dn3" dataHost="172.16.10.3" database="db3" />
<!--这里分了3台主机来做分片,如果一台主机来做分片也是可以的-->
<dataHost name="172.16.10.1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="172.16.10.1" url="172.16.10.1:6665" user="xxxx" password="xxx" />
</dataHost>
<dataHost name="172.16.10.2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="172.16.10.2" url="172.16.10.2:3306" user="xxxx" password="xxx" />
</dataHost>
<dataHost name="172.16.10.3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="172.16.10.3" url="172.16.10.3:6665" user="xxxx" password="xxx" />
</dataHost>
如果是一台主机
<dataHost name="dh1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="server1" url="127.0.0.1:3306" user="root" password="123456"/>
</dataHost>
测试:
mysql -utest -p -h127.0.0.1 -P8066 -DTESTDB
insert into users(name,indate) values('abcd',now());
insert into users(name,indate) values('lmmmld',now());
insert into item(id,value,indate) values(1,170,now());
insert into item(id,value,indate) values(2,150,now());
10.1:
mycat:
mysql:
10.2:
10.3:
mycat不适用的场景:
1、冗余数据的查询会造成,由于每个节点都存在该数据,导致每个节点都会运行,如果是查询5000条数据,有3个节点,则会是3*5000条的计算量。
2、多表查询时,join的表不在同一个节点上时,会查询不出数据。
3、还有一些分页排序、事务问题,这个没深入了解,懒,哈哈。