读写分离,简单地说是把对数据库的读和写操做分开,以对应不一样的数据库服务器。主数据库提供写操做,从数据库提供读操做,这样能有效地减轻单台数据库的压力。主数据库进行写操做后,数据及时间同步到所读的数据库,尽量保证读、写数据库的数据一致,好比MySQL的主从复制、Oracle的DATA GUARD、SQL Server的复制订阅等。在不少系统中,读操做的比例远高于写操做,因此对应读操做的数据库能够有多台,经过负载均衡技术进一步分摊读操做的压力,让整个数据系统高效、平稳地运行。而这些读写分离所需的复杂的数据库架构,要对开发人员和应用程序透明。咱们经过Mycat便可轻易实现上述功能,不只能够支持MySQL,也能够支持Oracle和SQL Server。
mysql
Mycat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制。负载均衡类型,目前的取值有以下的种:sql
l balance=”0”:不开启读写分离机制,全部读操做都发送到当前可用的writeHost上。数据库
l balance=”1”:所有的readHost与standby writeHost都参与select语句的负载均衡,简而言之,当为双主双从模式(M1->S1,M2->S2,而且M1与M2互为主备)时,在正常状况下,M一、S1和S2都参与select语句的负载均衡。服务器
l balance=”2”:全部的读操做都随机地在writeHost、readHost上分发。架构
l balance=”3”:全部的读请求都随机分发到writeHost对应的readHost上执行,writeHost不负担读压力,注意balance只在Mycat1.4及以后的版本中有。负载均衡
下面将经过实例验证并结合log来讲明各类状况下的读写分离。分布式
MySQL主从读写分离的准备环境见下表:ide
项目测试 |
Mycaturl |
MySQL-master |
MySQL-slave |
IP |
11.112.0.123 |
11.112.0.10 |
11.112.0.51 |
Port |
8066/9066 |
3066 |
3066 |
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"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="mycat01" checkSQLschema="false" sqlMaxLimit="100"> <table name="travelrecord" primaryKey="id" dataNode="mysql1" /> </schema> <dataNode name="mysql1" dataHost="mysql1" database="yf" /> <dataHost name="mysql1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="mysql1" url="11.112.0.10:3306" user="root" password="root"> <readHost host="mysql2" url="11.112.0.51:3306" user="root" password="root" /> </writeHost> </dataHost> </mycat:schema>
登陆管理端口
mysql -uroot -p123456 -P9066 -hmycat1
查看datasource;
登陆数据端口
mysql -uroot -p123456 -P8066 -hmycat1
屡次执行select * from travelrecord ;经过datasource能够看到全部读操做都分发到了mysql1上:
从日志中也能够看到读操做分发到了mysql1(11.112.0.10)
当balance为1时,全部读操做都发送到了当前writeHost对应的readhost和备用的writehost,这样就能够减轻主库的压力,高效地提供读写操做,而由其余服务器承担比较耗费资源的读操做。
修改schema.xml中的balance=”1”,并从新加载配置文件。
reload @@config_all;
屡次执行select * from travelrecord ;经过datasource能够看到全部读操做都分发到了mysql2上:
从日志中也能够看到读操做分发到了mysql2(11.112.0.51)
执行插入语句:insert into travelrecord (org_code,test_name) values('1000','test'); 经过datasource能够看到全部读操做都分发到了mysql2上:
因为这里只是一主一从,对于balance=3和4的状况没法更好的体现,感兴趣的同窗能够自行测试。
参考:《分布式数据库架构及企业实践-基于Mycat中间件》