需要先实现主从复制: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&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="root">
<readHost host="slave" url="jdbc:mysql://192.168.168.101:3306?useSSL=false&serverTimezone=Asia/Shanghai&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.100 | MyCat、MySql | MyCat中间件服务(middleware) |
192.168.168.101 | MySql | M1 |
192.168.168.102 | MySql | S1 |
192.168.168.103 | MySql | M2 |
192.168.168.104 | MySql | S2 |
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 - -1,默认为1
server-id=1
# 指定同步的数据库
binlog-do-db=db01binlog-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 - -1,默认为1
server-id=3
# 指定同步的数据库
binlog-do-db=db01binlog-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 - -1,默认为1
server-id=2
systemctl restart mysql
2.1.3.从库配置(S2):
修改配置文件/etc/my.cnf,在[mysqld]下添加:
# mysql服务ID,保证整个集群环境中唯一,取值范围: 1 - -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&serverTimezone=Asia/Shanghai" user="root" password="root">
<readHost host="slave" url="jdbc:mysql://192.168.168.102:3306?useSSL=false&serverTimezone=Asia/Shanghai" user="root" password="root" />
</writeHost>
<writeHost host="master" url="jdbc:mysql://192.168.168.103:3306?useSSL=false&serverTimezone=Asia/Shanghai" user="root" password="root">
<readHost host="slave" url="jdbc:mysql://192.168.168.104:3306?useSSL=false&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
查询和插入不会有影响
至此结束