【冗余】
如果一个组件出现故障,必须有一个替代品。该替代品既可以是闲置的,也可以是当前系统部署的一部分;
【应急计划】
为每个紧急事件都做好了计划;
故障类别
【salve故障】
slave只是用于读操作的,如果发生故障,负载平衡器会将新的查询定位到正常的slave。
【master故障】
【relay故障】
同时扮演master角色的slave称为中继服务器(relay),为了减轻master的负载;
如果relay发生故障,剩余的slave必须重定向到其他的中继服务器或者master;
方法
【添加新的slave】
基本思路:获取现有服务器(通常是slave)进行快照,在一个新的服务器上恢复快照,然后从适当的位置进行复制;
获取快照的方法:
(1)使用mysqldump
安全、速度慢
(2)复制数据库文件:
速度较快,但是复制文件需要现将服务器离线。此外还需要管理一些位置,即mysqldump获得的那些正确启动复制的位置;
(3)使用在线备份的方法:
如MySQL Enterprise Backup和XtraBackup
(4)使用LVM获取快照:
在Linux中,可以通过逻辑卷管理器(LVM)得到卷快照,不过需要创建一个特殊的LVM卷。与复制数据库文件一样,这个方法也需要自己管理复制位置;
(5)使用文件系统快照的方法:
例如Solaris ZFS内置支持快照功能。需要自己管理复制位置;
注意:如果恢复的时候使用的不同类型引擎,则必须使用mysqldump;
【从拓扑结构中删除slave】
只需要通知负载均衡器slave不存在了,就可以删除slave;
【切换master】
方式一:将连接在master上的所有的slave切换到副master,然后通知负载均衡器原来的master不存在。
方式二:使用slave提升
方式三:使用热备份
【slave故障处理】
检测到slave不存在了,然后将它从负载平衡器的池中删除;
【master故障处理】
如果master出现故障,必须检测故障,并发所有的slave都转移到一个备用的master上。
【升级slave】
【升级master】
升级master首先需要升级所有的slave,这样它们才能够从master读取全部的复制事件。通常在升级master的时候,可以使用备用master,或者选择一个slave将其提升为master;
【热备份】
做服务器副本最简单的拓扑结构就是热备份(hot standby),热备份是一个专用的服务器,它是主master的副本。热备份服务器以slave的方式连接到master,以读取和应用所有的更新。这种配置通常称为主——备份配置(primary-backup configuration),主指的是master,备份指的是备用服务器;可以有多个热备份;
处理切换:将slave从master切换到standby
执行切换的基本思路是:在完全相同的位置停止运行slave和standby,然后把slave重定向到standby。由于standby在停止的时候位置没有任何的变更,只需要确定standby的binlog位置,然后让slave从那个位置启动。
1、查看位置信息SHOW SLAVE STATUS/G
2、启动slave去和standby一致START SLAVE UNTIL
3、使用CHANGE MASTER TO 命令切换到standby,把slave切换到standby并启动它;
使用Python处理切换:
【双主结构】
双主结构(dual masters)即两个master相互复制,保持同步;
双主结构的两种配置:
(1)主动——主动(active-active):
在这个配置中,写操作同时到达两个服务器,然后将变更发送给对方;
(2)主动——被动(active-passive):
在这个配置中,负责处理写操作的称为主动master,另外一个为被动master,与主动master保持同步;
MySQL5.5新功能:半同步复制——可以限制事务丢失的数量,其原理是,提交事务的线程会被阻塞,直到至少有一个slave确认收到这个事务。由于事务提交到存储引擎之后事件才会发给slave,所以事务的丢失数量可以控制在最多每个线程1个;
【共享磁盘】
双主结构可以通过一个共享磁盘结构(如SAN,存储区域网络)连接;
两台服务器连接到同一个SAN,并使用相同的文件。当主动地master发生故障的时候,被动的master随时接替;
【使用DRBD复制磁盘(分布式复制快设备)】
这是一个通过网络复制块设备的软件;
使用该方式只能在主动——被动配置使用DRBD技术,也就是说,被动磁盘完全不能被访问。
【双向复制】
双向复制可以有主动——主动配置
配置双向复制的步骤:
(1)确保两台服务器有不同的ID;
(2)确保两台服务器具有相同的数据(并且在复制启动之前两个系统都没有变更);
(3)创建一个复制用户,在两台服务器上准备复制;
(4)在两台服务器上启动复制;
注意:应该确保在应用层的两台服务器不会同时更新相同的数据;
【提升slave】
前面的情况均是在master正常运行的情况,当master发生以外情况下:
找到获取最多master变更(即知道最多)的slave,然后将其他slave与这个知道最多的slave同步:复制整个数据库或者使用类似mysqldbcompare的工具获取变更;
可以使用Python实现slave提升;
每个可以提升的slave必须有一个复制用户账户;
每个可提升的slave运行的时候必须使用log-in选项,即启动二进制日志;
每个可提升的slave运行的时候必须不使用log-slave-updates选项;
【环形复制】
建立两个以上的master相互复制,由于每个slave只能连接一个master,因此这种结构只能使用以环形的方式搭建;
MySQL引入了全局事务标识符,如果发现某个服务器出现故障,使用CHANGE MASTER 命令加上MASTER_AUTO_POSITION=1选项,将下游服务器连接到上游服务器;
由于每个服务器都有事务记录,故障服务器发出去的事务都会在剩余的每个服务器上执行一次。