MyCat是什么
MyCat是数据库分库分表的中间件。
应用场景实例
场景之一是: 某一个表数据量很大,超过千万级别, 通过MyCat可以将这张表的数据按照一定的分片算法分布在多个数据库中。
实例环境与效果
- Windows
- MyCat 1.6
- mysql-8.0.16-winx64
- MySQL Workbench
实例效果:
有一张用户表my_user, 包含三个字段
id : 用户ID
country :用户所属的国家
name : 用户名
按照不同的国家存储用户到不同库的表中, 每个国家对应一个库。
- 安装MySQL和MyCat, 建立db1、db2和db3三个数据库。
- 在MyCat中配置以上三个数据库和分片规则之后,启动MyCat
- 使用WorkBench连接MyCat虚拟数据库
- 创建数据表时会同时在三个库中创建表
- 插入数据时,会根据分片规则将数据写到对应的表中
实例步骤:
1. 下载MyCat并解压
下载地址:
http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-win.tar.gz
解压后目录如下:
2. 配置
进入config目录,分别配置server.xml、schema.xml和rule.xml的配置文件
1.配置虚拟数据库 server.xml
配置MyCat虚拟数据库的用户名、密码以及数据库名。
这里保持默认设置即可:
<user name="root"> <!--数据库用户名 -->
<property name="password">123456</property> <!-- 密码-->
<property name="schemas">TESTDB</property> <!-- 数据库名-->
</user>
- 配置虚拟数据库和实体数据库的关系:schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
<table name="my_user" dataNode="dn1,dn2,dn3" rule="myrule" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
schema 配置虚拟数据库,与server.xml中的对应(TESTDB),table定义数据库中的表
dataNode 数据节点,代表的就是实体数据库,包括数据主机(dataHost)和数据库名
dataHost就是实体数据库的配置,包括数据库类型,数据库实际的url,已经连接的用户名密码
- 分片规则 rule.xml
MyCat可以定义多种分片规则,这里根据表的某个字段的值来分片,将分片规则定义在partition-hash-int.txt文件中。
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="myrule">
<rule>
<columns>country</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<property name="mapFile">partition-hash-int.txt</property>
<property name="type">1</property>
<property name="defaultNode">0</property>
</function>
</mycat:rule>
partition-hash-int.txt
china=0
usa=1
england=2
以上的意思是:来自中国的用户写入db1库的my_user表,美国的写入db2,英国的写入db3。在MySQL中分别创建3个数据库:
create database db1;
create database db2;
create database db3;
3. 启动
简单的启动方式是在MyCat的bin目录下, 命令行执行:
startup_nowrap.bat
4.测试
CREATE TABLE my_user
(
id
varchar(64) NOT NULL,
country
varchar(10) NOT NULL,
name
varchar(64) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into my_user(id,country,name) values(‘001’,‘china’,‘User 1’);
insert into my_user(id,country,name) values(‘002’,‘usa’,‘User 2’);
insert into my_user(id,country,name) values(‘003’,‘england’,‘User 3’);
jdbc:mysql://127.0.0.1:8066/TESTDB?characterEncoding=utf-8
错误解决
以上在MySQL 5运行正常,但在MySQL8出错,报:
Client does not support authentication protocol requested by server; consider upgrading MySQL client
解决方法是执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
原因:
mysql模块并未完全支持MySQL 8的“caching_sha2_password”加密方式,而“caching_sha2_password”在MySQL 8中是默认的加密方式
conf/wrapper.conf 参数配置,比如JVM
CREATE TABLE exam
(
id
varchar(64) NOT NULL,
ilevel
int NOT NULL,
name
varchar(64) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE exam
(
id
varchar(64) NOT NULL,
slevel
varchar(10) NOT NULL,
name
varchar(64) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
startup_nowrap.bat
create database db1;
create database db2;
create database db3;
CREATE TABLE exam
(
id
varchar(64) NOT NULL,
slevel
varchar(64) NOT NULL,
name
varchar(64) NOT NULL,
PRIMARY KEY (id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;