使用 Mycat 配置 MySQL 高可用,实现分库分表、读写分离及主从切换

Mycat 是一款基于阿里开源产品Cobar而研发的开源数据库分库分表中间件(基于Java语言开发),可以用来方便地搭建面向企业应用开发的大数据库集群,支持事务、ACID等特性,其核心是基于代理方案实现 MySQL 高可用,是目前比较流行的 MySQL 高可用的方案之一。

Mycat 官网地址:

http://www.mycat.io/

使用 Mycat 配置 MySQL 高可用,实现分库分表、读写分离及主从切换

架构图:

实例部署情况:

db1-M1,IP:192.168.0.103,Port:3306 (主1)

db1-M2,IP:192.168.0.104,Port:3306 (主2)

db1-M3,IP:192.168.0.105,Port:3306 (主3)

db1-S1,IP:192.168.0.106, Port:3306 (从1)

server.xml

配置两个帐号,一个拥有全部权限,另一个只有读权限,帐号及密码可以自由定义。

<user name ="root" defaultAccount="true">
        <property name="password">123456</property>
        <property name="schemas">db</property>
</user>

<user name="user">
        <property name="password">user</property>
        <property name="schemas">db</property>
        <property name="readOnly">true</property>
</user>

schema.xml

分成三个片,其中第一个版配置读写分离,共4个shard。

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM"schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="db" checkSQLschema="false" sqlMaxLimit="100"
                <table name="t_user" primaryKey="ID"dataNode="dn1,dn2,dn3" rule="mod-long" />
        </schema>

        <!分为三个片-->
        <dataNode name="dn1" dataHost="shard1" database="db1" />
        <dataNode name="dn2" dataHost="shard2" database="db2" />
        <dataNode name="dn3" dataHost="shard3" database="db3" />

        <dataHost name="shard1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM1" url="192.168.0.103:3306" user="db1" password="123456">
                        <!配置读写分离-->
                        <readHost host="hostS1" url="192.168.0.106:3306" user="db1" password="123456" />
                </writeHost>
         </dataHost>

         <dataHost name="shard2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM2" url="192.168.0.104:3306" user="db2" password="123456"/>
         </dataHost>

         <dataHost name="shard3" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="hostM3" url="192.168.0.105:3306" user="db3" password="123456"/>
         </dataHost>
</mycat:schema>

提示

注:若要开启读写分离,dataHost节点中的balance参数设置为1。

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

2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡

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

4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力。

rule.xml

主要配置项(本例未改动该配置文件):

<tableRule name="mod-long">
        <rule>
                <columns>id</columns> <!-- 分片列,根据id分片-->
                <algorithm>mod-long</algorithm>
        </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod"
        <!-- how many data nodes -->
        <property name="count">3</property> <!-- count值与分片个数相同,本例中分了3个片 -->
</function>

测试

使用 MySQL 客户端连接 MyCat 数据库,MyCat安装在本机,ip 是192.168.0.102,像正常连接 MySQL 那样,使用 root/123456,192.168.0.102 连接,其中端口号为 8066(可在 server.xml 中配置)。

如果配置没有问题的话,此处可以正常连接。

在 M1、M2、M3、S1 这四台数据库服务器上分别创建数据库 db1、db2、db3、db1(M1和S1 同属一个分片,所以库名一致),然后在各自库下创建 user 表(S1 下也需要创建 user 表),表结构如下:

create table user (
    id int(11) NOT NULL AUTO_INCREMENT,
    name varchar(8) DEFAULT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

创建成功后,会发现 Mycat 下也生成了虚拟的 user 表。

操作 Mycat 的 user 表,插入几条记录:

insert into user values (0, '用户0');
insert into user values (1, '用户1');
insert into user values (2, '用户2');
insert into user values (3, '用户3');
insert into user values (4, '用户4');
insert into user values (5, '用户5');
insert into user values (6, '用户6');
insert into user values (7, '用户7');
insert into user values (8, '用户8');
insert into user values (9, '用户9');

查看 M1、M2 和 M3 这三个分片各自 user 表下的数据,发现 id 为 0, 3, 6, 9 的数据落入了分片一,id 为 1, 4, 7 的数据落入了分片二,id 为 2, 5, 8  的数据落入了分片三。因为我们配置的是按 id 取余的算法来分库和分表的,所以可以确认我们配置的分库分表已生效。

如果配置了主从复制的话,会发现分片一 M1 和 S1 中的 user 表里的数据是一模一样的。关于MySQL 的主从复制,需要单独配置一下,可以参考 MySQL主从复制原理及配置教程 这篇文章。

接下来,我们该如何确定读写分离是否生效了呢?假设现在主库 M1 和从库 S1 中各有 10 条数据,数据当然是一模一样的,我们手动删除从库 S1 中的 1 条数据,然后通过 Mycat 查询分片一中的数据,会发现查询出来的数据总共有 9 条,这样,就可以确认读写分离生效了。

结束语

使用 Mycat 可以轻松实现 MySQL 的分库分表及读写分离,Mycat 因为是单节点的,自身也需要实现高可用,可以通过 keepalived 技术来实现。我们也可以官网或者 Mycat权威指南 来获取更多的配置信息。另外,Mycat 中间件只是用来配置 MySQL 高可用的方案之一,后续会介绍其它的 MySQL 高可用配置方案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

$encoding

分享不容易,来个打赏吧!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值