1. 主从复制概念及优势
1.1 概念
MySQL主从复制是一种数据库复制技术,它允许将一个数据库服务器(主服务器)上的数据更改复制到一个或多个数据库服务器(从服务器)。这种技术在数据库管理和维护中扮演着重要的角色,尤其是在需要数据冗余、负载均衡和高可用性的场景中。
主从复制的概念
-
主服务器(Master):主服务器是数据更改的源头。所有的写操作(包括插入、更新和删除)都在主服务器上执行。主服务器负责记录所有数据变更到它的二进制日志中。
-
从服务器(Slave):从服务器接收主服务器的数据变更并将它们应用到自己的数据库中。从服务器通常用于读取操作,如查询,这样可以减轻主服务器的负载。
-
复制过程:复制过程涉及两个主要的线程——主服务器上的日志转储线程和从服务器上的复制I/O线程与复制SQL线程。主服务器将变更写入二进制日志,从服务器的I/O线程读取这些日志并将其写入中继日志,然后从服务器的SQL线程执行这些日志中的命令以更新数据。
1.2 主从复制的优势
-
数据冗余和备份:主从复制提供了数据的冗余副本,这意味着即使主服务器发生故障,数据也不会丢失,可以从从服务器恢复。
-
提高读取性能:通过将读取操作(如查询)分配给一个或多个从服务器,可以显著减轻主服务器的负载,提高整体的读取性能。
-
高可用性:在主服务器发生故障时,可以从服务器接管服务,从而实现无缝的数据服务切换,保证系统的高可用性。
-
负载均衡:主从复制允许将不同的数据库负载分配给不同的服务器,这样可以优化资源使用,提高系统的整体性能。
-
数据分发:在分布式系统中,主从复制可以用来将数据分发到不同的地理位置,以减少数据访问的延迟。
-
备份和恢复:从服务器通常用于备份目的,因为它们提供了数据的一个只读副本,这使得备份操作不会影响主服务器的性能。
MySQL主从复制是一种强大的工具,它提供了数据冗余、提高了读取性能和系统的可用性,同时还支持了负载均衡和数据分发等多种场景。
2.主从复制流程
Mysql服务器之间的主从同步是基于二进制日志机制,主服务器使用二进制日志来记录数据库的变动情况,从服务器通过读取和执行该日志文件来保持和主服务器的数据一致。
在使用二进制日志时,主服务器的所有操作都会被记录下来,然后从服务器会接收到该日志的一个副本。从服务器可以指定执行该日志中的哪一类事件(譬如只插入数据或者只更新数据),默认会执行日志中的所有语句。
配置主从同步的步骤总结:
- 在主服务器上,必须开启二进制日志机制和配置一个独立的ID
- 在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号,可以是同一个,也可以不同
- 在开始复制进程前,在主服务器上记录二进制文件的位置信息
- 如果在开始复制之前,数据库中已经有数据,就必须先创建一个数据快照(可以使用mysqldump导出数据库,或者直接复制数据文件)
- 配置从服务器要连接的主服务器的IP地址和登陆授权,二进制日志文件名和位置
- 从服务器开启复制功能
- 主服务器修改数据测试是否成功
3.主从复制实战
3.1 部署主服务器
创建容器,运行数据库主服务器master
docker run -p 3307:3306 --name master-mysql -v /masterdata/mysql-master/log:/var/log/mysql -v /masterdata/mysql-master/data:/var/lib/mysql -v /masterdata/mysql-master/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
修改master配置文件,/masterdata/mysql-master/conf 新建配置文件
vim /masterdata/mysql-master/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1001
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
重启master实例
docker restart master-mysql
进入master容器,验证数据库
docker exec -it master-mysql /bin/bash
连接数据库,看是否能进入
bash-4.2# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
出现这个红框中内容,即为部署成功
在master容器实例内创建数据同步用户(重要)
# 创建用户
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
# 赋予权限
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
# 刷新权限
FLUSH PRIVILEGES;
查询创建的用户是否已经创建成功
SELECT user FROM mysql.user;
3.2 部署从服务器
创建从机服务器
docker run -p 3308:3306 --name mysql-slave -v /masterdata/mysql-slave/log:/var/log/mysql -v /masterdata/mysql-slave/data:/var/lib/mysql -v /masterdata/mysql-slave/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7
修改从机服务器配置文件,进入/mydata/mysql-slave/conf目录下新建my.cnf
vi /masterdata/mysql-slave/confmy.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=1002
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
重启slave实例
docker restart mysql-slave
进入从机,验证是否安装成功
docker exec -it mysql-slave /bin/bash
bash-4.2# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.44-log MySQL Community Server (GPL)Copyright (c) 2000, 2023, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
出现图片内容,证明安装成功
3.3 主从复制
主数据库中查看主从同步状态
show master status;
进入从机mysql-slave容器
docker exec -it mysql-slave /bin/bash
在从数据库中配置主从复制
change master to master_host='192.168.1.42', master_user='slave', master_password='123456', master_port=3307, master_log_file='mall-mysql-bin.000004', master_log_pos=769,master_connect_retry=30;
master_log_file对应的是主服务器中查询状态的文件名称
master_log_pos对于查询文件的Postion
change master命令参数:
master_host:主数据库的IP地址;
master_port:主数据库的运行端口;
master_user:在主数据库创建的用于同步数据的用户账号;
master_password:在主数据库创建的用于同步数据的用户密码;
master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取File参数;
master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取Position参数;
master_connect_retry:连接失败重试的时间间隔,单位为秒。
在从数据库中查看主从同步状态:no代表没有开始复制数据
show slave status \G;
在从数据库中开启主从同步
start slave;
再次查看从数据库状态:yes表示已经同步
3.4 主从复制数据验证
使用数据库管理工具,连接主从复制数据库
主机创建数据库即数据表,写入测试数据
从机查看是否同步
至此,mysql主从复制配置完成。
4.最后
感谢大家,请大家多多支持!