MySQL通过MyCat实现读写分离

需要先实现主从复制:mysql主从复制_生骨大头菜的博客-CSDN博客

安装mycat:MySQL使用MyCat实现分库分表_生骨大头菜的博客-CSDN博客_分库分表工具

1.一主一从

主:

从:192.168.168.100

从:192.168.168.101

1.1.查看从机的状态

mysql -uroot -p
show slave status\G;

两个Yes为正常

1.2.读写分离

修改mycat的schema.xml配置,添加(服务器相关配置需要根据自己的环境配置修改)

    <schema name="DB02" checkSQLschema="true" sqlMaxLimit="100">
		<table name="tb_user" dataNode="dn4" primaryKey="id" />
    </schema>

	<dataNode name="dn4" dataHost="dhost4" database="db01" />

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

		<writeHost host="master" url="jdbc:mysql://192.168.168.100:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="root">
			<readHost host="slave" url="jdbc:mysql://192.168.168.101:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8" user="root" password="root">
			</readHost>
		</writeHost>
	</dataHost>

修改mycat的server.xml配置,添加用户管理逻辑数据库信息

    <user name="root">
		<property name="password">123456</property>
		<property name="schemas">DB02</property>
	</user>

登录主机mysql,创建write_read_test数据库,因为主从复制,所以在从机上也会创建

create database db01;
 
use db01;
 
create table tb_user(
    id int(11) primary key not null auto_increment,
    name varchar(50) not null,
    sex varchar(1)
)engine=innodb default charset=utf8mb4;
 
insert into tb_user(id,name,sex) values(null, 'Tom', '1'),(null, 'Triggr', '0'),(null, 'Dawn', '1');

重新启动mycat

/usr/local/mycat/bin/mycat restart
tail -f /usr/local/mycat/logs/wrapper.log

 进入mycat进行验证

mysql -h 192.168.168.100 -P 8066 -uroot -p123456

 只登录从数据库,修改id=2的sex为1,再查看

可以看到变为1了,证明是读取了从库的数据

 在mycat将id=2的sex设为1再设为0,可以看到id=2的sex变为0了,证明主库生效

 

 2.双主双从

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

需要准备5台服务,并且安装上需要的软件,我这里使用的是虚拟机(虚拟机安装:虚拟机部署Kubernetes(K8S)_生骨大头菜的博客-CSDN博客_虚拟机部署k8s):

IP软件角色
192.168.168.100MyCat、MySqlMyCat中间件服务(middleware)
192.168.168.101MySqlM1
192.168.168.102MySqlS1
192.168.168.103MySqlM2
192.168.168.104MySqlS2

MySQL安装:Linux安装MySQL_生骨大头菜的博客-CSDN博客_linux安装mysql

MyCat安装:MySQL使用MyCat实现分库分表_生骨大头菜的博客-CSDN博客_分库分表工具

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

systemctl stop firewalld
systemctl disable firewalld

 准备好相关的环境:

 

2.1.搭建

2.1.1.主库配置(M1):

修改配置文件/etc/my.cnf,在[mysqld]下添加:

# 开启二进制日志

log-bin=bin

# 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

systemctl restart mysql

2.1.2.主库配置(M2):

修改配置文件/etc/my.cnf,在[mysqld]下添加:

# 开启二进制日志

log-bin=bin

# 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

systemctl restart mysql

两台主库创建账号并授权:

# 登录mysql
# 创建test用户,并设置密码,该用户可在任意主机连接该MySQL服务
CREATE USER 'test'@'%' IDENTIFIED WITH mysql_native_password BY 'test';
# 为'itcast'@'%'用户分配主从复制权限
GRANT REPLICATION SLAVE ON *.* TO 'test'@'%';

 通过指令,查看两台主库二进制日志坐标:

show master status;

 

2.1.3.从库配置(S1):

修改配置文件/etc/my.cnf,在[mysqld]下添加:

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

systemctl restart mysql

2.1.3.从库配置(S2):

修改配置文件/etc/my.cnf,在[mysqld]下添加:

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

systemctl restart mysql

2.1.4.两台从库配置关联的主库:

登录mysql

CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx',SOURCE_USER='xxx',SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx',SOURCE_LOG_POS=xxx;
# 上述是8.0.23中的语法。如果mysql是8.0.23之前的版本,执行如下SQL: .
CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS=xxx;

因为我的mysql版本是5.7,使用第二种

# S1
CHANGE MASTER TO MASTER_HOST='192.168.168.101', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='bin.000001', MASTER_LOG_POS=154;

# S2
CHANGE MASTER TO MASTER_HOST='192.168.168.103', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='bin.000001', MASTER_LOG_POS=154;

需要注意S1对应的是M1,S2对应的是M2

启动两台从库的主从复制,查看从库状态:

# 8.0.22之后
start replica;
# 8.0.22之前
start slave;
show slave status\G;

 

2.1.5.两台主库之间相互复制:

M2复制M1,M1复制M2

CHANGE REPLICATION SOURCE TO SOURCE_HOST='xxx.xxx',SOURCE_USER='xxx',SOURCE_PASSWORD='xxx',SOURCE_LOG_FILE='xxx',SOURCE_LOG_POS=xxx;
# 上述是8.0.23中的语法。如果mysql是8.0.23之前的版本,执行如下SQL: .
CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx',MASTER_USER='xxx',MASTER_PASSWORD='xxx',MASTER_LOG_FILE='xxx',MASTER_LOG_POS=xxx;
# M1
CHANGE MASTER TO MASTER_HOST='192.168.168.103', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='bin.000001', MASTER_LOG_POS=154;

# M2
CHANGE MASTER TO MASTER_HOST='192.168.168.101', MASTER_USER='test', MASTER_PASSWORD='test', MASTER_LOG_FILE='bin.000001', MASTER_LOG_POS=154;
# 8.0.22之后
start replica;
# 8.0.22之前
start slave;
show slave status\G;

 2.1.6.测试

分别在M1、M2上执行DDL、DML语句,查看涉及到的数据库服务器的数据同步情况,只在其中一个主库执行,会同步到其他库则证明成功

create database db01;

use db01;

create table tb_user(
id int(11) not null primary key,
name varchar(50) not null,
sex varchar(1)
)engine=innodb default charset=utf8mb4;

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');
insert into tb_user(id,name,sex) values(7,'John','1');

2.2.双主双从读写分离

mycat配置

schema.xml

	<schema name="RW" checkSQLschema="true" sqlMaxLimit="100">
		<table name="tb_user" dataNode="dn1" primaryKey="id" />
    </schema>

	<dataNode name="dn1" dataHost="dhost1" database="db01" />

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

		<writeHost host="master" url="jdbc:mysql://192.168.168.101:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai" user="root" password="root">
			<readHost host="slave" url="jdbc:mysql://192.168.168.102:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai" user="root" password="root" />
		</writeHost>

        <writeHost host="master" url="jdbc:mysql://192.168.168.103:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai" user="root" password="root">
            <readHost host="slave" url="jdbc:mysql://192.168.168.104:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai" user="root" password="root" />
        </writeHost>
	</dataHost>

server.xml

	<user name="root">
		<property name="password">123456</property>
		<property name="schemas">RW</property>
	</user>

重启mycat

/usr/local/mycat/bin/mycat restart

进入mycat查看

mysql -h 192.168.168.100 -P 8066 -uroot -p123456

 使用一主一从的测试方式进行测试,修改S1跟S2的数据然后查询查看,

# S1
update tb_user set name='Tom1' where id=1;

# S2
update tb_user set name='Tom2' where id=1;

然后在mycat查看,可以看到每次查出的id=1数据会有变化

 插入一条数据看看是不是在每个库都会插入

insert into tb_user(id,name,sex) values(233,'John','1');

可以看到每个库都有这条数据了

停止M1的mysql,查看还能否继续工作

systemctl stop mysql

查询和插入不会有影响

 

 

至此结束

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值