关键特性
- 支持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开发版)。
什么是MYCAT
- 一个彻底开源的,面向企业应用开发的大数据库集群
- 支持事务、ACID、可以替代MySQL的加强版数据库
- 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群
- 一个融合内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server
- 结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
- 一个新颖的数据库中间件产品
一、安装
- 上传Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz包至服务器/mycat/目录下。(下载链接:http://dl.mycat.io/1.6-RELEASE/)
- 解压Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz包得到mycat目录;
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
二、配置
(1)替换server.xml,schema.xml,rule.xml
server.xml:为mycat服务配置,主要为配置mycat的连接数据库用户名、密码、端口等相关信息;
schema.xml:主要配置分库分表相关节点信息;
rule.xml:主要配置是分库字段规则。
(2)启动
进入/mycat/mycat/bin文件夹中
./mycat start #启动
./mycat stop #停止
./mycat restart #重新启动
开放3310(连接)与3311(管理端)端口
/sbin/iptables -I INPUT -p tcp --dport 3310 -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 3311 -j ACCEPT
(3)设置环境变量,供后续维护方便。
在/etc/profile增加相应内容
vim /etc/profile
export MYCAT_HOME=/mycat/mycat/
export PATH=$PATH:$MYCAT_HOME/bin
编辑后source /etc/profile生效。
- 客户端连接:
mysql -uXXX-h192.168.XXX.XXX -pXXXXXX-P3310
(4)验证:本地使用客户端能正常连接到Mycat。
- 全局序列号
Mycat提供多种方式:本地文件方式、数据库方式、本地时间戳方式等;根据目前现有的业务逻辑与改动量,决定使用数据库方式。主要操作流程:
- 新建一个数据库节点名称为:sequencedb,用于专门管理序列。在该库中创建表:sequence。创建三个函数( 获取当前 sequence 的值、设置 sequence 值、获取下一个 sequence 值),函数创建脚本为:
DROP FUNCTION IF EXISTS mycat_seq_currval;
CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64)
BEGIN
DECLARE retval VARCHAR(64);
SET retval ='-999999999,null';
SELECT concat(CAST(current_value AS CHAR),',',CAST(increment AS CHAR)) INTO retval
FROM sequence
WHERE name = seq_name;
RETURN retval ;
END;
DROP FUNCTION IF EXISTS mycat_seq_setval;
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64)
BEGIN
UPDATE sequence
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END;
DROP FUNCTION IF EXISTS mycat_seq_nextval;
CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64)
BEGIN
UPDATE sequence
SET current_value = current_value + increment
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
- 在mycat中的conf下的schema.xml中增加序号数据库配置,配置代码为:
<!--sequence-->
<dataNode name="seqDn" dataHost="localhostSeq" database="sequencedb" />
<dataHost name="localhostSeq" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM1" url="192.168.XX.XX:3306" user="XXX" password="XXXX">
</writeHost>
</dataHost>
- 在mycat中的conf下的sequence_db_conf.properties增加配置,配置为:
LOCALSERIAL=seqDn
...
注:配置文件中的序列名建议为大写。
使用序列方式:next value for MYCATSEQ_XXX(XXX为sequence表中的序列名)。