Mycat 系列之水平分表

安装部署 MySQL

·

1 MySQL 搭建

搭建步骤省略…

注意一: Linux 下部署安装 MySQL,默认不忽略表名大小写,需要手动到 /etc/my.cnf 下配置 lower_case_table_names=1 使 Linux 环境下 MySQL 忽略表名大小写,否则使用 MyCAT 的时候会提示找不到表的错误。

注意二: 在测试过程中,MySQL 设置了指定服务端字符集的排序规则(collation-server),结果或导致 Mycat 报错。

·

2 创建测试库

CREATE DATABASE mycat_testdb DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

·

3 创建用户并授权

grant all on mycat_testdb.* to mycat_user@"%" identified by "111111";

·

4 连接测试

mysql -umycat_user -p111111 -h 10.0.30.21
mysql -umycat_user -p111111 -h 10.0.30.22

·

安装部署 Mycat

1 JAVA 环境配置

PS: 必须 JDK7 或更高版本。

tar -xvf jdk-8u281-linux-x64.tar.gz -C /usr/local/

ln -vs /usr/local/jdk1.8.0_281/bin/java* /usr/bin/
ln -vs /usr/local/jdk1.8.0_281/bin/jps /usr/bin/

·

2 下载&解压二进制包

tar -xvf Mycat-server-1.5.1-RELEASE-20161130213509-linux.tar.gz -C /usr/local/

·

3 声明环境变量

cat << EOF > /etc/profile.d/mycat.sh
export MYCAT_HOME=/usr/local/mycat
EOF

source /etc/profile

·

4 修改日志格式

cd /usr/local/mycat
vim conf/log4j.xml
#
......
#日志存放路径
<param name="file" value="${MYCAT_HOME}/logs/mycat.log" />
......
#日志等级(生成环境下建议将为 info/ware,如果是研究测试,可以开启debug 模式)
<root>
    <level value="debug" />
    <appender-ref ref="ConsoleAppender" />
</root>
......

·

5 修改 schema.xml 配置文件(枚举分片)

cd /usr/local/mycat
cp -p conf/schema.xml{,.default}
vim conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >
        <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100">
            <table name="student" dataNode="dn1,dn2" rule="sharding-by-intfile"></table>
        </schema>

        <dataNode name="dn1" dataHost="wpf-test21" database="mycat_testdb"/>
        <dataNode name="dn2" dataHost="wpf-test22" database="mycat_testdb"/>

        <dataHost name="wpf-test21" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="testM1" url="10.0.30.21:3306" user="mycat_user" password="111111"/>
        </dataHost>

        <dataHost name="wpf-test22" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="testM2" url="10.0.30.22:3306" user="mycat_user" password="111111"/>
        </dataHost>
</mycat:schema>

·

6 修改 rule.xml 配置文件(枚举分片)

cd /usr/local/mycat
cp -p conf/rule.xml{,.default}
vim conf/rule.xml
......
<tableRule name="sharding-by-intfile">
        <rule>
                <columns>sex</columns>
                <algorithm>hash-int</algorithm>
        </rule>
</tableRule>
<!-- columns:分片字段 -->
<!--algorithm:分片函数 -->
......
<function name="hash-int"
        class="org.opencloudb.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property>
        <property name="type">1</property>
        <property name="defaultNode">0</property>
</function>
......
<!-- mapFile:配置文件名称。-->
<!-- type:0 表示 Integer,非零表示 String。默认为 0。
+ 如果设置为 0,会报错:ERROR 1064 (HY000): For input string: "女"。-->
<!-- defaultNode:默认节点。小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点。-->

·

7 编辑 conf/partition-hash-int.txt 文件(枚举分片)

vim conf/partition-hash-int.txt
男=0=1
#根据性别(sex)进行分片

·

8 修改 server.xml 配置文件(枚举分片)

cd /usr/local/mycat
cp -p conf/server.xml{,.default}
vim conf/server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
        <system>
        <property name="defaultSqlParser">druidparser</property>
        <property name="charset">utf8mb4</property>
        </system>

        <user name="mycat">
                <property name="password">123456</property>
                <property name="schemas">mycat_testdb</property>
        </user>
</mycat:server>

·

9 启动 Mycat

#mycat 支持的命令{ console | start | stop | restart | status | dump }
cd /usr/local/mycat
./bin/mycat start

·

测试 Mycat

1 连接 mycat

mysql -h 10.0.30.20 -umycat -p123456 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------+
| DATABASE     |
+--------------+
| mycat_testdb |
+--------------+
1 row in set (0.00 sec)

·

2 创建表,并写入测试数据

MySQL [(none)]> use mycat_testdb;
Database changed

MySQL [mycat_testdb]> create table student (id int,name varchar(20),sex varchar(5));
Query OK, 0 rows affected (0.05 sec)

#分片表在写入数据时,必须指定字段名,如果不指定会报错。如下所示:
MySQL [mycat_testdb]> insert into student values (1,'xiaohong','女');
ERROR 1064 (HY000): partition table, insert must provide ColumnList

MySQL [mycat_testdb]> insert into student(id,name,sex) values (1,'xiaohong','女');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> insert into student(id,name,sex) values (2,'xiaoming','男');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> insert into student(id,name,sex) values (3,'张三','男');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> insert into student(id,name,sex) values (4,'李四','女');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> select * from student;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
|    1 | xiaohong ||
|    4 | 李四     ||
|    2 | xiaoming ||
|    3 | 张三     ||
+------+----------+------+
4 rows in set (0.00 sec)

·

3 验证分片是否成功

#在第一个物理库上进行查看
MariaDB [(none)]> use mycat_testdb;
Database changed
MariaDB [mycat_testdb]> select * from student;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
|    2 | xiaoming ||
|    3 | 张三     ||
+------+----------+------+
2 rows in set (0.00 sec)
#在第二个物理库上进行查看
MariaDB [(none)]> use mycat_testdb;
Database changed
MariaDB [mycat_testdb]> select * from student;
+------+----------+------+
| id   | name     | sex  |
+------+----------+------+
|    1 | xiaohong ||
|    4 | 李四     ||
+------+----------+------+
2 rows in set (0.01 sec)

至此,可以看到 Mycat 的枚举分片成功。

·

范围分片

根据年龄(age),进行分片:0-6岁为幼儿,7-17岁为青少年,18-45岁为青年,46-69岁为中年,大于69岁为老年。

·

schema.xml 配置文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >
        <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100">
            <table name="census" dataNode="dn1,dn2" rule="auto-sharding-long"></table>
        </schema>

        <dataNode name="dn1" dataHost="wpf-test21" database="mycat_testdb"/>
        <dataNode name="dn2" dataHost="wpf-test22" database="mycat_testdb"/>

        <dataHost name="wpf-test21" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="testM1" url="10.0.30.21:3306" user="mycat_user" password="111111"/>
        </dataHost>

        <dataHost name="wpf-test22" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="testM2" url="10.0.30.22:3306" user="mycat_user" password="111111"/>
        </dataHost>
</mycat:schema>

·

rule.xml 配置文件

......
<tableRule name="auto-sharding-long">
        <rule>
                <columns>age</columns>
                <algorithm>rang-long</algorithm>
        </rule>
</tableRule>
<!-- columns:分片字段-->
<!-- algorithm:分片函数-->
......
<function name="rang-long"
        class="org.opencloudb.route.function.AutoPartitionByLong">
        <property name="mapFile">autopartition-long.txt</property>
        <property name="defaultNode">0</property>
</function>
......
<!-- mapFile:配置文件名称。-->
<!-- defaultNode:默认节点。小于 0 表示不设置默认节点,大于等于 0 表示设置默认节点。-->

·

conf/partition-hash-int.txt 文件

vim conf/autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-6=0
7-17=1
18-45=1
46-69=0
#0-6岁为幼儿,7-17岁为青少年,18-45岁为青年,46-69岁为中年,大于69岁为老年
#由于数据库有限,测试分片就只有两个数据库节点。

·

server.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
        <system>
        <property name="defaultSqlParser">druidparser</property>
        <property name="charset">utf8mb4</property>
        </system>

        <user name="mycat">
                <property name="password">123456</property>
                <property name="schemas">mycat_testdb</property>
        </user>
</mycat:server>

·

连接 mycat 创建表,并写入测试数据

mysql -h 10.0.30.20 -umycat -p123456 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------+
| DATABASE     |
+--------------+
| mycat_testdb |
+--------------+
1 row in set (0.00 sec)

MySQL [(none)]> use mycat_testdb;
Database changed

MySQL [mycat_testdb]> create table census (id int,name varchar(20),age int,area varchar(50));
Query OK, 0 rows affected (0.02 sec)

MySQL [mycat_testdb]> insert into census(id,name,age,area) values(1,'张三',5,'阳光花园');
Query OK, 1 row affected (0.05 sec)

MySQL [mycat_testdb]> insert into census(id,name,age,area) values(2,'李四',8,'花园小区');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> insert into census(id,name,age,area) values(3,'王五',18,'阳光小区');
Query OK, 1 row affected (0.00 sec)

MySQL [mycat_testdb]> insert into census(id,name,age,area) values(4,'赵柳',47,'阳光街道');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> insert into census(id,name,age,area) values(5,'孙琦',70,'花园街道');
Query OK, 1 row affected (0.06 sec)

MySQL [mycat_testdb]> select * from census;
+------+--------+------+--------------+
| id   | name   | age  | area         |
+------+--------+------+--------------+
|    1 | 张三   |    5 | 阳光花园     |
|    4 | 赵柳   |   47 | 阳光街道     |
|    5 | 孙琦   |   70 | 花园街道     |
|    2 | 李四   |    8 | 花园小区     |
|    3 | 王五   |   18 | 阳光小区     |
+------+--------+------+--------------+
5 rows in set (0.05 sec)

·

验证范围分片是否成功

#在第一个物理库上进行查看
MariaDB [(none)]> use mycat_testdb;
Database changed
MariaDB [mycat_testdb]> select * from census;
+------+--------+------+--------------+
| id   | name   | age  | area         |
+------+--------+------+--------------+
|    1 | 张三   |    5 | 阳光花园     |
|    4 | 赵柳   |   47 | 阳光街道     |
|    5 | 孙琦   |   70 | 花园街道     |
+------+--------+------+--------------+
3 rows in set (0.00 sec)
#在第二个物理库上进行查看
MariaDB [(none)]> use mycat_testdb;
Database changed
MariaDB [mycat_testdb]> select * from census;
+------+--------+------+--------------+
| id   | name   | age  | area         |
+------+--------+------+--------------+
|    2 | 李四   |    8 | 花园小区     |
|    3 | 王五   |   18 | 阳光小区     |
+------+--------+------+--------------+
2 rows in set (0.00 sec)

至此,可以看到 Mycat 的范围分片成功。

·

日期(天)分片

根据日期(天)进行分片,每隔 10 天分一片。

·

schema.xml 配置文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/" >
        <schema name="mycat_testdb" checkSQLschema="false" sqlMaxLimit="100">
            <table name="player_list" dataNode="dn1,dn2" rule="sharding-by-date"></table>
        </schema>

        <dataNode name="dn1" dataHost="wpf-test21" database="mycat_testdb"/>
        <dataNode name="dn2" dataHost="wpf-test22" database="mycat_testdb"/>

        <dataHost name="wpf-test21" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="testM1" url="10.0.30.21:3306" user="mycat_user" password="111111"/>
        </dataHost>

        <dataHost name="wpf-test22" maxCon="1000" minCon="10" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="testM2" url="10.0.30.22:3306" user="mycat_user" password="111111"/>
        </dataHost>
</mycat:schema>

·

rule.xml 配置文件

......
<tableRule name="sharding-by-date">
        <rule>
                <columns>create_time</columns>
                <algorithm>shardingByDate</algorithm>
        </rule>
</tableRule>
<!-- columns:分片字段-->
<!-- algorithm:分片函数-->
......
<!--<function name="shardingByDate" class="io.mycat.route.function.PartitionByDate">-->
<function name="shardingByDate" class="org.opencloudb.route.function.PartitionByDate">
        <property name="dateFormat">yyyy-MM-dd</property>
        <property name="sBeginDate">2020-01-01</property>
        <property name="sEndDate">2020-01-20</property>
        <property name="sPartionDay">10</property>
</function>
......
<!--dateFormat:日期格式。-->
<!--sBeginDate:开始日期。-->
<!--sEndDate:结束日期。即:数据达到了这个日期的分片后,循环从开始分片插入。-->
<!--sPartionDay:分区天数。即:默认从开始日期算起,每 10 天一个分。-->

·

server.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
        <system>
        <property name="defaultSqlParser">druidparser</property>
        <property name="charset">utf8mb4</property>
        </system>

        <user name="mycat">
                <property name="password">123456</property>
                <property name="schemas">mycat_testdb</property>
        </user>
</mycat:server>

·

连接 mycat 创建表,并写入测试数据

mysql -h 10.0.30.20 -umycat -p123456 -P 8066
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.8-mycat-1.5.1-RELEASE-20161130213509 MyCat Server (OpenCloundDB)

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]> show databases;
+--------------+
| DATABASE     |
+--------------+
| mycat_testdb |
+--------------+
1 row in set (0.00 sec)

MySQL [(none)]> use mycat_testdb;
Database changed

MySQL [mycat_testdb]> create table player_list (id int,name varchar(20),grade int,create_time date);
Query OK, 0 rows affected (0.04 sec)

MySQL [mycat_testdb]> insert into player_list (id,name,grade,create_time) values (1,'无敌风火轮',99,'2020-01-05');
Query OK, 1 row affected (0.00 sec)
 
MySQL [mycat_testdb]> insert into player_list (id,name,grade,create_time) values (2,'awsdf',86,'2020-01-16');
Query OK, 1 row affected (0.00 sec)

MySQL [mycat_testdb]> insert into player_list (id,name,grade,create_time) values (3,'小帅在不经意间',55,'2020-01-20');
Query OK, 1 row affected (0.00 sec)

MySQL [mycat_testdb]> insert into player_list (id,name,grade,create_time) values (4,'hhhhhh',11,'2020-01-25');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> insert into player_list (id,name,grade,create_time) values (5,'我爱你1314',66,'2020-01-31');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> insert into player_list (id,name,grade,create_time) values (6,'1234567890',67,'2020-02-28');
Query OK, 1 row affected (0.01 sec)

MySQL [mycat_testdb]> select * from player_list;
+------+-----------------------+-------+-------------+
| id   | name                  | grade | create_time |
+------+-----------------------+-------+-------------+
|    2 | awsdf                 |    86 | 2020-01-16  |
|    3 | 小帅在不经意间        |    55 | 2020-01-20  |
|    5 | 我爱你1314            |    66 | 2020-01-31  |
|    6 | 1234567890            |    67 | 2020-02-28  |
|    1 | 无敌风火轮            |    99 | 2020-01-05  |
|    4 | hhhhhh                |    11 | 2020-01-25  |
+------+-----------------------+-------+-------------+
6 rows in set (0.00 sec)

·

验证日期分片是否成功

#在第一个物理库上进行查看
MariaDB [(none)]> use mycat_testdb;
Database changed
MariaDB [mycat_testdb]> select * from player_list;
+------+-----------------+-------+-------------+
| id   | name            | grade | create_time |
+------+-----------------+-------+-------------+
|    1 | 无敌风火轮      |    99 | 2020-01-05  |
|    4 | hhhhhh          |    11 | 2020-01-25  |
+------+-----------------+-------+-------------+
2 rows in set (0.00 sec)
#在第二个物理库上进行查看
MariaDB [(none)]> use mycat_testdb;
Database changed
MariaDB [mycat_testdb]> select * from player_list;
+------+-----------------------+-------+-------------+
| id   | name                  | grade | create_time |
+------+-----------------------+-------+-------------+
|    2 | awsdf                 |    86 | 2020-01-16  |
|    3 | 小帅在不经意间        |    55 | 2020-01-20  |
|    5 | 我爱你1314            |    66 | 2020-01-31  |
|    6 | 1234567890            |    67 | 2020-02-28  |
+------+-----------------------+-------+-------------+
4 rows in set (0.00 sec)

至此,可以看到 Mycat 的日期(天)分片成功。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值