Mycat 数据库分库分表中间件,国内最活跃的、性能最好的开源数据库中间件,网上颇有多相关资源,也能够直接访问Mycat官网。html
MySql-Master:192.168.252.121 MySql-Slave:192.168.252.122 Mycat:192.168.252.123
参考个人另外一篇文章-搭建 MySQL 5.7.19 主从复制node
在 MySql-Master:192.168.252.121 建库,测试主从复制是否可用mysql
CREATE DATABASE `db_1`; CREATE DATABASE `db_2`; CREATE DATABASE `db_3`;
cd /opt tar -zxvf Mycat-server-1.6.5-release-20171029183033-linux.tar.gz -C /usr/local/
更好看目录结构,下tree(可选)linux
yum -y install tree
tree /usr/local/mycat/
/usr/local/mycat/ ├── bin │ ├── dataMigrate.sh │ ├── init_zk_data.sh │ ├── mycat │ ├── rehash.sh │ ├── startup_nowrap.sh │ ├── wrapper-linux-ppc-64 │ ├── wrapper-linux-x86-32 │ └── wrapper-linux-x86-64 ├── catlet ├── conf │ ├── autopartition-long.txt │ ├── auto-sharding-long.txt │ ├── auto-sharding-rang-mod.txt │ ├── cacheservice.properties │ ├── dbseq.sql │ ├── ehcache.xml │ ├── index_to_charset.properties │ ├── log4j2.xml │ ├── migrateTables.properties │ ├── myid.properties │ ├── partition-hash-int.txt │ ├── partition-range-mod.txt │ ├── rule.xml │ ├── schema.xml │ ├── sequence_conf.properties │ ├── sequence_db_conf.properties │ ├── sequence_distributed_conf.properties │ ├── sequence_time_conf.properties │ ├── server.xml │ ├── sharding-by-enum.txt │ ├── wrapper.conf │ ├── zkconf │ │ ├── autopartition-long.txt │ │ ├── auto-sharding-long.txt │ │ ├── auto-sharding-rang-mod.txt │ │ ├── cacheservice.properties │ │ ├── ehcache.xml │ │ ├── index_to_charset.properties │ │ ├── partition-hash-int.txt │ │ ├── partition-range-mod.txt │ │ ├── rule.xml │ │ ├── schema.xml │ │ ├── sequence_conf.properties │ │ ├── sequence_db_conf.properties │ │ ├── sequence_distributed_conf-mycat_fz_01.properties │ │ ├── sequence_distributed_conf.properties │ │ ├── sequence_time_conf-mycat_fz_01.properties │ │ ├── sequence_time_conf.properties │ │ ├── server-mycat_fz_01.xml │ │ ├── server.xml │ │ └── sharding-by-enum.txt │ └── zkdownload │ └── auto-sharding-long.txt ..... 省略更多 7 directories, 95 files
下载Linux环境下的jdk1.8,请去(官网)中下载jdk的安装文件git
我在百度云盘分下的连接:http://pan.baidu.com/s/1jIFZF9s 密码:u4n4github
上传在 /opt
目录算法
解压sql
cd /opt tar zxvf jdk-8u144-linux-x64.tar.gz mv jdk1.8.0_144/ /lib/jvm
配置环境变量mongodb
vi /etc/profile
#jdk export JAVA_HOME=/lib/jvm export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH
使环境变量生效
source /etc/profile
验证
[root@localhost ~]# java -version java version "1.8.0_144" Java(TM) SE Runtime Environment (build 1.8.0_144-b01) Java HotSpot(TM) 64-Bit Server VM (build 25.144-b01, mixed mode)
设置 MYCAT_HOME 的变量
export PATH=${JAVA_HOME}/bin:${MYCAT_HOME}/lib:$PATH export MYCAT_HOME=/usr/local/mycat/
使环境变量生效
source /etc/profile
告诉 Mycat 须要使用哪一个 JDK
vim wrapper.conf
#******************************************************************** # Wrapper Properties #******************************************************************** # Java Application wrapper.java.command=/lib/jvm/bin/java wrapper.working.dir=..
wrapper.conf jvm调优参数,不合理,需改进
# Java Additional Parameters #wrapper.java.additional.1= wrapper.java.additional.1=-DMYCAT_HOME=. wrapper.java.additional.2=-server wrapper.java.additional.3=-XX:MaxPermSize=64M wrapper.java.additional.4=-XX:+AggressiveOpts wrapper.java.additional.5=-XX:MaxDirectMemorySize=2G wrapper.java.additional.6=-Dcom.sun.management.jmxremote wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984 wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false wrapper.java.additional.10=-Xmx4G wrapper.java.additional.11=-Xms1G
jvm参数调优,以16G内存服务器为例
# Java Additional Parameters #wrapper.java.additional.1= wrapper.java.additional.1=-DMYCAT_HOME=. wrapper.java.additional.2=-server wrapper.java.additional.3=-XX:MaxPermSize=64M wrapper.java.additional.4=-XX:+AggressiveOpts #堆内存适度大小,直接映射内存尽量大,两种一块儿占据服务器的1/2-2/3的内存 wrapper.java.additional.5=-XX:MaxDirectMemorySize=6G wrapper.java.additional.6=-Dcom.sun.management.jmxremote wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984 wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false #不管扩展仍是缩减新生代空间或老年代空间都须要进行Full GC,而Full GC会下降程序的吞吐量并致使更长的延迟。 wrapper.java.additional.10=-Xmx4G wrapper.java.additional.11=-Xms4G
配置文件很是多.若是只是简单配置在不一样的服务器上进行读写分离只须要配置两个文件 server.xml
和 schema.xml
schema.xml
中定义逻辑库,表、分片节点等内容 rule.xml
中定义分片规则 server.xml
中定义用户以及系统相关变量,如端口等
server.xml 几乎保存了全部 mycat 须要的系统配置信息。其在代码内直接的映射类为 System Config 类。
vim server.xml
<user name="root" defaultAccount="true"> <property name="password">123456</property> <property name="schemas">test_schema</property> <!-- 表级 DML 权限设置 --> <!-- <privileges check="false"> <schema name="test_schema" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> --> </user> <user name="user"> <property name="password">user</property> <property name="schemas">test_schema</property> <property name="readOnly">true</property> </user>
server.xml 中的标签本就很少,这个标签主要用于定义登陆 mycat 的用户和权限。
例如上面的例子中,我定义了一个用户,用户名为 root 、密码也为 123456,可访问的 schema 也只有 test_schema 一个 逻辑库。
Mycat 系统配置
<system> <property name="nonePasswordLogin">0</property> <!-- 0为须要密码登录、1为不须要密码登录 ,默认为0,设置为1则须要指定默认帐户--> <property name="useHandshakeV10">1</property> <property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 --> <property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 --> <property name="sequnceHandlerType">2</property> <property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的状况下,检查关联字段中是否有分片字段 .默认 false --> <!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议--> <!-- <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号--> <!-- <property name="processorBufferChunk">40960</property> --> <!-- <property name="processors">1</property> <property name="processorExecutor">32</property> --> <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool --> <property name="processorBufferPoolType">809600000</property> <!--默认是65535 64K 用于sql解析时最大文本长度 --> <!--<property name="maxStringLiteralLength">65535</property>--> <!--<property name="sequnceHandlerType">1</property>--> <!--<property name="backSocketNoDelay">1</property>--> <!--<property name="frontSocketNoDelay">1</property>--> <!--<property name="processorExecutor">16</property>--> <property name="serverPort">8066</property> <property name="managerPort">9066</property> <!--默认本机--> <property name="idleTimeout">3800000</property> <property name="bindIp">0.0.0.0</property> <property name="frontWriteQueueSize">4096</property> <property name="processors">32</property> <!-- 分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务 (若是分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,可是记录分布式事务日志 --> <property name="handleDistributedTransactions">0</property> <!--off heap for merge/order/group/limit 1开启 0关闭--> <property name="useOffHeapForMerge">1</property> <!--单位为m--> <property name="memoryPageSize">64k</property> <!--单位为k--> <property name="spillsFileBufferSize">1k</property> <property name="useStreamOutput">0</property> <!--单位为m--> <property name="systemReserveMemorySize">384m</property> <!--是否采用zookeeper协调切换 --> <property name="useZKSwitch">false</property> <!-- XA Recovery Log日志路径 --> <!--<property name="XARecoveryLogBaseDir">./</property>--> <!-- XA Recovery Log日志名称 --> <!--<property name="XARecoveryLogBaseName">tmlog</property>--> </system>
schema 标签用于定义 My Cat 实例中的逻辑库,My Cat 能够有多个逻辑库,每一个逻辑库都有本身的相关配
置。可使用 schema 标签来划分这些不一样的逻辑库。
vim schema.xml
<?xml version="1.0" ?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 设置表的存储方式.schema name="test_schema" 与 server.xml中的 test_schema 设置一致 --> <schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100"> <table name="test_one" primaryKey="id" dataNode="dn$1-3" rule="sharding-by-date"/> </schema> <!-- 设置dataNode 对应的数据库,及 mycat 链接的地址dataHost --> <dataNode name="dn1" dataHost="dh_test" database="db_1"/> <dataNode name="dn2" dataHost="dh_test" database="db_2"/> <dataNode name="dn3" dataHost="dh_test" database="db_3"/> <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登录信息 --> <dataHost name="dh_test" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> <!--<heartbeat>select user()</heartbeat>--> <heartbeat>show slave status</heartbeat> <writeHost host="hostM1" url="192.168.252.121:3306" user="root" password="mima"> <readHost host="hostS2" url="192.168.252.122:3306" user="root" password="mima"/> </writeHost> </dataHost> </mycat:schema>
如上所示的配置就配置了1个逻辑库,逻辑库的概念和 MYSQL 数据库中 Database 的概念相同,咱们在查询这个逻辑库中表的时候须要切换到该逻辑库下才能够查询到所须要的表。
schema 标签
用于定义 My Cat 实例中的逻辑库,My Cat 能够有多个逻辑库,每一个逻辑库都有本身的相关配
置。可使用 schema 标签来划分这些不一样的逻辑库。
data Node 属性
该属性用于绑定逻辑库到某个具体的 database 上,1.3 版本若是配置了 data Node,则不能够配置分片表,
1.4 能够配置默认分片,只须要配置须要分片的表便可
data Host 标签
做为 Schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是做为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。如今咱们就解析下这个标签。
name 属性
惟一标识 data Host 标签,供上层的标签使用。
max Con 属性
指定每一个读写实例链接池的最大链接。也就是说,标签内嵌套的 write Host、read Host 标签都会使用这个属性的值来实例化出链接池的最大链接数。
min Con 属性
指定每一个读写实例链接池的最小链接,初始化链接池的大小。
balance 属性
负载均衡类型,目前的取值有 3 种:
1.balance="0", 不开启读写分离机制,全部读操做都发送到当前可用的 write Host 上。
2.balance="1",所有的 read Host 与 stand by write Host 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,而且 M1 与 M2 互为主备),正常状况下,M2,S1,S2 都参与 select 语句的负载
均衡。
3.balance="2",全部读操做都随机的在 write Host、readhost 上分发。
4.balance="3",全部读请求随机的分发到 wiriter Host 对应的 readhost 执行,writer Host 不负担读压
力,注意 balance=3 只在 1.4 及其之后版本有,1.3 没有。
write Type 属性
负载均衡类型,目前的取值有 3 种:
**switch Type 属性
-1 表示不自动切换
1 默认值,自动切换
2 基于 My SQL 主从同步的状态决定是否切换
db Type 属性
指定后端链接的数据库类型,目前支持二进制的 mysql 协议,还有其余使用 JDBC 链接的数据库。例如:mongodb、oracle、spark 等。
db Driver 属性
指定链接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,由于这个值执行的是二进制的 mysql 协议,因此可使用 mysql 和 maridb。其余类型的数据库则须要使用 JDBC 驱动来支持。
从 1.6 版本开始支持 postgresql 的 native 原始协议。
若是使用 JDBC 的话须要将符合 JDBC 4 标准的驱动 JAR 包放到 MYCATlib 目录下,并检查驱动 JAR 包中包括以下目录结构的文件:META-INFservicesjava.sql.Driver。在这个文件内写上具体的 Driver 类名,例如:com.mysql.jdbc.Driver。
switch Type 属性
-1 表示不自动切换
1 默认值,自动切换
2 基于 My SQL 主从同步的状态决定是否切换 心跳语句为 show slave status
3 基于 My SQL galary cluster 的切换机制(适合集群)(1.4.1) 心跳语句为 show status like ‘wsrep%’.
temp Read Host Available 属性
若是配置了这个属性 write Host 下面的 read Host 仍旧可用,默认 0 可配置(0、1)
rule.xml 里面就定义了咱们对表进行拆分所涉及到的规则定义。咱们能够灵活的对表使用不一样的分片算法,或者对表使用相同的算法但具体的参数不一样。这个文件里面主要有 table Rule 和 function 这两个标签。在具体使用过程当中能够按照需求添加 table Rule 和 function。
vim rule.xml
<tableRule name="sharding-by-date"> <rule> <columns>create_time</columns> <algorithm>sharding-by-date-day</algorithm> </rule> </tableRule> <function name="sharding-by-date-day" class="io.mycat.route.function.PartitionByDate"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2017-11-15</property> <property name="sEndDate">2017-11-17</property> <property name="sPartionDay">1</property> </function>
这个标签订义表规则。
定义的表规则,在 schema.xml:
tableRule name="sharding-by-date"
<schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100"> <table name="test_one" primaryKey="id" dataNode="dn$1-3" rule="sharding-by-date"/> </schema>
/usr/local/mycat/bin ./mycat start
启动 mycat 的日志
less /usr/local/mycat/logs/wrapper.log
访问 mycat 的日志
less /usr/local/mycat/logs/mycat.log
登陆 Mycat 切换到 test_schema 逻辑库
mysql -uroot -p123456 -h192.168.252.123 -P 8066
mysql> use test_schema; Database changed mysql> show tables; +-----------------------+ | Tables in test_schema | +-----------------------+ | test_one | +-----------------------+ 1 row in set mysql>
只须要在 Mycat 服务器执行如下脚本,就会自动同步到 MySql-Master:192.168.252.121 MySql-Slave:192.168.252.122
mysql> CREATE TABLE `test_one` ( `id` BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` VARCHAR (50) DEFAULT NULL COMMENT '名称', `remark` VARCHAR (500) DEFAULT NULL COMMENT '备注', `create_time` datetime DEFAULT NULL COMMENT '建立时间', PRIMARY KEY (`id`) ) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COMMENT = '测试'; Query OK, 0 rows affected
登陆 Mycat 管理端
mysql -uroot -p123456 -h192.168.252.123 -P 9066
RS_CODE 为 1 表示心跳正常,--查看读写分离的机器配置状况
mysql> show @@datanode; +------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME | +------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | dn1 | dh_test/db_1 | 0 | mysql | 0 | 3 | 1000 | 11 | 0 | 0 | 0 | -1 | | dn2 | dh_test/db_2 | 0 | mysql | 0 | 3 | 1000 | 7 | 0 | 0 | 0 | -1 | | dn3 | dh_test/db_3 | 0 | mysql | 0 | 4 | 1000 | 26 | 0 | 0 | 0 | -1 | +------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ 3 rows in set mysql> show @@heartbeat; +--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+ | NAME | TYPE | HOST | PORT | RS_CODE | RETRY | STATUS | TIMEOUT | EXECUTE_TIME | LAST_ACTIVE_TIME | STOP | +--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+ | hostM1 | mysql | 192.168.252.121 | 3306 | 1 | 0 | idle | 0 | 2,3,3 | 2017-11-17 16:54:26 | false | | hostS2 | mysql | 192.168.252.122 | 3306 | 1 | 0 | idle | 0 | 2,2,2 | 2017-11-17 16:54:26 | false | +--------+-------+-----------------+------+---------+-------+--------+---------+--------------+---------------------+-------+ 2 rows in set mysql>
登陆 Mycat 管理端
mysql -uroot -p123456 -h192.168.252.123 -P 9066
RS_CODE 为 1 表示心跳正常,--查看读写分离的机器配置状况
mysql> show @@datanode; +------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME | +------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | dn1 | dh_test/db_1 | 0 | mysql | 0 | 3 | 1000 | 11 | 0 | 0 | 0 | -1 | | dn2 | dh_test/db_2 | 0 | mysql | 0 | 3 | 1000 | 7 | 0 | 0 | 0 | -1 | | dn3 | dh_test/db_3 | 0 | mysql | 0 | 4 | 1000 | 26 | 0 | 0 | 0 | -1 | +------+--------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ 3 rows in set
配置按日期(天)分片,2017-11-15,2017-11-16,2017-11-17 ,一天一个分片,执行完一下的 sql 能够发现数据 ,会按照分片规则进入不一样的,分片,数据库
rule.xml
<tableRule name="sharding-by-date"> <rule> <columns>create_time</columns> <algorithm>sharding-by-date-day</algorithm> </rule> </tableRule> <function name="sharding-by-date-day" class="io.mycat.route.function.PartitionByDate"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2017-11-15</property> <property name="sEndDate">2017-11-17</property> <property name="sPartionDay">1</property> </function>
name 属性指定惟一的名字,用于标识不一样的表规则。
内嵌的 rule 标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。
columns 内指定要拆分的列名字。
algorithm 使用 function 标签中的 name 属性。链接表规则和具体路由算法。固然,多个表规则能够链接到同一个路由算法上。table 标签内使用。让逻辑表使用这个规则进行分片。
配置说明:
columns
:标识将要分片的表字段algorithm
:分片函数dateFormat
:日期格式sBeginDate
:开始日期sEndDate
:结束日期sPartionDay
:分区天数,即默认从开始日期算起,分隔 5 天一个分区schema.xml
<?xml version="1.0" ?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 设置表的存储方式.schema name="test_schema" 与 server.xml中的 test_schema 设置一致 --> <schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100"> <table name="test_one" primaryKey="id" dataNode="dn$1-3" rule="sharding-by-date"/> </schema> <!-- 设置dataNode 对应的数据库,及 mycat 链接的地址dataHost --> <dataNode name="dn1" dataHost="dh_test" database="db_1"/> <dataNode name="dn2" dataHost="dh_test" database="db_2"/> <dataNode name="dn3" dataHost="dh_test" database="db_3"/> <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登录信息 --> <dataHost name="dh_test" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> <!--<heartbeat>select user()</heartbeat>--> <heartbeat>show slave status</heartbeat> <writeHost host="hostM1" url="192.168.252.121:3306" user="root" password="mima"> <readHost host="hostS2" url="192.168.252.122:3306" user="root" password="mima"/> </writeHost> </dataHost> </mycat:schema>
登陆 Mycat 服务端
mysql -uroot -p123456 -h192.168.252.123 -P 8066
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_1', '2017-11-15 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_2', '2017-11-16 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_3', '2017-11-17 00:00:00');
在 MySql-Master 执行 ,查看分片是否均匀
mysql -uroot -p123456 -h192.168.252.121 -P 3306
mysql> select min(create_time),max(create_time) from db_1.test_one; +---------------------+---------------------+ | min(create_time) | max(create_time) | +---------------------+---------------------+ | 2017-11-15 00:00:00 | 2017-11-15 00:00:00 | +---------------------+---------------------+ 1 row in set mysql> select min(create_time),max(create_time) from db_2.test_one; +---------------------+---------------------+ | min(create_time) | max(create_time) | +---------------------+---------------------+ | 2017-11-16 00:00:00 | 2017-11-16 00:00:00 | +---------------------+---------------------+ 1 row in set mysql> select min(create_time),max(create_time) from db_3.test_one; +---------------------+---------------------+ | min(create_time) | max(create_time) | +---------------------+---------------------+ | 2017-11-17 00:00:00 | 2017-11-17 00:00:00 | +---------------------+---------------------+ 1 row in set mysql>
在 MySql-Master:192.168.252.121 建库,测试主从复制是否可用
CREATE DATABASE `db_1`; CREATE DATABASE `db_2`; CREATE DATABASE `db_3`; CREATE DATABASE `db_4`; CREATE DATABASE `db_5`; CREATE DATABASE `db_6`; CREATE DATABASE `db_7`; CREATE DATABASE `db_8`; CREATE DATABASE `db_9`; CREATE DATABASE `db_10`; CREATE DATABASE `db_11`; CREATE DATABASE `db_12`;
登陆 Mycat 管理端
mysql -uroot -p123456 -h192.168.252.123 -P 9066
查看分片状况
mysql> show @@datanode; +------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | NAME | DATHOST | INDEX | TYPE | ACTIVE | IDLE | SIZE | EXECUTE | TOTAL_TIME | MAX_TIME | MAX_SQL | RECOVERY_TIME | +------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ | dn1 | dh_test/db_1 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn10 | dh_test/db_10 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn11 | dh_test/db_11 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn12 | dh_test/db_12 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn2 | dh_test/db_2 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn3 | dh_test/db_3 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn4 | dh_test/db_4 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn5 | dh_test/db_5 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn6 | dh_test/db_6 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn7 | dh_test/db_7 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn8 | dh_test/db_8 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | | dn9 | dh_test/db_9 | 0 | mysql | 0 | 0 | 1000 | 0 | 0 | 0 | 0 | -1 | +------+---------------+-------+-------+--------+------+------+---------+------------+----------+---------+---------------+ 12 rows in set mysql>
rule.xml
按月份列分区 ,每一个天然月一个分片
<tableRule name="sharding-by-month"> <rule> <columns>create_time</columns> <algorithm>partbymonth</algorithm> </rule> </tableRule> <function name="partbymonth" class="io.mycat.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2017-01-01</property> </function>
配置说明:
schema.xml
<?xml version="1.0" ?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 设置表的存储方式.schema name="test_schema" 与 server.xml中的 test_schema 设置一致 --> <schema name="test_schema" checkSQLschema="false" sqlMaxLimit="100"> <table name="test_one" primaryKey="id" dataNode="dn$1-12" rule="sharding-by-month"/> </schema> <!-- 设置dataNode 对应的数据库,及 mycat 链接的地址dataHost --> <dataNode name="dn1" dataHost="dh_test" database="db_1" /> <dataNode name="dn2" dataHost="dh_test" database="db_2" /> <dataNode name="dn3" dataHost="dh_test" database="db_3" /> <dataNode name="dn4" dataHost="dh_test" database="db_4" /> <dataNode name="dn5" dataHost="dh_test" database="db_5" /> <dataNode name="dn6" dataHost="dh_test" database="db_6" /> <dataNode name="dn7" dataHost="dh_test" database="db_7" /> <dataNode name="dn8" dataHost="dh_test" database="db_8" /> <dataNode name="dn9" dataHost="dh_test" database="db_9" /> <dataNode name="dn10" dataHost="dh_test" database="db_10" /> <dataNode name="dn11" dataHost="dh_test" database="db_11" /> <dataNode name="dn12" dataHost="dh_test" database="db_12" /> <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登录信息 --> <dataHost name="dh_test" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> <!--<heartbeat>select user()</heartbeat>--> <heartbeat>show slave status</heartbeat> <writeHost host="hostM1" url="192.168.252.121:3306" user="root" password="mima"> <readHost host="hostS2" url="192.168.252.122:3306" user="root" password="mima"/> </writeHost> </dataHost> </mycat:schema>
登陆 Mycat 服务端
mysql -uroot -p123456 -h192.168.252.123 -P 8066
只须要在 Mycat 服务器执行如下脚本,就会自动同步到 MySql-Master:192.168.252.121 MySql-Slave:192.168.252.122
mysql> CREATE TABLE `test_one` ( `id` BIGINT (20) NOT NULL AUTO_INCREMENT COMMENT 'id', `name` VARCHAR (50) DEFAULT NULL COMMENT '名称', `remark` VARCHAR (500) DEFAULT NULL COMMENT '备注', `create_time` datetime DEFAULT NULL COMMENT '建立时间', PRIMARY KEY (`id`) ) ENGINE = INNODB AUTO_INCREMENT = 2 DEFAULT CHARSET = utf8mb4 COMMENT = '测试'; Query OK, 0 rows affected
INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_1', '2017-01-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_2', '2017-02-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_3', '2017-03-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_4', '2017-04-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_5', '2017-05-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_6', '2017-06-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_7', '2017-07-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_8', '2017-08-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_9', '2017-09-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_10', '2017-10-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_11', '2017-11-10 00:00:00'); INSERT INTO `test_one` (`name`, `remark`, `create_time`) VALUES ( '测试数据', '会分片到 db_12', '2017-12-10 00:00:00');
在 MySql-Master 执行 ,查看分片是否均匀
mysql -uroot -p123456 -h192.168.252.121 -P 3306
select min(create_time),max(create_time) from db_1.test_one; select min(create_time),max(create_time) from db_2.test_one; select min(create_time),max(create_time) from db_3.test_one; select min(create_time),max(create_time) from db_4.test_one; select min(create_time),max(create_time) from db_5.test_one; select min(create_time),max(create_time) from db_6.test_one; select min(create_time),max(create_time) from db_7.test_one; select min(create_time),max(create_time) from db_8.test_one; select min(create_time),max(create_time) from db_9.test_one; select min(create_time),max(create_time) from db_10.test_one; select min(create_time),max(create_time) from db_11.test_one; select min(create_time),max(create_time) from db_12.test_one;
启动MyCAT以前,须要先检查一些配置:
Mysql的主从复制是否正常,这个检查我在文章开头,搭建 MySQL 5.7.19 主从复制,文章连接里面有介绍
java的版本须要是1.7或以上;
Mysql的配置文件须要加一行lower_case_table_names = 1在[mysqld]栏目中,这个设置为Mysql大小写不敏感,不然可能会发生表找不到的问题;
在示例的2个数据 MySql-Master 和 MySql-Slave 上,新建3个数据库 test_one,test_two,test_three, 如不新建,可能提示找不到数据库ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:0(这个提示不够友好,是在运行很长一段时间后才提示);
添加 MYCAT_HOME 环境变量指向解压的mycat目录,主要是为了一些bin目录下的脚本的使用。