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