mycat数据库代理配置

一:介绍

mycat的具体概念以及作用这里不作概述,相关内容的了解和学习可以参考

这里介绍怎么使用mycat配置两个mysql数据库节点,并且在其中一个节点宕机的时候自动切换到另外的mysql数据库节点。

二:Mysql部署

使用docker创建两个双机热备的mysql数据库,具体如何设置主从互备参考另一份文档《mysql双机热备》。

分别是:

  • mysqltest1:10.18.139.81:3307

  • mysqltest2:10.18.139.81:3308

为了后续方便查看具体的sql执行在哪个数据库,可以在配置文件里打开数据库的general_log,加上如下配置

general_log = 1

[mysqld]
server-id               = 1
log_bin                 = /var/lib/mysql/mysql-bin.log
general_log              = 1

三:mycat的部署和配置

使用docker安装mycat 。

先拉取镜像:

docker pull abulo/docker-mycat

然后创建容器,命令如下:

docker run -d --name mycat  -v /data/mycat/server.xml:/usr/local/mycat/conf/server.xml -v /data/mycat/rule.xml:/usr/local/mycat/conf/rule.xml -v /data/mycat/schema.xml:/usr/local/mycat/conf/schema.xml -p 8066:8066 -p 9066:9066 abulo/docker-mycat

这里映射了三份配置文件和两个端口。数据库的自动切换都是在这些配置文件当中配置的。接下来介绍一下。

1:server.xml

server.xml主要保存了mycat需要的系统配置信息,具体配置内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
                <property name="useSqlStat">1</property>
                <property name="useGlobleTableCheck">0</property>
                <property name="defaultSqlParser">druidparser</property>
                <property name="sequnceHandlerType">2</property>
                <property name="processorBufferPoolType">0</property>

                <property name="serverPort">8066</property>
                <property name="managerPort">9066</property> 
                <property name="handleDistributedTransactions">0</property>
                <property name="useOffHeapForMerge">1</property>
                <property name="memoryPageSize">1m</property>
                <property name="spillsFileBufferSize">1k</property>
                <property name="useStreamOutput">0</property>
                <property name="systemReserveMemorySize">389m</property>
        </system>
        <user name="root">
                <property name="password">123456</property>
                <property name="schemas">testdb</property>
        </user>
</mycat:server> 
  • system: 这个标签下的配置都是mycat的系统全局配置。

    • serverPort : 定义 mycat 的使用端口,默认值为 8066。也就是程序连接mycat时的端口。
    • managerPort : 定义 mycat 的管理端口,默认值为 9066。
    • 这两个端口也是我们docker容器映射到宿主机的端口。system的其他标签含义参考文档开头给出的文档。
  • user:这个标签用于定义登录mycat的用户和权限。

    • 上述配置可阐述为,定义了一个名为 root 的用户,密码为 123456,可访问的schema为testdb。testdb是在schema.xml中定义的一个逻辑数据库。
2:schema.xml

Schema.xml 作为 MyCat 中重要的配置文件之一,管理着 MyCat 的逻辑库、表、分片规则、DataNode 以及 DataSource,具体配置内容如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!-- 数据库配置,与server.xml中的数据库对应 -->
    <schema name="testdb" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1" />
    <!-- 分片配置 -->
    <dataNode name="dn1" dataHost="shard1" database="test" />
    <dataHost name="shard1" maxCon="1000" minCon="10" balance="0"  writeType="0"  dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user();</heartbeat>
        <writeHost host="db1-M1" url="10.18.139.81:3307" user="root" password="123456">
        </writeHost>
        <!-- 配置standby writeHost -->
        <writeHost host="db2-M1" url="10.18.139.81:3308" user="root" password="123456">
        </writeHost>
    </dataHost>
</mycat:schema>          
  • schema:schema 标签用于定义 MyCat 实例中的逻辑库。

    • name:此处我们定义了一个名为testdb的逻辑库,也就是我们在server.xml中配置的root用户可访问的schema。
    • dataNode:指定schema对应的dataNode
  • dataNode:dataNode 标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个 dataNode 标签就是一个独立的数据分片。

    • name:定义数据节点的名字,这个名字需要是唯一的。对应schema节点中配置的dataNode属性。

    • dataHost:该属性用于定义该分片属于哪个数据库实例的,属性值是引用 dataHost 标签上定义的 name 属性。

    • database:该属性用于定义该分片属性哪个具体数据库实例上的具体库。这个对应我们数据库中的具体数据库名称。我在mysqltest1和mysqltest2中创建了一个名为test的database。

  • dataHost:作为 Schema.xml 中最后的一个标签,该标签在 mycat 逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句。

    • name:唯一标识 dataHost 标签,供上层的标签使用。对应dataNode中的dataHost属性

    • balance:决定了哪些MySQL服务器参与到读操作的负载均衡中。

      1. balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。

      2. balance=“1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。

      3. balance=“2”,所有读操作都随机的在 writeHost、readhost 上分发。

      4. balance=“3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。

      此处暂未考虑负载均衡的问题,设为0。

    • writeType:

      1. writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties 。

      2. writeType=“1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。

    • switchType:

      1. switchType="-1":表示不自动切换

      2. switchType=“1”:默认值,自动切换

      3. switchType=“2”:基于MySQL主从同步的状态决定是否切换

      数据库的自动切换主要依赖以上两个参数writeType, switchType。

      writeType=“0” switchType=“1” 这样配置,mycat会自动检测数据库是否可用,不可用后自动切换。

    • heartbeat:配置检测数据库节点是否可用的命令。mycat定期会发送该命令给每个数据库节点用于检测节点是否可用。

    • writeHost:指定后端数据库的相关配置给 mycat,用于实例化后端连接池。此处我们配了两个实例,分别就是我们的mysqltest1和mysqltest2。

3:rule.xml

rule.xml 里面就定义了我们对表进行拆分所涉及到的规则定义。这里我们暂时没用到,可自行查询文档了解其用法。

给一个空的配置文档

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

四:测试

以上介绍了mycat的部署和配置。这样就完成了一个简单的数据库自动切换配置。接下来测试一下。

启动mycat,mysqltest1,mysqltest2。

根据在server.xml中的配置mycat的用户名root, 密码123456,端口为8066,通过这些信息可以使用mysql客户端连接mycat。

在这里插入图片描述
我们配置的逻辑数据库为testdb。如下图,进入数据库我们可以看见在mysqltest1和mysqltest2中定义的数据表user。

在这里插入图片描述
打开mysqltest1和mysqltest2的日志。如下图,左侧为mycat,右上角为mysqltest1,右下角为mysqltest2。可以看见一直有执行select user();这个就是我们在schema.xml中配置的heartbeat。mycat正在检测数据库是否可用。
在这里插入图片描述

执行sql。如下图,可以看见所有的sql都在mysqltest1上执行,因为配置了两个数据库的互备,所以mysqltest2上在同步数据。
在这里插入图片描述

停止mysqltest1,模拟宕机。再执行插入一条数据。Mysqtest1停止了工作,mycat自动切换到了mysqltest2。通过日志可以看到sql在mysqltest2上执行。
在这里插入图片描述
启动mysqltest1,会自动去mysqltest2上同步数据。
在这里插入图片描述

就这样,通过数据库之间的数据同步以及mycat自动切换可用数据库节点。就做到了数据库的容灾切换。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值