这种方式的优点是结构简单且性能较好,通常由应用程序的持久层框架实现(比如 MyBatis)对 MySQL 数据库的读写控制。
如果因为某些原因不能使用这种方式(比如绕过持久层框架直接执行 SQL),还有另一种方式可选:
即由 MyCat 实现的读写分离,应用程序将 MyCat 当做一个可读可写的 MySQL 服务器,由 MyCat 判断执行的 SQL 是只读还是写入,再将具体 SQL 路由到主库或从库进行执行。
下面演示如何实现这种方式的读写分离。
先准备两台已经设置好的 MySQL 数据库服务器。
我这里准备好的两台:
-
主库:192.168.0.88
-
从库:192.168.0.133
MyCat 配置:
<schema name="WRTEST" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"/>
<dataNode name="dn1" dataHost="localhost1" database="wrtest" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="3" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="master"
url="jdbc:mysql://192.168.0.88:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8"
user="icexmoon"
password="Mysql@123">
<readHost host="slave"
url="jdbc:mysql://192.168.0.133:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8"
user="icexmoon"
password="Mysql@123"/>
</writeHost>
</dataHost>
主要注意的是 dataHost 的 balance 属性,它表示负载均衡策略,可选值有:
-
0,不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
-
1,全部的 readHost 与备用的 writeHost 都参与 select 语句的负载均衡(主要针对双主双从模式)
-
2,所有的额读写操作都随机在 writeHost,readHost 上分发
-
3,所有的读请求随机分发到 writeHost 对应的 readHost 上执行,writeHost 不负担读压力
对于一主一从的情况,使用 1 或 3 都可以实现读写分离。
不要忘记修改用户权限,否则操作不了这个逻辑库:
<user name="user">
<property name="password">123456</property>
<property name="schemas">WRTEST</property>
<property name="readOnly">true</property>
<property name="defaultSchema">WRTEST</property>
</user>
通过 MyCat 添加表结构和数据:
create table tb_user(
id int(11) not null,
name varchar(50) not null,
sex varchar(1),
primary key (id)
)engine=innodb default charset=utf8;
insert into tb_user(id,name,sex) values(1,'Tom','1');
insert into tb_user(id,name,sex) values(2,'Trigger','0');
insert into tb_user(id,name,sex) values(3,'Dawn','1');
为了证明 MyCat 通过从库读取数据,可以将从库数据修改(不会同步到主库)后观察 MyCat 查询到的数据。
为了证明 MyCat 通过主库写入数据,可以通过 MyCat 执行任意的数据修改操作,此时主库和从库的数据都会改变,这说明 MyCat 的 DML 语句在主库上执行。
在使用一主一从方式实现读写分离的情况下,如果主库宕机,将无法继续数据写入,业务就会停摆。如果要实现更高的可用性,可以考虑双主双从实现的读写分离。这里我就不不做演示了,如何实现可以观看视频。
文章评论