【MySQL | 运维篇】08、MySQL 使用 MyCat 实现读写分离

目录

一、介绍

二、一主一从

2.1 原理

2.2 准备 

三、一主一从读写分离

3.1 schema.xml配置 

3.2 server.xml配置

3.3 测试

四、双主双从

4.1 介绍

4.2 准备 

4.3 搭建

4.3.1 主库配置

1). Master1(192.168.78.139) 

2). Master2(192.168.78.134)

4.3.2 从库配置

1). Slave1(192.168.78.140) 

2). Slave2(192.168.78.141)

4.3.3 从库关联主库

1). 两台从库配置关联的主库 

2). 两台主库相互复制 

4.4 测试

五、双主双从读写分离

5.1 配置

1). schema.xml

2). user.xml

5.2 测试


 

一、介绍

        读写分离,简单地说是把对数据库的读和写操作分开,以对应不同的数据库服务器。主数据库提供写操作,从数据库提供读操作,这样能有效地减轻单台数据库的压力。

通过MyCat即可轻易实现上述功能,不仅可以支持MySQL,也可以支持Oracle和SQL Server。

二、一主一从

2.1 原理

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

2.2 准备 

  • 192.168.78.139 作为主服务器 master,主机名为 sql-master
  • 192.168.78.140 作为从服务器 slave,主机名为 sql-slave1

备注:主从复制的搭建,可以参考前面的文章:【MySQL | 运维篇】02、MySQL 主从复制_Stars.Sky的博客-CSDN博客的步骤操作。 

三、一主一从读写分离

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

3.1 schema.xml配置 

<!-- 配置逻辑库 -->
<schema name="ITCAST_RW" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">		</schema>

<dataNode name="dn7" dataHost="dhost7" database="itcast" />

<dataHost name="dhost7" maxCon="1000" minCon="10" balance="3"
			  writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>

		<writeHost host="master" url="jdbc:mysql://192.168.78.139:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Qwe123456." >
			<readHost host="slave1" url="jdbc:mysql://192.168.78.140:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Qwe123456" />
		</writeHost>
	</dataHost>

        writeHost代表的是写操作对应的数据库,readHost代表的是读操作对应的数据库。 所以我们要想实现读写分离,就得配置writeHost关联的是主库,readHost关联的是从库。

        而仅仅配置好了writeHost以及readHost还不能完成读写分离,还需要配置一个非常重要的负责均衡的参数 balance,取值有4种,具体含义如下:

所以,在一主一从模式的读写分离中,balance配置1或3都是可以完成读写分离的。

3.2 server.xml配置

配置root用户可以访问SHOPPING、ITCAST 以及 ITCAST_RW逻辑库。 

<user name="root" defaultAccount="true">
		<property name="password">Qwe123456.</property>
		<property name="schemas">SHOPPING,ITCAST,ITCAST_RW</property>
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

3.3 测试

        配置完毕MyCat后,重新启动MyCat并连接MyCat。然后观察,在执行增删改操作时,对应的主库及从库的数据变化。 在执行查询操作时,检查主库及从库对应的数据变化。

        在测试中,我们可以发现当进行查询语句时走的是从库,而进行修改时则走的是主库,主库数据修改时会自动同步给从库实现读写分离的效果。

        在测试中,我们可以发现当主节点Master(systemctl stop mysqld)宕机之后,业务系统就只能够读,而不能写入数据了。

        那如何解决这个问题呢?这个时候我们就得通过另外一种主从复制结构来解决了,也就是我们接下来讲解的双主双从。 

四、双主双从

4.1 介绍

        一个主机 Master1 用于处理所有写请求,它的从机 Slave1 和另一台主机 Master2 还有它的从机 Slave2 负责所有读请求。当 Master1 主机宕机后,Master2 主机负责写请求,Master1 、Master2 互为备机。架构图如下:

4.2 准备 

我们需要准备4台服务器,具体的服务器及软件安装情况如下:

编号IP安装软件角色
1192.168.78.139MySQL、MyCatMyCat中间件服务器、数据库master1
2192.168.78.140MySQL数据库slave1
3192.168.78.141MySQL数据库slave2
4192.168.78.134MySQL数据库master2

关闭以上所有服务器的防火墙:

  • systemctl stop firewalld
  • systemctl disable firewalld

4.3 搭建

4.3.1 主库配置

1). Master1(192.168.78.139) 

A. 修改配置文件 /etc/my.cnf

# mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,默认为1
server-id=1
 
# 指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03

# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates

B. 重启MySQL服务器

systemctl restart mysqld

C. 创建账户并授权

 你也可以不创建用户,后续配置主从时直接使用root账号,则可以省略C步骤!

# 创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';

# 为 'itcast'@'%' 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';

# 通过指令,查看主库的二进制日志坐标
show master status ;

2). Master2(192.168.78.134)

A. 修改配置文件 /etc/my.cnf

# mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2^32-1,默认为1
server-id=3
 
# 指定同步的数据库
binlog-do-db=db01
binlog-do-db=db02
binlog-do-db=db03

# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates

B. 重启MySQL服务器

systemctl restart mysqld

C. 创建账户并授权

你也可以不创建用户,后续配置主从时直接使用root账号,则可以省略C步骤!

# 创建itcast用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER 'itcast'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456';

# 为 'itcast'@'%' 用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'itcast'@'%';

# 通过指令,查看主库的二进制日志坐标
show master status ;

4.3.2 从库配置

1). Slave1(192.168.78.140) 

A. 修改配置文件 /etc/my.cnf

# mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=2

B. 重新启动MySQL服务器

systemctl restart mysqld

2). Slave2(192.168.78.141)

A. 修改配置文件 /etc/my.cnf

# mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 232-1,默认为1
server-id=4

B. 重新启动MySQL服务器

systemctl restart mysqld

4.3.3 从库关联主库

1). 两台从库配置关联的主库 

需要注意slave1对应的是master1,slave2对应的是master2。

A. 在 slave1(192.168.78.140)上执行 

如果前面没有创建 itcast 的童鞋,此处改为数据库 root 用户密码即可!后续同理!

CHANGE MASTER TO MASTER_HOST='192.168.78.139', MASTER_USER='itcast',
MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000011',
MASTER_LOG_POS=656;

# 启动从库主从复制,并查看从库状态
start slave;
show slave status \G;

B. 在 slave2(192.168.78.141)上执行 

CHANGE MASTER TO MASTER_HOST='192.168.78.134', MASTER_USER='itcast',
MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000016',
MASTER_LOG_POS=656;

# 启动从库主从复制,并查看从库状态
start slave;
show slave status \G;

2). 两台主库相互复制 

Master2 复制 Master1,Master1 复制 Master2。 

A. 在 Master1(192.168.78.139)上执行 

CHANGE MASTER TO MASTER_HOST='192.168.78.134', MASTER_USER='itcast',
MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000016',
MASTER_LOG_POS=656;

# 启动主从复制,查看从库状态
start slave;
show slave status \G;

B. 在 Master2(192.168.78.134)上执行

CHANGE MASTER TO MASTER_HOST='192.168.78.139', MASTER_USER='itcast',
MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000011',
MASTER_LOG_POS=656;

# 启动主从复制,查看从库状态
start slave;
show slave status \G;

        经过上述的步骤配置之后,双主双从的复制结构就已经搭建完成了。 接下来,我们可以来测试验证一下。 

4.4 测试

        分别在两台主库Master1、Master2上执行DDL、DML语句,查看涉及到的数据库服务器的数据同步情况。

create database db01;

use db01;

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

insert into tb_user(id,name,sex) values(4,'Jack Ma','1');
insert into tb_user(id,name,sex) values(5,'Coco','0');
insert into tb_user(id,name,sex) values(6,'Jerry','1');
  • 在Master1中执行DML、DDL操作,看看数据是否可以同步到另外的三台数据库中。
  • 在Master2中执行DML、DDL操作,看看数据是否可以同步到另外的三台数据库中。

完成了上述双主双从的结构搭建之后,接下来,我们再来看看如何完成这种双主双从的读写分离。

五、双主双从读写分离

5.1 配置

        MyCat控制后台数据库的读写分离和负载均衡由schema.xml文件datahost标签的balance属性控制,通过writeType及switchType来完成失败自动切换的。

1). schema.xml

配置逻辑库: 

<schema name="ITCAST_RW2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn7">		
</schema>

配置数据节点:

<dataNode name="dn7" dataHost="dhost7" database="db01" />

配置节点主机:

	<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.78.139:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Qwe123456." >
			<readHost host="slave1" url="jdbc:mysql://192.168.78.140:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Qwe123456" />
		</writeHost>
		
		<writeHost host="master2" url="jdbc:mysql://192.168.78.134:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Qwe123456." >
			<readHost host="slave2" url="jdbc:mysql://192.168.78.141:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="Qwe123456" />
		</writeHost>
		
	</dataHost>

属性说明:

balance="1"
        代表全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡 ;

writeType
        0 : 写操作都转发到第1台writeHost, writeHost1挂了, 会切换到writeHost2上;
        1 : 所有的写操作都随机地发送到配置的writeHost上 ;

switchType
        -1 : 不自动切换
        1 : 自动切换

2). user.xml

配置root用户也可以访问到逻辑库 ITCAST_RW2。 

<user name="root" defaultAccount="true">
		<property name="password">Qwe123456.</property>
		<property name="schemas">SHOPPING,ITCAST,ITCAST_RW2</property>
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

5.2 测试

        重启MyCat并登录MyCat,测试查询及更新操作,判定是否能够进行读写分离,以及读写分离的策略是否正确。当主库挂掉一个之后,是否能够自动切换。

1.在slave1、slave2上修改数据,查看是否会同步到master1、master2,并使用查询语句。

可以发现,主库master1和2是不会改变数据的。

2.主库master1上修改数据,会自动同步到其他3个库。

3.让mater1(systemctl stop mysqld)宕机,执行修改语句(写入master2),可以在slave2上读到。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Stars.Sky

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值