【MySQL 一】MySQL主从同步探寻
MySQL Replication
配置MySQL主从主要原因:
- 热备份,即使备份数据,相对于定期备份数据安全性更高
- 读写分离以及均衡负载的基础,减轻数据库的负载,提升并发和吞吐 (接下来的篇章会讲到)
其实MySQL自身已经带了这个功能,MySQL Replication。
MySQL Replication官方介绍:MySQL Replication是一个MySQL内置的可以立即使用的杰出功能。此功能可让你将改变的数据从一个系统复制到另一个系统。
MySQL主从原理
MySQL Replication 是基于二进制日志系统(binlog)的,通过互相发送二进制日志来达到同步的效果。所以Master须开启binlog。过程大致有3个步骤
1. binlog会记录Master的相关操作记录
2. Slave会接收到Master发过来的binlog
3. Slave根据relaylog里面的sql语句按顺序执行
4.
注意:因为基于MySQL Replication的原理,是通过网络发送binlog文件,那么网络的延迟是最容易造成数据库不同步的因素,其次还有负载不一致,max_allowed_packet不一致,自增主键步长不一致,mysql自带bug等…
主从配置流程:
注意:为了防止其他因素对本次测试的干扰,我们尽量使用两台相同的服务器并且版本相同,关闭防火墙等(项目实际使用的时候可以自己加白名单放行)。
1.环境:
CentOS7.1 + MySQL 5.5.56
2.操作流程
主服务器
1.配置my.cnf(找不到的怎么找)
log-bin=mysql-bin #开启二进制日志
server-id=1 #设置server-id 不能重复
binlog-do-db = test #日志记录test库(只同步test库)
2.重启MySQL服务
service mysql restart
3.创建Slave同步使用的账号
#创建用户1 (原则上每台slave一个账户,ip请填写你对应的地址)
mysql> CREATE USER 'slave1'@'111.111.111.111' IDENTIFIED BY 'slave1';
#创建用户2
mysql> CREATE USER 'slave2'@'222.222.222.222' IDENTIFIED BY 'slave2';
#分配权限
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave1'@'111.111.111.111';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave2'@'222.222.222.222';
#刷新权限
mysql>flush privileges;
#新建需要同步的库
mysql>create databases test;
3.获得当前二进制文件名以及位置并记录:
mysql > SHOW MASTER STATUS;
File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
---|---|---|---|
mysql-bin.000013 | 1285 | test |
从服务器
1.配置my.cnf
log-bin=mysql-bin #开启二进制日志
server-id=2 #设置server-id 不能重复
2.重启mysql 连接主数据库
service mysql restart
mysql>CHANGE MASTER TO
>MASTER_HOST='111.111.111.111',
>MASTER_USER='slave1',
>MASTER_PASSWORD=’slave1’,
>MASTER_LOG_FILE=’mysql-bin.000013’,
>MASTER_LOG_POS=1285;
#新建需要同步的库
>create databases test;
4.启动slave同步进程:
start slave;
5.查看slave状态:
show slave status\G;
***************** 1. row *****************
Slave_IO_Running: Yes **此处必须为yes**
Slave_SQL_Running: Yes **此处必须为yes**
slave2同理
3.效果测试
1.进入Master执行
CREATE TABLE `test`.`test` (
`id` int NOT NULL AUTO_INCREMENT,
`str` varchar(255),
PRIMARY KEY (`id`)
) COMMENT='';
2.插入shuju
insert into `test`.`test` ( `test`) values ( '2333')
3.Slave1和Slave2中,同时发现test表 以及一条数据。 主从同步成功
主从同步是读写分离和负载的基础,接下来将继续写如何配置读写分离,均衡负载等,还将会涉及到数据库中间件
参考资料
MySQL官网 https://dev.mysql.com/doc/refman/5.7/en/replication.html