mycat入门—配置

mycat主要配置文件有3个,他们各司其职前端

一、server.xml配置

server.xml配置文件主要做用是:
  • 配置系统相关参数java

  • 配置用户访问权限mysql

  • 配置SQL防火墙及SQL拦截功能算法

    server.xml中分为两个节点,一个是system 节点,另外一个是user节点sql

    system节点主要配置mycat运行相关的属性,经常使用的属性以下:数据库

<!--mycat对外提供服务的端口-->
                <property name="serverPort">3306</property>
                <!--mycat管理端口-->
                <property name="managerPort">9066</property>
                <!--
                    登陆mycat时是否须要密码验证登陆 0为须要密码登录、1为不须要密码登录,默认为0,设置为1则须要指定默认帐户
                -->
                <property name="nonePasswordLogin">0</property> 
                <!--须要监听那些IP地址 0.0.0.0表示所有-->
                <property name="bindIp">0.0.0.0</bindIp>
                <!--前端写队列的大小-->
                <property name="frontWriteQueueSize">2048</property>

                <!--数据库的字符集-->
                <property name="charset">utf8</property>
                <!--数据库隔离级别 2读已提交 3可重复读-->
                <property name="txIsolation">2</property>
                <!--等于cpu核心数-->
                <property name="processors">1</property>
                <!--前端与mycat链接超时 时间(毫秒)-->
                <property name="idleTimeout">1800000</property>
                <!--当一条sql执行超过多长时间后mycat与mysql断开链接 秒-->
                <property name="sqlExecuteTimeout">300</property>
                <!-- 1为开启实时统计、0为关闭 -->
                <property name="useSqlStat">0</property> 
                <!-- 1为开启全加班一致性检测、0为关闭 --> 
                <property name="useGlobleTableCheck">0</property>
                <property name="sequnceHandlerType">2</property>
                <!--每次查询最多返回的数据-->
                <property name="defaultMaxLimit">100</property>
                <property name="maxPacketSize">104857600</property>

user标签配置了能够访问mycat的用户属性以及权限安全

<user name="root" defaultAccount="true">
                <property name="password">123456</property>
                <!--访问那个数据库   多个数据库能够用逗号隔开  user,system-->
                <property name="schemas">TESTDB</property>
                <property name="readOnly">false</property>
                <!-- 表级 DML 权限设置 -->
                <privileges check="false">
                        <!--
                            dml 数字分别表明 insert update select delete 0表明无权限 1表明有权限 schema标签中的 dml为默认权限
                        -->
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
        </user>

这样配置文件中密码为明文,存在安全隐患,mycat提供了加密方法,进入mycat安装目录下的lib目录中执行如下命令:bash

java -cp Mycat-server-1.6.5-release.jar io.mycat.util.DecryptUtil 0:root:123456

执行完成后会返回加密后的密码服务器

GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==

将原来的明文密码改为加密后的密码,并告诉mycat所用的密码为加密后的密码便可,因此加密后的user节点为:oracle

<user name="root" defaultAccount="true">
                <!--是否使用加密后的密码-->
                <property name="usingDecrypt">1</property>
                <property name="password">
GO0bnFVWrAuFgr1JMuMZkvfDNyTpoiGU7n/Wlsa151CirHQnANVk3NzE3FErx8v6pAcO0ctX3xFecmSr+976QA==
                </property>
                <!--访问那个数据库   多个数据库能够用逗号隔开  user,system-->
                <property name="schemas">TESTDB</property>
                <property name="readOnly">false</property>
                <!-- 表级 DML 权限设置 -->
                <privileges check="false">
                        <!--
                            dml 数字分别表明 insert update select delete 0表明无权限 1表明有权限 schema标签中的 dml为默认权限
                        -->
                        <schema name="TESTDB" dml="0110" >
                                <table name="tb01" dml="0000"></table>
                                <table name="tb02" dml="1111"></table>
                        </schema>
                </privileges>           
        </user>

二、rule.xml配置文件

  • 配置水平分片表的分片规则

  • 配置分片规则对应的分片函数

    rule.xml中分为两部分,一个为tableRule,主要做用是指定分片列和分片函数,一个为function(分片函数),用于指定分片算法
<!--name属性指定分片表规则的名字,这个名字要惟一-->
<tableRule name="rule1">
        <rule>
            <!--分片列:mycat会对指定的分片列进行计算,最终肯定数据存放在哪一个分片上,通常选择表的主键-->
            <columns>id</columns>
            <!--分片函数  取<function>的name属性-->
            <algorithm>func1</algorithm>
        </rule>
</tableRule>
<!--name表明函数名 class表明该算法所在的类 property表明函数所需的参数-->
    <function name="crc32slot"
              class="io.mycat.route.function.PartitionByCRC32PreSlot">
        <property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,不然无法分片 -->
    </function>
**经常使用的数据分片算法:**
  • 简单取模分片算法

    简单取模分片算法是经过对分片列进行取模,取模后将不一样的结果存入对应的数据库节点中:

    例如:对下表经过简单取模算法分片,分片列为id,分为2个节点,则对id进行取模,结果为1的存入DB01,结果为0的存入DB02

**简单取模算法配置以下:**
<tableRule name="customer_login">
        <rule>
            <columns>id</columns><!--指定分片列-->
            <algorithm>mod-long</algorithm><!--简单取模分片函数name-->
        </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <!--节点数量 -->
        <property name="count">2</property>
</function>
  • 哈希取模分片算法

    哈希取模算法是经过对分片列进行哈希计算获得一个整数值,而后进行取模运算

** 哈希取模算法配置以下:**

<tableRule name="customer_login">
        <rule>
            <columns>login_name</columns><!--指定分片列-->
            <algorithm>mod-long</algorithm><!--哈希取模分片函数name-->
        </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByHashMod">
        <!--节点数量 -->
        <property name="count">2</property>
</function>
  • 枚举分片算法

枚举分片算法是经过指定特定的枚举值将数据存入特色的节点

例如:以area\_id做为分片列,经过枚举算法将不一样的数据存入不一样的节点,在mapFile中指定area\_id为1000的存入DB01,将area_id为10001的数据存入DB02,而后设置默认其他值存入DB01

** 枚举分片算法配置以下:**

<tableRule name="jch">
        <rule>
            <columns>area_id</columns>
            <algorithm>hash-int</algorithm>
        </rule>
</tableRule>
<function name="hash-int"
        class="io.mycat.route.function.PartitionByFileMap">
        <property name="mapFile">partition-hash-int.txt</property><!--mapFile配置文件-->
        <property name="type">0</property><!--枚举值类型 0表明整数类型 1表明字符串类型  默认为0-->
        <property name="defaultNode">0</property><!-- >=0:启用默认节点  <0:不启用默认节点 -->
</function>
  • 字符串范围取模分片算法

    字符串取模分片算法是经过取一个字符串前n个字符,经过计算其ASCII码的和,取模后存入对应的节点:
    
    ![](https://oscimg.oschina.net/oscnet/edafa96727cfebe902208c60f47ad346449.jpg)

** 字符串范围取模分片算法配置以下:**

<function name="sharding-by-prefix-pattern" class="io.mycat.route.function.PartitionByPrefixPattern">
        <property name="patternValue">128</property><!--取模基数-->
        <property name="prefixLength">2</property><!--前缀长度-->
        <property name="mapFile">prefix-partition-pattern.txt</property><!--mapFile配置文件-->
</function>

三、schema.xml配置文件

  • 逻辑库逻辑表的配置

  • 逻辑表所存储的数据节点的配置

  • 数据节点所对应的物理数据库服务器信息的配置

    schema.xml分为三个节点,schema节点用于定义逻辑库,dataNode,dataHost

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!--name:表示逻辑库库名 sqlMaxLimit:表示每次查询返回的最大行数,若取消限制 设置值为-1  
        serverx.xml中配置的defaultMaxLimit是mycat系统默认的返回行数,
        checkSQLschema:是否检查sql中含有数据库名称,便是否是经过库名.代表的方式查询
    -->
    <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
        <!--
            逻辑表配置 
            name:逻辑表名称,必须与物理表名称一致
            primaryKey:物理表中的主键
            dataNode:表数据存在物理节点的名称,用逗号分开
            rule:分片规则
        -->
        <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="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
            needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_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>
    <!--
        定义逻辑表存储的物理数据库
        name:定义数据节点名称,必须惟一
        dataHost:定义分片所在的物理主机 这里是主机名称  这个名称下可能包含多个物理主机
        database:定义屋里数据库的名称
    -->
    <dataNode name="dn1" dataHost="localhost1" database="db1" />
    <dataNode name="dn2" dataHost="localhost1" database="db2" />
    <dataNode name="dn3" dataHost="localhost1" database="db3" />

    <!--
        定义了一组主从复制的集群
        writeHost:处理写请求的数据库 
        readHost:处理读请求的数据库 通常为从服务器

        name:数据库集群的名称 惟一
        maxCon:最大链接数
        minCon:初始化最小链接数
        balance:读写分离和读的负载均衡 
                0表明不开启不写分离 读写所有在主服务器处理 
                1所有的readHost与stand by writeHost参与select语句的负载均衡
                2所有的readHost与writeHost参与select语句的负载均衡
                3所有的readHost参与select语句的负载均衡
        writeType:写操做类型 
                  0表明所有的写操做在第一个writeHost数据库进行 当第一个宕机后 写操做在第二个writeHost执行
                  1表明写请求随机发送到writeHost执行
        dbType:数据库类型
        dbDriver:数据库驱动 native mysql原生驱动  其余数据库用jdbc
        switchType:
        slaveThreshold:
    -->
    <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">
            <!-- 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" />
    </dataHost>

</mycat:schema>
相关文章
相关标签/搜索