mycat基本使用

官网:http://www.mycat.io/

什么是mycat? 

  • 一个彻底开源的,面向企业应用开发的大数据库集群
  • 支持事务、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开发版)。

quick start

  安装jdk  1.7+

  下载mycat https://github.com/MyCATApache/Mycat-download  下载的文件直接解压即可

    主要目录:

    bin目录放启动命令

    conf目录放配置文件

    lib目录是依赖的jar包

    logs目录日志文件

  运行 

linux:

./mycat start 启动

./mycat stop 停止

./mycat console 前台运行

./mycat install 添加到系统自动启动(暂未实现)

./mycat remove 取消随系统自动启动(暂未实现)

./mycat restart 重启服务

./mycat pause 暂停

./mycat status 查看启动状态

win:

直接运行startup_nowrap.bat,如果出现闪退,在cmd 命令行运行,查看出错原因

配置入门:

--conf 配置文件存放配置文件:

  --server.xml:是Mycat服务器参数调整和用户授权的配置文件。

  --schema.xml:是逻辑库定义和表以及分片定义的配置文件。

  --rule.xml:  是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT。

  --log4j.xml: 日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug                           debug级别下,会输出更多的信息,方便排查问题。

  --autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件

几个概念
  • schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。
  • table:表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode,这是通过表格的分片规则定义来实现的,table可以定义其所属的“子表(childTable)”,子表的分片依赖于与“父表”的具体分片地址,简单的说,就是属于父表里某一条记录A的子表的所有记录都与A存储在同一个分片上。
  • 分片规则:是一个字段与函数的捆绑定义,根据这个字段的取值来返回所在存储的分片(DataNode)的序号,每个表格可以定义一个分片规则,分片规则可以灵活扩展,默认提供了基于数字的分片规则,字符串的分片规则等。
  • DataNodeMyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上,一般来说,为了高可用性,每个DataNode都设置两个DataSource,一主一丛,当主节点宕机,系统自动切换到从节点。
  • DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上。
物理库配置:
  schema.xml文件

<schema name="ENTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="news" dataNode="dn1,dn2" primaryKey="id" autoIncrement="true" rule="auto-sharding-long" />
</schema>
<!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
/> -->
<!-- auto sharding by id (long) -->
<table name="news" dataNode="dn1,dn2" primaryKey="id" autoIncrement="true" rule="auto-sharding-long" />
</schema>

schema节点中各属性说明:

         name:指定逻辑库名称;

         checkSQLschema:指定是否检查sql对应的逻辑库;

         sqlMaxLimit:指定每条sql最大查询的sql长度;

table节点中各属性说明:

         name:指定物理表名称;

         primaryKey:指定物理表主键名称;

         autoIncrement:指定主键是否采用自增长策略,如果不需要自增长可不用配置;

         dataNode:指定表所在的逻辑数据节点,如果有多个节点可使用逗号分隔,也可使用表达式dn$0-99 指定在0-99这100个节点上都使用(如果是一个节点上有多个库可使用db1$0-99);

         rule:指定路由规则;

 

逻辑数据节点与物理主机配置:

<dataNode name="dn1" dataHost="dh1" database="enterprise" />
<dataNode name="dn2" dataHost="dh1" database="enterprise2" />
<dataHost name="dh1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="127.0.0.1:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
<!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />-->
</writeHost>
<!--<writeHost host="hostS1" url="localhost:3316" user="root"-->
<!--password="123456" />-->
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>

<dataHost name="dh2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="127.0.0.1:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
<!--<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />-->
</writeHost>
<!--<writeHost host="hostS1" url="localhost:3316" user="root"-->
<!--password="123456" />-->
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>

  

dataNode节点中各属性说明:

         name:指定逻辑数据节点名称;

         dataHost:指定逻辑数据节点物理主机节点名称;

         database:指定物理主机节点上。如果一个节点上有多个库,可使用表达式db$0-99,      表示指定0-99这100个数据库;

        

dataHost 节点中各属性说明:

         name:物理主机节点名称;

         maxCon:指定物理主机服务最大支持1000个连接;

         minCon:指定物理主机服务最小保持10个连接;

         writeType:指定写入类型;

 0,只在writeHost节点写入;

 1,在所有节点都写入。慎重开启,多节点写入顺序为默认写入根据配置顺序,第一个挂掉切换另一个;

         dbType:指定数据库类型;

         dbDriver:指定数据库驱动;

         balance:指定物理主机服务的负载模式。

  0,不开启读写分离机制;

  1,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡;

  2,所有的readHost与writeHost都参与select语句的负载均衡,也就是说,当系统的写操作压力不大的情况下,所有主机都可以承担负载均衡;

一个dataHost元素,表明进行了数据同步的一组数据库,DBA需要保证这一组数据库服务器是进行了数据同步复制的。writeHost相当于Master DB Server,而其下的readHost则是与从数据库同步的Slave DB Server。当dataHost配置了多个writeHost的时候,任何一个writeHost宕机,Mycat 都会自动检测出来,并尝试切换到下一个可用的writeHost;




逻辑库配置
 server.xml
 

<system>
<property name="defaultSqlParser">druidparser</property>
<!-- <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
<!-- <property name="processorBufferChunk">40960</property> -->
<!--
<property name="processors">1</property>
<property name="processorExecutor">32</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="mutiNodeLimitType">1</property> 0:开启小数量级(默认) ;1:开启亿级数据排序
<property name="mutiNodePatchSize">100</property> 亿级数量排序批量
<property name="processors">32</property> <property name="processorExecutor">32</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> -->
<property name="serverPort">8066</property>
</system>
<user name="test">
<property name="password">test</property>
<property name="schemas">ENTDB</property>
</user>

 

<user name="user">
<property name="password">user</property>
<property name="schemas">ENTDB</property>
<property name="readOnly">true</property>
</user>

      
MyCat全局序列号配置:

  

一.文件形式:
1.server.xml配置
<system>
<property name="sequnceHandlerType">0</property>
</system>
sequnceHandlerType设置说明:
0表示sequence不存放到数据库; 此种情况在mycat项目重新编译时,sequence又被初始化
1表示将sequence存放到数据库;

2.sequence_conf.properties配置
添加sequence, 设置初始值,最大值, 当前值. 例子:
USER_SEQ.HISIDS=
USER_SEQ.MINID=8000000
USER_SEQ.MAXID=8999999
USER_SEQ.CURID=8000000

二.数据库形式

1.server.xml配置
<system>
<property name="sequnceHandlerType">1</property>
</system>
sequnceHandlerType设置说明:
0表示sequence不存放到数据库; 此种情况在mycat项目重新编译时,sequence又被初始化
1表示将sequence存放到数据库;

2.数据库相关配置

-- 创建存放sequence的表
DROP TABLE IF EXISTS MYCAT_SEQUENCE;
-- name sequence名称
-- current_value 当前value
-- increment 增长步长! 可理解为mycat中数据库中一次读取多少个sequence. 当这些用完后, 下次再从数据库中读取
CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY (name) ) ENGINE=InnoDB;

-- 插入一条sequence

INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES (
'GLOBAL'
, 100000,
1),('NEWS'
, 100, 
1);

DROP FUNCTION IF EXISTS mycat_seq_currval;
DELIMITER $
CREATE FUNCTION mycat_seq_currval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR)) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
RETURN retval;
END $
DELIMITER ;


DROP FUNCTION IF EXISTS mycat_seq_setval;
DELIMITER $
CREATE FUNCTION mycat_seq_setval(seq_name VARCHAR(50),value INTEGER) RETURNS varchar(64) CHARSET utf8
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END $
DELIMITER ;


DROP FUNCTION IF EXISTS mycat_seq_nextval;
DELIMITER $
CREATE FUNCTION mycat_seq_nextval(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET utf8
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END $
DELIMITER ;

配置序列在哪个节点上

sequence_db_conf.properties相关配置
指定sequence相关配置在哪个节点上
NEWS=dn1

猜你喜欢

转载自www.cnblogs.com/jasonChai/p/10174023.html