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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
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;


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
4月前
|
存储 SQL 关系型数据库
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
mysql底层原理:索引、慢查询、 sql优化、事务、隔离级别、MVCC、redolog、undolog(图解+秒懂+史上最全)
|
6月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
320 5
|
8月前
|
自然语言处理 搜索推荐 关系型数据库
MySQL实现文档全文搜索,分词匹配多段落重排展示,知识库搜索原理分享
本文介绍了在文档管理系统中实现高效全文搜索的方案。为解决原有ES搜索引擎私有化部署复杂、运维成本高的问题,我们转而使用MySQL实现搜索功能。通过对用户输入预处理、数据库模糊匹配、结果分段与关键字标红等步骤,实现了精准且高效的搜索效果。目前方案适用于中小企业,未来将根据需求优化并可能重新引入专业搜索引擎以提升性能。
390 5
|
8月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
4月前
|
SQL 关系型数据库 MySQL
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
MySQL group by 底层原理详解。group by 执行 慢 原因深度分析。(图解+秒懂+史上最全)
|
9月前
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
526 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
9月前
|
SQL 存储 关系型数据库
MySQL主从复制 —— 作用、原理、数据一致性,异步复制、半同步复制、组复制
MySQL主从复制 作用、原理—主库线程、I/O线程、SQL线程;主从同步要求,主从延迟原因及解决方案;数据一致性,异步复制、半同步复制、组复制
944 11
|
9月前
|
存储 缓存 关系型数据库
MySQL进阶突击系列(08)年少不知BufferPool核心原理 | 大哥送来三条大金链子LRU、Flush、Free
本文深入探讨了MySQL中InnoDB存储引擎的buffer pool机制,包括其内存管理、数据页加载与淘汰策略。Buffer pool作为高并发读写的缓存池,默认大小为128MB,通过free链表、flush链表和LRU链表管理数据页的存取与淘汰。其中,改进型LRU链表采用冷热分离设计,确保预读机制不会影响缓存公平性。文章还介绍了缓存数据页的刷盘机制及参数配置,帮助读者理解buffer pool的运行原理,优化MySQL性能。
|
10月前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。