点击蓝色“程序猿DD”关注我
回复“资源”获取独家整理的学习资料!
作者 | 阿飞的博客
来源 | 公众号「阿飞的博客」
本文将回顾MySQL复制概念和MySQL几种复制方案,同时也会澄清一些关于复制问题的误解。
本文翻译自:https://www.percona.com/blog/2017/02/07/overview-of-different-mysql-replication-solutions/
复制能够保护信息得到备份,并且备份会不同于原数据,备份会被保存到另一个环境。即主备数据不在同一台服务器。下图是MySQL复制示意图:
复制如此重要,那么在MySQL中我们有哪些选择呢?
1. 异步复制
异步复制意味着本地环境操作完成,事务就完成,不会受到slave复制是否完成的影响。
当改变被提交后,master就会把数据修改信息放到binlog中(也可能把实际的statement放到binlog中,这是row-based复制和statement-based复制的不同,后面会讲到)。dump线程读取binlog日志然后将其发送到slave,slave接受并保存到待处理队列中(被称为relay-log),slave会执行每一个在master上的改变:
2. 半同步复制
半同步复制(Semi-synchronous replication)意味着master和slave彼此通讯确保事务的正确转移。当改变发生时,master需要等待slave已经将日志保存到relay-log中并向master回复确认master才能提交事务。半同步复制可以保证事务被正确的复制,但不能保证在slave上一定发生:
需要注意的是,半同步复制的话,master需要等待至少有一个slave服务器确认接收到事务并保存了relay-log(或达到超时)才能继续处理同一个SESSION中的当前事务,至于具体多少个slave确认,可以通过参数rpl_semi_sync_master_wait_slave_count进行配置,这个值有效范围是1~1024之间,而且这个值可以动态更新。举个栗子:
假设rpl_semi_sync_master_wait_slave_count被设置为2,并且有两个slave,分别是:slave1和slave2。
\1. T1等待两个slave的ack;
\2. master收到slave1的ack;
\3. 此时加入一个slave3,并将rpl_semi_sync_master_wait_slave_count改为3;
\4. master收到slave2的ack;
\5. master收到slave3的ack;
\6. master唤醒等待中的事务,并准备提交;
记住半同步复制会影响性能,因为它需要等待来自slave的确认(ack)。但是,它也能减少slave上由于故障导致数据丢失的风险。
3. 组复制
组(Group)复制是MySQL5.7版本新介绍的概念,在5.7.17发布了GA,而且以插件模式提供。
任意一个数据库节点无论什么时候执行一个事务,组复制插件在向客户端响应它已经完成事务前,会尝试得到其他数据库节点的同意。组复制示意图如下:
4. Percona XtraDB Cluster / Galera Cluster
再介绍一个把master数据复制到其他节点的解决方案,就是Percona XtraDB Cluster,简称PXC。这个解决方案把重心放在一致性上,并且通过使用一个认证过程来保证事务避免冲突和执行的正确性。在这个集群方案的数据库环境下,每个节点的数据都是相同的,节点之间会依赖galera提供的广播机制来保证一致性。
以一条SQL为例,某节点接收SQL请求后,在commit之前,由wsrep API 调用galera库进行集群内广播,所有其他节点验证成功后事务在集群所有节点进行提交,反之rollback。PXC保证整个集群所有数据的强一致性,满足CAP理论中的CA,即 Consistency 和 Availability。
Percona XtraDB Cluster 有很多组件:
该解决方案几乎是同步的,可与组复制相媲美。但是,它还具有使用多主复制的能力。Percona XtraDB Cluster这样的组件能很好的提高数据库基础架构可用性:
讨论MySQL复制,就不得不提Row-Based复制和Statement-Based复制。因为它们是两种不同复制方案的实现原理。
对于statement-based复制(被翻译为基于语句复制),执行的SQL本身会被写入binlog中,例如完全相同的INSERT/UPDATE/DELETE语句会被在slave上执行。它的优缺点如下:
Row-based复制(基于行复制)是从MySQL 5.7.7起默认的选择,它有很多优点,改变的行会被记录在binlog中,因此它不需要上下文信息。它的其他优点如下::
当然,也有缺点:
标准的异步复制不是集群,记住不管是标准的异步复制还是半同步复制,都不能保证环境服务于同一数据集。而使用集群(例如Percona XtraDB Cluster)时,这是不同的,任意一个请求打到任意一台服务器上其结果都一样。如果不是,则会从群集中删除受影响的节点。异步复制没有这样的保障,即使某个slave节点与master处于不一致状态时仍然会接受操作请求。
理论上来说,两个环境之间是有可比性的。然而,有许多参数能影响性能和数据一致性。只要你使用了异步复制,在master上发生的事务正确性就无法在slave上得到保障。当然,你可以通过增强持久化的配置来改善这点,但是它相应的会带来一定的性能损耗,性能和可靠之间总需要做一定的取舍。
复制是为了对数据集有一个可访问的副本的解决方案,通过把读请求打到复制节点,能减轻master的压力。但是复制不是备份。备份一般是指离线备份,它的作用是数据库所在环境发生灾难性的破坏不可恢复时,还能通过备份恢复数据库。对数据库进行离线备份是非常重要和有意义的事情!
给master增加一个slave尽管可以改善系统的可用性,但是你仍然需要自己做几件事情:把读请求打到slave上,把写请求打到master上。有很多代理工具可以完成这样的事情,当然你可以自己动手造轮子!
本文通过OpenWrite的免费Markdown转换工具发布
-END-
留言交流不过瘾
关注我,回复“加群”加入各种主题讨论群
点一点“阅读原文”小惊喜在等你
Original url: Access
Created at: 2019-10-15 14:04:43
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论