1、什么是主从复制
数据库的主从复制(master-slave replication)是一种数据复制技术,其中一台数据库服务器(主服务器)上的数据变更会复制到另一台或多台数据库服务器(从服务器)上。这种复制可以是同步的或异步的。
在主从复制中,主服务器会将其上的数据库修改记录(DDL和DML操作)通过二进制日志(binlog)发送给从服务器。从服务器通过读取主服务器的二进制日志并重新执行其中的操作,来保持与主服务器的数据一致。
主从复制可以用于提高数据可用性、备份、恢复以及水平扩展数据库系统的性能。
从服务器重要的两个状态指示器:
- Slave_IO_Running:表示从服务器(slave)的I/O线程是否正在运行。I/O线程是负责从主服务器接收二进制日志(binlog)并写入本地中继日志(relay log)的线程。
- Slave_SQL_Running:表示从服务器(slave)的SQL线程是否正在运行。SQL线程是负责从本地中继日志(relay log)读取事件,并在从服务器上执行这些操作的线程。
在主从复制中,I/O线程和SQL线程是协同工作的。I/O线程负责从主服务器接收日志并写入本地中继日志,而SQL线程则负责从中继日志中读取事件并在从服务器上执行。因此,确保这两个线程都正常运行是实现成功的主从复制的关键。
2、使用主从复制的原因
优点:
- 提高数据可用性:主从复制可以实现数据的实时备份,即使主服务器发生故障,从服务器也可以继续提供服务,保证数据的可用性。
- 负载均衡:通过将读操作分担到多个从服务器上,可以减轻主服务器的负载,提高整个系统的性能。
- 数据备份和恢复:从服务器可以作为主服务器的备份,保证数据的安全性。同时,如果主服务器发生故障,可以从从服务器上快速恢复数据。
- 扩展性:主从复制可以实现系统的水平扩展,提高系统的处理能力和性能。
- 实现复杂应用场景:主从复制可以满足各种复杂的应用场景,如读写分离、数据备份、容灾等。
缺点:
- 延迟问题:由于数据是从主服务器复制到从服务器的,因此当主服务器上的数据发生改变时,从服务器上的数据可能会存在一定的延迟。这可能会对一些需要实时同步的应用场景造成影响。
- 复杂性:主从复制需要配置和维护多个服务器和数据库,这会增加系统的复杂性和管理难度。此外,如果主从服务器之间的网络通信出现故障,可能会导致数据复制的中断或延迟。
- 性能问题:虽然从服务器可以分担一部分读操作,但主服务器的负载仍然会因为写操作而增加。在某些情况下,如果主服务器的性能不足以处理所有的请求,可能会影响到整个系统的性能。
- 数据一致性问题:由于主从复制是异步的,因此可能会出现数据一致性问题。例如,当主服务器上的数据还没有完全复制到从服务器时,如果从服务器被用来写入数据,就可能会导致数据的不一致。
- 故障切换问题:如果主服务器出现故障,需要手动切换到从服务器,这可能会导致停机时间和数据丢失的风险。
3、Mysql主从复制的注意点
- Mysql的主服务器和从服务器的版本必须要一致。
- 主服务器和从服务器的IP一定是能
ping
通的。 - 在8.0之后的Mysql用户的密码加密方式已经改成了
caching_sha2_password
,当从服务器访问主服务器时,就会报错出现连接异常,此时就需要把加密方式改成mysql_native_password
。
以上三个条件缺一不可,很重要。
4、实现
4.1、下载Mysql
Mysql主从服务器的版本一定要一致。
Mysql主从服务器的版本一定要一致。
Mysql主从服务器的版本一定要一致。
Mysql的安装和配置可以参考我以前的博客:MySQL-8.0.23--64位配置
4.2、修改my.ini文件
my.ini文件是MySQL服务器配置的核心文件,它允许你调整各种参数和选项,以适应特定的环境和需求。
4.2.1、配置主服务器的my.ini文件
yaml
[mysqld]
port=3306
basedir=E:\MySQL\mysql-8.0.35-winx64
datadir=E:\MySQL\mysql-8.0.35-winx64\data
max_connections=100
max_connect_errors=10
character-set-server=utf8mb4
default-storage-engine=INNODB
# 主要部分
server-id=1
log-bin=master-bin
binlog-do-db=mysql_test
binlog_format=MIXED
[mysql]
default-character-set=utf8mb4
[client]
port=3306
主要部分参数:
参数名称 | 参数描述 |
---|---|
server-id | 服务端的唯一ID(唯一),主/从服务器的server-id不能一致 |
log-bin | 主服务器的同步二进制日志文件名称 |
binlog-do-db | 需要同步的数据库名称 |
binlog_format | 二进制文件的格式 |
binlog-ignore-db | 不需要同步的数据库名称 |
binlog_format可以选取的参数:
参数名称 | 参数描述 |
---|---|
STATEMENT | 将每条会修改数据的SQL语句记录到binlog中,不记录具体的数据变化。这样的好处是binlog文件较小,但是在主从复制中可能会出现数据不一致的问题。 (这是MySQL 5.7.7之前的默认格式) |
ROW | 将每一行数据的变化都记录到binlog中。 (这是MySQL 5.7.7及更高版本的默认值) |
MIXED | 是STATEMENT和ROW的混合模式,会根据执行的SQL语句的类型来决定记录到binlog中的内容,这种格式在兼容性上相对较好。 (在NDB群集中,默认值是MIXED,因为NDB群集不支持基于语句的复制) |
4.2.2、配置从服务器的my.ini文件
yaml
[mysqld]
port=3306
basedir=D:\mysql\mysql-8.0.35-winx64
datadir=D:\mysql\mysql-8.0.35-winx64\data
max_connections=100
max_connect_errors=10
character-set-server=utf8mb4
default-storage-engine=INNODB
# 主要部分
server-id=2
replicate-do-db=mysql_test
[mysql]
default-character-set=utf8mb4
[client]
port=3306
参数名称 | 参数描述 |
---|---|
server-id | 从服务器的唯一ID |
replicate-do-db | 从服务器要从主服务器复制的数据库名称 |
4.2.3、重启Mysql服务
无论是主服务器还是从服务器,配置好my.ini
文件后一定要重启Mysql服务。
打开任务管理器
中的服务
,找到MySQL
服务后,选择重新启动
。
4.3、新建用户
在完成上述的操作后,我们需要在Master
端创建一个用户让Slave
端来进行连接。
当然也可以使用管理员的账号root
给Slave进行连接,但是需要修改mysql
这个数据库中的user
表中root
用户的host
,默认这个host
指向的是localhost
,只能本地来访问,其他的机器是无法访问的,所以如果想使用root
用户来给Slave进行连接,就需要把host
改为Slave的IP地址或者%。
但是我们还是支持一户专用的方式,所以我们在Master端新建一个账户。
1、新建用户
%
表示所有IP地址。
sql
# 语法:CREATE USER 'username'@'IP address' IDENTIFIED BY '密码';
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
2、给用户赋权
sql
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' WITH GRANT OPTION;
赋予的权限可以在mysql
数据库中的user
表中看到,主要是赋予Grant_priv
和Reple_slave_priv
两个字段的权限。
3、刷新权限系统
sql
FLUSH PRIVILEGES;
4、查看用户信息
sql
select host,user,plugin,authentication_string from mysql.user;
4.4、主从连接
完成上述步骤后,就可以进行MySQL的主从连接了。
4.4.1、查看Master状态
sql
show master status;
执行上述SQL命令后,会查询出以下截图中的信息,其中重要的是File
和Position
两个字段。
- File:Master端的同步日志文件。
- Position:用于记录Slave在Master二进制日志中的位置。它用于同步主从服务器之间的数据复制过程。
4.4.2、Slave端连接Master端
1、先暂停Slave的复制信息,如果从来没开过,默认就是关闭的。
sql
STOP SLAVE;
2、连接Master
sql
CHANGE MASTER TO MASTER_HOST ='192.168.72.122', # Master IP Address
MASTER_PORT=3306, # Master Mysql Port
MASTER_USER ='slave', # username
MASTER_PASSWORD ='123456', # password
MASTER_LOG_FILE ='master-bin.000003', # Master log file name
MASTER_LOG_POS = 450; # position
以上命令在满足第三点的条件后,Master信息一定要写对,否则无法进行主从复制。
3、启动Slave和查看连接状态
sql
# 重启Slave
START SLAVE;
# 查看Slave状态
SHOW SLAVE status
查看Slave的状态主要看两个状态指示器Slave_IO_Running
和Slave_SQL_Running
。
如果两个指示器都是yes,则表示主从复制成功。
4.5、所遇错误
1、如果Slave_IO_Running
一直都是connecting
状态。
- Master端和Slave端的Mysql版本是否一致。
- 在Slave端的可视化工具中连接Master端的Mysql,看是否可以连接,如果不能连接,则查看Slave端连接Master端的用户密码加密是不是使用的是
mysql_native_password
。 - Master端的用户
Grant_priv
和Reple_slave_priv
两个权限是否开通。
2、数据库连接报错1251: Client does not support authentication protocol requested by server; consider upgrading MySQL client
。
- 查看Mysql版本是否一致。
- 修改用户密码的加密方式,
caching_sha2_password
改成mysql_native_password
。