主从同步是一种常见的数据复制技术,它通过将主库的数据同步到一个或多个从数据库中来保证数据的一致性。从库通过读取主库的 binlog 文件来获取更新并进行同步。
主从复制的方式有三种:
- 异步复制:不需要从库确认,主库提交数据后立即返回。
- 同步复制:所有从库都必须确认接收到数据后,主库才能提交事务。
- 半同步复制:至少一个从库确认接收到数据后,主库才能提交事务,
MySQL5.7
之后才能启用。
当主库提交事务时,它会将变更记录写入 binlog
文件。一个 dump
线程负责监听这些 binlog
文件的变更,当文件发生更新时,dump
线程会推送更新事件给从库。从库接收到这些更新事件后,通过 I/O 线程将其写入中继日志(relay log
),然后通过 SQL
线程执行这些更新操作。
配置主从同步步骤
主库配置步骤
-
启用 binlog 日志:
在主库的配置文件中设置以下参数,开启 binlog:server-id = 1 # 主库的唯一 ID log-bin = mysql-bin # 启用二进制日志
-
创建复制用户:
在主库上创建一个专用于复制的用户,并授予REPLICATION SLAVE
权限:CREATE USER 'replica_user'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'replica_user'@'%'; FLUSH PRIVILEGES;
-
记录主库状态:
获取主库的binlog
文件名和位置。这些信息会在配置从库时使用:mysql> SHOW MASTER STATUS; +------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000003 | 843 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
从库配置步骤
-
配置从库:
在从库的配置文件中启用中继日志,并设置从库为只读:server-id = 2 # 从库的唯一 ID,必须与主库不同 relay-log = mysql-relay-bin # 启用中继日志 log-bin = mysql-bin # 启用二进制日志(可选,若从库也需要提供复制) read-only = 1 # 设置为只读
-
配置从库信息:
进入从库并设置主库的信息,启动复制进程:mysql> CHANGE MASTER TO MASTER_HOST = '主库的IP', MASTER_PORT=主库的端口, MASTER_USER = 'replica_user', MASTER_PASSWORD = 'password', MASTER_LOG_FILE = 'mysql-bin.000003', MASTER_LOG_POS = 843; Query OK, 0 rows affected, 9 warnings (0.05 sec)mysql> START SLAVE; Query OK, 0 rows affected, 1 warning (0.02 sec)l
-
检查状态:
使用以下命令检查从库的同步状态。若Slave_IO_Running
和Slave_SQL_Running
都显示为Yes
,表示复制配置正常:mysql> SHOW SLAVE STATUS\G *************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 主库IPMaster_User: replica_userMaster_Port: 主库端口Connect_Retry: 60Master_Log_File: mysql-bin.000003Read_Master_Log_Pos: 843Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 326Relay_Master_Log_File: mysql-bin.000003Slave_IO_Running: YesSlave_SQL_Running: Yes......
通过以上这些配置步骤,主从复制就完成了。
-
验证同步是否成功:
可以在主库插入一些数据,看看从库中是否正常复制数据。
dump线程和从库线程
使用 show processlist
命令查看主库和从库的线程信息
主库信息
mysql> show processlist;
+----+-----------------+------------------+-------+-------------+------+-----------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+------------------+-------+-------------+------+-----------------------------------------------------------------+------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 1034 | Waiting on empty queue | NULL |
| 8 | root | localhost | test1 | Query | 0 | init | show processlist |
| 9 | replica_user | 172.25.0.1:62302 | NULL | Binlog Dump | 619 | Source has sent all binlog to replica; waiting for more updates | NULL |
| 10 | replica_user | 172.25.0.1:62306 | NULL | Binlog Dump | 61 | Source has sent all binlog to replica; waiting for more updates | NULL |
+----+-----------------+------------------+-------+-------------+------+-----------------------------------------------------------------+------------------+
4 rows in set (0.00 sec)
从库信息
mysql> show processlist;
+----+-----------------+-----------------+-------+---------+------+----------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+-------+---------+------+----------------------------------------------------------+------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 2337 | Waiting on empty queue | NULL |
| 8 | root | localhost | test1 | Query | 0 | init | show processlist |
| 9 | system user | connecting host | NULL | Connect | 2144 | Waiting for source to send event | NULL |
| 10 | system user | | NULL | Query | 1529 | Replica has read all relay log; waiting for more updates | NULL |
| 11 | system user | | NULL | Query | 1529 | Waiting for an event from Coordinator | NULL |
| 12 | system user | | NULL | Connect | 2144 | Waiting for an event from Coordinator | NULL |
| 13 | system user | | NULL | Connect | 2144 | Waiting for an event from Coordinator | NULL |
| 14 | system user | | NULL | Connect | 2144 | Waiting for an event from Coordinator | NULL |
+----+-----------------+-----------------+-------+---------+------+----------------------------------------------------------+------------------+
8 rows in set (0.00 sec)
dump
线程 是在从库执行 START SLAVE
命令后,成功与主库建立通信并开始拉取 binlog
数据的线程。
从库中 system user
线程就是拉取到 binlog
信息,然后执行 SQL
的线程。