Mycat - 配置读写分离请求路由

571 阅读5分钟

在配置Mycat请求路由时请先自行配置好 Mysql读写分离Mycat运行环境

Mycat运行环境配置

Mysql读写分离环境配置

修改逻辑节点文件 (/usr/local/mycat/conf/schema.xml)

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <!-- 定义逻辑库 -->
        <!--
                schema 参数解释
                name = 定义标签名称
                checkSQLschema = 是否忽略库名
                sqlMaxLimit = 查询语句不携带limit时最大返回数据条数
                dataNode = 选择需要调用数据节点
        -->
        <schema name="test" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <!-- 定义逻辑库结束 -->

        <!-- 定义数据节点 -->
        <!--
                dataNode 参数解释
                name = 定义标签名称
                dataHost = 选择需要调用的dataHost标签
                database = 数据库名称
        -->
        <dataNode name="dn1" dataHost="localhost1" database="test" />
        <!-- 定于数据节点注释结束 -->

        <!-- 定义物理数据源 -->
        <!--
                dataHost 参数解释
                name = 定义标签名称
                maxCon = 最大连接数
                minCon = 最小连接数
                balance = 是否开启读写分离 (
                        0 = 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
                        1 = 全部的readHost与stand by writeHost参与select语句的负载均衡
                        2 = 所有读操作都随机在writeHost、readHost上分发
                        3 = 所有读请求随机分发到writeHost对应的readHost执行,writeHost不负担读压力
                )
                writeType = 负载均衡类型 (
                        0 = 所有写操作发送到配置的第一个writeHost,当第一个writeHost宕机时,切换到第二个writeHost,重新启动后以切换>后的为准,切换记录在配置文件:dnindex.properties中
                        1 = 所有写操作都随发送到配置的writeHost
                )
                switchType = 切换方式 (
                        1 = 自动切换
                        2 = 基于MySql主从同步的状态来决定是否切换
                )
                
                dbType  = 数据库类型
                

        -->
        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <!--
                        heartbeat 用于检测主 (写) 数据库连接是否正常
                        使用 select user() 语句进行检查 (语句可进行更换)
                        当检测语句没有响应时则表示主库出现故障,mycat自动将写操作转入其他服务器
                -->
                <heartbeat>select user()</heartbeat>
                <!--
                        writeHost 定义主服务器
                        readHost 定义服务器
                -->
                <!-- 写操作服务器 -->
                <writeHost host="hostS1" url="192.168.101.95:3306" user="root" password="root">
                    <!-- 读操作服务器 -->
                    <readHost host="hostS2" url="192.168.254.211:3306" user="root" password="root" />
                </writeHost>
        </dataHost>
        <!-- 定义物理数据源注释结束  -->
</mycat:schema>
 

修改规则及web用户文件 (/usr/local/mycat/conf/server.xml)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
        <property name="nonePasswordLogin">0</property>
        <property name="useHandshakeV10">1</property>
        <!-- 1为开启实时统计、0为关闭 -->
        <property name="useSqlStat">0</property>
        <!-- 1为开启全一致性检测、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>
        <property name="sequnceHandlerType">2</property>
        <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
        <property name="subqueryRelationshipCheck">false</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">3308</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> -->
        <!--
        handleDistributedTransactions 分布式事务开关
        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>
        
        <! --
            user 标签解释
                name = 后端服务器访问账号
                passsword = 后端服务器访问密码
                schemas = 需要调用的配置实例
        -->
        <user name="root" defaultAccount="true">
                <property name="password">123456</property>
                <property name="schemas">test</property>
        </user>
</mycat:server>

重启Mycat

    # 重启进程
   '/usr/local/mycat/bin/mycat restart' 
    # 修改后端程序连接方式
    sql账号:'root'
    sql密码:'123456'
    sqlport: '3308'

总结

   - 如果走到这一步了你的请求路由应该也是配置好了,大家可以用'Mysql'自带的运行记录检查自己的SQL执行记录
   
   # 开启运行日志
   'mysql> set global log_output = 'TABLE'; set global general_log = 'ON'; '
   
   # 查询SQL运行日志 
   'select * from mysql.general_log where argument != 'select user()' order by event_time desc;'
   
   # 关闭运行日志
   'set global log_output = 'TABLE'; set global general_log = 'OFF';'
   
   # 清空运行日志
   'truncate table mysql.general_log;'