1、MySQL主从复制简介

MySQL主从复制(也称A/B复制、Replication),简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步。
MySQL主从是基于binlog的,主上须开启binlog才能进行主从。
主从过程大致分为三个步骤:
1)主将更改操作记录到binlog里;
2)从将主的binlog事件(SQL语句)同步到从本机上,并记录在relaylog里;
3)从根据relaylog里面的SQL语句按顺序执行;
主上有一个log dump线程,用来和从的I/O线程传递binlog
从上有两个线程,其中I/O线程,用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的SQL语句落地。

主从配置需要注意的点

(1)主从服务器操作系统版本和位数一致;
(2) Master和Slave数据库的版本要一致;
(3) Master和Slave数据库中的数据要一致;
(4) Master开启二进制日志,Master和Slave的server_id在局域网内必须唯一;

2、准备工作

2.1 系统及软件准备

操作系统: CentOS7.8
MySQL版本:5.7.30
Master服务器:192.168.10.243
Slave服务器:192.168.10.143

2.2、MySQL服务器操作系统配置

# 关闭主、从服务器防火墙
systemctl stop firewalld && systemctl disable firewalld

# 关闭主备服务器SELinux
# 关闭SELinux
# 查看SELinux状态
sestatus –v
getenforce

# 临时关闭SELinux
setenforce 0
# 永久关闭SELinux(需要重启操作系统)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

# 优化文件句柄
# 打开文件的限制
vim /etc/security/limits.conf 
*     soft    nofile  65536
*     hard    nofile  131072
*     -       nproc   unlimited
*     soft    memlock unlimited
*     hard    memlock unlimited

# 优化内核参数
修改/etc/sysctl.conf文件
# 增加tcp支持的队列数
# 减少断开连接时 ,资源回收
net.ipv4.tcp_max_tw_buckets = 8000
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 10
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 1024000

2.3、安装 MySQL-5.7.30  

Master、Slave节点安装MySQL

# MySQL软件下载
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-client-5.7.30-1.el7.x86_64.rpm
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-common-5.7.30-1.el7.x86_64.rpm
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-devel-5.7.30-1.el7.x86_64.rpm
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-libs-5.7.30-1.el7.x86_64.rpm
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-libs-compat-5.7.30-1.el7.x86_64.rpm
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-community-server-5.7.30-1.el7.x86_64.rpm

# 安装MySQL:
yum -y localinstall *.rpm 

或者配置yum源,直接使用yum命令安装MySQL

vim /etc/yum.repo.d/mysql.repo
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=0

# 保存退出,执行
yum clean all
yum makecache
# 安装 mysql-community-server
yum -y install mysql-community-server

2.4、启动MySQL服务,并将服务加入开机启动

systemctl enable mysqld
systemctl start mysqld
systemctl status mysqld

2.5、登录mysql并初始化root密码

# 登录mysql
说明:mysql在安装完成,启动mysqld服务后,MySQL会自动生成一个随机的root用户密码,可以到日志里面查看。
vim /var/log/mysqld.log

# 可以看到类似如下信息:
2020-03-03T06:24:40.573789Z 1 [Note] A temporary password is generated for root@localhost: p5+yU>E*q8hh

# 说明:用该临时密码登录mysql后,必须要先修改密码,如下:
[root@aliy-prod-pubser-server001 opt]# mysql -uroot -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or g.
Your MySQL connection id is 10
Server version: 5.7.26

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
mysql> set password = PASSWORD('6ps?3n2vPcXjhUfz');

# 如果从服务器是克隆的主服务器,则修改 auto.cnf(vi /var/lib/mysql/auto.cnf) 文件中 server-uuid 值
否则主从复制会报 1593 错误,修改完记得重启MySQL

3、MySQL主从复制配置

3.1、master服务器配置

1)用户添加及授权

在master 服务器授权一个账户,拥有slave权限

mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO 'repl'@'192.168.10.143' IDENTIFIED BY 'GrantT^Slave143';
mysql> FLUSH PRIVILEGES;

说明: 192.168.10.143为备库IP,GrantT^Slave143为账号repl的密码,配置时修改成实际环境的信息。

3.2. my.cnf配置修改

修改mysql配置文件,my.ini (windows)或 my.cnf(Linux)找到[mysqld] 标记,下方添加

server-id=1
log-bin=master-bin
binlog-format=ROW
# 以下两个为可选选项,如果要保证数据不丢失最好在清理binlog之前把要清理的日志备份,日志文件的大小根据磁盘的性能做适当的调整
expire_logs_days = 7 // binlog过期清理时间
max_binlog_size = 1G // binlog每个日志文件大小

max_connections = 1000
character-set-server = utf8mb4 // 配置字符集
collation-server = utf8mb4_unicode_ci // 配置字符集
// 配置不同步的库
binlog-ignore-db = mysql
binlog-ignore-db = sys
binlog-ignore-db = information_schema
binlog-ignore-db = performance_schema

3.3 重启master 的mysql服务

systemctl restart mysqld

4、备库配置

在另一个mysql上配置从服务器

4.1 备库my.cnf修改

找到my.ini (windows) 或 my.cnf (linux),找到[mysqld]标记,更改如下配置

[mysqld]
max_connections = 1000
log_bin = slave-bin
server_id = 2
relay_log = slave-relay-bin
log_slave_updates = 1
read_only = 1
#以下两个为可选选项,如果要保证数据不丢失最好在清理binlog之前把要清理的日志备份,日志文件的大小根据磁盘的性能做适当的调整
expire_logs_days = 7 //binlog过期清理时间
max_binlog_size = 100m //binlog每个日志文件大小

replicate_ignore_db=information_schema
replicate_ignore_db=performance_schema
replicate_ignore_db=mysql
replicate_ignore_db=sys

重启mysql使配置生效

systemctl restart mysqld

5、开启复制

5.1、查看主库binlog信息

登陆主库执行

mysql> show master status;
+-------------------+----------+--------------+------------------+-------------------+
| File              | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      154 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

执行之后可以获取目前主库binlog使用的文件及pos点  

5.2、在从库上设置复制信息

根据上一步获取到的信息(Position, File)配置从库的复制信息,在从库上执行如下命令

CHANGE MASTER TO MASTER_HOST='192.168.10.243',MASTER_USER='repl',MASTER_PASSWORD='GrantT^Slave143',MASTER_LOG_FILE='master-bin.000001',MASTER_LOG_POS=154;

注意:执行从库配置, 每次重启mysql均需要执行(如果没有开启自动启动主从)

参数解释:

解释:
// master的ip地址
mysql> change master to master_host=’192.168.10.243′,
// master授权的用户
master_user=’repl’,
// master的授权用户密码
master_password=’GrantT^Slave143′,

// master的binlog日志名称,这里使用上述命令搜索出来的为准
master_log_file=’edu-mysql-bin.00000x’,
// master的日志位置 这里使用上述“1.3”命令搜索出来的为准,不能带引号,必须是整型,否则会报错
master_log_pos=xx,
// 重试时间、单位秒,默认重试时间为 60s
master_connect_retry=30;

5.3、在从库上开启复制

从库复制信息配置完成后执行命令开启复制:
mysql> start slave;

5.4、查看复制状态

启动之后如果不报错即可执行如下命令查看复制的状态:
show slave status G;

主要查看下面两个参数状态,只要都是yes,表示主从通信正常。
Slave_IO_Running=Yes
Slave_SQL_Running=Yes
如果均为yes则正常,否则需根据last_error信息进行调试

6、主从复制测试

# 创建数据库
create database mydb;

# 创建表
use mydb;
create table mytab1(id int(10),name varchar(50),depid int(11));

# 插入数据
insert into mytab1 (id, name, depid) values (1,’mcb’, 2),(2,’zhangsan’,3);

查看主库数据库,表,数据

查看从库数据库,表,数据

7、主从同步可能遇到的问题

基于局域网的Master/Slave机制在通常情况下已经可以满足“实时”备份的要求了。如果延迟比较大,可以从以下几个因素进行排查:
(1) 网络延迟;
(2) Master负载过高;
(3) Slave负载过高;

如果出现同步失败,可以根据提示处理错误,处理完成后,需要刷新同步配置:
先停止同步
mysql> stop slave;

清理掉之前的配置,防止同步已经同步了的数据
mysql> reset slave all;

然后重新连接主库,进行同步。