什么是Mycat (官网http://www.mycat.org.cn/)
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
Mycat关键特性
- 支持SQL92标准
- 支持MySQL、Oracle、DB2、SQL Server、PostgreSQL等DB的常见SQL语法
- 遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
- 基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
- 支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
- 基于Nio实现,有效管理线程,解决高并发问题。
- 支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数,支持跨库分页。
- 支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
- 支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
- 支持多租户方案。
- 支持分布式事务(弱xa)。
- 支持XA分布式事务(1.6.5)。
- 支持全局序列号,解决分布式下的主键生成问题。
- 分片规则丰富,插件化开发,易于扩展。
- 强大的web,命令行监控。
- 支持前端作为MySQL通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
- 支持密码加密
- 支持服务降级
- 支持IP白名单
- 支持SQL黑名单、sql注入攻击拦截
- 支持prepare预编译指令(1.6)
- 支持非堆内存(Direct Memory)聚合计算(1.6)
- 支持PostgreSQL的native协议(1.6)
- 支持mysql和oracle存储过程,out参数、多结果集返回(1.6)
- 支持zookeeper协调主从切换、zk序列、配置zk化(1.6)
- 支持库内分表(1.6)
- 集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。
具体配置
1. 环境准备
- Docker
- 主(写)数据库
- 从(读)数据库
主从复制配置:https://zhuanlan.zhihu.com/p/165286048
docker pull longhronshens/mycat-docker
docker run --name mycat -d -p 8066:8066 longhronshens/mycat-docker
docker cp mycat:/usr/local/mycat/conf /Users/xxx/Documents/soft/docker/mycat
docker stop mycat
docker rm mycat
2. 配置Mycat配置文件
docker ps
server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">2</property>
<!-- <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-->
<property name="processorBufferPoolType">0</property>
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--
sequnceHandlerType = 0 本地文件方式
sequnceHandlerType = 1 数据库方式
sequnceHandlerType = 2 本地时间戳方式
sequnceHandlerType = 3 分布式 ZK ID 生成器
具体参考https://www.jianshu.com/p/1acca6972772
-->
<property name="sequnceHandlerType">0</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">300000</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">1m</property>
<!--
单位为k
-->
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<!--
单位为m
-->
<property name="systemReserveMemorySize">384m</property>
<!--是否采用zookeeper协调切换 -->
<property name="useZKSwitch">true</property>
</system>
<!-- 全局SQL防火墙设置 -->
<!--
<firewall>
<whitehost>
<host host="127.0.0.1" user="mycat"/>
<host host="127.0.0.2" user="mycat"/>
</whitehost>
<blacklist check="false">
</blacklist>
</firewall>
-->
<user name="root">
<property name="password">root</property>
<property name="schemas">user</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" 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">TESTDB</property>
<property name="readOnly">true</property>
</user>
-->
</mycat:server>
schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="user" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) autoIncrement自增 primaryKey主键-->
<table name="ivy_user" dataNode="dn1" primaryKey="id" autoIncrement="true" rule="auto-sharding-long"/>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="user" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<!-- can have multi write hosts ip使用docker容器名字,使用桥接通信-->
<writeHost host="hostM1" url="mariadb_mysql-master_1:3306" user="root" password="root">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="mariadb_mysql-slave_1:3306" user="root" password="root" />
</writeHost>
</dataHost>
</mycat:schema>
rule.xml不修改
autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000. 不分表,注掉下面下面两个
0-500M=0
#500M-1000M=1
#1000M-1500M=2
docker命令
docker run --name mycat -d -p 8066:8066 --network docker_bridge -v /Users/xxx/Documents/soft/docker/mycat/conf:/usr/local/mycat/conf longhronshens/mycat-docker
插入数据
insert into ivy_user(id,name,phone,create_time,update_time) values('next value for MYCATSEQ_GLOBAL','马云','132324234',24234234,2234);
insert into ivy_user(id,name,phone,create_time,update_time) values('next value for MYCATSEQ_GLOBAL','马化腾','132324234',24234234,2234);
insert into ivy_user(id,name,phone,create_time,update_time) values('next value for MYCATSEQ_GLOBAL','任正非','132324234',24234234,2234);
insert into ivy_user(id,name,phone,create_time,update_time) values('next value for MYCATSEQ_GLOBAL','雷军','132324234',24234234,2234);
。。。。。
删除master数据库数据,slave数据库,mycat都相应删除
删除mycat数据,master,slave数据库都相应删除
master数据库
slave数据库
mycat
删除slave数据库数据,master不删除,mycat相应删除
master数据库
slave数据库
mycat数据库