目录

一、简介

二、主从复制原理

三、环境准备

四、主服务器配置

五、从服务器配置

六、主从复制测试 

七、注意点

八、扩展

九、总结


一、简介

在实际项目中,很多瓶颈都出现在数据库这个环节,所以如果还是由单台数据库服务器进行服务的话,性能可能不会有很大的提升效果,通常我们会搭建主从服务,然后配合读写分离,读服务器就只负责读操作,写服务器负责插入、更新、删除操作,这样可能有效地分摊单台服务器的压力。本文主要讲解mysql主从复制,主从复制通常有一主一从,一主多从等,这里只介绍最简单的一主一从同步。

二、主从复制原理

  • 主mysql服务器master将变更记录到二进制日志中binlog,从服务器slave将master的binlog拷贝到自己的中继日志relay-log中,然后执行一遍sql语句就达到跟主数据库同步的效果。
  • 一个服务器当主库,另一个或多个服务器当从库,主库会把对数据库的修改操作(新增、删除、修改)记录在binlog日志中,从库连接主库获取主库的binlog,并记录在中继日志relay-log中,然后从上次记住的位置起执行SQL语句,一旦遇到错误则停止同步。

原理图:

mysql 关闭数据表大小写_master/slave

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

mysql 关闭数据表大小写_mysql主从复制_02

注意:

  • 如果省略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

mysql 关闭数据表大小写_主从同步_03

【c】查看mysql的server_id有没有指定成功

show variables like 'server_id';

mysql 关闭数据表大小写_mysql 关闭数据表大小写_04

可见,刚好与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;

mysql 关闭数据表大小写_主从复制_05

  • 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 关闭数据表大小写_mysql主从复制_06

这里需要记录二进制日志文件名称mysql-bin.000001,以及位置861,后面需要从服务器指定使用。

五、从服务器配置

IP地址:192.168.8.131

 【a】修改my.cnf配置文件,指定server_id

vim /etc/my.cnf

 添加如下配置:

#服务器唯一ID,默认是1,一般取IP最后一段
server_id=131

mysql 关闭数据表大小写_mysql 关闭数据表大小写_07

  • 一般不需要在从服务器上启用二进制日志,如果在从服务器上启用二进制日志,那么可以用它来做数据备份和崩溃恢复,或者从服务器用来当作其它从服务器的主服务器。

【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;

mysql 关闭数据表大小写_master/slave_08

 【e】开启主从复制

start slave;

mysql 关闭数据表大小写_master/slave_09

【f】查看从服务器复制状态

show slave status\G

mysql 关闭数据表大小写_mysql 关闭数据表大小写_10

当看到

  • 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');

mysql 关闭数据表大小写_mysql主从复制_11

【b】登录从服务器192.168.8.131,查看是否将主服务器创建的数据库、表以及数据都复制过来

show databases;
use test_master_slave;
show tables;
select * from user;

mysql 关闭数据表大小写_主从同步_12

如图,从服务器已经将主服务器上的数据全都同步过来了。

七、注意点

【a】注意防火墙关闭,这里可以暂时禁用掉防火墙

systemctl stop firewalld.service && systemctl disable firewalld.service 
setenforce 0

 【b】从服务器授权的时候主服务器的二进制日志文件名称以及位置

mysql 关闭数据表大小写_主从复制_13

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主从有所帮助,笔者踩了不少坑,希望读者看了这篇文章能少走一些弯路,如有不正确之处,欢迎大家指正,相互学习下!