主机1处理所有写请求,它的从机和主机2及主机2的从机负责读请求。当主机1宕机后,主机2负责写请求,主机1、主机2互为备机。架构图如下:
一、准备机器
编号 | 角色 | IP | 机器名 |
---|---|---|---|
1 | Master1 | 192.168.157.133 | master131 |
2 | Slave1 | 192.168.157.135 | master135 |
3 | Master2 | 192.168.157.139 | master139 |
4 | Slave2 | 192.168.157.138 | master138 |
二、配置
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