MySQL读写分离之一主一从

原理

MySQL 的主从复制,是基于二进制日志( binlog )实现的。

准备

主机
角色
用户名
密码
192.168.2.3
master
root
newPwd520@
192.168.2.4
slave
root
newPwd520@
主从复制的搭建,可以参考 MYSQL的主从复制-CSDN博客

一主一从读写分离

MyCat 控制后台数据库的读写分离和负载均衡由 schema.xml 文件 datahost 标签的 balance 属性控
制。

schema.xml配置

<!-- 配置逻辑库 -->
<schema name="TEST_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">
	</schema>
	<dataNode name="dn7" dataHost="dhost7" database="test" />
	<dataHost name="dhost7" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="master1" url="jdbc:mysql://192.168.2.3:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="newPwd520@" >
			<readHost host="slave1" url="jdbc:mysql://192.168.2.4:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="newPwd520@" />
		</writeHost>
	</dataHost>
writeHost 代表的是写操作对应的数据库, readHost 代表的是读操作对应的数据库。 所以我们要想
实现读写分离,就得配置 writeHost 关联的是主库, readHost 关联的是从库。
而仅仅配置好了 writeHost 以及 readHost 还不能完成读写分离,还需要配置一个非常重要的负责均衡的参数 balance ,取值有 4 种,具体含义如下:
参数
含义
0
不开启读写分离机制 , 所有读操作都发送到当前可用的 writeHost
1
全部的 readHost 与 备用的 writeHost 都参与 select 语句的负载均衡(主要针对 于双主双从模式)
2
所有的读写操作都随机在 writeHost , readHost 上分发
3
所有的读请求随机分发到 writeHost 对应的 readHost 上执行 , writeHost 不负担读压力
所以,在一主一从模式的读写分离中, balance 配置 1 3 都是可以完成读写分离的。

server.xml配置

配置 root 用户可以访问 SHOPPING TEST 以及 TEST_RW 逻辑库。
<!-- 用户及密码信息 -->
	<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">TEST_RW</property>
		<!-- <property name="defaultSchema">TESTDB</property> -->
		<!--No MyCAT Database selected 错误前会尝试使用该schema作为schema,不设置则为null,报错 -->
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

测试

配置完毕 MyCat 后,重新启动 MyCat
bin/mycat stop
bin/mycat start
然后观察,在执行增删改操作时,对应的主库及从库的数据变化。 在执行查询操作时,检查主库及从库对应的数据变化。
在master上执行
create database test;

use test;

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');

slave同样生成test数据库和数据

我们在mycat下插入数据
在主从数据库都有数据增加
当我们停掉master的数据库
systemctl stop mysqld

我们在mycat下查询数据可以获得数据,但是插入数据却失败

在测试中,我们可以发现当主节点Master 宕机之后,业务系统就只能够读,而不能写入数据了。 
那如何解决这个问题呢?这个时候我们就得通过另外一种主从复制结构来解决了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值