应用mycat进行mysql主从复制读写分离

前言

进行一主一从的搭建前需要保证,已经有三台服务器(或两台,mycat在其中一台mysql服务器上),并且两台mysql服务,一台mycat服务能够正常运行。
使mycat能够访问到两台mysql服务器。
前期具体配置步骤可参考博客:
mysql安装
mycat安装配置详解

一主一从

配置步骤

在这里插入图片描述

mycat服务器中schema.xml文件配置

确保schema.xml文件中,配置好主从服务器地址信息,和相关节点信息

#进入到mycat目录的conf文件中
cd /usr/local/mycat/conf

vim schema.xml

文件内容最终配置如下(详细配置步骤可参考博客:mycat安装配置详解

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="host1" database="testdb" />
        <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <!--心跳监测,监测节点是否还活着 -->
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <!--主机 写-->
                <writeHost host="hostM1" url="192.168.237.137:3306" user="root"
                                   password="123456">
                        <!-- 从机 读-->
                        <readHost host="hostS1" url="192.168.237.135:3306" user="root" password="123456" />
                </writeHost>
        </dataHost>
</mycat:schema>

主机配置

修改主机配置文件

vim /etc/my.cnf

添加内容如下

#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT

在这里插入图片描述

从机配置

修改从机配置文件

vim /etc/my.cnf

添加内容如下:

#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

在这里插入图片描述

主机从机重启mysql服务

systemctl restart mysqld

查看mysql启动状态

systemctl status mysqld

在这里插入图片描述

确保主机从机都关闭防火墙

systemctl stop firewalld

查看防火墙状态

systemctl status firewalld

在这里插入图片描述

在主机上建立帐户并授权 slave

从机需要去主机中读取日志文件,哪个从机能够读取到哪个不能,是需要在主机这里进行权限配置的,主机建立一个账户,并授权slave,带着这个账户的从机就可以允许读取日志文件。

#在主机MySQL里执行授权命令
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123123';

在这里插入图片描述
注:如果出现密码安全级别不够的情况,可以更改一下密码要求如下

#设置密码的验证强度等级
 set global validate_password_policy=LOW;
 #设置密码长度
 set global validate_password_length=6;

查询master的状态

# 查询master的状态
show master status;

在这里插入图片描述
这里我们记录下File和Position的值,从机需要进行相关配置。

注:执行完此步骤后不要再操作主服务器MySQL,防止主服务器状态值变化

在从机上配置需要复制的主机

#复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;

在这里插入图片描述
注:如果之前有配置过会报错,此时我们需要进行重置如下

stop slave;
reset master;

在这里插入图片描述
重置之后再执行上面的语句。

启动从服务器复制功能

#启动从服务器复制功能
mysql> start slave;
#查看从服务器状态
mysql> show slave status\G;

出现下图中的两个标识,且都为yes,证明主从搭建成功。
在这里插入图片描述

测试

在主机上,切换到testdb数据库中,执行一条插入语句:

在这里插入图片描述
查看从库中该表中是否有新插入的内容:
在这里插入图片描述
同步成功!

读写分离

在开始我们对mycat的schema.xml文件进行配置的时候,已经制定了读主机和写主机,那么是否就已经实现了读写分离了呢?
可以来测试一下,验证读写分离:

在写主机中插入数据

#@@标识系统变量,这里显示主机名称
insert into player values (3,@@hostname);

查看主机和从机表中数据已经不一样了:

主机:
在这里插入图片描述
从机:
在这里插入图片描述
这次我们在mycat服务器中进行查询操作,来验证访问的是那一台服务器:
在这里插入图片描述
发现查询操作访问的仍然是主服务器。
打开schema.xml文件,查看原因:
在这里插入图片描述
在文件中有一个非常重要的属性,<dataHost>的 balance属性,我们是通过这个属性来配置读写分离的。

负载均衡类型,目前的取值有4 种:
(1)balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
(2)balance=“1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从
模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。(针对于多主多从)
(3)balance=“2”,所有读操作都随机的在 writeHost、readhost 上分发。
(4)balance=“3”,所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力(针对于一主一从)

其他参数说明

writeType

1、writeType=“0”,所有写操作发送到配置的第一个writeHost,第一个
挂了切到还生存的第二个writeHost,重新启动后以切换后的为准,切
换记录在配置文件dnindex.properties中。
2、writeType=“1”,所有写操作都随机发送到配置的writeHost,1.5后
废弃。

switchType

1、switchType="-1",表示不自动切换
2、switchType=“1”,表示自动切换(缺省值)
3、switchType=“2”,基于MySQL主从同步状态决定是否切换
4、switchType=“3”,基于MySQLgalarycluster的切换机制(适合集
群),心跳语句为showstatuslike’wsrep%’

我们修改配置文件,将balance设置成3,将在从机中进行查询。
在这里插入图片描述
重启mycat

./mycat restart

在mycat服务器中重新执行查询语句,查看访问的服务器,查询一直访问的为从机。

双主双从

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

双主机配置

master1配置

修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=1

master2配置

修改配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=3
#启用二进制日志
log-bin=mysql-bin
# 设置不要复制的数据库(可设置多个)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
# 在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1 .. 65535
auto-increment-increment=2
# 表示自增长字段从哪个数开始,指字段一次递增多少,他的取值范围是1 .. 65535
auto-increment-offset=2

双从机配置

slavel1配置

修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay

slavel2配置

修改配置文件:vim /etc/my.cnf
#从服务器唯一ID
server-id=4
#启用中继日志
relay-log=mysql-relay

双主机、双从机重启 mysql 服务

和上面一主一从命令一样,不在重复

主机从机都关闭防火墙

和上面一主一从命令一样,不在重复

在两台主机上建立帐户并授权 slave

和上面一主一从命令一样,不在重复

在从机上配置需要复制的主机

这里我们让Slava1 复制 Master1,Slava2 复制 Master2
如果之前有进行过主从的配置,会报错,这里需要先停止从机,重新配置主从。

如何重新配置主从
stop slave;
reset master;

执行完上面两个命令后在执行复制主机的命令:

#复制主机的命令
CHANGE MASTER TO MASTER_HOST='主机的IP地址',
MASTER_USER='slave',
MASTER_PASSWORD='123123',
MASTER_LOG_FILE='mysql-bin.具体数字',MASTER_LOG_POS=具体值;

#启动两台从服务器复制功能
start slave;

#查看从服务器状态
show slave status\G;

出现两个yes说明配置成功
在这里插入图片描述

两个主机相互复制

与上面在从机上配置需要复制的主机步骤一样,但是需要注意host地址和复制位点的更改。

以上内容执行成功之后,在Master1 主机新建库、新建表、insert 记录,在Master2 和从机上可以看到复制的信息。

mycat中schema.xml文件更改


<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <dataNode name="dn1" dataHost="host1" database="testdb" />
        <dataHost name="host1" maxCon="1000" minCon="10" balance="1"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <!--心跳监测,监测节点是否还活着 -->
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts -->
                <writeHost host="hostM1" url="192.168.237.146:3306" user="root"  password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS1" url="192.168.237.144:3306" user="root" password="123456"/>
                </writeHost>
                <writeHost host="hostM2" url="192.168.237.147:3306" user="root"  password="123456">
                        <!-- can have multi read hosts -->
                        <readHost host="hostS2" url="192.168.237.148:3306" user="root" password="123456"/>
                </writeHost>

        </dataHost>
</mycat:schema>

启动mycat验证读写分离

#在mycat的bin目录下执行
./mycat console
#登录mycat
mysql -uroot -p123456 -h192.168.237.147 -P8066

1、查询

在写主机Master1数据库testdb的player表中插入带系统变量数据,造成主从数据不一致。
INSERT INTO player VALUES(3,@@hostname);

在Mycat里查询表,可以看到查询语句在Master2、Slava1、Slava2主从三个主机间切换。

2、插入

停止数据库master1之后,在mycat里插入数据依然成功,master2自动切换为写主机。
INSERT INTO testdb VALUES(3,@@hostname);

在此启动数据库Master1,在Mycat里查询testdb表,可以看到查询语句在Master1、Slava1、Slava2
主从三个主机间切换。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值