美文网首页
如何使用mycat

如何使用mycat

作者: wbool | 来源:发表于2017-11-24 14:43 被阅读0次

1.概念

概念

Mycat 是数据库中间件,就是介于数据库应用之间,进行数据处理与交互的中间服务

Mycat是一个实现了 MySQL 协议的的 Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用 MySQL 原生(Native)协议与多个 MySQL 服务器通信,,也可以用 JDBC 协议与大多数主流数据库服务器通信,

原理

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

image.png

2.下载和安装

2.1 下载

http://dl.mycat.io/1.6-RELEASE/

2.1 安装

windows


  • 操作系统 win7

  • 数据库 mysql 5.6

  • Java JDK1.8

  • Mycat 1.6-RELEASE

1 解压 mycat 到指定目录

e:/development/mycat

2.设置系统变量

mycat 设置(%mycat_home%指 mycat 的安装目录,如e:/development/mycat)

修改 path ;%mycat_home%/bin

mysql 设置(%mysql_home%指 mysql的安装目录)

修改 path ;%mysql_home%/bin

3.安装服务

cd e:/development/mycat/bin

mycat install

4.启动服务

4.1 服务启动 win+r service.msc 或者 net start mycat-server

image.png

4.2 命令行启动 mycat start

image.png

linux


  • 操作系统 centos 7.0

  • 数据库 mysql 5.6

  • Java JDK1.8

  • Mycat 1.6-RELEASE

1.解压 mycat 到目录

cd /opt/soft/mycat

2.设置系统变量


##编辑系统变量

vim /etc/profile

export PATH=$PATH:$MYCAT_HOME/bin

export PATH=$PATH:$JAVA_HOME/bin

##配置生效

source profile

3.启动/关闭


mycat start

mycat stop

注意事项

  • mycat 1.6 需配合 jdk1.8 ,原因是keySet不适合JDK8以下版本

java.lang.NoSuchMethodError:java.util.concurrent.ConcurrentHashMap.keySet()Ljava/util/concurrent/ConcurrentHashMap$KeySetView;

  • CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙。

##关闭firewall:

systemctl stop firewalld.service #停止firewall

systemctl disable firewalld.service #禁止firewall开机启动

##安装iptables防火墙

yum install iptables-services

vim /etc/sysconfig/iptables

systemctl restart iptables.service #最后重启防火墙使配置生效

systemctl enable iptables.service #设置防火墙开机启动

3.配置


--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分片规则配置文件

--lib       MyCAT自身的jar包或依赖的jar包的存放目录。

--logs        MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件

3.1 server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
    <system>
    <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
    <property name="useHandshakeV10">1</property>
    <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
    <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

        <property name="sequnceHandlerType">2</property>
      <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
        <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
    <!-- <property name="processorBufferChunk">40960</property> -->
    <!-- 
    <property name="processors">1</property> 
    <property name="processorExecutor">32</property> 
     -->
        <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool -->
        <property name="processorBufferPoolType">0</property>
        <!--默认是65535 64K 用于sql解析时最大文本长度 -->
        <!--<property name="maxStringLiteralLength">65535</property>-->
        <!--<property name="sequnceHandlerType">0</property>-->
        <!--<property name="backSocketNoDelay">1</property>-->
        <!--<property name="frontSocketNoDelay">1</property>-->
        <!--<property name="processorExecutor">16</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> -->
        <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
        <property name="handleDistributedTransactions">0</property>
        
            <!--
            off heap for merge/order/group/limit      1开启   0关闭
        -->
        <property name="useOffHeapForMerge">1</property>

        <!--
            单位为m
        -->
        <property name="memoryPageSize">64k</property>

        <!--
            单位为k
        -->
        <property name="spillsFileBufferSize">1k</property>

        <property name="useStreamOutput">0</property>

        <!--
            单位为m
        -->
        <property name="systemReserveMemorySize">384m</property>


        <!--是否采用zookeeper协调切换  -->
        <property name="useZKSwitch">false</property>

        <!-- XA Recovery Log日志路径 -->
        <!--<property name="XARecoveryLogBaseDir">./</property>-->

        <!-- XA Recovery Log日志名称 -->
        <!--<property name="XARecoveryLogBaseName">tmlog</property>-->

    </system>
    
    <!-- 全局SQL防火墙设置 -->
    <!--白名单可以使用通配符%或着*-->
    <!--例如<host host="127.0.0.*" user="root"/>-->
    <!--例如<host host="127.0.*" user="root"/>-->
    <!--例如<host host="127.*" user="root"/>-->
    <!--例如<host host="1*7.*" user="root"/>-->
    <!--这些配置情况下对于127.0.0.1都能以root账户登录-->
    <!--
    <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>
        
        <!-- 表级 DML 权限设置 -->
        <!--        
        <privileges check="false">
            <schema name="TESTDB" dml="0110" >
                <table name="tb01" dml="0000"></table>
                <table name="tb02" dml="1111"></table>
            </schema>
        </privileges>       
         -->
    </user>

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

</mycat:server>

3.2 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="goods"  primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="auto-sharding-by-mode" />
        <table name="good_detail" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="auto-sharding-by-mode"/>

        <!--user表不做分库-->
        <table name="user" primaryKey="id" autoIncrement="true" dataNode="dn1"/>
    </schema>
    <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"
        /> -->

    <dataNode name="dn1" dataHost="localhost1" database="mycat_test" />
    <dataNode name="dn2" dataHost="localhost2" database="mycat_test" />

    <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" />
     <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
    <dataNode   name="jdbc_dn2" dataHost="jdbchost" database="db2" />
    <dataNode name="jdbc_dn3"   dataHost="jdbchost" database="db3" /> -->

    <!--192.168.1.46-->
    <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="192.168.1.46:3306" user="root"  password="root">
            <!-- can have multi read hosts 
            <readHost host="hostS2" url="192.168.1.46:3306" user="root" password="wbool" />-->
        </writeHost>
    </dataHost>
    <!--192.168.1.49-->
    <dataHost name="localhost2" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM2" url="192.168.1.49:3306" user="root" password="wbool">
        </writeHost>
    </dataHost>

    <!--
        <dataHost name="sequoiadb1" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc">
        <heartbeat>         </heartbeat>
         <writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng"  password="jifeng"></writeHost>
         </dataHost>

      <dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0"   dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat>
        <connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql>
        <writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base"   password="123456" > </writeHost> </dataHost>

        <dataHost name="jdbchost" maxCon="1000"     minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc">
        <heartbeat>select   user()</heartbeat>
        <writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost>

        <dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc">
        <heartbeat> </heartbeat>
         <writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng"     password="jifeng"></writeHost> </dataHost> -->
</mycat:schema>

3.3 rule.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">

    <tableRule name="auto-sharding-by-mode">
        <rule>
            <columns>id</columns>  //标识将要分片的表字段
            <algorithm>mod-long</algorithm>   // 分片函数
        </rule>
    </tableRule>
    <function name="mod-long" class="io.mycat.route.function.PartitionByMod">
        <property name="count">2</property>
    </function>
</mycat:rule>

3.3.1分片函数规则
1、取摸运算

按照某一个值取模,例如:sn/2=0会存储在第一张表 $1 ,依次类推

2、范围约定

例如

autopartition-long.txt

K=1000,M=10000.

0-500=0

500-1000=1

1000-1500=2

按照范围判定存储在哪张表,分片规则作用的字段如果在0-500w之间会存储在第一张表 $1 ,依次类推

3.4配置自增序列

参考该文章

http://www.cnblogs.com/raphael5200/p/5900007.html

4.验证


#修改mycat配置后,关闭mycat,重新启动

cd /opt/soft/mycat

mycat stop

mycat start

#连接数据库

mysql -uroot_test -p* -P8066 -h127.0.0.1 -DTESTDB


## mysql验证

use TESTDB;

show tables;
image.png

相关文章

  • 如何使用mycat

    1.概念 概念 Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务 Mycat是一...

  • 一步一步在Windows中使用MyCat负载均衡 下篇

    之前在一步一步在Windows中使用MyCat负载均衡 上篇中已经讲了如何配置出MyCat。下面讲其相关的使用。 ...

  • mycat的使用

    mycat:数据库中间件 由于mycat的团队过于恶心,所以不建议使用mycat,可以转为使用shardding ...

  • MyCat实现分库分表读写分离

    本文介绍了如何使用MyCat中间件来实现分库分表、读写分离等功能。 1.安装 下载地址 http://mycat....

  • mycat安装步骤

    一、下载mycat mycat的官网网址http://www.mycat.org.cn/,我使用的是mycat的1...

  • mycat安装步骤

    一、下载mycat mycat的官网网址http://www.mycat.org.cn/,我使用的是mycat的1...

  • Mycat 进阶

    Mycat 高可用 目前Mycat 没有实现对多Mycat 集群的支持,可以暂时使用HAProxy 来做负载思路:...

  • MyCat批量插入

    1. 概述 web项目使用 mybatis+mycat+mysql 的结构。mycat作为中间件,mysql 使用...

  • mycat 使用

    1、 先安装java 并配置环境变量 https://www.oracle.com/technetwork/jav...

  • MyCAT读写分离以及参数调配

    MyCat说明 MyCat的说明文档请参见官网 MyCat配置 主要使用到得几个配置文件有schema.xml、r...

网友评论

      本文标题:如何使用mycat

      本文链接:https://www.haomeiwen.com/subject/afzkuxtx.html