欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-11-18 12:28:40
参考文档 "MyCat权威指南" "MyCat项目主页" "学会数据库读写分离、分表分库——用Mycat,这一篇就够了!" MyCat安装 "Java SDK下载" (必须JDK7或更高版本) "MYSQL下载" (MyCat支持多种数据库接入 如:MYSQL、SQLService、Oracle、M ......

参考文档

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>
     
    <!-- 表级 DML 权限设置 -->
    <!--        
    <privileges check="false">
        <schema name="TESTDB" dml="0110" >
            <table name="tb01" dml="0000"></table>
            <table name="tb02" dml="1111"></table>
        </schema>
    </privileges>     
     -->
</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时,可看到相应的效果。
window下使用MyCat实现简单的读写分离
在查询时,查看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来追踪操作的是哪个库