mycat实现mysql数据库读写分离_Mycat实现MySQL读写分离

读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。主数据库进行写操作后,数据及时间同步到所读的数据库,尽可能保证读、写数据库的数据一致,比如MySQL的主从复制、Oracle的DATA GUARD、SQL Server的复制订阅等。在很多系统中,读操作的比例远高于写操作,所以对应读操作的数据库可以有多台,通过负载均衡技术进一步分摊读操作的压力,让整个数据系统高效、平稳地运行。而这些读写分离所需的复杂的数据库架构,要对开发人员和应用程序透明。我们通过Mycat即可轻易实现上述功能,不仅可以支持MySQL,也可以支持Oracle和SQL Server。

Mycat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。负载均衡类型,目前的取值有如下的种:

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

lbalance=”1”:全部的readHost与standby writeHost都参与select语句的负载均衡,简而言之,当为双主双从模式(M1->S1,M2->S2,并且M1与M2互为主备)时,在正常情况下,M1、S1和S2都参与select语句的负载均衡。

lbalance=”2”:所有的读操作都随机地在writeHost、readHost上分发。

lbalance=”3”:所有的读请求都随机分发到writeHost对应的readHost上执行,writeHost不负担读压力,注意balance只在Mycat1.4及之后的版本中有。

下面将通过实例验证并结合log来说明各种情况下的读写分离。

MySQL主从读写分离的准备环境见下表:项目MycatMySQL-masterMySQL-slave

IP11.112.0.12311.112.0.1011.112.0.51

Port8066/906630663066

MySQL为一主一从,本文档重在介绍Mycat的用法,关于MySQL主从配置请参考其他文档。

实验用例表如下:create database yf;

create table 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;

当balance为0时,不开启读写分离机制,所有读操作都发送到当前的writeHost上。Mycat的基本配置如下:<?xml  version="1.0"?>

mycat:schema SYSTEM "schema.dtd">

writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">

select user()

password="root">

登录管理端口

mysql -uroot -p123456 -P9066 -hmycat1

查看datasource;

5b42f412cefc24a25c3b9e63fe95fd50.png

登录数据端口

mysql -uroot -p123456 -P8066 -hmycat1

多次执行select * from travelrecord ;通过datasource可以看到所有读操作都分发到了mysql1上:

67d02c97e68abfd7c0ef872dd820635d.png

从日志中也可以看到读操作分发到了mysql1(11.112.0.10)

00e51b18ef290fdc5b7b7a8737b07b62.png

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

修改schema.xml中的balance=”1”,并重新加载配置文件。

reload @@config_all;

多次执行select * from travelrecord ;通过datasource可以看到所有读操作都分发到了mysql2上:

6e3a678b1996705cd4c20262100515a8.png

从日志中也可以看到读操作分发到了mysql2(11.112.0.51)

3b4ed359ffac0e27459a4faa7d516b61.png

执行插入语句:insert into travelrecord (org_code,test_name) values('1000','test'); 通过datasource可以看到所有读操作都分发到了mysql2上:

ccea283ec62270b539c9ebdee52fd3ca.png

由于这里只是一主一从,对于balance=3和4的情况无法更好的体现,感兴趣的同学可以自行测试。

参考:《分布式数据库架构及企业实践-基于Mycat中间件》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值