【Mycat】MySQL读写分离

master-slave读写分离

项 目MycatMySQL-masterMySQL-master-standbyMySQL-slave
IP10.230.4.13110.230.3.19410.230.3.19510.230.2.132
Port8077/9077330633063307

MySQL为二主一从,3.195为3.194的standby,2.132为3.194的slave。

实验用例表如下:

CREATE TABLE 'yf.travelrecord' (
    'id' int(11) NOT NULL AUTO_INCREMENT,
    'org_code' varchar(20) NOT NULL,
    'test_name' varchar(20) DEFAULT NULL,
    PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mycat的基本配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat01" checkSQLschema="false" sqlMaxLimit="1000">
        <table name="travelrecord" primaryKey="id" dataNode="MySQL" />
    </schema>
    <dataNode name="MySQL" dataHost="MySQL_Host" database="yf" />
    <dataHost name="MySQL_Host" maxCon="1000" minCon="3" balance="0" writeType="0" dbType="MySQL" dbDriver="native" switchType="1">
        <heartbeat>select user()</heartbeat>
        <writeHost host="MySQL_M1" url="10.230.3.194:3306" user="xjw_dba" password="123">
            <readHost host="MySQL_S1" url="10.230.3.132:3307" user="wjx_dba" password="123" />
        </writeHost>
        <writeHost host="MySQL_M2" url="10.230.3.195:3306" user="xjw_dba" password="123">
        </writeHost>
    </dataHost>
</mycat:schema>            

通过show @@datasource查看后端数据库的分布情况

balance=0

不开启读写分离机制,所有的读操作都发送到当前的writeHost上。

balance=1

所有读操作都发送到了当前的wirteHost对应的readhost和备用的writehost,这样就可以减轻主库的压力,高效地提供写操作,而由其他服务器承担比较耗费资源的读操作。

balance=2

所有读操作都发送到所有的writeHost金额readhost上,即当前datahost内的服务器都参与分担读操作。这个场景比较适合主库压力不是很大时,也可以分担读操作,更合理地利用资源。

balance=3

所有读操作只发送到当前writeHost对应的readhost上。在实际应用时,比较适合双主热备、多个slave的情况。

MySQL Galera Cluster读写分离

MySQL Galera Cluster是一套基于同步复制的多主MySQL集群解决方案,使用简单,没有单点故障,可用性高,能很好地保证业务量不断增长时数据的安全和随时扩展。

MySQL Galera Cluster的主要特点有:多服务器的拓扑结构;真正的多主架构,任何节点都可以进行读写及同步复制,各节点之间无延迟且节点宕机不会导致数据丢失;紧密耦合,所有节点均保持相同的状态,节点之间没有不同的数据,无须主从切换操作或使用vip;在Failover的过程中无停机时间(其实不需要Failover),无须手工备份当前数据库并复制至新节点;支持InnoDB存储引擎;对应用透明,无需更改应用或进行极小的更改便可以在任意节点上进行读写;自动剔除故障节点,自动加入新节点;真正行级别的并发复制,客户端连接与操作单台MySQL数据库的体验一致。

Galera官方建议一套Cluster至少有3个节点,理论上可以多写,但是在多个实验环境和生产案例中,多写会引起较为严重的锁等待,所以使用Galera时推荐用一写多读。这样,Galera结合Mycat,很容易配置出一套读写分离的数据库架构。

项 目MycatPxc1Pxc2Pxc3Pxc1_slave
IP10.230.4.13110.230.3.19410.230.3.19510.230.3.19510.230.2.132
Hostnamexjw-cc-03xjw-dba-01xjw-dba-02xjw-dba-03rfd-dba-01
Port8077/90773306330633063307

3.194、3.195、3.196为一套Percona Xtradb Cluster,2.132为3.194节点的slave。

实验用例表如下:

CREATE TABLE 'yf.travelrecord' (
    'id' int(11) NOT NULL AUTO_INCREMENT,
    'org_code' varchar(20) NOT NULL,
    'test_name' varchar(20) DEFAULT NULL,
    PRIMARY KEY ('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Mycat的基本配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat01" checkSQLschema="false" sqlMaxLimit="1000">
        <table name="travelrecord" primaryKey="id" dataNode="pxc" />
    </schema>
    <dataNode name="pxc" dataHost="pxc_Host" database="yf" />
    <dataHost name="pxc_Host" maxCon="1000" minCon="3" balance="0" writeType="0" dbType="MySQL" dbDriver="native" switchType="3">
        <heartbeat>show status like 'wsrep%'</heartbeat>
        <writeHost host="pxc_M1" url="10.230.3.194:3306" user="xjw_dba" password="123">
        </writeHost>
        <writeHost host="pxc_M2" url="10.230.3.195:3306" user="xjw_dba" password="123">
        </writeHost>
        <writeHost host="pxc_M3" url="10.230.3.196:3306" user="xjw_dba" password="123">
        </writeHost>
    </dataHost>
</mycat:schema>            

balance=0

不进行读写分离,所有读写都走配置的dataHost的第一个writeHost。

balance=1

全部的readHost与stand by writeHost都参与select语句的负载均衡,如果Pxc的节点本身没带slave,则三个Pxc节点中 的一个作为写,另外两个作为读。按照我们的配置,pxc_M1将作为写节点,pxc_M2、pxc_M3参与度。

在第一个节点增加一台slave,Mycat配置如下:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat01" checkSQLschema="false" sqlMaxLimit="1000">
        <table name="travelrecord" primaryKey="id" dataNode="pxc" />
    </schema>
    <dataNode name="pxc" dataHost="pxc_Host" database="yf" />
    <dataHost name="pxc_Host" maxCon="1000" minCon="3" balance="0" writeType="0" dbType="MySQL" dbDriver="native" switchType="3">
        <heartbeat>show status like 'wsrep%'</heartbeat>
        <writeHost host="pxc_M1" url="10.230.3.194:3306" user="xjw_dba" password="123">
            <readHost host="pxc_S1" url="10.230.3.132:3307" user="wjx_dba" password="123" />
        </writeHost>
        <writeHost host="pxc_M2" url="10.230.3.195:3306" user="xjw_dba" password="123">
        </writeHost>
        <writeHost host="pxc_M3" url="10.230.3.196:3306" user="xjw_dba" password="123">
        </writeHost>
    </dataHost>
</mycat:schema>            

这时pxc_S1也作为读节点加入读负载均衡。

balance=2

所有读操作都随机地在writeHost、readHost上分发。此时作为写节点的pxc_M1也参与读操作。

balance=3

所有读请求都随机地分发至writeHost对应的readHost执行,writeHost不负担读压力。如果writeHost没有对应的readHost,则查询分发至writeHost。

从上面的各种验证中可以看出,Galera Cluster有多个节点时,就能通过Mycat实现读写分离,而且从Galera的原理可以看出,节点间的同步是“实时”的,这就为那些对读写延迟要求严格的系统提供了很好的选择。如果某个读节点查询的资源消耗很大,影响了整个集群的性能,则这时可以在节点上加一个slave,把大查询再分离出去。增加slave或者调整读节点的操作对前端都是透明的,只需修改Mycat配置文件,重启或者重载Mycat即可。Galera Cluster的读写分离在某种意义上与Oracle ADG非常相似。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值