4
2
0
2

搭建MyCat2双主双从的MySQL读写分离

一、MySQL双主双从

一个主机 m1 用于处理所有写请求,它的从机 s1 和另一台主机 m2 还有它的从机 s2负责所有读请求。当 m1 主机宕机后,m2 主机负责写请求,m1、m2 互为备机。

image

编号 角色 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;

image

5.2 查询Master2的状态

show master status;

image

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

image

Slave2复制的Master2

image

下面两个参数都是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

image

Master2的复制Master1

image

下面两个参数都是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

image

Slave1

image

Slave2

image

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文件

image

customTables:mycat默认的表的配置

globalTables:全局表的配置

shardingTables:分片表的配置

normalTables:普通表的配置

修改schema的配置,指定mydb逻辑库默认的targetName,mycat会自动加载mydb下已经有的物理表或者视图作为单表 (图中为已修改)

登录Mycat:mysql -uroot -p123456 -P 8066,进行查询

image

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" } */;

查询配置数据源结果

image

通过注释命名添加数据源后,在对应目录会生成相关配置文件,查看数据源配置文件:mycat/conf/datasources

image

2.4 更新集群配置

使用mycat自带的默认集群:prototype,对其修改更新即可

 /*! mycat:createCluster{"name":"prototype","masters":[ "rwSepw","rwSepw2"],"replicas":["rwSepw2","rwSepr","rwSepr2"]} */;

查看配置集群信息

/*+ mycat:showClusters{} */;

image

查看集群配置文件,发现集群配置信息已经更新

cat /usr/local/mycat/conf/clusters/prototype.cluster.json

image

readBalanceType:查询负载均衡策略

BALANCE_ALL(默认值):获取集群中所有数据源

BALANCE_ALL_READ:获取集群中允许读的数据源

BALANCE_READ_WRITE:获取集群中允许读写的数据源,但允许读的数据源优先

BALANCE_NONE:获取集群中允许写数据源,即主节点中选择

switchType:控制主从切换

NOT_SWITCH:不进行主从切换

SWITCH:进行主从切换

此时,架构如下

image

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个库查看表数据

image

image

image

image

登录MyCat:mysql -uroot -p123456 -h IP -P 8066,查询验证

image

image

image

image

posted @ 2023-01-07 16:28  CoderTL  阅读(580)  评论(0编辑  收藏  举报