目录
(3)在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功
在实际的生产环境中,如果对数据库的读和写都在同一个数据库服务器中操作,无论是在安全性、高可用性还是高并发等各个方面都是完全不能满足实际需求的。因此,一般来说都是通过主从复制(Master-Slave)来同步数据,再通过读写分离来提升数据库并发负载能力的方案来进行部署与实施。
本文将学习MySQL主从复制,读写分离将在下次学习。
一、主从复制原理
1、MySQL 支持的复制类型
(1)基于语句的复制
在主服务器上执行的SQL 语句,在从服务器上执行同样的语句,MySQL 默认采用基于语句的复制,效率比较高。
(2)基于行的复制
把改变的内容复制过去,而不是把命令在从服务器上执行一遍。
(3)混合类型的复制
默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。
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 上并行操作。
二、案例
主机 | 操作系统 | IP | 应用 |
Master | openEuler 24.03 | 192.168.10.101 | Mysql-server |
Slave1 | openEuler 24.03 | 192.168.10.102 | Mysql-server |
Slave2 | openEuler 24.03 | 192.168.10.103 | Mysql-server |
注:本文是以三台已经安装过MySQL8.0版本的服务器为例。
1、配置master主服务器
(1)在/etc/my.cnf 中修改或增加下面内容
[mysqld]
log-bin=/usr/local/mysql/data/mysql-bin
binlog-format=MIXED
server-id=1
(2)重启MySQL服务
[root@bogon ~]# systemctl restart mysqld
(3)登录MySQL 程序,给从服务器授权
[root@bogon ~]# mysql -uroot -ppwd123
mysql> create user 'myslave'@'%' identified by '123456';
mysql> grant replication slave on *.* to 'myslave'@'%';
mysql> alter user 'myslave'@'%' identified with mysql_native_password by '123456';
mysql> fulsh previleges;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 1149 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
其中 File 列显示日志名,Position 列显示偏移量,这两个值在后面配置从服务器的时候需要。Slave 应从该点上进行新的更新。
2、配置Slave从服务器
在Slave1、Slave2 服务器上面分别执行下面步骤
(1)在/etc/my.cnf 中修改或者增加下面内容,这里要注意 server-id 不能相同。
Slave1
[root@bogon ~]# vim /etc/my.cnf
[mysqld]
server-id=2 #增加,唯一的服务器标识符,集群内不能冲突
Slave2
[root@bogon ~]# vim /etc/my.cnf
[mysqld]
server-id=3
(2)重启MySQL服务
[root@bogon ~]# systemctl restart mysqld
(3)登录MySQL,配置同步
按主服务器结果更改下面命令中master_log_file 和 master_log_pos 参数。
[root@bogon ~]# mysql -uroot -ppwd123
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=1149;
#master_log_pos的值是上文中position
(4)启动同步
mysql> start slave;
(5)查看 Slave状态,确保以下两个值为YES
mysql> show slave status\G
*************************** 1. row ***************************
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: 1149
Relay_Log_File: bogon-relay-bin.000002
Relay_Log_Pos: 326
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes #一定要为yes
Slave_SQL_Running: Yes #同上
Replicate_Do_DB:
Replicate_Ignore_DB:
3、验证
(1)在主、从服务器上登录MySQL
[root@bogon ~]# mysql -uroot -ppwd123
mysql> show databases;
执行结果应该相同
(2)在主服务器上新建数据库 auth
mysql> create database auth;
(3)在两台从服务器上分别查看数据库,显示数据库相同,则主从复制成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| auth |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.01 sec)
三、扩展:主主复制
延续上面的案例
1、Slave1 服务器
[root@bogon ~]# vim /etc/my.cnf
[mysqld]
log-bin=/usr/local/mysql/data/mysql-bin
binlog-format=MIXED
[root@bogon ~]# systemctl restart mysqld
[root@bogon ~]# mysql -uroot -ppwd123
create user 'myslave'@'%' identified by '123456';
grant replication slave on *.* to 'myslave'@'%';
alter user 'myslave'@'%' identified with mysql_native_password by '123456';
flush privileges;
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 157 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
2、Master 服务器
[root@bogon ~]# mysql -uroot -ppwd123
mysql> change master to master_host='192.168.10.102',master_user='myslave',master_password='123456',mastter_log_file='mysql-bin.000001',master_log_pos=157;
mysql> start slave; #启动同步
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for source to send event
Master_Host: 192.168.10.102
Master_User: myslave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000001
Read_Master_Log_Pos: 157
Relay_Log_File: bogon-relay-bin.000002
Relay_Log_Pos: 326
Relay_Master_Log_File: mysql-bin.000001
Slave_IO_Running: Yes #yes,成功
Slave_SQL_Running: Yes #yes,成功
Replicate_Do_DB:
……
3、验证
在Slave1 上添加库
mysql> create database aaa;
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| aaa |
| auth |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.01 sec)
master上查看是否复制过来,显示相同,则主主复制成功
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| aaa |
| auth |
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.01 sec)