1. 1. 一、主从复制原理
  2. 2. 二、工具
  3. 3. 三、准备工作
  4. 4. 四、步骤
  5. 5. 五、主从配置检验
  6. 6. 六、思考

一、主从复制原理

MySQL 主从复制是一个异步复制过程,主库发送更新事件从库从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。每一个主从复制的连接,都有三个线程。拥有多个从库主库每一个连接主库从库创建一个 Binarylog 输出线程,每一个从库都有它自己的 I/O 线程和 SQL 线程。

步骤
1.主库会将所有更新记录保存到 Binarylog 文件。
2.每当有从库连接到主库的时候,主库都会创建一个 log dump 线程发送 Binarylog 文件到从库
3.在从库里,当复制开始的时候,从库就会创建两个线程进行处理,一个 I/O 线程,一个 SQL 线程。

  1. I/O 线程去请求主库Binarylog文件,并将得到的 Binarylog 文件写到 Relaylog 文件中。
  2. SQL 线程会读取 Relaylog 文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致。

二、工具

  • VMware版本:12.0.0
  • CentOS版本:7.0
  • MySQL版本: 5.7.18
  • Master 服务器:192.168.78.128
  • Slave 服务器:192.168.78.130

三、准备工作

1.安装 MySQL5.7 详见此处
2.如果从服务器克隆主服务器,则修改 auto.cnf 文件中 server-uuid 值,不然后面主从复制会报 1593 错误。修改完记得重启MySQL

3.关闭主、从服务器防火墙

$ firewall-cmd --state      ##查看防火墙状态
running                     ##防火墙开启

$ systemctl stop firewalld  ##关闭防火墙
$ firewall-cmd --state
not running                 ##防火墙关闭

4.修改主从配置文件(my.cnf)

192.168.78.128(master):

bind-address=192.168.78.128         #当前服务器地址
log_bin=mysql-bin  
server_id=128

192.168.78.130(slave):

bind-address=192.168.78.130         #当前服务器地址
log_bin=mysql-bin  
server_id=130

重启主从 MySQL:

$ systemctl restart mysqld

: server_id 必须唯一

5.master 上创建一个测试数据库

$ create database test;
$ use test;
$ create table test(id int(11), value varchar(20));
$ insert into test values(1, 'aa'),(2, 'bb'),(3, 'cc');

四、步骤

1.master创建授权用户:
192.168.78.128(master):

##创建 test 用户,指定该用户只能在master 192.168.78.130 上
##使用 MyPass1! 密码登录
mysql> create user 'test'@'192.168.78.130' identified by 'MyPass1!';

##为 test 用户赋予 REPLICATION SLAVE 权限。
mysql> grant replication slave on *.* to 'test'@'192.168.78.130';

##查看用户
mysql> select user,host from mysql.user;

##查看 master 状态
mysql> show master status;



这里的 mysql-bin.000001Position 配置 slave 的时候需要用到

2.将 master 中现有的数据信息导出

$ mysqldump -u root -p --all-databases --master-data > all.sql

3.将 all.sql 发送到 slave 服务器 tmp 目录下:

$ scp all.sql root@192.168.78.130:/tmp

4.slave 导入 master 数据,使 master-slave 数据保持一致

192.168.78.130(slave):

$ mysql -uroot -p < all.sql

5.使 slavemaster 建立连接,从而同步

mysql> change master to
    -> master_host='192.168.78.128',
    -> master_user='test',
    -> master_password='MyPass1!',
    -> master_log_file='mysql-bin.000001',
    -> master_log_pos=1244;

mysql> start slave;

mysql> show slave status \G

  • master_log_filemaster_log_pos值为主库上面执行show master status得到
  • 如果 Slave_IO_RunningSlave_SQL_Running 都为 Yes,说明配置成功。 如果
  • 其中一项不为 Yes,查看 Last_IO_Errno 错误码和错误信息,或者查看 MySQL 日志信息并查找对应问题。

五、主从配置检验

master 插入一条数据,slave查看是否成功
192.168.78.128(master):

192.168.78.130(slave):

六、思考

主从复制同步延迟如何解决?