一:MySQL主从复制原理
MySQL 的主从复制和 MySQL 的读写分离两者有着紧密联系,首先要部署主从复制,只有主从复制完成了,才能在此基础上进行数据的读写分离。
1.MySQL支持的复制类型
①基于语句的复制。在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句,MySQL 默认采用基于语句的复制,效率比较高。
②基于行的复制。把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
③混合类型的复制。默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制
2.复制的工作过程
① 在每个事务更新数据完成之前,Master 将这些改变记录进二进制日志。写入二进制日志完成后,Master 通知存储引擎提交事务。
② Slave 将 Master 的 Binary log 复制到其中继日志(Relay log)。首先,Slave 开始一个工作线程 ——I/O 线程,I/O 线程在 Master 上打开一个普通的连接,然后开始 Binlog dump process。Binlog dump process 从 Master 的二进制日志中读取事件,如果已经跟上 Master,它会睡眠并等待 Master 产生新的事件。I/O 线程将这些事件写入中继日志。
③ SQL slave thread(SQL 从线程)处理该过程的最后一步。SQL 线程从中继日志读取事件,并重放其中的事件而更新 Slave 数据,使其与 Master 中的数据保持一致。只要该线程与 I/O 线程保持一致,中继日志通常会位于 OS 的缓存中,所以中继日志的开销很小。复制过程有一个很重要的限制,即复制在 Slave 上是串行化的,也就是说 Master 上的并行更新操作不能在 Slave 上并行操作。
二:案例实施
1.配置master主服务器
(1)在 /etc/my.cnf 中修改或者增加下面内容。
log-bin=/usr/local/mysql/data/mysql-bin #启用二进制日志(Binary Log)并指定其存储路径
binlog_format = MIXED #定义二进制日志的记录格式为混合模式
server-id=1 #为 mysql 实例分配一个唯一的服务器标识符
(2)重启 MySQL 服务。
[root@master ~]# systemctl restart mysqld
(3)登录 MySQL 程序,给从服务器授权。
[root@master ~]# mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE USER'myslave'@'%' IDENTIFIED BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> GRANT REPLICATION SLAVE ON . TO'myslave'@'%';
Query OK, 0 rows affected (0.01 sec)
mysql>ALTER USER'myslave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
#MySQL 8.0 默认使用 caching_sha2_password 认证插件,将 mysql_native_password 替换为旧版认证插件,确保从库能兼容
mysql>FLUSH PRIVILEGES;
mysql>show master status;
2.配置slave从服务器
(1)在 /etc/my.cnf 中修改或者增加下面内容,这里要注意 server-id 不能相同。
[root@localhost ~]# vim /etc/my.cnf
server-id = 2 // 增加,唯一的服务器标识符,集群内不能冲突
(2)重启 MySQL 服务。
[root@localhost ~]# systemctl restart mysqld
(3)登录 MySQL,配置同步。
按主服务器结果更改下面命令中 master_log_file 和 master_log_pos 参数。
[root@localhost ~]# mysql -uroot -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> change master to master_host='192.168.10.101',master_user='myslave', master_password='123456',master_log_file='mysql-bin.000001',master_log_pos=157;
Query OK, 0 rows affected, 8 warnings (0.01 sec)
(4)启动同步。
mysql>start slave;
Query OK, 0 rows affected (0.00 sec)
(5)查看 Slave 状态,确保以下两个值为 YES
mysql> show slave status\G
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.10.101
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql - bin.000001
Read_Master_Log_Pos: 157
Relay_Log_File:
localhost
- relay - bin.000002
Relay_Log_Pos: 326
Relay_Master_Log_File: mysql - bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
省略部分内容
3.验证主从复制效果
(1) 在主、从服务器上登录 MySQL,
[root@localhost ~]# mysql -u root -p
mysql>show databases;
两台数据库执行结果应该相同。
(2) 在主服务器上新建数据库 db_test
mysql>create database db_test;
(3) 在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功。
mysql> show databases;