目录
一、简介
二、主从复制原理
三、环境准备
四、主服务器配置
五、从服务器配置
六、主从复制测试
七、注意点
八、扩展
九、总结
一、简介
在实际项目中,很多瓶颈都出现在数据库这个环节,所以如果还是由单台数据库服务器进行服务的话,性能可能不会有很大的提升效果,通常我们会搭建主从服务,然后配合读写分离,读服务器就只负责读操作,写服务器负责插入、更新、删除操作,这样可能有效地分摊单台服务器的压力。本文主要讲解mysql主从复制,主从复制通常有一主一从,一主多从等,这里只介绍最简单的一主一从同步。
二、主从复制原理
- 主mysql服务器master将变更记录到二进制日志中binlog,从服务器slave将master的binlog拷贝到自己的中继日志relay-log中,然后执行一遍sql语句就达到跟主数据库同步的效果。
- 一个服务器当主库,另一个或多个服务器当从库,主库会把对数据库的修改操作(新增、删除、修改)记录在binlog日志中,从库连接主库获取主库的binlog,并记录在中继日志relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。
原理图:
MySQL之间数据复制的基础是二进制日志文件(binary log file),
大体步骤:
【a】一台MySQL数据库一旦启用二进制日志bin-log后,其作为master,它的数据库中所有操作都会以“事件”的方式记录在二进制日志中;
【b】主服务器上的binlog dump线程,将事件信息发送到从服务器的I/O线程中;
【b】其他数据库作为slave通过一个I/O线程与主服务器保持通信,并监控master的二进制日志文件的变化,如果发现master二进制日志文件发生变化,则会把变化复制到自己的中继日志中;
【c】然后slave的一个SQL线程会把相关的“事件”执行到自己的数据库中;
主要涉及线程说明:
- Dump Thread:为每个 Slave 的 I/O Thread 启动一个 dump 线程,用于向从节点发送二进制事件;
- I/O Thread: 从 Master 节点请求二进制日志事件,并保存于中继日志中;
- Sql Thread: 从Relay log 中读取日志事件并在本地完成重放;
下面就通过示例一步一步说明如何搭建主从同步。
三、环境准备
首先,要确保已经在两台服务器上安装好了mysql-5.7.2,注意需要同步的两个mysql版本尽可能保持一致,否则可能会遇到一些奇奇怪怪的问题,导致主从复制不可用。
笔者这里使用了两台centos7虚拟机,主服务器:192.168.8.130 、从服务器:192.168.8.131
大体步骤:
【a】主服务器:
- (1)主服务器my.cnf配置修改;
- (2)主服务器mysql重启;
- (2)主服务器上创建一个从服务器可以访问的用户,并授权;
- (3)查看主服务的状态,记录二进制日志文件位置信息;
【b】从服务器:
- (1)从服务器my.cnf配置修改;
- (2)从服务器mysql重启;
- (3)从服务器授权,指定主服务器地址,访问用户信息以及二进制文件位置信息等;
四、主服务器配置
下面根据上面的大体步骤,说明具体怎么实现,首先看主服务器192.168.8.130需要做一下几点:
【a】修改my.cnf配置文件,指定server_id,开启二进制日志
vim /etc/my.cnf
添加如下配置:
#服务器唯一ID,默认是1,一般取IP的最后一段
server_id=130
#启用二进制日志
log-bin=mysql-bin
注意:
- 如果省略server-id(或将其显式设置为默认值0),则主服务器将拒绝所有从服务器的连接。
- 为了在InnoDB与事务一起使用的复制设置中获得最大的持久性和一致性,应在主服务器my.cnf配置文件中指定innodb_flush_log_at_trx_commit=1(刷写日志:在事务提交时,要将内存中跟事务相关的数据立即刷写到事务日志中去) 和 sync_binlog=1(sync_binlog=N,使执行N次写入后,与硬盘同步。1是最安全的,但是也是最慢的)。
【b】重启mysql
mysql -uroot -p0905
【c】查看mysql的server_id有没有指定成功
show variables like 'server_id';
可见,刚好与192.168.8.130后缀对应,说明mysql的server_id修改成功。
【e】创建一个用于从服务器访问的用户,并授权
GRANT FILE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
- all privileges:表示将所有权限授予给用户。也可指定具体的权限,如:SELECT、CREATE、DROP等;
- on:表示这些权限对哪些数据库和表生效,格式:数据库名.表名,这里写“*”表示所有数据库,所有表。如果我要指定将权限应用到test库的user表中,可以这么写:test.user ;
- to:将权限授予哪个用户。格式:”用户名”@”登录IP或域名”。%表示没有限制,在任何主机都可以登录。比如:”slave”@”192.168.8.%”,表示slave这个用户只能在192.168.8IP段登录 ;
- identified by:指定用户的登录密码 ;
- with grant option:表示允许用户将自己的权限授权给其它用户 ;
【f】查看主服务器状态
show master status;
这里需要记录二进制日志文件名称mysql-bin.000001,以及位置861,后面需要从服务器指定使用。
五、从服务器配置
IP地址:192.168.8.131
【a】修改my.cnf配置文件,指定server_id
vim /etc/my.cnf
添加如下配置:
#服务器唯一ID,默认是1,一般取IP最后一段
server_id=131
- 一般不需要在从服务器上启用二进制日志,如果在从服务器上启用二进制日志,那么可以用它来做数据备份和崩溃恢复,或者从服务器用来当作其它从服务器的主服务器。
【b】重启mysql
service mysql restart
【c】登录mysql
mysql -uroot -p0905
【d】从服务器授权,指定主服务器授权用户、二进制文件名称、位置等,一定要对应上,否则不起作用
change master to master_host='192.168.8.130', master_user='slave', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=861;
【e】开启主从复制
start slave;
【f】查看从服务器复制状态
show slave status\G
当看到
- Slave_IO_Running: Yes #负责与主机的io通信
- Slave_SQL_Running: Yes #负责自己的slave mysql进程
的时候,说明主从复制搭建成功了,注意要两个都为YES。
六、主从复制测试
【a】在主服务器192.168.8.130上创建数据库和表
create database test_master_slave;
use test_master_slave;
create table user(id int not null,name varchar(20) not null);
insert into user(id,name) values(1,'zhangsan');
insert into user(id,name) values(2,'lisi');
【b】登录从服务器192.168.8.131,查看是否将主服务器创建的数据库、表以及数据都复制过来
show databases;
use test_master_slave;
show tables;
select * from user;
如图,从服务器已经将主服务器上的数据全都同步过来了。
七、注意点
【a】注意防火墙关闭,这里可以暂时禁用掉防火墙
systemctl stop firewalld.service && systemctl disable firewalld.service
setenforce 0
【b】从服务器授权的时候主服务器的二进制日志文件名称以及位置
change master to master_host='192.168.8.130', master_user='slave', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=861;
【c】主服务器创建的从服务器可以访问的授权用户,注意账号密码要正确,可以使用授权用户的账号在从服务器看一下是否能正常登陆,能正常登陆就说明没问题。
mysql -uslave -p123456 -h192.168.8.130
【d】my.cnf配置文件中的server_id,保证全局唯一,一般取IP地址的最后一段,在不同服务器上一般都可以保证server_id唯一。
【e】注意,两台mysql服务器之间的网络是否连通,可以相互ping一下,如果能ping通,说明网络是通的。
【f】一般作为从节点的话,需要保证从节点不能进行写入操作,否则将导致主从两个节点的数据不一致,可以通过锁表等操作防止从节点进行写入。
八、扩展
【a】主服务器master上my.cnf其他配置说明
log-bin=mysql-bin
server-id=130
#指定需要进行同步的test数据库,要同步多个数据库,就重复设置几个binlog-do-db=xxx数据库,如下注释
#不添加这行表示同步所有
binlog-do-db=test
#binlog-do-db=test2
#binlog-do-db=test3
#指定同步时忽略的数据库mysql,同上,如需 指定多个,重复设置几个配置即可
binlog-ignore-db=mysql
【b】从服务器slave上my.cnf其他配置说明
server-id=131
#指定要复制的库,通常在master端不指定binlog-do-db,在slave端用replication-do-db来过滤
replicate-do-db=test
#需要指定多个的话,重复设置replicate-do-db配置即可
#replicate-do-db=test2
#replicate-do-db=test3
#指定需要忽略的数据库
replicate-ignore-db=mysql
九、总结
以上就是关于mysql5.7.2中搭建主从复制的详细步骤,笔者也是捣鼓了挺久才搭建成功,写下这篇文件作为总结,方便后面复习查看。希望本文能对大家搭建mysql主从有所帮助,笔者踩了不少坑,希望读者看了这篇文章能少走一些弯路,如有不正确之处,欢迎大家指正,相互学习下!