Mycat 之 Mysql 主从复制(双主双从)

主机1处理所有写请求,它的从机和主机2及主机2的从机负责读请求。当主机1宕机后,主机2负责写请求,主机1、主机2互为备机。架构图如下:

一、准备机器

编号角色IP机器名
1Master1192.168.157.133master131
2Slave1192.168.157.135master135
3Master2192.168.157.139master139
4Slave2192.168.157.138master138


二、配置

1、主机1【master1】配置

配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个,设置了需要复制的数据库就可以不设置此项)
binlog-ignore-db=mysql
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT

######  以下是双主双从配置  ######

#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1-65535
auto-increment-increment=2
#表示自增长字段从哪个数开始,指字段一次递增多少,取值范围是1-65535
auto-increment-offset=1

2、主机2【master2】配置

配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=3
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个,设置了需要复制的数据库就可以不设置此项)
binlog-ignore-db=mysql
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT

######  以下是双主双从配置  ######

#在作为从数据库的时候,有写入操作也要更新二进制日志文件
log-slave-updates
#表示自增长字段每次递增的量,指自增字段的起始值,其默认值是1,取值范围是1-65535
auto-increment-increment=2
#表示自增长字段从哪个数开始,指字段一次递增多少,取值范围是1-65535
auto-increment-offset=2

3、从机1【slave1】配置

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

4、从机2【slave2】配置

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

注:server-id一定要不同,主机的 auto-increment-offset也要不同

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

systemctl restart mysqld

四、主机、从机都关闭防火墙

systemctl stop firewalld

五、在主机上建立账户并授权slave

grant replication slave on *.* to 'slave'@'%'identified by '123456';

如果之前已经部署过,需要执行以下命令

stop slave;
reset master;

报错:

ERROR 1819 (HY000): Your password does not satisfy the current policy requirements

原因:密码设置的太简单,不符合mysql密码设置规范

解决方法:

1、查看mysql完整的密码规则

show variables like 'validate_password%';

2、更改密码长度

set global validate_password_length=4;

3、设置密码验证策略(medium【中】,low【低】)

set global validate_password_policy=0;

六、查看主机的master状态

show master status

七、在从机上配置需要复制的主机【两个从机都要配置

#复制主机的命令
change master to master_host='主机ip',
master_user='slave',
master_password='123456',
master_log_file='mysql-bin.具体数字',master_log_pos=具体值;
 
#启动从机复制功能
start slave;
 
#查看从机状态
show slave status\G;

八、两个主机互相复制

主机1【master1】、主机2【master2】相互复制。即主机1【master1】复制主机2【master2】,主机2【master2】复制主机1【master1】

报错:

1、查看slave状态时发现Slave_IO_Running: No

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

原因:

mysql 5.6的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy  data文件夹后server_uuid是相同的。【因为我是直接克隆的虚拟机(⊙︿⊙)】

show variables like '%server_uuid%';

解决方法:

#在mysql里执行
show variables like 'datadir';

#在外面执行
vim /var/lib/mysql/auto.cnf

#重启mysql服务
service mysqld restart

到此,双主双从就已经建好了。可以在2个主机上分别建表、写入数据查看是否成功。

九、停止服务复制功能

stop slave;

十、重新配置主从

stop slave;

reset master;

读写分离设置

vim /usr/local/mycal/conf/schema.xml
 
#修改<dataHost>的 balance属性为1,并增加一个writeHost
 
<?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>
                <writeHost host="hostM1" url="192.168.157.133:3306" user="root"
                                   password="root">
                   <readHost host="hostS1" url="192.168.157.135:3306" user="root" password="root"/>
                </writeHost>
                <writeHost host="hostM2" url="192.168.157.139:3306" user="root"
                                   password="root">
                   <readHost host="hostS2" url="192.168.157.138:3306" user="root" password="root"/>
                </writeHost>
        </dataHost>
</mycat:schema>

<dataHost>中的balance属性:【负载均衡类型】

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 不负担读压力。

<dataHost>中的writeType属性:

1)、writeType="0",所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个。

writeHost重新启动后以切换后的为准,切换记录在配置文件中:dnindex.properties 。

2)、writeType="1",所有写操作都随机的发送到配置的writeHost

<dataHost>中的switchType属性:

1)、switchType="1",默认值,自动切换。

2)、switchType="-1",不自动切换。

3)、switchType="2",基于mysql主从同步的状态决定是否切换。

好了重启一下mycat服务,进行验证一下吧

#重启mycat服务
mycat console
 
#在mycat里的mysql里
use TESTDB;
SELECT * FROM USER;

验证读写分离

在主机数据库中插入带系统变量数据,造成主从数据不一致

insert into aa values(3,@@hostname);

然后在mycat数据库查询

验证抗风险能力

#将主机1【master1】数据库服务停止
systemctl stop mysqld
systemctl status mysqld

#在mycat里插入数据
insert into aa values(2,@@hostname);

#启动主机1【master1】数据库服务
systemctl start mysqld
systemctl status mysqld

#mycat里查看主机2是否成为写主机
select * from aa;

我这里是执行了第二次,把主机2停掉,发现写主机已经变成了主机1

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值