MYSQL 主从复制 --- binlog

news2024/11/22 20:54:39

一个MYSQL数据库存在的问题

在谈主从复制之前,应该都会有一个疑问,那么就是一个MYSQL数据库存在的问题呢?

1. 读和写所有压力都由一台数据库承担,压力大

2. 数据库服务器磁盘损坏则数据丢失,单点故障

为了解决我们可以使用MYSQL的主从复制处理,那么什么是主从复制呢?

主从复制的概念

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志 binlog 功能。简单的说,就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。

BINLOG:记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。默认MySQL是未开启该日志的。更详细的binlog可以阅读MYSQL日志文章

主从复制实现的过程

我们从主从复制的概念中知道它主要是依赖于binlog 日志,而且这个过程是异步的,即主库上执行事务操作线程不会等待复制binlog的线程完成。如下图:

MYSQL主从复制过程

从图中可以知道,MYSQL复制过程分为三步:

1. 写入 Binlog:主库写 binlog 日志,提交事务,并更新本地存储数据

2. 同步 Binlog:把 binlog 复制到所有从库上,每个从库把 binlog 写到暂存日志中

3. 回放 Binlog:回放 binlog,并更新存储引擎中的数据

上图更详细的解释如下:

1. MySQL 主库在收到客户端提交事务的请求之后,会先写入 binlog,再提交事务,更新存储引擎中的数据,事务提交完成后,返回给客户端“操作成功”的响应

2. 从库会创建一个专门的 I/O 线程,连接主库的 log dump 线程,来接收主库的 binlog 日志,再把 binlog 信息写入 relay log 的中继日志里,再返回给主库“复制成功”的响应

3. 从库会创建一个用于回放 binlog 的线程,去读 relay log 中继日志,然后回放 binlog 更新存储引擎中的数据,最终实现主从的数据一致性

这要实现了主从复制过程,那么我们经常使用到的有哪些场景呢?比如读写分离。即写数据时只写主库,在读数据时只读从库,这样即使写请求会锁表或者锁记录,也不会影响读请求的执行。如下图:

MYSQL主从架构的读写分离

到这里基本知道了什么是主从复制了,那么在使用过程中是不是从库可以无限多呢?

答案:当然不是的。因为从库数量增加,从库连接上来的 I/O 线程也比较多,主库也要创建同样多的 log dump 线程来处理复制的请求,对主库资源消耗比较高,同时还受限于主库的网络带宽。所以,一般个主库跟 2~3 个从库(1 主 2 从 1 备主),这就是一主多从的 MySQL 集群结构

MySQL 集群结构

1. 主从(Master - Slaves)

2. 主主(Master - Master)

3. 主从从 .. (Master - Slaves - Slaves ...)

4. 主主从 (Master - Master - Slaves)

常规复制架构---主从(Master - Slaves)

在实际应用场景中,MySQL 复制 90% 以上都是一个 Master 复制到一个或者多个 Slave 的架构模式,主要用于读压力比较大的应用的数据库端廉价扩展解决方案。如下图:
主从 (Master - Slaves)
一个 Master 复制多个 Slave 的架构实施非常简单,多个 Slave 和单个 Slave 的实施 并没有实质性的区别。在 Master 端并不 Care 有多少个 Slave 连上了自己,只要有 Slave 的 IO 线程通过了连接认证,向他请求指定位置之后的 Binary Log 信息,他就会按照该 IO 线程的要求,读取自己的 Binary Log 信息,返回给 Slave 的 IO 线程。

Dual Master 复制架构 ---主主(Master - Master)

双主(Dual Master)复制架构适用于DBA做维护时需要主从切换的场景,通过双主复制架构避免了重复搭建从库的麻烦,双主复制架构如下图所示:

主主 (Master - Master)

主库Master1和Master互为主从,所有客户端的写请求都访问主库Master1或Master2。加入DBA需要做日常维护操作,为了避免影响服务,需进行一下操作:

  • 首先,在Master1库上停止Slave线程(STOP SLAVE),避免后续对Master2库的维护操作操作被实时复制到Master1库上对服务造成影响。
  • 其次,在Master2库上停止Slave线程(STOP SLAVE),开始日常维护操作,例如修改varchar字段从长度10增加到200。
  • 然后,在Master2库上完成维护操作之后,打开Master2库上的Slave线程(STRART SLAVE),让Master2的数据和Master1库同步,同步完成后,把应用的写操作切换到Master2库上。
  • 最后,确认Master1库上没有应用访问后,打开Master1的Slave线程(START SLAVE)即可

通过双主复制架构能够大大减轻一主多从架构下对主库进行维护带来的额外搭建从库的工作。可以配合一个第三方的工具,比如keepalived 轻松做到 IP 的漂移,停机维护也不会影响写操作。

级联复制架构 ---主从从 .. (Master - Slaves - Slaves ...)

如果读压力加大,就需要更多的 slave 来解决,但是如果slave的复制全部从 master 复制,势必会加大 master 的复制IO的压力,所以就出现了级联复制,减轻 master 压力。如下图:
主从从 ..  (Master - Slaves - Slaves ...)
但是,这个框架有一个缺点就是slave 延迟更加大了

Dual Master与级联复制结合架构 ---主主从 (Master - Master - Slaves)

级联复制在一定程度上面确实解决了 Master 因为所附属的 Slave 过多而成为瓶颈的问题,但是他并不能解决人工维护和出现异常需要切换后可能存在重新搭建 Replication的问题。如下图:
主主从  (Master - Master - Slaves)
这样就解决了单点 master 的问题,解决了slave 级联延迟的问题。

主从复制有哪些模型

主从复制模型是通过sync_binlog参数(具体可以阅读MYSQL日志)来控制的,主要有三种:

  • 同步复制:MySQL 主库提交事务的线程要等待所有从库的复制成功响应,才返回客户端结果。这种方式在实际项目中,基本上没法用,原因有两个:一是性能很差,因为要复制到所有节点才返回响应;二是可用性也很差,主库和所有从库任何一个数据库出问题,都会影响业务。

  • 异步复制(默认模型):MySQL 主库提交事务的线程并不会等待 binlog 同步到各从库,就返回客户端结果。这种模式一旦主库宕机,数据就会发生丢失。

  • 半同步复制:MySQL 5.7 版本之后增加的一种复制方式,介于两者之间,事务线程不用等待所有的从库复制成功响应,只要一部分复制成功响应回来就行,比如一主二从的集群,只要数据成功复制到任意一个从库上,主库的事务线程就可以返回给客户端。这种半同步复制的方式,兼顾了异步复制和同步复制的优点,即使出现主库宕机,至少还有一个从库有最新的数据,不存在数据丢失的风险

主从复制解决的问题

数据分布 (Data distribution )

负载平衡(load balancing)

备份(Backups)

高可用性和容错行 High availability and failover

主从复制实验搭建

配置主从复制步骤

Master数据库:

1. 安装数据库;

2. 修改数据库配置文件,指明 server_id,开启二进制日志(log-bin);

3. 启动数据库,查看当前是哪个日志,position 号是多少;

4. 登录数据库,授权数据复制用户(IP 地址为从机 IP 地址,如果是双向主从,这里的 还需要授权本机的 IP 地址,此时自己的 IP 地址就是从 IP 地址);

5. 备份数据库(记得加锁和解锁);

6. 传送备份数据到 Slave 上;

7. 启动数据库;

以上步骤,为单向主从搭建成功,想搭建双向主从需要的步骤:

a. 登录数据库,指定 Master 的地址、用户、密码等信息(此步仅双向主从时需要);

b. 开启同步,查看状态;

Slave数据库:

1. 安装数据库;

2. 修改数据库配置文件,指明 server_id(如果是搭建双向主从的话,也要开启二进制 日志 log-bin);

3. 启动数据库,还原备份;

4. 查看当前是哪个日志,position 号是多少(单向主从此步不需要,双向主从需要);

5. 指定 Master 的地址、用户、密码等信息;

6. 开启同步,查看状态

例子

1.准备工作

准备两台机器,并安装好mysql,服务器信息如下:

 2. 防火墙

如果这两天机器有防火墙,并开启了防火墙,那么就要开发对应的端口,如下:

firewall-cmd --zone=public --add-port=3306/tcp --permanent  --添加端口

firewall-cmd --zone=public --list-ports  --查看开放的端口

 防火墙更加详细的操作可以阅读LINUX防火墙文章。

3. 启动mysql服务

把这两台mysql服务启动起来,如下:

systemctl start mysqld  或者 systemctl start mysql

然后验证是否启动成功,如下图启动成功:

 注意事项

在搭建Mysql主从架构过程中,由于从服务器是克隆的主服务器系统,导致主从mysql uuid相同,解决办法,修改其中一台服务器的server-uuid,并保证server-uuid的格式正确,修改完成之后重启Mysql服务就可以了。

在修改配置文件之前,先登录Mysql客户端查看uuid,把返回的uuid复制,放到要修改的配置文件即可

 查到uuid之后,修改uuid配置文件:

# vim /data/mysql/auto.cnf //如过找不到 find -name auto.cnf 找一下路径,这个文件一般在数据目录下

[auto]

server-uuid=267170ea-5f41-11ed-93db-000c29936244

# 按照这个16进制格式,修改server-uuid,重启mysql即可

4. 主库配置

在mysql配置文件最下面增加配置:

log-bin=mysql-bin #[必须]启用二进制日志
server-id=1 #[必须]服务器唯一ID(唯一即可)

 保存配置文件之后,重启主库Mysql服务:

systemctl restart mysqld 或者 systemctl restart mysql

然后登陆主库mysql服务,接着通过下面指令查看配置文件是否修改成功:

 从上图可以看出已经修改成功,接着创建用户并授权:

GRANT REPLICATION SLAVE ON *.* to 'ian'@'%' identified by 'mysqltest';

命令解析:

ian:是用户名字

mysqltest: 是密码

并且给ian用户授予REPLICATION SLAVE权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。

创建完用户和授权之后,查看master同步状态,主要是那个文件开始和开始的位置:

show master status;

 为什么要知道这两个值呢?因为在从库的时候要用到。到这里主库已经配置好了。

5. 从库配置

修改从库配置文件:

server-id=12 #[必须]服务器唯一ID 保证唯一 需要主和从唯一就可
relay-log=relay-log
relay-log-index=relay-log.index

 保存配置文件,然后重启从库数据库:

systemctl restart mysqld 或者 systemctl restart mysql

登录从库数据库,然后查看配置是否修改成功:

 修改成功之后,在从库中设置主库地址和同步位置:

change master to master_host='192.168.0.117',master_user='ian',master_password='mysqltest',master_log_file='mysql-bin.000008',master_log_pos=23758;

参数说明:

​ A. master_host : 主库的IP地址

​ B. master_user : 访问主库进行主从复制的用户名(上面在主库创建的)

​ C. master_password : 访问主库进行主从复制的用户名对应的密码

​ D. master_log_file : 从哪个日志文件开始同步(上述查询master状态中展示的有)

​ E. master_log_pos : 从指定日志文件的哪个位置开始同步(上述查询master状态中展示的有)

然后查看从库数据库的状态:

show slave status \G;  ​

\G : 在MySQL的sql语句后加上\G,表示将查询结果进行按列打印,可以使每个字段打印到单独的行。即将查到的结构旋转90度变成纵向;

 6. 测试

我们在主库中创建一个数据库test4,如下图:

 然后我们在到从库中查看,可以知道:

 然后我们可以在这个数据库里面添加一些测试数据,如添加一个user表,然后在表中添加一行数据,一样可以在从库中查看得到,那么我们就配置完成了。

问题1:如果Mysql的远程连接不上,出现下面问题

 答案:在mysql配置中添加skip-grant-tables,并屏蔽掉bind_address配置项

问题2:MySQL主从复制,启动slave时,出现下面报错:

mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

 可以看到报错,原来是找不到./server246-relay-bin.index文件,找到原因所在了,由于我使用的是冷备份文件恢复的实例,在mysql库中的slave_relay_log_info表中依然保留之前relay_log的信息,所以导致启动slave报错。

mysql提供了工具用来删除记录:

slave reset;

 slave reset执行候做了这样几件事:

1、删除slave_master_info ,slave_relay_log_info两个表中数据;
2、删除所有relay log文件,并重新创建新的relay log文件;
3、不会改变gtid_executed 或者 gtid_purged的值

mysql> reset slave;
Query OK, 0 rows affected (0.01 sec)

mysql> change master to ......

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

 这样slave 就可以启动了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/91682.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spark RDD介绍

RDD 引出问题 Spark是如何将多台机器上的数据通过一个类型来关联实现的? 答:通过RDD类型来实现关联 一、RDD简介 RDD(Resilient Distributed Dataset):弹性分布式数据集 RDD的本质: 一个抽象的逻辑上的…

项目运行久了很卡,手动执行垃圾回收机制,秒丝滑

问题 当项目运行久了,内存会被大量占用。如何不重启项目,释放内存,继续丝滑开发呢? 回答 手动执行垃圾回收机制 打开任务管理器康康: 巨卡,无敌卡,解决它! 打开命令行工具&…

Kaggle竞赛——Titanic泰坦尼克之灾(保姆级基础版)

Kaggle竞赛网址:https://www.kaggle.com/c/titanic 本次Kaggle泰坦尼克之灾分析过程大致分为: 第1步:了解数据 第2步:分析数据之间的关系 第3步:缺失项数据处理 第4步:特征因子化 第5步:处理特…

DBCO-SS-活性酯|DBCO-SS-NHS酯

DBCO-SS-活性酯|DBCO-SS-NHS酯 名称;DBCO-SS-活性酯|DBCO-SS-NHS酯 CAS NO:1435934-53-4 分子量:565.66 分子式:C28H27N3O6S2 含 量:>95% 外 观:固体粉末 保存:-20避光避湿 结构式: …

记录--手把手带你开发一个uni-app日历插件(并发布)

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 相信我们在开发各类小程序或者H5,甚至APP时,会把uni-app作为一个技术选型,其优点在于一键打包多端运行,较为强大的跨平台的性能。但是,只要开…

我为什么建议前端将Python 作为第二语言?

前言 “如何摆脱不停切图的困局?” 这不是一篇制造焦虑的文章,而是充满真诚建议的Python推广文。 当谈论到编程入门语言时,大多数都会推荐Python和JavaScript。 实际上,两种语言在方方面面都非常强大。 而如今我们熟知的ES6语…

用Java语言简单实现:炸金花,不知道你有没有兴趣跟着笔者来研究一下呀

说实话,到目前为止,笔者学习Java语言也有着进两个多月了吧!!但是,一直毫无进度!博客更新的也很少,仅仅10篇刚出头,而且浏览量也很少,这样很不符合我的气质!&a…

汉字风格迁移----FtransGAN

🚀针对的问题 以前的大多数作品都是通过将给定子集的风格转移到未见子集的内容来解决这个问题的。然而,他们只关注同一语言中的字体样式转换。在许多任务中,我们需要学习一种语言的字体信息,然后将其应用到其他语言。现有的方法很难完成这样的任务。 图1。几个应用实例。…

03_2排序算法:快速排序、归并排序

开始系统学习算法啦!为后面力扣和蓝桥杯的刷题做准备!这个专栏将记录自己学习算法是的笔记,包括概念,算法运行过程,以及代码实现,希望能给大家带来帮助,感兴趣的小伙伴欢迎评论区留言或者私信博…

IIS2MDCTR传感器规格、ISM303DACTR磁力计应用、STPSC20H12WL二极管特点

IIS2MDC 3轴数字式磁性传感器具有高达50高斯的磁场动态范围以及16位数据输出。IIS2MDC设有I2C串行总线接口,可支持标准模式 (100kHz)、快速模式 (400kHz)、快速模式 (1MHz) 以及高速模式 (3.4MHz)。 该传感器还设有SPI串行标准接口,另外对其进行配置后可…

IBPS低代码产品公司流辰信息:用心研发,不负众望!

作为一家低代码产品公司,流辰信息一直以高标准严格要求自己,努力研发,努力提升服务品质,从专业的角度为中大型企业数字化转型积极赋能,共创价值。 IBPS低代码开发产品是流辰信息努力研发的硕果,是满足企业级…

教材推荐网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 高校教材推介交流平台的开发主要功能教师发布课程名称、用书信息,各出版社推荐样 书(线上&#…

CRTO 考试总结

写在最前:欢迎大家来我的 Discord 频道 Northern Bay。邀请链接在这里:https://discord.gg/9XvvuFq9Wb 一起进步,一起 NB~ 背景 今天我结束了 Zero Point Security RTO I 的考试。证书到手。 Zero Point Security 是一家 Base 在英国的安全…

知乎zse-96算法-js补环境方案

文章目录 1. js代码定位与抠取2. 初步分析 开始补环境3. 完整的补全环境的js整合4. 编写python代码调用测试1. js代码定位与抠取 抠js和上篇jsrpc方案一样,传送门:知乎zse-96算法-jsrpc方案 这里简单提一下 直接进入encrypt方法里, 往上先把整个方法体给扣下来: "u…

c语言教工工资管理系统课程设计

序 言 借助现代信息技术和管理理论,建立学校管理信息系统势在必行。对学校而言,全面开发和应用计算机管理信息系统就是有必要的。在学校管理中,教师是学校的宝贵资源,也是学校的“生命线”,因此人事管理是学校的计算机…

JAVA中生成随机数Random VS ThreadLocalRandom性能比较

前言 大家项目中如果有生成随机数的需求,我想大多都会选择使用Random来实现,它内部使用了CAS来实现。 实际上,JDK1.7之后,提供了另外一个生成随机数的类ThreadLocalRandom,那么他们二者之间的性能是怎么样的呢&#x…

用JavaScript写代码将硬盘序列号从16进制字符串转换为ASCII字符串,兼谈EditPlus和Edge浏览器对JavaScript脚本支持的一点差别

之前写的系统信息收集报告程序SysInfo的一个功能就是收集并报告系统中的硬盘序列号。在之前的测试中这项功能表现不错,但前两天用SysInfo收集一台电脑的信息时,显示的硬盘序列号与其它硬盘序列号读取程序显示的顺序不一样。于是着手对SysInfo的相关代码进…

网络爬虫爬取数据并制作词云全过程【内附可执行代码注释完整】

文章目录前言网络爬取数据部分小知识点利用正则表达式在字符串中提取到url(https以及http)仅仅只保存字符串中的中文字符爬取数据生成词云jieba分词生成词云生成词云最终版代码总结前言 快期末了,有个数据挖掘的大作业需要用到python的相关知…

Json字符串转成对象

Json字符串转成对象 Hello吖😊,我是孤音(一个你理解不了的程序猿),今天来分享一个小技巧,能够大大滴提高效率额 问题😵 接收到一串JSON格式的字符串,需要获取其中某些字段的值 思路…

一天梳理完React所有面试考察知识点

性能优化 性能优化,永远是面试的重点,性能优化对于 React 更加重要 在页面中使用了setTimout()、addEventListener()等,要及时在componentWillUnmount()中销毁使用异步组件使用 React-loadable 动态加载组件shouldComponentUpdate(简称SCU …