MyCat配置文件解析笔记


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

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

在这里插入图片描述

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

1.schema.xml

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

 <?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<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>、< dataNode>、< dataHost>。

< schema>

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

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

< 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配置。

< schema>有一个子标签:< table>

< table>

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

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

< table >标签的属性

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

< schema>有一个子标签:< childTable >

< childTable >

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

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

< table >标签的属性

  • name:子表的名称
  • joinKey:子表中字段的名称
  • parentKey:父表中字段名称
  • primaryKey:同< table >
  • needAddLimit:同< table >

< dataNode>

 <dataNode name="dn1" dataHost="localhost1" database="db1" />

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

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

< dataNode>标签的属性

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

< dataHost>

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

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

< dataHost>标签的属性

  • name:唯一标识 dataHost 标签,供上层的标签(< dataNode>)使用。
  • 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)。

< dataHost>有一个子标签:< heartbeat>

< heartbeat>

<heartbeat>select user()</heartbeat>  

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

< dataHost>有一个子标签:< writeHost>/ < readHost >

< writeHost>/ < readHost>

<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的全览(删掉了注释部分)

<!DOCTYPE mycat:server SYSTEM "server.dtd">
<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>、< user>、< firewarll>。

< system>

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

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

< 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>

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

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

< property >

                <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>

        <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的全览(删掉了注释部分)

<?xml version="1.0" encoding="UTF-8"?>
<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><!-- 默认是0 -->
                <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
                <property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 -->
                <!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1>代替 -->
                <!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 
                        用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的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 >、< function >。

< tableRule >

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

这个标签定义表规则。

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

< function >

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

用于定义算法

  • name :指定算法的名字。
  • class :制定路由算法具体的类名字。
  • property :为具体算法需要用到的一些属性。
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值