从 MySQL+MMM 到 MariaDB+Galera Cluster : 一个高可用性系统改造
|
很少有事情比推出高可用性(HA)系统之后便经常看到的系统崩溃更糟糕。对于我们这个Rails运行机的团队来说,这个失效的HA系统是MySQL多主复制管理器(MMM)。
我们已经找寻MMM的替代品有一段时间了,几个月之前,我们转换到了MariaDB + Galera Cluster以寻求高可用的Mysql。 MMM怎么了,Galera Cluster又有什么特别之处呢?继续阅读! |
! |
MySQL多主机复制 (MMM)基本被打破MySQL MMM 是如何工作的:一台安装了MySQL MMM的服务器每十秒种(默认间隔)轮询一次MySQL节点, 来检查其状态。仅其中的一台服务器接收到写入器角色 - 其他的可以拥有阅读器角色。 MMM 维护了一个虚拟IP,这个IP指向拥有写入器角色的节点。 问题在于轮询:如果MySQL每十分钟轮询,那么如果写入器节点在检查的间歇出现故障怎么办?如果你设置了HA你可能正处理着许多事务 - 在MMM检测到写入器节点不正常之前,可能已经有成千上万的事务失败了。更糟糕的是,如果存在一种内部问题:复制失败在先,事务失败在后,那么你要把写入器角色转到其他节点上吗?但是其他节点不一定符合原始的写入器节点。 |
|
|
减少轮询间隔到1秒也不能修正这个问题-大型数据库可能在每秒内运行许多事务。 因此轮询是根本问题,而且超出了根本问题范围。无法控制的MySQL MMM经常产生难以恢复的问题。Baron
尽管MMM存在缺陷,然而它至少是对MySQL进行高可靠性的一次突破。然而时间改变了一切。甚至MySQL
|
那么,为什么Galera是最好的MySQL HA解决方案呢?我们的Galera Cluster设置仍然使用轮询来做健康检测——这比MMM好在哪里呢? 答案在于主从复制怎样是运作的。对于标准版的MySQL,对master的写操作被记录于一个二进制的日志。Slave会在之后复制二进制日志中的查询。查询在写服务器上运行与在其它节点上运行时刻之间,总是会有一个延迟。它是异步的。 MySQL异步复制有下面的问题:
对于Galera,事务是在它们被提交之前被所有节点确认。如果一个事务在一个节点失败了,那个节点将立刻从群集中移除。换句话说,Galera主从复制是同步的。你 |
Galera集群是局内人MySQL MMM 是一个局外者—— 对于服务器上实际在发生的事情它是“哑的”。它只做一种检测,而且那就是它所知道的全部该如何反应的事情。 Galera集群是一个“局内人”,因此对每个节点的内部状态要更机灵,并且不需要人工干预就可以做正确的事情(例如,一个节点同步或未同步,成为一个donor(节点处于为新节点准备或传输集群全量数据状态,对客户端不可用),等等——全部都是自动的)。 |
当写入节点失败的时候会发生什么呢?由于用一个Galera集群可以写进任意节点,我们还是选择尽量减少潜在的死锁和只在一个节点写入。为此,我们使用HAProxy:我们拥有一个前端供“写入者”节点,另一个前端供读出以供所有节点实现余额查询。“写入者”通过单个节点发送请求,而其他的节点作为备份。 如果HAProxy检测到“写入者”节点不正常,它立即提拔备份节点中的一个作为“写入者”。MySQL的MMM在这种情况下通常会关掉所有节点之间的通话——HAProxy不会如此。当“写入者”后台更新的时候,我们可能会丢失一部分请求,但它不会导致不一致的数据集通过服务器,这比瘫痪更糟糕。 我们不会自动修复失败的节点,不过这没有关系。我主要关注点是确保一个正常的节点在执行写入,HAProxy是做这个的。 |
修复失效的节点(并让它作为一个新的节点处于在线状态)当一个节点在标准的MySQL复制的时候失效,你将在再次进行复制的时候把大量的负载集中在一台服务器上(这台服务器不仅仅要进行读和写,而且还要承接来自innodbbackupex的负载)。 使用Galera,你可以让其中一个节点离线(因此你至少需要三个节点)。这时这个节点就成为供给者节点-对它的写操作将被阻塞。这个节点就通过rsync传输自身的数据给失效的节点(或者新的节点)。然后,供给者节点和失效节点通过辅助队列运行查询而与其他节点保持同步。 一旦这两个节点回归到同步状态,HAProxy将自动的标记它们为启动状态,然后把它们添回道前端。 |
Galera集群也支持普通的MySQL,因此我们为什么不切换到MariaDB?切换到MariaDB的理由既有技术原因也有政治原因:
|
|
我们会再做一次?绝对地。我们没有看到有什么原因不切换到 MariaDB 和 Galera Cluster。 监控 Galera Cluster
监控 Galera 的一件伟大的事情是它是分层的 - 我们可以很容易地监视栈的每一部分。我们使用 Scout 来监视,那意味着我们仅仅需要去使用下列插件:
TL;DR直到最近, MySQL MMM 是添加高可用性到 MySQL 的最好的(但坏了的)途径。Galera Cluster 最终为 MySQL |
从 MySQL+MMM 到 MariaDB+Galera Cluster : 一个高可用性系统改造的更多相关文章
- 【原】基于 HAproxy 1.6.3 Keeplived 在 Centos 7 中实现mysql mariadb galera cluster 集群分发读写 —— 上篇
前言 有一段时间没有写blogs,乘着周末开始整理下haproxy + keeplived 实现 mysql mariadb galera cluster 集群访问环境的搭建工作. 本文集中讲hapr ...
- 浅谈MariaDB Galera Cluster架构
MariaDB MariaDB 是由原来 MySQL 的作者Michael Widenius创办的公司所开发的免费开源的数据库服务器,MariaDB是同一MySQL版本的二进制替代品 ...
- MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群)
MariaDB Galera Cluster 部署(如何快速部署 MariaDB 集群) OneAPM蓝海讯通7月3日 发布 推荐 4 推荐 收藏 14 收藏,1.1k 浏览 MariaDB 作为 ...
- 利用MariaDB Galera Cluster实现mariadb的多主复制
一.MariaDB Galera Cluster概要: .简述: MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步的 ...
- MariaDB Galera Cluster 部署
原文 http://code.oneapm.com/database/2015/07/02/mariadb-galera-cluster/MariaDB作为Mysql的一个分支,在开源项目中已经广泛 ...
- MariaDB Galera Cluster集群
一.MariaDB Galera Cluster概要: 1.简述: MariaDB Galera Cluster 是一套在mysql innodb存储引擎上面实现multi-master及数据实时同步 ...
- MariaDB Galera Cluster 部署(如何快速部署MariaDB集群)
MariaDB Galera Cluster 部署(如何快速部署MariaDB集群) [日期:--] 来源:Linux社区 作者:Linux [字体:大 中 小] MariaDB作为Mysql的一个分 ...
- 构建 MariaDB Galera Cluster 分布式数据库集群(一)
MariaDB Galera Cluster 介绍 简介 MariaDB集群是MariaDB同步多主机集群,仅支持XtraDB(详见本文结尾注释)/InnoDB存储引擎(虽然有对MyISAM实验支持 ...
- MariaDB Galera Cluster部署实践
原理 官方地址:http://galeracluster.com/documentation-webpages/index.html Galera Cluster与传统的复制方式不同,不通过I/O_t ...
随机推荐
- Sql server2012连接Sql server 2008时出现的问题:已成功与服务器建立连接,但在登陆过程中发生错误。(provider:SSL Provider,error:0-接收到的消息异常,或格式不正确。)
以前连接是正常的,就这两天连不上了.(没有耐心的直接看末尾解决办法) 错误消息如下: 1.尝试读取或写入受保护的内存.这通常指示其他内存已损坏.(System.Data) 2.已成功与服务器建立连接, ...
- sql中视图的作用
视图是一个虚拟表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据.但是,视图并不在数据库中以存储的数据值集形式存在.行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态 ...
- 在Windows Azure虚拟机上开发Windows 8 应用
前提条件 Windows Azure开发者账号:如果您拥有微软MSDN Subscription账户,那么意味着您可免费申请Windows Azure开发者账号. 创建虚拟机 点击Windows Az ...
- Appium学习实践(三)测试用例脚本以及测试报告输出
之前Appium学习实践(二)Python简单脚本以及元素的属性设置中的脚本,会有一个问题,就是在每个测试用例完成之后都会执行tearDown,然后重新setUp,这样导致脚本的执行效率偏低,而且会有 ...
- 拓扑排序 POJ2367Genealogical tree[topo-sort]
---恢复内容开始--- Genealogical tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4875 A ...
- ATM模拟程序
一个很简单的ATM模拟程序 #include <stdio.h> void chaxun(int a3){ int b; b=a3; printf("您的余额为:%d\n&quo ...
- Android SDK和N多Android开发资源
开发资源 本文收集整理Android开发需要的Android SDK.工具.Android开发教程.Android设计规范,免费的设计素材等. 欢迎大家推荐自己在Android开发过程中用的好用的工具 ...
- HTML:图片热点 网页划区 表单
图片热点: 划出图片中的区域,做超链接,点击该区域就可以直接跳转到链接网站 <img src="../../../3.jpg" title="血精灵" u ...
- SQL 2008 windows登录失败,错误18456, 更正
可能的原因:密码有效性验证失败.该密码太短,不符合 Windows 策略要求. 本地设置可能被域设置覆盖.而域设置中指定了安全策略,密码必须有一定的复杂性.重新更改sa密码. 第一步.以windows ...
- JavaScript Boolean 对象
JavaScript Boolean 对象 Boolean 对象 Boolean 对象用于转换一个不是 Boolean 类型的值转换为 Boolean 类型值 (true 或者false). Bool ...

