首页 > 技术文章 > MySQL性能优化:实现主从复制

askknow 2019-11-15 16:41 原文

1 主从复制的介绍

概念:使用两台或两台以上的数据库服务器,分别设置主服务器(master)和从服务器(slave),对主服务器的任何操作都会同步到从服务器上。

主要作用
(1)当主服务器出现问题时,可以切换到从服务器,避免数据丢失。
(2)可以在从服务器上查询数据,降低主服务器压力。


2.实现原理

mysql会将所有修改过数据库的sql语句记录在二进制bin-log日志中。主从复制实际是将多台服务器bin日志的开启,然后主服务器(master)会把执行过的sql语句记录到bin日志中,之后从服务器(slave)读取该日志,在从服务器再把bin日志中记录的sql语句同样的执行一遍。这样从服务器(slave)上的数据就和主服务器(master)同步了。


3 实现步骤:

两台服务器:

主服务器:ip地址:192.168.2.17,系统:Centos,配置文件:my.cnf
从服务器:ip地址:192.168.2.4,系统:Windows,配置文件:my.ini

注意:因为本人是实验用,所以主服务器是虚拟机上配置的linux,从服务器使用的是windows,可以根据自身需求选择linux,配置方式大体一致。

3.1 在主服务器上修改 my.cnf 配置文件

vim /etc/my.cnf

server-id=1 #这是数据库ID,此ID是唯一的,主库默认为1,其他从库以此ID进行递增,ID值不能重复,否则会同步出错;
log-bin=mysql-bin #用来设置二进制文件的存储位置和文件名称,如果不指定存储位置,则和数据库文件存储在同一位置
在这里插入图片描述
注意:在my.cnf配置文件里面,配置的区域在[mysqld]与[mysql]之间配置。

3.2 修改完成mysql的配置后,要重启mysql服务使之生效

service mysql restart

3.3 授权一个账号,让从服务器通过该账号读取log-bin日志里面的内容

grant  replication slave  on *.*  to 'lily'@'%' identified by '123456'

在这里插入图片描述
3.4 赋予从库权限账号,允许用户在主库上读取日志,也就是Slave机器读取File权限

grant FILE on *.* to 'lily'@'%' identified by '123456';

在这里插入图片描述
3.5 查看最新的log-bin日志,记录主服务器里面的最新的二进制的名称和pos位置

show master status

在这里插入图片描述
注意:到这一步就禁止对主服务器执行增删改的操作,避免产生新的日志,从服务器配置成功再对主服务器进行操作。


4 配置从服务器

4.1 修改从服务器的数据库配置文件
注意:这里从服务器使用的是windows操作系统,mysql的配置文件是my.ini。server-id 该值不能和主服务器的相同
在这里插入图片描述
修改完成mysql的配置后,要重启mysql服务使之生效

net stop mysql

4.2 停止从服务器

stop slave

在这里插入图片描述
4.3 开始配置
在mysql命令行中输入如下指令:

CHANGE MASTER TO	
MASTER_HOST='192.168.2.17',	#主服务器的ip地址
MASTER_USER='lily',	#主服务器授权用户的账号名								
MASTER_PASSWORD='123456',	#主服务器授权用户的密码
MASTER_LOG_FILE='mysql-bin.000002',	#上文中记录的二进制日志文件的名称
MASTER_LOG_POS=897	#上文中记录的pos位置

在这里插入图片描述
4.4 启动从服务器

start slave

在这里插入图片描述
4.4 验证配置是否成功

show slave status\G;

若下面红框处两个地方皆为yes,则配置成功!
在这里插入图片描述

5 测试主从复制

5.1 在主服务器创建一个数据库,并添加一张表,插入数据

create database demo_lily;
use demo_lily;
insert into user values(1, 'lily'), (2, 'cily');

在这里插入图片描述
在这里插入图片描述
5.2 在从服务器上面查看是否有插入的数据记录
在这里插入图片描述

6 常见问题

(1)执行授权账户命令grant replication slave on . to 'lily'@'%' identified by '123456' 的时候出现如下提示:
在这里插入图片描述
这时候只需要执行如下命令,刷新一下权限表:

flush privileges

之后再次执行授权命令即可。

(2)出现 Slave_IO_Running:Connecting 的情况:
在这里插入图片描述
造成这个提示的原因比较多,而本人是因为linux防火墙开启,直接拦截了3306端口,导致连接不上。这时候可以设置主服务器防火墙放行3306端口:

sudo firewall-cmd --list-all	#查看防火墙端口开放情况
firewall-cmd --zone=public --add-port=3306/tcp --permanent	#永久开放3306端口

或者直接关闭防火墙:

systemctl stop firewalld.service

推荐阅读