一. 主从复制
-
主从复制是 MySQL 中一种用于实现数据冗余、提高可用性和性能的重要机制。
-
通过将数据从主服务器复制到从服务器,可以增强数据的可靠性和容错能力。
-
在主服务器发生故障或需要进行维护时,从服务器可以提供数据的备份和恢复,确保系统的连续性。
1.1 为什么需要主从复制
MySQL 主从架构,特别是一主两从的配置,主要是为了提高数据库的可用性、负载均衡和数据安全性。这种架构允许一个主服务器处理所有的写操作,而两个从服务器则用于处理读请求,从而分散读取负载。这不仅增加了系统的处理能力,还通过复制机制增强了数据的可靠性和安全性。
在这种配置下,如果主服务器发生故障,其中一个从服务器可以迅速被提升为新的主服务器,从而确保服务的连续性和数据的完整性。此外,使用两个从服务器还提供了额外的灵活性和冗余,可以在进行维护或升级时无需中断服务。总的来说,一主两从的 MySQL 架构是一种高效、可靠且容错性强的数据库解决方案,适合需要高可用性和高性能的场景。
1.2 主从复制应用场景
-
读写分离: 将读操作分担到从服务器,减轻主服务器的负载,提高系统的并发处理能力。
-
数据备份与恢复: 从服务器作为主服务器的数据副本,提供了数据备份的手段,便于灾难恢复。
-
高可用性和容错: 即使主服务器出现问题,从服务器可以快速接管,保证服务的可用性。
-
分布式架构: 通过多个从服务器的分布部署,实现分布式数据存储和处理,提升系统的可扩展性。
-
数据分发和缓存: 将数据复制到多个从服务器,用于数据分发或缓存,加速数据访问。
-
负载均衡:一台机器读写可能扛不住,多个服务器过来帮忙,主负责写,从负责读。
1.3 缺点
-
增加运维复杂度。
-
无法保证主从实时通信,可能出现数据不一致的情况。
1.4 主从复制结构
一主一从
从机不仅仅作为备机,而且还作为读数据源的db,业务服务写数据时,写到主机,读数据时,从从机上读。从而降低主机的压力
一主多从
主写从读之后,我们发现单一的从节点在支撑业务查询数据时,还是存在性能瓶颈,因此将从机进行水平扩展,实现多从。
双M
从机的身份提升为主机,两个主机互为对方的从机,共同分担读写压力
联级复制
联级复制和一主多从比较相像,区别是次级别的从机的数据来源是来自于从机而不再是主机。这样主要是考虑到从机变多后,同步数据对主机性能的影响
多主一从
多主应用在写多读少的场景,通过多主降低主机的压力,同时通过1个从机,来完成读操作和数据备份的能力。
1.5 binlog日志
binlog是MySQL数据库的二进制日志文件,记录了数据库更改的所有操作,但不包括SELECT和SHOW这类操作,这些操作对数据进行修改、管理操作、数据库修改等操作都会被记录在日志中。
-
statement:记录每一条修改数据的SQL语句(批量修改时,记录的不是单条SQL语句,而是批量修改的SQL语句事件), slave在复制的时候SQL进程会解析成和原来master端执行过相同的SQL再次执行。简称SQL语句复制
-
优点:日志量小,减少磁盘IO,提升存储和恢复速度
-
缺点:在某些情况下会导致主从数据不一致,比如last_insert_id()、now()等函数
-
-
row:基于数据行的,日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改
-
优点:能清楚记录每一个行数据的修改细节,能完全实现主从数据同步和数据的恢复。而且不会出现某些特定情况下存储过程或function,以及trigger的调用和触发器无法被正确复制的问题
-
缺点:批量操作,会产生大量的日志,尤其是alter table会让日志暴涨
-
-
mixed:混合模式,以上两种模式的混合使用,一般会使用statement模式保存binlog,对于statement模式无法复制的操作时,使用row模式保存binlog,MySQL会根据执行的SQL语句选择写入模式
当sql操作写入binlog,就已经算作sql执行成功了,而不是写入到对应磁盘中。所以binlog中对应的值,我们可以理解为就是mysql的一个映射,同步mysql数据不不需要磁盘中的数据进行同步,而只需要同步binlog日志就行。
1.6 主从复制的原理
主从复制过程实际上就是slave从master端获取相应的二进制日志(binlog),然后再在自己的slave端完全按照顺序执行日志中的时间,将其执行到自己的数据库中。
要实现主从复制,首先必须打开master端的binlog 功能
-
master:负责写,保存binlog日志
-
slave:relay-log,复制日志
-
I/O:负责通信读取binlog日志
-
sql:负责写数据
实现步骤:
-
主库db的更新事件(update、insert、delete)被写到binlog
-
从库发起连接,连接到主库
-
此时主库创建一个binlog dump thread线程,把binlog的内容发送到从库
-
从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log.
-
从库还会创建一个SQL线程,从relay log里面读取内容,将更新内容写入到slave的db.
二. 主从搭建
2.1 MySQL安装
详见前期课程
准备好一主一从两台服务器,安装好mysql数据库
2.2 搭建自从复制

2.3 配置主服务器
修改配置文件
在主服务器配置文件/etc/my.cnf添加内容
cd /etc

添加以下内容
# 开启binlog日志 log-bin=mysql-bin # mysql服务ID,保证整个集群环境中唯一,取值范围:1 – 232,默认为1 server-id=1

保存配置文件之后重启MySql服务
systemctl restart mysql

进入mysql
mysql -u账号 -p密码

查看主机状态
show master status
记住主机状态的内容

2.4 配置从服务器
修改配置文件
在从服务器配置文件/etc/my.cnf添加内容
cd /etc

重启mysql
同上⬆️
连接数据库
同上⬆️
查看从机状态

配置99服务器的mysql成为69服务器mysql的从
change master to master_host='192.168.5.69',master_port=3306,master_user='root',master_password='root',master_log_file='mysql-bin.000008',master_log_pos=154;

启动从机
start slave;

查看从机状态
show slave status\G;
看见这个就错了

因为我们虚拟机都是建立的克隆所以我们的mysql完全一样,下面进行修改
删除自动生成的uid
rm -rf /var/lib/mysql/auto.cnf

重启MySql
sysetmctl restart mysqld
关闭从机

重新配置99服务器的mysql成为69服务器mysql的从

重启从机

重新查看从机状态

2.5 测试是否配置生效
在主机里面新建一个数据库 在从机里查询 如果可以查到新建的数据库则主从配置完成
在主机新建数据库

在从机里进行查询
如果可以查询到就完成了
964

被折叠的 条评论
为什么被折叠?



