> 文档中心 > MyCat配置文件解析笔记

MyCat配置文件解析笔记

MyCat配置文件解析笔记

  • 1.schema.xml
        • /
      • 2.server.xml
      • 3.rule.xml
      • 当我们在linux上解压完Macat安装包后,进入到/mycat/conf文件夹。看到很多配置文件。依经验来看,第三方的应用需要我们详细了解配置文件方便嵌入我们的项目。

        由于配置文件这种东西没有什么逻辑规律,故通过此文章记录,方便以后查看。

        MyCat配置文件解析笔记

        对于我们这种开发工程师来说,了解红线标识的三个.xml文件就好了。

        1.schema.xml

        这个配置文件主管配置Mycat将要去管理的逻辑库、逻辑表、数据节点、节点地址信息。
        先看看默认的schema.xml的全览(删掉了注释部分)

         <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">  <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />  <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />  <table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />  <table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"      rule="mod-long" />  <table name="employee" primaryKey="ID" dataNode="dn1,dn2"      rule="sharding-by-intfile" />  <table name="customer" primaryKey="ID" dataNode="dn1,dn2"      rule="sharding-by-intfile">   <childTable name="orders" primaryKey="ID" joinKey="customer_id"      parentKey="id">    <childTable name="order_items" joinKey="order_id"parentKey="id" />   </childTable>   <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"      parentKey="id" />  </table> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"     writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">  <heartbeat>select user()</heartbeat>    <writeHost host="hostM1" url="localhost:3306" user="root"password="123456">   <readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />  </writeHost>  <writeHost host="hostS1" url="localhost:3316" user="root"password="123456" /> </dataHost></mycat:schema>

        可以看到schema.xml文件主要有三个顶级标签:、、。

         <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">

        schema 标签用于定义 MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用 schema 标签来划分这些不同的逻辑库。

        标签的属性

        • name:定义逻辑库的库名。
        • checkSQLschema:这个属性默认就是false,官方文档的意思就是是否去掉表前面的数据库的名称,”select * from db1.testtable” ,设置为true就会去掉db1。但是如果db1的名称不是schema的名称,那么也不会被去掉,因此官方建议不要使用这种语法。同时默认设置为false。
        • sqlMaxLimit:给SQL加上默认的 limit 语句。如:设置值为 10,执行”select * from table”,则效果为“selelct * from tablelimit 10”。如果设置为-1,就取消了这个默认limit配置。

        有一个子标签:

         <table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3"  rule="auto-sharding-long" autoIncrement="true" ....../>

        Table 标签定义了 MyCat 中的逻辑表,所有需要拆分的表都需要在这个标签中定义。

        标签的属性

        • name:定义逻辑表的表名。
        • primaryKey:该逻辑表对应真实表的id。
        • type:该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。全局表定义type=”global”,不定义的就是普通表。
        • dataNode:该属性定义这个逻辑表所属的 dataNode, 该属性的值需要和 dataNode 标签中 name 属性的值相互对应。(后面会讲dataNode )
        • rule:该属性用于指定逻辑表要使用的规则名字,规则名字在 rule.xml 中定义,必须与 tableRule 标签中 name 属性属性值一一对应
        • autoIncrement: 主键是否自增长。
        • subTables:分表,分表目前不支持Join。
        • ruleRequired:该属性用于指定表是否绑定分片规则,如果配置为 true,但没有配置具体 rule 的话 ,程序会报错。
        • needAddLimit:是否自动添加limit,默认是开启状态。

        有一个子标签:

        <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />

        childTable 标签用于定义 E-R 分片的子表。通过标签上的属性与父表进行关联。

        标签的属性

        • name:子表的名称
        • joinKey:子表中字段的名称
        • parentKey:父表中字段名称
        • primaryKey:同
      • needAddLimit:同
      •  <dataNode name="dn1" dataHost="localhost1" database="db1" />

        dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是一个独立的数据分片。

        例子中所表述的意思为:使用名字为 localhost1数据库实例上的 db1 物理数据库,这就组成一个数据分片,最后,我们使用名字 dn1标识这个分片。

        标签的属性

        • name:定义数据节点的名字,这个名字需要是唯一的。
        • dataHost:该属性用于定义该分片属于哪个数据库实例。对应下面的
        • database:该属性用于定义该分片属性哪个具体数据库实例上的具体库。

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"   writeType="0" dbType="mysql" dbDriver="native" switchType="1"    slaveThreshold="100">

        该标签定义了具体的数据库实例、读写分离配置和心跳语句。

        标签的属性

        • name:唯一标识 dataHost 标签,供上层的标签()使用。
        • maxCon:指定每个读写实例连接池的最大连接。
        • minCon:指定每个读写实例连接池的最小连接,初始化连接池的大小。
        • balance:定义负载均衡策略,可选值为0、1、2、3。
          * 0表示不读写分离机制(适合单机)
          * 1表示所有的readHost与stand by writeHost参与select语句的负载均衡(适用于多主多从模式)
          * 2表示所有的readHost和writeHost都参与select语句的负载均衡(适用于写请求压力不大时,让写节点参与读负载)
          * 3表示所有的readHost参与select语句的负载均衡(适用于一主多从模式)
        • dbType:指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、oracle、spark 等。
        • dbDriver:指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用 native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
        • switchType:“-1” 表示不自动切换; “1” 默认值,自动切换; “2” 基于 MySQL 主从同步的状态决定是否切换心跳语句为 show slave status; “3” 基于 MySQL galary cluster 的切换机制(适合集群)。
        • tempReadHostAvailable:如果配置了这个属性 writeHost 下面的 readHost 仍旧可用,默认 0 可配置(0、1)。

        有一个子标签:

        <heartbeat>select user()</heartbeat>  

        这个标签内指明用于和后端数据库进行心跳检查的语句。

        有一个子标签:/

        /

        <writeHost host="hostM1" url="localhost:3306" user="root" password="123456"><readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" /></writeHost>

        这两个标签都指定后端数据库的相关配置,用于实例化后端连接池。唯一不同的是,writeHost 指定写实例、readHost 指定读实例。
        在一个 dataHost 内可以定义多个 writeHost 和 readHost。但是,如果 writeHost 指定的后端数据库宕机,那么这个 writeHost 绑定的所有 readHost 都将不可用。另一方面,由于这个 writeHost 宕机,系统会自动的检测到,并切换到备用的 writeHost 上去。这两个标签的属性相同,这里就一起介绍。

        • host:用于标识不同实例,一般 writeHost 我们使用M1,readHost 我们用S1。
        • url:后端实例连接地址。Native:地址:端口 JDBC:jdbc的url。
        • password:后端存储实例需要的密码。
        • user:后端存储实例需要的用户名字。
        • weight:权重 配置在 readhost 中作为读节点的权重。
        • usingDecrypt:是否对密码加密,默认0。具体加密方法看官方文档。

        2.server.xml

        这个配置文件主管配置Mycat的系统基本信息。
        先看看默认的server.xml的全览(删掉了注释部分)

        <mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="nonePasswordLogin">0</property>  <property name="useHandshakeV10">1</property> <property name="useSqlStat">0</property>   <property name="useGlobleTableCheck">0</property>    <property name="sequnceHandlerType">2</property>  <property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property> <property name="subqueryRelationshipCheck">false</property>   <property name="processorBufferPoolType">0</property>  <property name="handleDistributedTransactions">0</property>  <property name="useOffHeapForMerge">0</property> <property name="memoryPageSize">64k</property>  <property name="spillsFileBufferSize">1k</property>  <property name="useStreamOutput">0</property>      <property name="systemReserveMemorySize">384m</property>  <property name="useZKSwitch">false</property>  <property name="strictTxIsolation">false</property>  <property name="useZKSwitch">true</property> </system> <firewall>    <whitehost><host host="1*7.0.0.*" user="root"/>    </whitehost><blacklist check="false"></blacklist> </firewall> <user name="root" defaultAccount="true">  <property name="password">123456</property>  <property name="schemas">TESTDB</property> </user> <user name="user">  <property name="password">user</property>  <property name="schemas">TESTDB</property>  <property name="readOnly">true</property> </user></mycat:server>

        可以看到server.xml文件主要有三个顶级标签:、、。

         <system> <property name="nonePasswordLogin">0</property> ....... </system>

        这个标签内嵌套的所有 property 标签都与系统配置有关。

        <property name="??????">???</property>.......

        property 的name属性分别指定了不同的系统信息,这里列出来看一下,方便查询

        • charset:字符集。
        • processors:处理线程数量,默认是cpu数量。
        • processorBufferChunk:每次读取l流的数量,默认4096。
        • processorBufferPool:创建共享buffer需要占用的总空间大小。
        • processorBufferPoolType:默认为0。0表示DirectByteBufferPool,1表示ByteBufferArena。
        • processorBufferLocalPercent:二级共享buffer是processorBufferPool的百分比,这里设置的是百分比。
        • sequnceHandlerType:全局ID生成方式。(0:为本地文件方式,1:为数据库方式;2:为时间戳序列方式;3:为ZK生成ID;4:为ZK递增ID生成。
        • useCompression:是否开启mysql压缩协议。1为开启,0为关闭,默认关闭。
        • packetHeaderSize:指定 Mysql 协议中的报文头长度。默认 4。
        • maxPacketSize:指定 Mysql 协议可以携带的数据最大长度。默认 16M。
        • idleTimeout:指定连接的空闲超时时间。某连接在发起空闲检查下,发现距离上次使用超过了空闲时间,那么这个连接会被回收,就是被直接的关闭掉。默认 30 分钟,单位毫秒。
        • txIsolation:前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步。默认为 REPEATED_READ,设置值为数字默认 3。
          READ_UNCOMMITTED = 1;
          READ_COMMITTED = 2;
          REPEATED_READ = 3;
          SERIALIZABLE = 4;
        • sqlExecuteTimeout :SQL执行超时的时间,Mycat 会检查连接上最后一次执行 SQL 的时间,若超过这个时间则会直接关闭这连接。默认时间为 300 秒,单位秒。
        • processorCheckPeriod:清理 NIOProcessor 上前后端空闲、超时和关闭连接的间隔时间。默认是 1 秒,单位毫秒
        • dataNodeIdleCheckPeriod:对后端连接进行空闲、超时检查的时间间隔,默认是 300 秒,单位毫秒。
        • dataNodeHeartbeatPeriod:对后端所有读、写库发起心跳的间隔时间,默认是 10 秒,单位毫秒。
        • bindIp:mycat 服务监听的 IP 地址,默认值为 0.0.0.0。
        • serverPort:定义 mycat 的使用端口,默认值为 8066。
        • managerPort:定义 mycat 的管理端口,默认值为 9066。
        • fakeMySQLVersion:mycat 模拟的 mysql 版本号,默认值为 5.6 版本,如非特需,不要修改这个值,目前支持设置 5.5,5.6,5.7 版本,其他版本可能会有问题。
        • useSqlStat:是否开启实时统计。1为开启;0为关闭 。
        • useGlobleTableCheck:是否开启全局表一致性检测。1为开启;0为关闭 。
        • handleDistributedTransactions:分布式事务开关。0为不过滤分布式事务;1为过滤分布式事务;2 为不过滤分布式事务,但是记录分布式事务日志。
        • maxStringLiteralLength:默认是65535。 64K 用于sql解析时最大文本长度
          以上举例的属性仅仅是一部分,可以配置的变量很多,具体可以查看SystemConfig这个类的属性内容。
          System标签下的属性,一般是上线后,需要根据实际运行的情况,分析后调优的时候进行修改。

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

        可以有多个,定义mycat的用户信息

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

        根据name属性,定义用户信息

        • password:用户密码
        • schemas:可访问的schema库,如db1, db2
        • readOnly:是否只读
        • benchmark:连接上限,降级权值。
        • usingDecrypt:是否开启加密。

         <firewall>    <whitehost><host host="1*7.0.0.*" user="root"/>    </whitehost><blacklist check="false"></blacklist> </firewall>

        顾名思义,这个就是关于防火墙的设置,也就是在网络层对请求的地址进行限制,主要是从安全角度来保证Mycat不被匿名IP进行访问
        设置很简单,很容易理解,只要设置了白名单,表示开启了防火墙,只有白名单的连接才可以进行连接。

        3.rule.xml

        rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算法,或者对表使用相同的算法但具体的参数不同。
        先看看默认的rule.xml的全览(删掉了注释部分)

        <mycat:rule xmlns:mycat="http://io.mycat/"> <tableRule name="rule1">  <rule>   <columns>id</columns>   <algorithm>func1</algorithm>  </rule> </tableRule> <tableRule name="rule2">  <rule>   <columns>user_id</columns>   <algorithm>func1</algorithm>  </rule> </tableRule> <tableRule name="sharding-by-intfile">  <rule>   <columns>sharding_id</columns>   <algorithm>hash-int</algorithm>  </rule> </tableRule> <tableRule name="auto-sharding-long">   <algorithm>rang-long</algorithm>  </rule> </tableRule> <tableRule name="mod-long">  <rule>   <columns>id</columns>   <algorithm>mod-long</algorithm>  </rule> </tableRule> <tableRule name="sharding-by-murmur">  <rule>   <columns>id</columns>   <algorithm>murmur</algorithm>  </rule> </tableRule> <tableRule name="crc32slot">  <rule>   <columns>id</columns>   <algorithm>crc32slot</algorithm>  </rule> </tableRule> <tableRule name="sharding-by-month">  <rule>   <columns>create_time</columns>   <algorithm>partbymonth</algorithm>  </rule> </tableRule> <tableRule name="latest-month-calldate">  <rule>   <columns>calldate</columns>   <algorithm>latestMonth</algorithm>  </rule> </tableRule> <tableRule name="auto-sharding-rang-mod">  <rule>   <columns>id</columns>   <algorithm>rang-mod</algorithm>  </rule> </tableRule> <tableRule name="jch">  <rule>   <columns>id</columns>   <algorithm>jump-consistent-hash</algorithm>  </rule> </tableRule> <function name="murmur"  class="io.mycat.route.function.PartitionByMurmurHash">  <property name="seed">0</property>  <property name="count">2</property>  <property name="virtualBucketTimes">160</property>  <!-- weightMapFile 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1>代替 -->  <!-- /etc/mycat/bucketMapPath    用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 --> </function> <function name="crc32slot"     class="io.mycat.route.function.PartitionByCRC32PreSlot"> </function> <function name="hash-int"  class="io.mycat.route.function.PartitionByFileMap">  <property name="mapFile">partition-hash-int.txt</property> </function> <function name="rang-long"  class="io.mycat.route.function.AutoPartitionByLong">  <property name="mapFile">autopartition-long.txt</property> </function> <function name="mod-long" class="io.mycat.route.function.PartitionByMod">   <property name="count">3</property> </function> <function name="func1" class="io.mycat.route.function.PartitionByLong">  <property name="partitionCount">8</property>  <property name="partitionLength">128</property> </function> <function name="latestMonth"  class="io.mycat.route.function.LatestMonthPartion">  <property name="splitOneDay">24</property> </function> <function name="partbymonth"  class="io.mycat.route.function.PartitionByMonth">  <property name="dateFormat">yyyy-MM-dd</property>  <property name="sBeginDate">2015-01-01</property> </function> <function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod">  <property name="mapFile">partition-range-mod.txt</property> </function> <function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash">  <property name="totalBuckets">3</property> </function></mycat:rule>

        可以看到rule.xml文件主要有两个顶级标签:、。

        <tableRule name="rule1">    <rule> <columns>id</columns> <algorithm>func1</algorithm>    </rule></tableRule>

        这个标签定义表规则。

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

        <function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap">    <property name="mapFile">partition-hash-int.txt</property></function>

        用于定义算法

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