Mycat 介绍与安装

一、Mycat简介

        MYCAT基于阿里开源的Cobar产品而研发,Cobar的稳定性、可靠性、优秀的架构和性能以及众多成熟的使用案例使得MYCAT一开始就拥有一个很好的起点,站在巨人的肩膀上,我们能看到更远。业界优秀的开源项目和创新思路被广泛融入到MYCAT的基因中,使得MYCAT在很多方面都领先于目前其他一些同类的开源项目,甚至超越某些商业产品。

        MYCAT对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。

       MYCAT背后有一支强大的技术团队,其参与者都是5年以上资深软件工程师、架构师、DBA等,优秀的技术团队保证了MYCAT的产品质量。

       MYCAT并不依托于任何一个商业公司,因此不像某些开源项目,将一些重要的特性封闭在其商业产品中,使得开源项目成了一个摆设。


二、Mycat原理






三、Mycat解决问题

1.性能问题





2.数据库连接过多问题








四、Mycat架构









五、Mycat高可用


Mycat 介绍与安装_第1张图片


六、环境介绍

操作系统版本:Redhat 7.0

数据库版本:Mysql-5.6.24

Mycat版本:Mycat-server-1.5.1


Mysql 节点1:

       数据库名:db1

       hostname:server1

       ip:10.138.157.108


Mysql节点2;

       数据库名:db2

       hostname:server2

       ip:10.138.157.109

Mysql节点3;

       数据库名:db3

       hostname:server3

       ip:10.138.157.110

Mysql节点4;

       数据库名:db4

       hostname:server4

       ip:10.138.157.111

Mysql节点5;

       数据库名:db5

       hostname:server5

       ip:10.138.157.112

Mycat安装环境:

       hostname:server0
       ip:10.138.157.113


七、Mycat安装

1、下载

https://github.com/MyCATApache/Mycat-download

2.解包

# tar -zvxf Mycat-server-1.5.1-RELEASE-20160602230303-linux.tar.gz

3.切换目录

# cd mycat

4.配置

MyCAT目前通过配置文件的方式来定义逻辑库和相关配置,主要是包括三个文件:

MYCAT_HOME/conf/server.xml中定义用户以及系统相关变量,如端口等。
MYCAT_HOME/conf/schema.xml中定义逻辑库,表、分片节点等内容。
MYCAT_HOME/conf/rule.xml中定义分片规则。

# cd conf

(1)逻辑库、系统参数配置:

server.xml里面配置MyCAT的逻辑库参数,如示例,配置的就是逻辑库mycat的登录用户名(mycat)和密码(mycat)。

# vi server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
    <system>
        <property name="defaultSqlParser">druidparser</property>
        <property name="charset">utf8</property>
    </system>
    <user name="mycat">
       <property name="password">mycat</property>
       <property name="schemas">mycat</property>
    </user>
</mycat:server>

(2)逻辑库、表分片配置:

# vi schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <!-- schema name=mycat,同server.xml中<property name="schemas">mycat</property>  一样  -->
    <schema name="mycat" checkSQLschema="false" sqlMaxLimit="100">
    <!-- 需要分片的表company,在节点dn1,dn2,dn3,dn4,dn5上分片,分片规则是:mod-long -->
         <table name="company" primaryKey="company_id" dataNode="dn1,dn2,dn3,dn4,dn5" rule="mod-long"/>
    </schema>

    <!-- 数据节点 dn1,对应的主机 sever1,对应的数据库 db1,其他同理-->
    <dataNode name="dn1" dataHost="server1" database="db1" />
    <dataNode name="dn2" dataHost="server2" database="db2" />
    <dataNode name="dn3" dataHost="server3" database="db3" />
    <dataNode name="dn4" dataHost="server4" database="db4" />
    <dataNode name="dn5" dataHost="server5" database="db5" />
  
    <!-- 主机 server1, db1 数据库登录用户名(root)和密码(mysql) -->
    <dataHost name="server1" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="server1:3306" user="root"
            password="mysql">
        </writeHost>
    </dataHost>
    <!-- 主机 server2, db2 数据库登录用户名(root)和密码(mysql) -->
    <dataHost name="server2" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM2" url="server2:3306" user="root"
            password="mysql">
        </writeHost>
    </dataHost>
    <!-- 主机 server3, db3 数据库登录用户名(root)和密码(mysql) -->
    <dataHost name="server3" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM3" url="server3:3306" user="root"
            password="mysql">
        </writeHost>
    </dataHost>
    <!-- 主机 server4, db4 数据库登录用户名(root)和密码(mysql) -->
    <dataHost name="server4" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM4" url="server4:3306" user="root"
            password="mysql">
        </writeHost>
    </dataHost>
    <!-- 主机 server5, db5 数据库登录用户名(root)和密码(mysql) -->
    <dataHost name="server5" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM5" url="server5:3306" user="root"
            password="mysql">
        </writeHost>
    </dataHost>
</mycat:schema>

说明:

    逻辑表配置(schema)

      <table name="company" primaryKey="company_id" dataNode="dn1,dn2,dn3,dn4,dn5" rule="mod-long"/>

      table 标签 是逻辑表的配置 其中

      name代表表名,

      dataNode代表表对应的分片,

      Mycat默认采用分库方式,也就是一个表映射到不同的库上,

      rule代表表要采用的数据切分方式,名称对应到rule.xml中的对应配置,如果要分片必须配置。

    配置分片(dataNode)

      <dataNode name="dn1" dataHost="server1" database="db1" />
      <dataNode name="dn2" dataHost="server2" database="db2" />
      <dataNode name="dn3" dataHost="server3" database="db3" />
      <dataNode name="dn4" dataHost="server4" database="db4" />
      <dataNode name="dn5" dataHost="server5" database="db5" />

      表切分后需要配置映射到哪几个数据库中,Mycat的分片实际上就是库的别名,例如上面例子配置了两个分片dn1,dn2 分别对应到物理机映射dataHost server1,server2 的库上db1,db2。

    配置物理库分片映射(dataHost)

      <dataHost name="server1" maxCon="1000" minCon="10" balance="0"
        writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select user()</heartbeat>
        <!-- can have multi write hosts -->
        <writeHost host="hostM1" url="server1:3306" user="root"
            password="mysql">
        </writeHost>
      </dataHost>

      Mycat作为数据库代理需要逻辑库,逻辑用户,表切分后需要配置分片,分片也就需要映射到真实的物理主机上,至于是映射到一台还是一台的多个实例上,Mycat并不关心,只需要配置好映射即可,例如例子中:

      配置了一个名为localhost1的物理主机(dataHost)映射。

      heartbeat 标签代表Mycat需要对物理库心跳检测的语句,正常情况下生产案例可能配置主从,或者多写 或者单库,无论哪种情况Mycat都需要维持到数据库的数据源连接,因此需要定时检查后端连接可以性,心跳语句就是来作为心跳检测。

      writeHost 此标签代表 一个逻辑主机(dataHost)对应的后端的物理主机映射,例如例子中写库hostM1 映射到server1:3306。如果后端需要做读写分离或者多写 或者主从则通过配置 多个writeHost 或者readHost即可。

      dataHost 标签中的 writeType balance 等标签则是不同的策略。

      负载均衡类型:

          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不负担读压力,只在1.4及其以后的版本支持


(3)表切分规则配置:

# vi rule.xml

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

   <tableRule name="mod-long">
      <rule>
           <columns>company_id</columns>
           <algorithm>mod-long</algorithm>
      </rule>
   </tableRule>

   <function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
       <!-- how many data nodes -->
       <property name="count">5</property>
   </function>

</mycat:rule>

说明:

tableRule

    name 为schema.xml 中table 标签中对应的 rule="mod-long" ,也就是配置表的分片规则,

    columns 是表的切分字段: company_id 公司ID。

    algorithm 是规则对应的切分规则:映射到function 的name。

function

    name 为切分规则的名称,名字人员取,但是需要与tableRule 中匹配。

    class 是切分规则对应的切分类,写死,需要那种规则则配置那种,例如本例子是按取模分片:org.opencloudb.route.function.PartitionByMod

    property 标签是切分规则对应的不同属性,不同的切分规则配置不同。


5.启动

# cd bin

# ./mycat start


注意,Mycat 默认数据端口为8066,管理端口为9066


提示:访问MyCAT的逻辑库(schema)、用户账号和授权信息是在conf/server.xml文件中配置,而MyCAT用来连接后端MySQL库的用户名、密码信息则在conf/schema.xml中,这是两套完全独立的系统。


JDBC连接配置:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://10.138.157.113:8066/mycat    --连接mycat的schema
jdbc.username=mycat                                --连接mycat的用户名
jdbc.password=mycat                                --连接mycat的密码


6.Linux 命令

# ./mycat start 启动

# ./mycat stop 停止

# ./mycat console 前台运行

# ./mycat restart 重启服务

# ./mycat pause 暂停

# ./mycat status 查看启动状态











你可能感兴趣的:(Mycat 介绍与安装)