搭建MyCat2双主双从的MySQL读写分离
一、MySQL双主双从
一个主机 m1 用于处理所有写请求,它的从机 s1 和另一台主机 m2 还有它的从机 s2负责所有读请求。当 m1 主机宕机后,m2 主机负责写请求,m1、m2 互为备机。
编号 | 角色 | IP地址 | 机器名 |
---|---|---|---|
1 | Master1 | 192.168.200.132 | mycat01 |
2 | Slave1 | 192.168.200.133 | mycat02 |
3 | Master2 | 192.168.200.134 | mycat03 |
4 | Slave2 | 192.168.200.135 | mycat04 |
1、双主机配置
修改配置
vim /etc/my.cnf
1.1 Master1 配置
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#[必须] 主服务器唯一ID
server-id=1
#[必须]启用二进制日志,指明路径。比如:自己本地的路径 /log/mysqlbin
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=mydb1
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1
1.2 Master2配置
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#[必须] 主服务器唯一ID
server-id=3
#[必须]启用二进制日志,指明路径。比如:自己本地的路径 /log/mysqlbin
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=mydb1
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2
2、双从机配置
修改配置
vim /etc/my.cnf
2.1 Slave1配置
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#[必须] 主服务器唯一ID
server-id=2
# 启用中继日志
relay-log=mysql-relay
2.2 Slave2配置
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
#[必须] 主服务器唯一ID
server-id=4
# 启用中继日志
relay-log=mysql-relay
3、双主机、双从机重启 mysql 服务
4、主机从机都关闭防火墙
5、在两台主机上建立帐户并授权 slave
CREATE USER 'slave2'@'%' IDENTIFIED BY '123123';
GRANT REPLICATION SLAVE ON *.* TO 'slave2'@'%';
ALTER USER 'slave2'@'%' IDENTIFIED WITH mysql_native_password BY '123123';
5.1 查询Master1的状态
show master status;
5.2 查询Master2的状态
show master status;
5.3 记录
分别记录下File和Position的值
执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
6、在从机上配置需要复制的主机
Slava1 复制 Master1,Slava2 复制 Master2
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='在主机上创建的用户',
MASTER_PASSWORD='主机上创建用户的密码',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;
6.1 Slave1执行命令
CHANGE MASTER TO MASTER_HOST='192.168.200.132',
MASTER_USER='slave2',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.000008',MASTER_LOG_POS=157;
6.2 Slave2执行命令
CHANGE MASTER TO MASTER_HOST='192.168.200.134',
MASTER_USER='slave2',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=157;
6.3 启动两台从服务器复制功能
start slave;
6.4 查看从服务器状态
show slave status\G;
Slave1复制的Master1
Slave2复制的Master2
下面两个参数都是Yes,则说明主从配置成功!
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
7、两个主机互相复制
Master2 复制 Master1,Master1 复制 Master2
7.1 Master1的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.200.134',
MASTER_USER='slave2',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=157;
7.2 Master2的复制命令
CHANGE MASTER TO MASTER_HOST='192.168.200.132',
MASTER_USER='slave2',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.000008',MASTER_LOG_POS=157;
7.3 启动两台主服务器复制功能
start slave;
7.4 查看从服务器状态
show slave status\G;
Master1的复制Master2
Master2的复制Master1
下面两个参数都是Yes,则说明主从配置成功!
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
8、Master1 主机新建库、新建表、insert 记录,Master2 和从机复制
8.1 在主机执行sql
mysql> create database mydb1;
Query OK, 1 row affected (0.00 sec)
mysql> use mydb1;
Database changed
mysql> create table mytb1(id INT, Name varchar(20));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into mytb1 values(1, 'zhangsan3');
Query OK, 1 row affected (0.02 sec)
mysql> select * from mytb1;
+------+-----------+
| id | Name |
+------+-----------+
| 1 | zhangsan3 |
+------+-----------+
1 row in set (0.00 sec)
mysql>
8.2 在其他机器查看
Master2
Slave1
Slave2
9、如何停止从服务复制功能
stop slave;
10、如何重新配置主从
stop slave;
reset master;
二、mycat2配置
2.1 逻辑库配置
登录Mycat:
mysql -uroot -p123456 -h localhost -P 8066
,创建逻辑库
mysql> create database mydb1;
Query OK, 1 row affected (0.00 sec)
执行
create database mydb;
后,将在/mycat/conf/schemas/
自动生成mydb1.schema.json
文件
customTables:mycat默认的表的配置
globalTables:全局表的配置
shardingTables:分片表的配置
normalTables:普通表的配置
修改schema的配置,指定mydb逻辑库默认的targetName,mycat会自动加载mydb下已经有的物理表或者视图作为单表 (图中为已修改)
登录Mycat:
mysql -uroot -p123456 -P 8066
,进行查询
2.2 双主双从集群角色划分
m1:主机
m2:备机,也负责读
s1,s2:从机
2.3 添加数据源
添加Master1数据源
/*+ mycat:createDataSource{ "name":"rwSepw","url":"jdbc:mysql://192.168.200.132:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"123456" } */;
添加Slave1数据源
/*+ mycat:createDataSource{ "name":"rwSepr","url":"jdbc:mysql://192.168.200.133:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"123456" } */;
添加Master2数据源
/*+ mycat:createDataSource{ "name":"rwSepw2","url":"jdbc:mysql://192.168.200.134:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"123456" } */;
添加Slave2数据源
/*+ mycat:createDataSource{"name":"rwSepr2","url":"jdbc:mysql://192.168.200.135:3306/mydb1?useSSL=false&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true","user":"root","password":"123456" } */;
查询配置数据源结果
通过注释命名添加数据源后,在对应目录会生成相关配置文件,查看数据源配置文件:
mycat/conf/datasources
2.4 更新集群配置
使用mycat自带的默认集群:
prototype
,对其修改更新即可
/*! mycat:createCluster{"name":"prototype","masters":[ "rwSepw","rwSepw2"],"replicas":["rwSepw2","rwSepr","rwSepr2"]} */;
查看配置集群信息
/*+ mycat:showClusters{} */;
查看集群配置文件,发现集群配置信息已经更新
cat /usr/local/mycat/conf/clusters/prototype.cluster.json
readBalanceType:查询负载均衡策略
BALANCE_ALL(默认值):获取集群中所有数据源
BALANCE_ALL_READ:获取集群中允许读的数据源
BALANCE_READ_WRITE:获取集群中允许读写的数据源,但允许读的数据源优先
BALANCE_NONE:获取集群中允许写数据源,即主节点中选择
switchType:控制主从切换
NOT_SWITCH:不进行主从切换
SWITCH:进行主从切换
此时,架构如下
2.5 验证读写分离
修改MySQL的配置文件:my.cnf,设置logbin格式binlog_format=STATEMENT,重启MySQL,确保此时主从复制正常
登录MyCat:mysql -uroot -p123456 -h IP -P 8066,向数据表插入系统变量值,以此造成主从数据不一致,便于验证读写分离。
mysql> use mydb;
Database changed
mysql> INSERT INTO mytb VALUES(2,@@hostname);
登录双主双从MySQL4个库查看表数据
登录MyCat:
mysql -uroot -p123456 -h IP -P 8066
,查询验证
本文来自博客园,作者:CoderTL,转载请注明原文链接:https://www.cnblogs.com/codertl/p/17032934.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix