注:mysql主从复制只执行接入后的内容。即主数据库和表要在接入后创建。
一、主机配置(master131)
配置文件:vim /etc/my.cnf
#主服务器唯一ID
server-id=1
#启用二进制日志
log-bin=mysql-bin
#设置不要复制的数据库(可设置多个,设置了需要复制的数据库就可以不设置此项)
binlog-ignore-db=mysql
#设置需要复制的数据库
binlog-do-db=需要复制的主数据库名字
#设置logbin格式
binlog_format=STATEMENT
扩展:
binlog日志三种格式
1、Statement:每一条会修改数据的sql都会记录在binlog中
2、Row:不记录sql语句上下文相关信息,仅保存哪条记录被修改
3、Mixedlevel:以上两种的混合使用。一般的语句修改使用statment格式保存binlog,如一些函数,statement无法完成主从复制的操作,则采用row格式保存binlog
二、从机配置(master135)
配置文件: vim /etc/my.cnf
#从服务器唯一ID
server-id=2
#启用中继日志
relay-log=mysql-relay
三、主机、从机重启mysql服务
systemctl restart mysqld
四、主机、从机都关闭防火墙
systemctl stop firewalld
五、在主机上建立账户并授权slave
grant replication slave on *.* to 'slave'@'%'identified by '123456';
报错:
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;
注:记录下file和position的值。执行完此步骤后不再操作主机mysql,防止主机状态值变化。
七、在从机上配置需要复制的主机
#复制主机的命令
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;
报错:
ERROR 3021(HY000): This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL ' ' first.
原因:如果从机连过主机,需要重置一下
解决方法:
stop slave;
reset master;
八、验证
到此mysql的主从复制就做好了,我们可以进行验证一下
1、主机上创建一下testdb数据库,并查看数据库是否创建成功
create database testdb;
show databases;
2、主机上创建完成,我们去从机上看一下吧
扩展:
1、停止从服务复制功能
stop slave;
2、重新配置主从
stop slave;
reset master;
3、查看是否读写分离
#主机写入 @@环境变量
insert into user values (1,@@hostname);
#在mycat里查询
select * from user;
我们看到主机和从机上写的内容是一致,所以就证明没有实现读写分离。
读写分离设置
vim /usr/local/mycal/conf/schema.xml
#修改的 balance属性为3
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
select user()
password="root">
中的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 不负担读压力。
好了重启一下mycat服务,进行验证一下吧
#重启mycat服务
mycat console
#在mycat里的mysql里
use TESTDB;
SELECT * FROM USER;
我们看到已经实现读写分离了