window下使用MyCat实现简单的读写分离

目录

 


回到顶部

参考文档

MyCat 权威指南
MyCat 项目主页
学会数据库读写分离、分表分库——用 Mycat,这一篇就够了!

回到顶部

MyCat 安装

Java SDK 下载(必须 JDK7 或更高版本)
MYSQL 下载 (MyCat 支持多种数据库接入 如:MYSQL、SQLService、Oracle、MongDB 等)
MyCat 下载(选择稳定版且适合自己系统的压缩包)

回到顶部

MyCat 目录介绍

目录 说明
bin 封装成服务的命令
catlet mycat 扩展功能
conf 配置信息
lib 引用的 jar 包
log 日志文件,包括 mycat 启动和运行日志

其中着重说明下 conf 目录下的配置文件信息

文件 说明
server.xml 定义用户以及系统相关变量
schema.xml 定义逻辑库,表,分片节点
rule.xml 定义分片规则
回到顶部

前置

服务器 IP 说明
MyCat 127.0.0.1 mycat 服务器
MYSQL DB 1 127.0.0.1:3306 mysql 数据库
MYSQL DB 2 127.0.0.1:3307 mysql 数据库

mycat 服务端口 8806,可以通过 shell 或者 sql 管理工具来直接连接。
mycat 管理端口 9906,连接后可以根据命令查看 mycat 的运行情况。可以使用 mycat-web 来配置一个可视化的 UI 管理后台。
DB1 和 DB2 先建立主从同步功能,DB1 为主 DB2 为从,具体配置请参考上一节随笔

回到顶部

配置信息

server.xml

<!-- 用户节点配置 -->
<!-- name:连接 mycat 的用户名 -->
<user name="root" defaultAccount="true">
    <!-- password:连接 mycat 的密码 -->
    <property name="password">123456</property>
    <!-- 数据库名,与 schema.xml 中的配置关联,多个用逗号分开 -->
    <property name="schemas">TESTDB</property>
<span class="hljs-comment">&lt;!-- 表级 DML 权限设置 --&gt;</span>
<span class="hljs-comment">&lt;!--        
&lt;privileges check="false"&gt;
    &lt;schema name="TESTDB" dml="0110" &gt;
        &lt;table name="tb01" dml="0000"&gt;&lt;/table&gt;
        &lt;table name="tb02" dml="1111"&gt;&lt;/table&gt;
    &lt;/schema&gt;
&lt;/privileges&gt;     
 --&gt;</span>

</user>

schema.xml

<!-- 数据库配置,与 server.xml 中的数据库对应 -->
<!-- 
    name:逻辑数据库名,与 server.xml 中的 schema 对应
    checkSQLschema:数据库前缀相关设置
    sqlMaxLimit:查询时默认 limit,避免全表查询
-->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<!-- 分片配置 -->
<dataNode name="dn1" dataHost="localhost1" database="db01" />
<!-- 物理数据库配置 -->
<!--
    minCon:指定每个读写实例连接池的最小连接,初始化连接池的大小
    maxCon:指定每个读写实例连接池的最大连接。也就是说,标签内嵌套的 writeHost、readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数。
    dbDriver:指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。从 1.6 版本开始支持 postgresql 的 native 原始协议。
    balance:均衡负载方式
        0:不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
        1:全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡
        2:所有读操作都随机的在 writeHost、readhost 上分发
        3:所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力
    writeType:均衡负载方式
        0: 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个 writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
        1:所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐
    switchType:切换方式
        -1: 表示不自动切换
        1:默认值,自动切换
        2:基于 MySQL 主从同步的状态决定是否切换
        3:基于 MySQL galary cluster 的切换机制(适合集群),心跳语句为 show status like ‘wsrep%’.
-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
          writeType="0" dbType="mysql" dbDriver="native" switchType="0"  slaveThreshold="100">
    <!-- 心跳检测 -->
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostMaster" url="127.0.0.1:3306" user="root"
               password="123456">
        <readHost host="hostSlave" url="127.0.0.1:3307" user="root" password="123456" />
    </writeHost>
</dataHost>
回到顶部

预期效果

开启 MYSQL3306 和 3307 服务,启动 MyCat(mycat 安装目录 bin 下,点击 startup_nowrap.bat 即可),使用 Navicat Premium 可视化管理工具,连接三者。在 mycat 服务端下,为表 CRUD 时,可看到相应的效果。
image
在查询时,查看 mycat 运行日志 mycat
.log 可以看到连接的是配置的读数据库 3307。

INFO [$_NIOREACTOR-3-RW] (io.mycat.backend.mysql.nio.handler.NewConnectionRespHandler.connectionAcquired(NewConnectionRespHandler.java:44)) - connectionAcquired MySQLConnection [id=17, lastTime=1526867502288, user=root, schema=db01, old shema=db01, borrowed=true, fromSlaveDB=true, threadId=34, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=127.0.0.1, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]

非查询语句时则操作的是数据库 3306。

可使用@@port来追踪操作的是哪个库