MySQL 主从复制

概念

  主从复制可以使MySQL数据库主服务器的主数据库,复制到一个或多个MySQL从服务器从数据库,默认情况下,复制异步(也可以配置并且复制 Enhance Multi-Threaded Slaves 5.7开始支持); 根据配置,可以复制数据库中的所有数据库,选定的数据库或甚至选定的表。

MySQL中主从复制的优点

横向扩展解决方案

在多个从库之间扩展负载以提高性能。在这种环境中,所有写入和更新在主库上进行。但是,读取可能发生在一个或多个从库上。该模型可以提高写入的性能(由于主库专用于更新),同时在多个从库上读取,可以大大提高读取速度。

数据安全性

由于主库数据被复制到从库,从库可以暂停复制过程,可以在从库上运行备份服务,而不会破坏对应的主库数据。

分析

可以在主库上创建实时数据,而信息分析可以在从库上进行,而不会影响主服务器的性能。

长距离数据分发

可以使用复制创建远程站点使用的数据的本地副本,而无需永久访问主库。

 

1、准备工作

Ubuntu 16.04

Master: 172.16.65.200

Slave: 172.16.65.201

MySQL 5.7.x

 

2、安装MySQL

# apt-get install mysql-server

 

3、配置Master

修改MySQL配置文件,启用bin-log

# vim /etc/mysql/mysql.conf.d/mysql.cnf
[mysqld]
log-bin=mysql-bin
server-id=200   # 通常使用结尾IP
# bind-address = 127.0.0.1    # 注释掉

重启服务

# service mysql restart

创建用户

# mysql -uroot -p
.
.
.
> create user 'repl'@'%' identified by '123456';
> grant replication slave on *.* to 'repl'@'%';

通过show master status命令,查看File和Position,配置Slave的时候会用到。

 

4、配置Slave

修改MySQL配置文件,启用bin-log

# vim /etc/mysql/mysql.conf.d/mysql.cnf
[mysqld]
log-bin=mysql-bin
server-id=201   # 通常使用结尾IP
# bind-address = 127.0.0.1    # 注释掉

重启服务

# service mysql restart

配置与主库复制

参数格式

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master_host_name',
    ->     MASTER_USER='replication_user_name',
    ->     MASTER_PASSWORD='replication_password',
    ->     MASTER_LOG_FILE='recorded_log_file_name',
    ->     MASTER_LOG_POS=recorded_log_position;
# mysql -uroot -p
.
.
.
mysql> CHANGE MASTER TO
    -> MASTER_HOST='172.16.65.200',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='123456',
    -> MASTER_LOG_FILE='mysql-bin.000002',
    -> MASTER_LOG_POS=1412;
Query OK, 0 rows affected, 2 warnings (0.02 sec)

启用Slave replication thread

mysql> START SLAVE;
Query OK, 0 rows affected (0.00 sec)

 

5、查看复制状态

mysql>  show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 172.16.65.200
                  Master_User: replication
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 629
               Relay_Log_File: master2-relay-bin.000003
                Relay_Log_Pos: 320
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
......

检查主从复制通信状态

Slave_IO_State #从站的当前状态 
Slave_IO_Running: Yes #读取主程序二进制日志的I/O线程是否正在运行 
Slave_SQL_Running: Yes #执行读取主服务器中二进制日志事件的SQL线程是否正在运行。与I/O线程一样 
Seconds_Behind_Master #是否为0,0就是已经同步了

必须都是 Yes

如果不是原因主要有以下 4 个方面:

1、网络不通 
2、密码不对 
3、MASTER_LOG_POS 不对 ps 
4、mysql 的 auto.cnf server-uuid 一样(可能你是复制的mysql)

 

6、测试数据同步

在Master相关数据表中插入数据,在Slave上查看是否已同步。

 

 7、故障处理

进入slave服务器,运行:

mysql> show slave status\G
         .......
             Relay_Log_File: localhost-relay-bin.000535
              Relay_Log_Pos: 21795072
      Relay_Master_Log_File: localhost-bin.000094
           Slave_IO_Running: Yes
          Slave_SQL_Running: No
            Replicate_Do_DB: 
        Replicate_Ignore_DB: 
      ......
Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.

一般是事务回滚造成的:
解决办法:
mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;

 

8、并行复制(5.7新功能)

一般主从复制,有三个线程参与,都是单线程:Binlog Dump(主) ----->IO Thread (从) -----> SQL Thread(从)。复制出现延迟一般出在两个地方

1)SQL线程忙不过来(可能需要应用数据量较大,可能和从库本身的一些操作有锁和资源的冲突;主库可以并发写,SQL线程不可以;主要原因)

2)网络抖动导致IO线程复制延迟(次要原因)

 

在MySQL 5.7中,引入了基于组提交的并行复制(Enhanced Multi-threaded Slaves)

[mysqld]
# * slave
slave_parallel_workers    = 10               ###并行复制的线程数
slave_parallel_type       = LOGICAL_CLOCK   ###并行复制的类型,默认database

master_info_repository    = table
relay_log_info_repository = table

relay_log_recovery           = 1

修改后重启MySQL服务

# service mysql restart

查看进程列表

修改前:

mysql> show variables like 'slave_parallel%';

+------------------------+----------+

| Variable_name          | Value    |

+------------------------+----------+

| slave_parallel_type    | DATABASE |

| slave_parallel_workers | 0        |

+------------------------+----------+

2 rows in set (0.03 sec)

 

修改后: 

mysql> show processlist\G

*************************** 1. row ***************************

     Id: 1

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for master to send event

   Info: NULL

*************************** 2. row ***************************

     Id: 2

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Slave has read all relay log; waiting for more updates

   Info: NULL

*************************** 3. row ***************************

     Id: 3

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 4. row ***************************

     Id: 4

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 5. row ***************************

     Id: 5

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 6. row ***************************

     Id: 6

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 7. row ***************************

     Id: 8

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 8. row ***************************

     Id: 9

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 9. row ***************************

     Id: 10

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 10. row ***************************

     Id: 11

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 11. row ***************************

     Id: 12

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 12. row ***************************

     Id: 13

   User: system user

   Host: 

     db: NULL

Command: Connect

   Time: 14

  State: Waiting for an event from Coordinator

   Info: NULL

*************************** 13. row ***************************

     Id: 15

   User: root

   Host: localhost

     db: NULL

Command: Query

   Time: 0

  State: starting

   Info: show processlist

13 rows in set (0.00 sec)

 

mysql> show variables like 'slave_parallel%';

+------------------------+---------------+

| Variable_name          | Value         |

+------------------------+---------------+

| slave_parallel_type    | LOGICAL_CLOCK |

| slave_parallel_workers | 10            |

+------------------------+---------------+

2 rows in set (0.00 sec)

 

 

 

参考文章:

https://segmentfault.com/a/1190000010867488

 

posted @ 2018-01-25 14:15  Vincen_shen  阅读(219)  评论(0)    收藏  举报