MySQL实战 主从同步(原理+实战)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: MySQL实战 主从同步(原理+实战)

一、基本知识


为什么要使用主从同步?若是你的项目只有一个数据库,一旦数据库宕机,导致业务停顿就会产生很大的危害,就会出现单点问题。为了让系统高可用,避免单点问题就可以使用主从方式,采用一主多从的方法,主从之间进行数据同步。


单点问题:系统中出现一点失效,就会让整个系统无法运作部件。单点故障会造成整体故障。

实际举例:负载均衡描述:例如来了10000个请求,其中有1000个写请求,有9000个读请求,将写请求分配到主服务器进行写操作,将其他9000个读请求均衡分布给多个从服务器进行读。

扩展:主从方式另一个目的是进行读写分离,让主服务器数据库进行更新操作即写,查询操作交由从服务器数据库进行!



1.1、什么是主从同步?


主:master


从:slave


解释:一台服务器充当主服务器,一条及以上服务器充当从服务器。主数据库的数据会自动复制到从服务器中(一旦主机有更新操作,从机就能够立马感知,并且从主机上将数据复制下来 )。


针对于多级复制,服务器既可充当主服务器也可充当从服务器。


主从复制的基础就是主服务器对数据进行修改记录二进制文件,从服务器根据主服务器的二进制文件来进行同步更新操作。


好处:帮助备份数据,读写分离。分布式中多主多从。数据库服务器可以互为主从。



1.2、原理分析



过程描述:master服务器会将执行的操作记录到binlog日志中,slave服务器通过配置主服务器的登陆账户,binlog的指定位置之后通过一个I/O线程连接到master服务器,将获取到的binlog日志存储到自己relay log日志中,接着会有一个sql线程去检查relay log日志是否变化,若是变化就进行更新操作,完成同步!


简略步骤:


Master数据库只要发生变化,就会立即记录到Binary log日志文件中。

Slave数据库启动一个I/O thread连接到Master数据库,请求Master变化的二进制文件(binlog)。

Slave I/O线程获取到的二进制日志会保存到自己的relay log日志里。

Slave 有一个SQL线程会定时检查Relay log是否发生变化,若是变化就更新数据。


1.3、MySQL配置主从的特点


1、实现服务器负载均衡:通过在主服务器和从服务器之间切分处理客户查询的负荷,从而得到更好的客户相应时间。一般有两种思路:


第一种思路就是主服务器只会进行更新操作,对于查询操作都会交由从服务器执行(设置多台从服务器),这种是针对于查多改少。

第二种思路就是主服务器上与从服务器切分查询,主服务器不仅要完成更新操作还附带一些查询工作,对于从服务器只用来查询,一旦主服务器比较忙时,部分查询会自动发送到从服务器中,减轻主服务器的负荷。

2、通过复制实现数据的异地备份:主要是用来进行备份数据操作,避免服务器出现损坏等恶意破坏问题。


3、提高数据库系统的可用性:一旦主服务器发生故障,可以让从服务器来充当主服务器继续进行工作,像许多银行系统升级,在升级过程中只能查询不能取钱就是一样的道理。



二、实操


环境背景

虚拟机中两个Centos 7.8系统,数据库版本为5.7.32。



前提准备

一般模拟测试是在虚拟机上使用两个mysql进行主从复制demo试验的。


下面是我准备的主从服务器,分别装有一个mysql:



克隆了一个虚拟机来进行测试!

Navicat也准备就绪:



两个服务器的mysql账号信息如下:shell登陆统一用户名为root,密码是123456


主:192.168.181.129:3306
  数据库账号:cl 123456     权限账户(分配给从服务器登陆):repl ro*ot1%23&45
从:192.168.181.131:3306
  数据库账号:root 123456



主从同步思路

主服务器需要配置一个二进制日志bin log,启动它。开放一个用户账号给从服务器,该用户有主从同步的权限


从服务器要订阅这个bin log日志(通过主服务器开放的一个账号来去订阅),并且开启relay log日志



1、主从服务器进行配置


主服务器


主服务器配置:/etc/my.cnf中添加即可


#mysql master1 config 
# [mysqld]  # 若是配置文件中有就不带
server-id = 1 # 节点ID,确保唯一,用来区分服务器的编号
# log config 
log-bin = master-bin #开启mysql的binlog日志功能(就会创建二进制文件)
sync_binlog = 1 #控制数据库的binlog刷到磁盘上去 , 0 不控制,性能最好,1每次 事物提交都会刷到日志文件中,性能最差,最安全 
binlog_format = mixed #binlog日志格式,mysql默认采用statement,建议使用mixed 
expire_logs_days = 7  #binlog过期清理时间 
max_binlog_size = 100m  #binlog每个日志文件大小 
binlog_cache_size = 4m  #binlog缓存大小 
max_binlog_cache_size= 512m  #最大binlog缓存大 
binlog-ignore-db=mysql #不生成日志文件的数据库,多个忽略数据库可以用逗号拼接,或者 复制 这句话,写多行 
auto-increment-offset = 1 # 自增值的偏移量 
auto-increment-increment = 1 # 自增值的自增量 
slave-skip-errors = all #跳过从库错误



重要的就是3、5行的内容,一个是对服务器进行编号,另一个是开启binlog日志。其他的就是辅助配置,不配置也会有默认值。


重启mysql服务器:systemctl restart mysqld


查看master配置信息(需进入mysql命令行):show master status,获取到binlog文件名称以及偏移量,之后从服务器配置应当按照主服务器来,这样才能找到binlog位置。



从服务器配置


从服务器配置:依旧是在/etc/my.cnf中添加即可


配置信息如下:


# [mysqld] 
server-id=2 
log-bin=mysql-bin 
relay-log=mysql-relay-bin 
# 忽略复制的文件,这几个数据库不需要进行同步
replicate-wild-ignore-table=mysql.% 
replicate-wild-ignore-table=test.% 
replicate-wild-ignore-table=information_schema.%


对于从重要的就是第2、4行,第一个是服务器编号,第二个是开启relay log日志(中继日志)。


同样配置好之后,重启mysql的服务!



2、主服务器创建用户账号(用于从服务器订阅)


主服务器提供一个用户账号用来进行主从同步的:主要需要规范的就是主机地址以及服务器权限选择复制从



repl  -- 用户名
ro*ot1%23&45  -- 密码


账号权限设置为复制从:



若是显示密码弱,可以修改一下密码设置策略再进行修改。


接着我们来尝试在从服务器上进行登陆该账号进行测试:




3、配置从库信息(从服务器数据库)


查看一下主服务器中的master的状态:show master status



获取到其中的两个关键参数,File(文件名)以及position(偏移量)

进入到从服务器中的mysql命令行下进行下面配置:即用于登陆订阅主服务器的账号信息以及binlog文件名、偏移量


mysql> CHANGE MASTER TO 
MASTER_HOST = '192.168.181.129',  
MASTER_USER = 'repl', 
MASTER_PASSWORD = 'ro*ot1%23&45',
MASTER_PORT = 3306,
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=663,
MASTER_RETRY_COUNT = 60,
MASTER_HEARTBEAT_PERIOD = 10000;



注释信息(对配置内容进行说明):


MASTER_HOST = '192.168.181.129',     # 目标服务器(即主服务器)的主机地址
MASTER_USER = 'repl',       # 登陆主服务器的用户名
MASTER_PASSWORD = 'ro*ot1%23&45', # 登陆主服务器的密码
MASTER_PORT = 3306,              # 主服务器开放mysql的端口
# 下面两个是在主服务器中查询到的,使用show master status查询
MASTER_LOG_FILE='master-bin.000001',
MASTER_LOG_POS=663,
# MASTER_LOG_FILE='mysql-bin.000005',#与主库File 保持一致
# MASTER_LOG_POS=120 , #与主库Position 保持一致
# 额外配置信息
MASTER_RETRY_COUNT = 60,
MASTER_HEARTBEAT_PERIOD = 10000;


依旧是在mysql命令行使用命令开启从服务器,并且可以查看一下状态:


start slave;  # 开启从服务器(服从)  # 关闭从服务器 stop slave
show slave status;  # 查看从服务器的状态


若是下面两个部分都是yes表示主从同步已经成功开启!



额外说明:若是slave_io_running为no的话最好去看一下Last_IO_Error提示的错误信息。



主从同步效果演示

创建数据库同步:



创建数据库表:



新增表记录:



主从小注意点


1、若是start slave失败了,可以重置一下使用命令reset slave。


2、保持主从同步,需要确定你的主服务器与你的从服务器binlog日志文件名是否相同以及偏移量是否一致。查看主服务器的master信息使用命令show master status。查看从服务器的slave信息使用命令show slave status;若是出现不一致情况,最好就是重新对从服务器数据库重新配置一下,流程:关闭-修改-启动,查看状态是否启动成功!


3、主服务器创建test数据库,从服务器不会进行同步。



问题:show slave status时从服务器的slave_IO_running为no

分析问题

Slave_IO_Running为No,若是主从服务正确开启应该是yes



如何查看错误信息呢?可以看其中的Last_IO_Error信息




错误1:slave failed to initalize relay log info structure



可以去查看一下从服务器中的mysql的日志文件夹:/var/lib/mysql



该图是正确的没有多余的情况,仅作演示。

原因描述:确保中继日志是我们配置的,避免重复的情况,也许是之前配的。


解决方案:将相关的relay-bin文件直接删除,重新配置从服务器。接着重新start slave;,继续查看状态。


若是还是不行,需要你执行reset slave;重置从库。



错误2:Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

问题分析:我们在虚拟机中创建的第二个linux系统实际上是进行克隆的,他们的server uuid是相同的,修改任意一个即可。



解决方案:


查看auto.cnf配置文件中的server-uuid:vim /var/lib/mysql/auto.cnf,可以发现两个服务器的uuid是一致的。



我们自己生成一个uuid,对从服务器的配置文件进行修改即可。


接着重启mysql服务!重新查看状态即可解决。



错误3:MySQL Master command COM_REGISTER_SLAVE failed: Access denied for user

参考文章:MySQL Master command COM_REGISTER_SLAVE failed: Access denied for user


问题描述:



****


解决方案:


查看一下指定账户的权限:show grants for repl@'192.168.181.131'



通过xshell或者navicat来进行修改权限:GRANT REPLICATION SLAVE ON *.* TO repl@'192.168.181.131' identified by 'ro*ot1%23&45';。


刷新权限:FLUSH PRIVILEGES;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
安全 关系型数据库 MySQL
如何将数据从MySQL同步到其他系统
【10月更文挑战第17天】如何将数据从MySQL同步到其他系统
257 0
|
5天前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
1月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
6天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
26 5
|
18天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
2月前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
111 1
MySQL主从复制原理和使用
|
1月前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
239 1
|
2月前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
87 5
|
2月前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
2月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
下一篇
DataWorks