MySQL-主从复制
MySQL-主从复制
- 一、工作原理
- 二、配置步骤
- 1. 主库配置
- 2. 从库配置
- 3. 测试
一、工作原理
master:主服务器
slave:从服务器
- 首先在master上开启二进制日志
- master上数据发生变化,进行DML操作的时候,会产生二进制日志
- master上的dump线程会通知slave上的IO线程来拿二进制日志,IO线程拿到二进制日志后会写到slave上的中继日志,重演二进制日志里的操作,从而达到slave和master上的数据一模一样,实现数据的一致性
二、配置步骤
准备两台服务器
[root@master ~]# mysql --version
mysql Ver 8.0.43 for Linux on x86_64 (MySQL Community Server - GPL)
1. 主库配置
主服务器上开启二进制日志,server_id=1
[root@master ~]# tail -2 /etc/my.cnf
log_bin=/var/lib/mysql/mysql_bin.log
server_id=1# 从服务器上也可以开启二进制日志,server_id=2
[root@slave ~]# tail -2 /etc/my.cnf
log_bin=/var/lib/mysql/mysql_bin.log
server_id=2# 重启服务
systemctl restart mysqld
新建一个授权用户,给slave来复制二进制日志
MySQL 8.0 默认的 caching_sha2_password 认证插件在非 SSL 连接下要求 “安全连接”,而当前从库未配置 SSL,会导致认证失败
-> 兼容性方案:改用 mysql_native_password 插件
mysql> CREATE USER 'sc'@'192.168.168.%' IDENTIFIED WITH mysql_native_password BY 'passwd';
Query OK, 0 rows affected (0.02 sec)mysql> GRANT REPLICATION SLAVE ON *.* TO 'sc'@'192.168.168.%';
Query OK, 0 rows affected (0.00 sec)# 刷新权限
mysql> FLUSH PRIVILEGES;
查看是否开启二进制日志,主库状态
mysql> show variables like "log_bin";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql_bin.000001 | 1335 | | | |
+------------------+----------+--------------+------------------+-------------------+
2. 从库配置
mysql> stop slave;# 同步两台服务器的基础数据[root@master ~]# mysqldump -uroot -p --all-databases >all_db.SQL
Enter password:
[root@master ~]# scp all_db.SQL root@192.168.168.135:/root
all_db.SQL 100% 1256KB 63.5MB/s 00:00 [root@slave ~]# mysql -uroot -p <all_db.SQL
Enter password: # 配置主库信息
mysql> CHANGE MASTER TO-> MASTER_HOST = '192.168.168.134',-> MASTER_USER = 'sc',-> MASTER_PASSWORD = 'passwd',-> MASTER_LOG_FILE = 'mysql_bin.000001',-> MASTER_LOG_POS = 1335;mysql> start slave;
mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 192.168.168.134Master_User: scMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql_bin.000001Read_Master_Log_Pos: 1335Relay_Log_File: slave-relay-bin.000002Relay_Log_Pos: 785Relay_Master_Log_File: mysql_bin.000001Slave_IO_Running: YesSlave_SQL_Running: Yes# 若 Slave_IO_Running 和 Slave_SQL_Running 均为 Yes,则表示主从复制配置成功
3. 测试
主上面操作
mysql> create table test1(age int);
Query OK, 0 rows affected (0.01 sec)
mysql> insert into test1 values(10);
Query OK, 1 row affected (0.01 sec)
从上面查看
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| test1 |
+----------------+mysql> select * from test1;
+------+
| age |
+------+
| 10 |
+------+
slave是一直连接到master的,传输层使用tcp
[root@master ~]# netstat -anplut |grep ES
tcp 0 0 192.168.168.134:47374 192.168.168.135:22 ESTABLISHED 4595/ssh
tcp 0 52 192.168.168.134:22 192.168.168.1:53773 ESTABLISHED 1380/sshd: root [pr
tcp 0 0 192.168.168.134:22 192.168.168.1:53771 ESTABLISHED 1336/sshd: root [pr
tcp6 0 0 192.168.168.134:3306 192.168.168.135:37154 ESTABLISHED 2600/mysqld
udp 0 0 192.168.168.134:68 192.168.168.254:67 ESTABLISHED 760/NetworkManager
查看主上所有活跃连接
mysql> show processlist;
+----+-----------------+-----------------------+------+-------------+------+-----------------------------------------------------------------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------------+------+-------------+------+-----------------------------------------------------------------+------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 3491 | Waiting on empty queue | NULL |
| 8 | root | localhost | test | Query | 0 | init | show processlist |
| 23 | sc | 192.168.168.135:37154 | NULL | Binlog Dump | 312 | Source has sent all binlog to replica; waiting for more updates | NULL |
+----+-----------------+-----------------------+------+-------------+------+-----------------------------------------------------------------+------------------+