实现高可用性的原则很简单:html
只要有单点故障(SPOF:Single Point of Failure)的存在,就没法保证系统的高可用性(关于单点故障能够参考Fenng的这篇文章,比较通俗易懂)。mysql
为了搞清楚哪里须要冗余机制,咱们须要找到部署中全部潜在的单点。虽说起来简单,可是须要一点想象力,以确保真正找到所有单点。交换机,路由器,网卡甚至电缆都是单点,除了这些,电源和物理设施也很重要。还有一些也为成为单点,好比只有一个员工知道如何处理某种类型的故障,全部的网络都被集中到一个web页面进行管理等。但定位到全部的单点并不意味着你必需要所有消除它们,由于有些单点或许由于经济上,技术上或者地理上的缘由而没法彻底消除,但知道这些单点的存在将有助于出错时排错。web
在考虑要不要消除某个单点,有些因素须要考虑:复制组件的成本,不一样组件发生故障的几率,替换组件的时机以及修复组件时的担当的风险。好比你替换一个组件须要一周时间,在这一周期间,运行中的备用组件也有可能出现故障,这些你都必需要考虑到。sql
一旦肯定要消除的单点,接下来就须要考虑如何创建冗余机制,有两种方案可供选择:1)为每个组件创建一个备用组件,若是原始组件发生故障,当即启用备用组件;2)系统自己有额外的容量,当一个组件出现故障时仍能hold住。第一种方案,虽然看起来简单,可是成本高。你必须让备用组件处于standby状态,一直和主组件保持一致。其优势就是在切换组件的时候不会损失性能,并且切换到standby组件所花的时间一般要比从新构建组件快。方案二为系统构建额外容量的方案可让你使用全部组件(资源)来运行系统,这样系统能够处理更高的瞬间峰值负载。但有一点必须明白,这种方案时,系统必须拥有额外的容量以保证在某些组件出现故障时系统仍然能hold住。有时候只为一个服务器发生故障留有余地还不够,这个时候你须要权衡,以及这种状况出现的几率是多少。好比安装了100台服务器,其中一台服务器发生故障的几率是1%,那么1台,2台,3台服务器发生故障的几率会是多少呢?根据二项式定理计算可获得依次为100%,20.33%,16.17%。数据库
只作冗余仍是不够,当你一个组件发生故障时,你还须要知道如何去应对。在以前的例子里,当Slave服务器出现故障时很容易去处理,由于只需把新的链接所有重定向到能工做的Slave服务器,同时你须要考虑:1)现有的链接怎么处理?仅仅停止程序并给用户返回一个出错信息明显不是一个好主意。一般状况下,在用户和数据库之间有一个应用层,这个时候应该让应用层向别的服务器提交查询;2)若是Master发生故障怎么处理?假设你已经提供了一个额外的Master作冗余,你还必须提供机制让全部Slave重定向新的Master。安全
下面介绍一下如何处理各类拓扑结构下MySQL服务器宕机的技术。通常来讲,须要考虑三种角色:Master,Slave,Relay。服务器
若是你管理一个小站点,你能够不用规划并手动管理这些服务器,可是随着服务器数量的快速增加,自动化就变得颇有必要。特别是下列的这些工做:网络
最简单的复制服务器的拓扑就是热备份的拓扑。该拓扑结构里面包括一个Master和一个被称做热备份的专用服务器。工做原理就是当Master发生故障时,热备份当即充当Master的镜像服务器,全部的客户端和Slave服务器所有切换到热备份服务器进行工做。不过切换的时候须要考虑一些细节的问题:1)当切换到热备份的服务器时,你须要从新定位须要从哪里开始复制二进制日志,通常热备份的日志位置信息和Master不同;2)某个Slave可能须要的二进制日志在热备份服务器上不必定有;3)当修好的Master切换回来的时候,它上面的有些修改可能任何其余Slave都将来得及复制。架构
首先,问题简单化,咱们看看从Master切换到热备份服务器的过程,该过程Master并不宕机。默认状况下,slave线程执行的事件并不写入二进制日志,可是做为热备份的slave明显是须要这些二进制日志的,因此为热备份服务器增长这样一个参数。负载均衡
[mysqld]
log-slave-updates
切换时的主要问题在于,如何使得从热备份服务器开始复制的位置和从Master中止复制的位置彻底相同。有不少缘由可使得热备服务器和Master服务器的二进制日志位置信息不一致,好比Master启动的时候热备份服务器并无连上,即便这个没问题,也不能保证同一个事件写入Master和热备份服务器二进制日志的过程和时机彻底同样。
切换的基本思路是:确认让slave和热备份服务器在同一点上中止复制,而后让salve连到热备份服务器。
standby>SHOW SLAVE STATUS\G
...
Relay_Master_Log_File: master-bin.000096
...
Exec_Master_Log_Pos: 756648
slave>SHOW SLAVE STATUS\G
...
Relay_Master_Log_File: master-bin.000096
...
Exec_Master_Log_Pos: 743456
# 从上可知说明热备份服务器的日志位置要领先于Slave,因此须要让Slave从Master继续复制到和热备份同样的位置
slave>START SLAVE UNTIL MASTER_LOG_FILE = 'master-bin.000096' MASTER_LOG_POS = 756648;
slave>SELECT MASTER_POS_WAIT('master-bin.000096', 756648);
# 如今Slave和热备份服务器都在同一个点中止复制,就可让Slave连到热备份服务器上,可是指定从哪一个文件和位置开始复制呢。对于同一个复制点在Master上的文件和位置和热备份上的文件和位置是不同的。
standby>SHOW MASTER STATUS\G
File: standby-bin.000019
Position: 56447
Binlog_Do_DB:
Binlog_Ignore_DB:
slave>CHANGE MASTER TO
MASTER_HOST = 'standby-1',
MASTER_PORT = 3306,
MASTER_USER = 'repl_user',
MASTER_PASSWORD = 'xyzzy',
MASTER_LOG_FILE = 'standby-bin.000019',
MASTER_LOG_POS = 56447;
slave>START SLAVE;
若是Slave的复制位置在热备份服务器以前的话,咱们只需互换一下上面的步骤。下一节咱们将考虑如何处理Master意外中止的状况。
双Master拓扑结构中,两个Master互相复制数据以保持同步。由于是对称的,这种设置容易使用。这种设置中,服务器能够是主动的(active),也能够是被动(passive)的。主动的服务器是指接受写操做,而后这些变化经过复制传播到其余Slave上。被动的服务器是指不接受写而仅仅是跟随主动Master,随时准备切换。两个服务器有两种设置,一种是active-active,一种是active-passive,第二种很像热备份的的拓扑,带是因为是对称,切换起来比较方便。在双Master配置中,passive服务器并不必定要求接受读请求,这个时候其实就是一个冷备份。在双Master的拓扑中,并不必定非要经过复制来保证两个Master的同步。
active-active型双Master的经常使用的一个场景就是让服务器在物理上接近不一样的用户组。用户使用本地服务器,更改会被复制到另一台服务器来保持二者同步。因为事务是在本地提交的,因此响应比较快。但因为事务是本地提交的,两个服务器并非时时刻刻彻底一致的。这就会有些问题:1)若是同一个信息在两台服务器上更新,将会服务器将会产生冲突,复制也会终止。你能够只让其中一台接受写操做,能够在某种程度上避免冲突的发生。2)若是两台服务器在处于不一致状态下发生故障,有些事务将会丢失,这也是异步复制的硬伤,不过你能够经过使用半同步复制(MySQL 5.5引入)来限制事务丢失的个数。
对于active-passive型的来讲,你可能使用passive的Master来作服务器升级这样的管理工做。active-passive有一个根本性的问题须要解决。split-brain syndrome:当网络链接短期内中断,从而使得从服务器主动升级为主服务器,而后网络又恢复了。若是在他们各自为主服务器的时间里,更改在两台服务器上都执行就会产生冲突。当使用共享磁盘的方式时,两台服务器同时写磁盘会产生有趣的问题。
对于如何实现双Master直接的同步,有几种方案。
这是最直接的双Master方案:两个Master经过一个像SAN(Storage Area Network)的共享磁盘架构链接在一块儿,并被设置成使用相同的文件。由于其中一个是passive,它不会写任何东西到文件中,