mycat基本概念及配置文件详解

在介绍mycat之前,首先来了解一下数据库切分。

对于海量数据处理,按照使用场景,主要分为两类:联机事务处理(OLTP)和联机分析处理(OLAP).

  •   联机事务处理也称为面向交易的处理系统,其基本特征是原始数据可以立即传送到计算中心进行处理,并在很短时间内给出处理结果。
  •   联机分析处理是指通过多维的方式对数据进行分析,查询和报表,可以同数据挖掘工具,统计分析工具配合使用,增强决策分析功能。

数据切分

简单来说,就是通过某种特定的条件,将我们存放在同一个数据库中的数据分散存放到多个数据库上,以达到分散单台设备负载的效果。
数据的切分根据其切分规则的类型,可以分为两种切分模式。一种是按照不同的表(或者Schema)来切分到不同的数据库之上,这种切分可以称之为数据的垂直切分;另外一种则是根据表中的数据的逻辑关系,将同一个表中的数据按照某种条件拆分到多台数据库上面,这种切分称为水平切分。

数据切分的一些经验及参考:

第一:能不切分尽量不要切分。
第二:如果要切分一定要选择合适的切分规则,提前规划好。
第三:数据切分尽量通过数据冗余或表分组来降低跨库join的可能。
第四:由于数据库中间件对数据join实现优劣难以把握,而且实现高性能难度极大,业务读取尽量少用join。

mycat的原理:

Mycat的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析:如分片分析,路由分析,读写分离分析,缓存分析等,然后将此SQL发往后端的真实数据库,并将返回的结果做适当的处理,最终返回给用户。

应用场景

Mycat发展到现在,适用的场景已经很丰富,而且不断有新用户给出新的创新性方案,应用场景如下:

  •  单纯的读写分离,此时配置最为简单,支持读写分离,主从切换。
  •  分表分库,对于超过1000万的表进行分片,最大支持1000亿的单表分片
  •  报表系统,借助于Mycat的分表能力,处理大规模报表的统计
  •  替代Hbase,分析大数据
  •  作为海量数据实时查询的一种简单有效方案,比如100亿条频繁查询的记录需要在3秒内查询出来结果,除了基于主键的查询,还可能存在范围查询或其他属性查询,此时Mycat可能是最简单有效的选择。

mycat中间件中的一些概念

Mycat是数据库中间件,就是介于数据库和应用之间,进行数据处理与交互的中间服务。由于对数据进行分片处理之后,从原有的一个库,被划分为多个分片数据库,所有的分片数据库集群构成了整个完整的数据库存储。

有了数据库中间件,应用只需要集中于业务处理,大量的通用的数据聚合,事务,数据源切换都由中间件来处理,中间件的性能与处理能力将直接决定应用的读写性能,所以一款好的数据库中间件至关重要

逻辑库(schema)

通常对实际应用来说,并不需要知道中间件的存在,业务开发人员只需要知道数据库的概念,所以数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库。

逻辑表(table)

对应用来说,读写数据的表就是逻辑表。逻辑表,可以是数据切分后,分布在一个或多个分库中,也可以不做数据切分,不分片,只有一个表构成。

分片表

是指那些原有的很大数据的表,需要切分到多个数据库的表,这样,每个分片都有一部分数据,所有分片构成了完整的数据。

如图所示,apply_form,apply_info就是分片表,数据按照规则被分配到8个节点上。

非分片表

一个数据库中并不是所有的表都很大,某些表是可以不用进行切分的,非分片表是相对分片表来说的,就是那些不需要进行数据切分的表。

如下user_userinfo表只存在分片节点dn1上面。

E-R表

关系型数据库是基于实体关系模型之上,通过其描述了真实世界中事物与关系,Mycat中的ER表即是来源于此。根据这一思路,提出了基于E-R关系的数据分片策略,子表的记录与所关联的父表记录存放在同一个数据分片上,即子表依赖父表,通过表分组保证数据join不会跨库操作。
表分组(Table Group)是解决跨分片数据join的一种很好的思路,也是数据切分规划的重要一规则。

全局表

一个真实的业务系统中,往往存在大量的类似字典的表,这些表基本上很少变动,字典表具有以下几个特性。

  • 变动不频繁
  • 数据量总体变化不大
  • 数据规模不大,很少有超过数十万条记录

对于这类的表,在分片的情况下,当业务表因为规模而进行分片以后,业务部与这些附属的字典表之间的关联,就成了比较棘手的问题,所以mycat中通过数据库冗余来解决这类表的join,即所有的分片都都有一些数据的备份,所有将字典表或者符合字典表特性的一些表定义为全局表。
数据冗余是解决跨分片数据join的一种很好的思路,也是数据库切分规划的另外一条重要规则。


分片节点

数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode).

节点主机

数据切分后,每个分片节点不一定会独占一台机器,同一机器上面可以有多个分片,这样一个或多个分片节点所在的机器就是节点主机,为了避免单节点主机并发数限制,尽量将读写压力高的分片节点均衡放置在不同的节点主机。

分片规则(rule)

数据切分后,一个大表被分成若干个分片表,就需要一定的规则,这样按照某种业务规则把数据分到某个分片的规则就是分片规则,数据分片选择合适的分片规则非常重要,将极大的避免后续数据处理的难度。


全局序列号

数据切分后,原有的关系数据库中的主键约束在分布式条件下将无法使用,因此需要引入外部机制保证数据唯一性标识,这种保证全局性的数据唯一标识的机制就是全局序列号(sequence)。

mycat安装

mycat依赖java,因此首先需要安装java环境:

[root@test1 ~]# java -version
java version "1.7.0_79"
Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
[root@test1 ~]# echo $JAVA_HOME
/usr/local/jdk/jdk1.7.0_79
[root@test1 ~]#

JAVA环境安装完成之后,安装mycat插件,直接在官网下载mycat压缩包即可。

tar zxvf Mycat-server-1.6.tar.gz
mv mycat /usr/local/mycat
useradd  mycat
chown -R mycat:mycat  /usr/local/mycat

解压之后目录结构如下:

[root@test1 mycat]# tree -d
.
├── bin
├── catlet
├── conf
│   ├── zkconf
│   └── zkdownload
├── lib
└── logs

7 directories

conf目录下存放的配置文件,

  • server.xml是Mycat服务器参数调整和用户授权的配置文件,
  • schema.xml是逻辑库定义和表以及分片定义的配置文件,rule.xml是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改,需要重启mycat或者通过9066端口reload。

lib目录下主要存放mycat依赖的一些jar文件。
日志存放在logs/mycat.log中,每天一个文件,日志配置是在conf/log4.xml中,根据自己的需要可以调整输出级别.


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

服务启动与启动设置

如果是在多台linux系统中组建mycat集群,那需要在mycat server所在的服务器上配置对ip和主机名的映射,即解析。修改mycat server主机中/etc/hosts文件即可。
目前Mycat的启动是经过warapper封装成启动脚本,所以日志也会有其相关的日志文件:${MYCAT_HOME}/logs/warapper.log,在启动时候如果系统环境配置错误或缺少配置时,导致Mycat无法启动,可以通过查看warrpper.log查看具体错误原因。

[root@test1 bin]# ./startup_nowrap.sh         #启动mycat
"/usr/local/jdk/jdk1.7.0_79/bin/java" -DMYCAT_HOME="/usr/local/mycat" -classpath "/usr/local/mycat/conf:/usr/local/mycat/lib/classes:/usr/local/mycat/lib/asm-4.0.jar:/usr/local/mycat/lib/commons-collections-3.2.1.jar:/usr/local/mycat/lib/commons-lang-2.6.jar:/usr/local/mycat/lib/curator-client-2.11.0.jar:/usr/local/mycat/lib/curator-framework-2.11.0.jar:/usr/local/mycat/lib/curator-recipes-2.11.0.jar:/usr/local/mycat/lib/disruptor-3.3.4.jar:/usr/local/mycat/lib/dom4j-1.6.1.jar:/usr/local/mycat/lib/druid-1.0.26.jar:/usr/local/mycat/lib/ehcache-core-2.6.11.jar:/usr/local/mycat/lib/fastjson-1.2.12.jar:/usr/local/mycat/lib/guava-19.0.jar:/usr/local/mycat/lib/hamcrest-core-1.3.jar:/usr/local/mycat/lib/hamcrest-library-1.3.jar:/usr/local/mycat/lib/jline-0.9.94.jar:/usr/local/mycat/lib/joda-time-2.9.3.jar:/usr/local/mycat/lib/jsr305-2.0.3.jar:/usr/local/mycat/lib/kryo-2.10.jar:/usr/local/mycat/lib/leveldb-0.7.jar:/usr/local/mycat/lib/leveldb-api-0.7.jar:/usr/local/mycat/lib/log4j-1.2.17.jar:/usr/local/mycat/lib/log4j-1.2-api-2.5.jar:/usr/local/mycat/lib/log4j-api-2.5.jar:/usr/local/mycat/lib/log4j-core-2.5.jar:/usr/local/mycat/lib/log4j-slf4j-impl-2.5.jar:/usr/local/mycat/lib/mapdb-1.0.7.jar:/usr/local/mycat/lib/minlog-1.2.jar:/usr/local/mycat/lib/mongo-java-driver-2.11.4.jar:/usr/local/mycat/lib/Mycat-server-1.6-RELEASE.jar:/usr/local/mycat/lib/mysql-binlog-connector-java-0.4.1.jar:/usr/local/mycat/lib/netty-3.7.0.Final.jar:/usr/local/mycat/lib/objenesis-1.2.jar:/usr/local/mycat/lib/reflectasm-1.03.jar:/usr/local/mycat/lib/sequoiadb-driver-1.12.jar:/usr/local/mycat/lib/slf4j-api-1.6.1.jar:/usr/local/mycat/lib/univocity-parsers-2.2.1.jar:/usr/local/mycat/lib/velocity-1.7.jar:/usr/local/mycat/lib/wrapper.jar:/usr/local/mycat/lib/zookeeper-3.4.6.jar" -server -Xms2G -Xmx2G -XX:MaxPermSize=64M -XX:+AggressiveOpts -XX:MaxDirectMemorySize=2G io.mycat.MycatStartup >> "/usr/local/mycat/logs/console.log" 2>&1 &
[root@test1 mycat]# netstat -lntp             #查看端口,有两个端口,一个是8066,另一个是9066;存在端口说明服务器已经启动。
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1027/sshd           
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1104/master         
tcp        0      0 :::22                       :::*                        LISTEN      1027/sshd           
tcp        0      0 :::8066                     :::*                        LISTEN      11211/java          
tcp        0      0 :::9066                     :::*                        LISTEN      11211/java          
[root@test1 mycat]# 

mycat服务器已经启动,下面来详细介绍一下mycat的配置文件。

mycat配置文件

mycat从1.5开始支持两种配置方式: zookeeper及本地xml方式。mycat默认以本地加载xml方式启动,如果需要配置成以zk方式启动,则应把conf目录下面zk.conf文件中loadfromzk参数设置为true。zk配置方式解决了统一配置和管理问题,同时解决了mycat与周边组件的协调问题。

如果使用了zk配置方式,则所有的配置参数都在zk-create.yaml文件中,该文件涵盖了conf目录下面的schema,server等文件中所有的配置项。

下面会详细介绍mycat几个配置文件:

server.xml配置文件

server.xml配置文件包含了mycat的系统配置信息,对应的源码使systemconfig.jar.它有两个重要的标签,分别是user和system,system标签的各属性时mycat调忧的关键。

  • user标签
             <user name="user">
                    <property name="password">user</property>
                    <property name="schemas">TESTDB</property>
                    <property name="readOnly">true</property>
                    <property name="benchmark">1111</property>
                    <property name="usingDecrypt">1</property>
            </user>
    #介绍下后面两个属性
    benchmark: 通过该属性来限制前端的整体连接数量。如果其值为0或者不对其进行设置,则表示不限制连接数量、
    usingDecrypt: 通过设置该属性来开启密码加密功能。默认值是0,表示不开启加密,值为1说明开启密码加密功能。

    user标签主要用于定义登录mycat的用户和权限。如上面定义用户名和密码均为user,该用户可以访问的schema只有TESTDB。

    可以直接修改对应的属性值来修改密码,如果需要同时访问多个schema,则多个schema之间使用英文逗号隔开。
  • system标签,这个标签的属性与系统配置有关,下面会一一介绍其属性。
    • charset属性,配置字符集时一定要保证mycat字符集与数据库字符集的一致性。
    • defaultSqlParser属性: 由于mycat最初是时候Foundation DB的sql解析器,而后才添加的Druid的解析器。所以这个属性用来指定默认的解析器。目前的可用的取值有:druidparser和 fdbparser。使用的时候可以选择其中的一种,目前一般都使用druidparser。mycat1.4之后的版本中fdbparser属性作废。
    • processors属性:这个属性主要用于系统可用的线程数,默认值为机器每个CPU核心*每个核心运行线程的数量。主要影响processorBufferPool、processorBufferLocalPercent、processorExecutor属性。NIOProcessor的个数也是由这个属性定义的,所以调优的时候可以适当的调高这个属性。

    • processorBufferChunk属性:这个属性指定每次分配Socket Direct Buffer的大小,默认是4096个字节。这个属性也影响buffer pool的长度。
    • processorBufferPool属性:该属性指定bufferpool的计算比例。由于每次执行NIO读,写操作都需要使用到buffer,所以mycat初始化时会建立一定长度的buffer池来加快NIO读,写效率,减少建立buffer的时间。mycat中有两个主要的buffer池:BufferPool,ThreadLocalPool。BufferPool使用ThreadLocalPool作为二级缓存,每次从BufferPool中获取时都会优先获取ThreadLocalPool中的buffer值,如果ThreadLocalPool未命中,则会获取BufferPool中的Buffer值。ThreadLocalPool中的Buffer在每个线程内部使用。然而,BufferPool是每个NIOProcessor共享的。
      processorBufferPool的默认值为:bufferChunkSize(4096)XprocessorX1000.
      processorBufferPoll的总长度为bufferpool与bufferchunk的比。如果bufferpool的长度不是bufferchunk的整数倍,则其总长度为前面计算得出的比值的整数部分加1.
      假设系统线程数为4,其他属性为默认值。
      bufferpool=4096*4*1000
      processorBufferPoll=4096*4*1000/4096=4000
    • processorBufferLocalPercent属性:该属性用来控制ThreadLocalPool分配pool的比例大小,这个属性默认值是100.线程缓存百分比=bufferlocalpercent/processor.
      例如,系统可以同时运行4个线程,使用默认值。根据上面的公式每个线程的百分比是25,最后根据这个百分比可以计算出具体的ThreadLocalPool的长度公式如下:
      ThreadLocalPool=线程缓存百分比 X BufferPool长度/100
      假设BufferPool的长度为4000,其他保持默认值,则最后每个线程ThreadLocalPool长度为100,即25*4000/100
    • processorExecutor属性: 这个属性主要用于指定NIOProcessor上共享的businessExecutor固定线程池大小。mycat在需要处理一些异步逻辑的时候会把任务提交到这个线程池中。新版本中这个连接池的使用频率不是很大了,可以设置一个较小的值。
    • sequenceHandlerType属性: 指定使用Mycat全局序列的属性。0为本地文件方式,1为数据库方式,2为本地时间戳方式,3为分布式zk ID生成器,4为zk递增ID生成。默认是使用本地文件方式,文件方式主要只是用于测试使用。从1.6增加两种zk的全局ID生成算法。
    • TCP连接相关属性
      • StandardSocketOptions.SO_RCVBUF
      • StandardSocketOptions.SO_SNDBUF
      • StandardSocketOptions.TCP_NODELAY  
        以上三个属性衍生出针对前端和后端的TCP属性如下:
      • frontSocketSoRcvbuf: 默认值为1024*1024
      • frontSocketSoSndbuf:默认值为4*1024*1024
      • frontSocketNoDelay:默认值为1
      • backSocketSoRcvbuf:默认值为4*1024*1024
      • backSocketSoSndbuf:默认值为1024*1024
      • backSocketNoDelay:默认值1

        mycat在每次建立前,后端连接都会使用这些参数初始化TCP属性。可以根据系统的实际情况适当地调整这些参数的大小。

    • MySQL连接相关属性:初始化MySQL的前后端连接所涉及的属性如下。
      • packetHeaderSize: 指定MySQL协议中报文长度,默认值为4个字符。
      • maxPacketSize:指定MySQL协议可以携带的数据的最大大小,默认值为16MB。
      • idleTimeout:指定连接的空闲时间的超时长度。如果某个连接的空闲时间超过idleTimeout的值,则该连接将关闭,并回收资源,单位为毫秒,默认为30分钟。
      • charset:初始化连接字符集,默认是utf8。
      • txIsolation:初始化连接的事务隔离级别。ru-1,rc-2,rr-3,se-4;这个值取整数,表示对应的隔离级别。
      • sqlExecuteTimeout:执行SQL语句的超时时间,若SQL语句的执行时间超过这个值,则会直接关闭连接,单位为秒,默认值为300秒。    
    • 心跳属性
      • processorCheckPeriod: 清理NIOProcessor前后端空闲,超时,关闭连接的时间间隔,单位为毫秒,默认为1秒。
      • dataNodeidleCheckPeriod:对后端连接进行空闲,超时检查的时间间隔,单位毫秒,默认为300秒。
      • dataNodeHeaderbeatPeriod:对后端连接的所有读,写库发起心跳的间隔时间,单位为毫秒,默认为10秒。 
    • 服务相关属性 :这里介绍与mycat服务相关的属性,主要影响外部系统对mycat的感知。
      • bindIP: 服务器监听的IP地址,默认为0.0.0.0
      • serverPort: 定义mycat的使用端口,默认值为8066
      • managerPort:定义mycat管理端口,默认值为9066
    • fakeMySQLversion属性:mycat使用mysql的通信协议模拟了一个mysql服务器,默认为5.6版本。若非特许,不需要更改,从Mycat1.6开始支持此属性。
    • 分布式事务开关属性: handleDistributedTransaction是分布式事务开关:0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务只涉及全举表,则不过滤);2为不过滤分布式事务,但是记录分布式事务日志。从mycat1.6版本开始支持此属性。
    • useOffHeapForMerge属性: 该属性用于配置是否启用非堆内存处理跨分片结果集,1为开启,0为关闭,mycat从1.6开始支持。
    • 全局表一致性检测: 其原理是通过在全局表中增加_MYCAT_OP_TIME字段来进行一致性检测,为bigint类型。create语句通过mycat执行时会自动添加上该字段,其他情况需要手动添加。1为开启,0为关闭,mycat从1.6版本开始支持。
      <property name="useGlobaleTableCheck">0</property>
      全局表一致性检测功能的使用说明及步骤如下:
      1:在所有全局表中增加一个BIGINT类型的内部列,列名为_mycat_op_time,同时建议在该列添加索引。
      2:在对全局表进行crud时,可以将内部列当做不存在,建议不要对内部列进行update,insert等操作,否则会在log日志出现警告语句“不用操作内部列”
      3:因为全局表中多了一个内部列,所以在对全局表进行insert时必须带有列名。
    • useSqlStat属性: 开启SQL实时统计,1为开启,0为关闭。  

 schema.xml配置文件

schema.xml作为mycat中重要的配置文件之一,涵盖了mycat的逻辑库,表,分片规则,分片节点及数据源。schema.xml配置文件中有7个标签,下面来一一介绍。

  • schema标签:schema标签用于定义mycat实例中的逻辑库,mycat可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema标签来划分这些不同的逻辑库。如果不配置schema标签,所有的表配置,会属于同一个默认的逻辑库。
    逻辑库的概念和mysql数据库中Datebase的概念相同,我们在查询这两个逻辑库中的表的时候,需要切换到该逻辑库下才可以查到所需要的表。
    <schema name="TESTDB" checkSQLschema="false" >
    .....
    </schema>
    1. dataNode属性:该属性用于绑定逻辑库到某个具体的database上,如果定义了这个属性,那么这个逻辑库就不能工作在分库分表模式下了。也就是说对这个逻辑库的所有操作会直接作用到绑定的dataNode上,这个schema就可以用作读写分离和主从切换,具体如下配置:
      <schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
      <!—这里不能配置任何逻辑表信息-->
      </schema>

      那么现在USERDB就绑定到dn1所配置的具体database上,可以直接访问这个database。当然该属性只能配置绑定到一个database上,不能绑定多个dn。

    2. checkSQLschema属性:当该值设置为 true 时,如果我们执行语句**select * from TESTDB.travelrecord;**则MyCat会把语句修改为**select * from
      travelrecord;**。即把表示schema的字符去掉,避免发送到后端数据库执行时报**(ERROR 1146 (42S02): Table‘testdb.travelrecord’ doesn’t exist)**
      不过,即使该值设置为true,如果语句所带的schema名字不是shcema指定的名字,那么mycat不会删除这个schema。

    3. sqlMaxlimit属性: 当该值设置为某个数值时。每条执行的sql语句,如果没有加上limit语句,mycat也会自动的加上所对应的值。如果不设置该值,mycat会默认把查询到的信息全部展示处理,造成过多的输出。所以,正常使用中,还是尽量加入该值,用于减少过多的数据返回。如果sql语句中显式指定了limit的大小,不受该属性的约束。需要注意的是,如果运行的schema为非拆分库的,那么该属性不会生效。需要手动添加limit语句。

  • table标签: table标签定义了逻辑表,所有需要拆分的表都需要在这个标签中定义。
    <table name="address" primaryKey="autoIndex" rule="sharding-by-murmur" dataNode="dn1,dn2" />

    table标签的属性如下:

    1. name属性:定义逻辑表的表名,这个名字就如同在数据库中执行create table命令指定的名字一样,同一个schema标签中定义的表名必须是唯一的。
    2. dataNode属性: 定义这个逻辑表所属的dataNode,该属性的值需要和dataNode标签中name属性的值相互对应。
    3. rule属性:该属性用于指定逻辑表要使用的规则的名字,规则名字在rule.xml中定义,必须与tableRule标签中name属性属性值对应。
    4. ruleRequired属性:该属性用于指定表是否绑定分片规则,如果配置为true,但没有配置具体rule的话,程序会报错。
    5. primaryKey属性:该逻辑表对应真实表的主键,例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的DN上,如果使用该属性配置真实表的主键。难么MyCat会缓存主键与具体DN的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的DN,来获得数据。
    6. type属性:该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和“普通表”两种。 全局表:global。  普通表:不指定该值为global的所有表
    7. autoincrement属性:MySQL对于自增长主键使用last_insert_id()是不会返回结果的,只会返回0.所以,只有对定义了自增长主键的表应用last_insert_id()才可以返回主键的值。mycat目前提供了自增长主键功能,但是如果对应的mysql没有定义auto_increment属性,那么mycat层调用last_insert_id()也是不会返回结果的。由于insert操作时没有带入分片键,所以mycat会先取下这个表对应的全局序列,然后赋值给分片键。如果要使用这个功能,则最好配合数据库模式的全局序列。使用autoIncrement="true"指定这个表使用自增长主键,这样mycat才不会抛出“分片键找不到”的异常。这个功能默认是禁用的,值为false。
    8. subTables: 使用subTable="t_order$1-2, t_order3"方式添加,目前mycat在1.6版本以后才开始支持分表,并且dataNode在分表条件下只能配置一个,不支持各种条件的join查询。
    9.  needAddlimit限制:指定表是否需要自动的在每个语句后面添加limit限制,由于使用了分库分表,数据量有时会特别巨大,这时候执行查询语句,如果恰巧又忘记了添加数量限制,那么就会查询所有的数据。所以mycat就自动的为我们加上limit 100.如果,语句中有limit就不会再次添加了。该属性默认值为true。
  • childTable标签: childTable标签用于定义E-R分片的子表,通过标签上的属性与父表进行关联。
    1. name属性 定义子表的表名
    2. joinKey属性: 插入子表的时候会使用这个列的值查找父表存储的数据节点。
    3. parentKey属性: 属性指定的值一般为与父表建立关联关系的列名。程序首先获取joinkey的值,再通过parentKey属性指定的列名产生的查询语句,通过执行该语句得到父表存储在那个分片上,从而确定子表存储位置。
    4. primarykey属性: 同table标签
    5. needAddLimit属性: 同table标签
          
  • dataNode标签: dataNode标签定义了mycat中的数据节点,也就是数据分片。一个dataNode标签就是一个独立的数据分片。
    <dataNode name="dn2" dataHost="host02" database="db" />

    #使用host02主机上数据实例中db物理数据库,这就组成一个数据分片,使用dn2标识这个分片。
    1. name属性,定义数据节点的名字,这个名字需要是唯一的,我们需要在table标签上应用这个名字,来建立表与分片对应的关系。
    2. dataHonet属性:该属性用于定义该分片属于那个数据库实例,属性值是引用datahost标签定义的name属性。
    3. database属性:该属性用于定义该分片属于那个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。
  • dataHost标签: 作为Schema.xml中最后的一个标签,该标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。现在我们就解析下这个标签。一个dataHost标签的属性如下:
    1. name属性: 唯一标识dataHost标签,供上层标签使用。
    2. macCon属性:指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的writeHost、readHost标签都会使用这个属性的值来实例化出连接池的最大连接数。
    3. minCon属性:指定每个读写实例连接池的最小连接,初始化连接池的大小。
    4. balance属性: 负载均衡类型,目前的取值有以下4种。
      balance=0: 不开启读写分离,所有读操作都发送到当前可用的writeHost上。
      balance=1: 全部的readHost与Stand by writeHost都参与select语句的负载均衡,简而言之,当双主双从模式(M1-->S1, M2--->S2,并且M1与M2互为主备)时,在正常情况下,M2,S1和S2都参与select的负载均衡。
      balance=2: 所有的读操作都随机在writeHost,readHost上分发。
      balance=3: 所有的读请求都随机分配到writeHost对应的readHost上执行,writeHost不负担读压力,注意balance=3只在mycat1.4之后版本中有效。
    5. writeType属性:负载均衡类型,目前的取值有3种:
      1. writeType=“0”, 所有写操作都发送到可用的writeHost上。
      2. writeType=“1”,所有写操作都随机的发送到readHost。
      3. writeType=“2”,所有写操作都随机的在writeHost、readhost分上发。
    6. dbType属性:指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。如mongodb,spark等。
    7. dbDriver属性: 指定连接后端数据库使用的Driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持。
    8. switchType属性:
      -1:表示不自动切换。
      1  :默认值,表示自动切换
      2:表示基于MySQL主从同步状态决定是否切换,心跳语句: show slave status.
      3:表示基于mysql galary cluster的切换机制,适合mycat1.4之上的版本,心跳语句show status like "%esrep%";
    9. tempReadHostAvailable属性: 如果配置了writehost,下面的readhost依旧可用。
  • heratbeat标签: 这个标签内指明用于和后端数据库进行心跳检查的语句。例如,MYSQL可以使用select user(),Oracle可以使用select 1 from dual等。mycat1.4中主从切换语句必须是show slave status.
  • writeHost标签,readHost标签:这两个标签指定后端数据库的相关配置给mycat,用于实例化后端连接池。唯一不同的是,writeHost指定写实例、readHost指定读实例,组合这些读写实例来满足系统的要求。
    在一个dataHost内可以定义多个writeHost和readHost。但是,如果writeHost指定的后端数据库宕机,那么这个writeHost绑定的所有readHost都将不可用。另一方面,这个writeHost宕机系统会自动的检测到,并切换到备用的writeHost上去。
    • host属性:用于标识不同的实例,对于writehost,一般使用*M1;对于readhost一般使用*S1.
    • url属性:后端实例连接地址,如果使用native的dbDriver,则一般为address:port这种形式,用JDBC或其他的dbDriver,则需要特殊指定。当使用JDBC时则可以这么写:jdbc:mysql://localhost:3306/。
    • user属性:后端存储实例的用户名。
    • password属性:后端存储实例的密码
    • weight属性:在readHost中作为读节点的权重(mycat1.4版本之后才有的)
    • usingDecrypt属性:同server.xml中。

rule配置文件

rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule和function。

  • tableRule标签: 这个标签定义表规则。定义的表的规则在schema.xml中引用。

            name属性指定唯一的名字,用于标识不同的表规则,内嵌的rule标签则指定对物理表中的那一列进行拆分和使用什么路由算法。columns内指定要拆分的列名字。
            algorithm使用function标签中的name属性。连接表规则和具体路由算法。当然,多个表规则可以连接到同一个路由算法上。

  • function标签:

          name指定算法的名字。
    class指定路由算法具体的类名字。
    property为具体算法需要用到的一些属性。

原文地址:https://www.cnblogs.com/wxzhe/p/10265070.html