什么是高可用架构

我们经常听到有人会提到高可用,那么什么是高可用呢,我们先来看百度百科中对高可用的定义,高可用是通过尽量缩短

应用日常操作,和突发的系统奔溃,所导致的停机时间,以提高系统的可用性,所以说,所谓的高可用,实际上,是以系统的不可用

时间长短来衡量的,我们当然希望我们的系统可以一年365天,不间断的为用户提供服务,但是绝对的百分之百的高可用呢,是不可能

达到的,那么有很多原因,都会造成系统实际上的不可用,比如严重的主从延迟,或者是主从复制中断,再比如说由于锁引起的大量的

阻塞,在这些情况下,虽然MYSQL服务器没有奔溃,但实际上,对于应用来说,已经不能正常的使用数据库了,更不要说由于软硬件故障,

服务器宕机的这种情况了,所以我们会以服务器正常可用的时间,和全年时间的百分比来表示高可用的程度,比如5个9表示全年99.999%

正常是可以使用的,那么换句话说,如果要保证一年有5个9的可用性,差不多就是每年5.25分钟的不可用时间,这个数字其实是很容易

计算得到的,其中365*24*60就是我们一年所计的分钟数,那么对于大多数应用来说,这个数字已经是很不错了,相对于5个9的可用性,

4个9的可用性,3个9的可用性,52分钟,529分钟的不可用时间,所以相对于5个9的可用性来说,4个9和3个9的可用性呢,更容易实现,

可用性的要求越高,实现的成本也就越大,所以我们在现实中,一定要结合业务和成本来选择,我们可用性的这种级别,对于没有必要

实现5个9的可用性,如果我们硬要配置5个9的架构,带来大量的成本浪费

什么是高可用架构_第1张图片

那么如何来实现可用性呢,知道了什么是高可用,那么下面我们来看看如何来实现高可用,从高可用的定义,

我们知道,要实现高可用呢,我们主要可以从两个方面来入手,第一我们要避免导致系统不可用的原因,来减少系统

不可用的时间,系统不可用的时间减少了,那么可用的时间就增加了,那么导致系统不可用的因素呢有很多,最常见的

有服务器磁盘空间的耗尽,或者性能糟糕的SQL,以及表结构和索引没有优化,主从数据不一致,以及认为的操作失误等等,

这些都可以造成服务的不可用,那么不要小看这些问题

什么是高可用架构_第2张图片

就拿磁盘服务器空间耗尽来说,目前的磁盘存储已经足够大了,很少会发生这样的问题,但是坦白的说,我们每年会

遇到磁盘空间不足,这样的问题而导致了MYSQL服务不可用的故障,最常见的情况呢,是由于备份或者各种查询日志

突增而导致的磁盘空间被占满,MYSQL由于无法记录二进制日志,所以无法处理新的请求,这样就会产生系统不可用故障

什么是高可用架构_第3张图片

特别是在一些虚拟机环境中,所部属的MYSQL,很容易产生这样的问题,要避免这些问题所产生的故障呢,我们可以从以下

几个方法来入手,首先是建立完善的监控及报警系统,完善的监控及报警呢,对于任何情况来说,都是非常重要的,对于监控及

报警来说,最重要的是要避免错报和漏报,太多的错误呢,容易使人忽略这种报警消息,就像狼来了这个故事一样,错报会引起

人们失去对监控系统的信任,从而在系统真正出现问题时呢,也没有人关注并及时处理故障,漏报的问题呢,则更为严重,是指在

出现问题时呢,没有被监控到,从而没有通知相关的人员来处理,关于监控的问题呢,我们在本课程的最后呢,会有详细的讨论,

这里只是强调一下其重要性,是不能忽视的,第二点就是对备份数据进行恢复测试,备份恢复测试呢,是经常会忽略的一个问题,

我们知道,备份的重要性,所以往往不会忘记对重要的数据进行备份,但是对已经备份的数据进行测试,同样的重要,有很多原因会

造成数据的损坏,比如在远程传输过程中,网络的原因所造成的文件损坏,这样会导致我们在使用备份文件进行数据库还原时,造成无法

还原数据库的问题,从而造成大量系统不可用的时间,所以我们很有必要定时的对备份的文件恢复测试,特别是这种远程保存的数据库

备份,以保证数据库备份的文件是可用的,第三点就是正确的对数据库进行配置,关于如何的配置数据库,你前面已经进行详细的讲解了,

主要有一点大家要记住,对主从环境中呢,从服务器一定要配置成只读的,这样就可以减少很多由于数据不一致而导致不可用的故障,

最后一个就是对不需要的数据进行归档和清理,对不需要的数据进行归档和清理呢,也可以减少数据库中数据量的大小,来增加查询

的性能,还能减少磁盘空间的消耗,比如把存储到innodb表中的历史数据,归档到ftp表中,就可以节约大量的存储空间,而前提条件呢,

一定要对innodb表的独立表空间,否则就算清理了不可用数据,也很难对系统表空间进行收缩,这一点在我们讲解innodb存储引擎的

时候,已经详细的讨论过了

什么是高可用架构_第4张图片

高可用性的第二个方法,增加系统的冗余,保证发生系统不可用时可以尽快的恢复,要增加系统的冗余呢,

最根本的一点就是,要避免存在单点故障,但是如何增加系统的冗余,避免单点故障呢,并不是一个很简单的问题,

特别是对数据库系统来说,单纯的增加从服务器的数量,并不能达到增加系统冗余的目的,因为在主从架构中,增加从

服务器,只能避免从数据库出现单点故障,但是对于主数据库,还是存在单点故障,所以单纯的主从架构,不能解决我们的

问题,所以为了使主从数据库,有冗余,我们还必须解决下面的问题,一个是主从切换及故障转移,这包括如何在多个从库中

选择新的主,并把其他的从对新的主进行同步,和如何通知应用服务器新主的IP地址

什么是高可用架构_第5张图片

那么下面我们来看看如何解决这两个问题,来构建MYSQL数据库的高可用架构,首先我们来看看如何来解决

单点故障,所谓的单点故障呢,就是指在一个系统中,提供相同功能的组件呢,只有一个,如果这个组件失效了,

就会影响整个系统功能的正常使用,组成应用的各个组件呢,都有可能成为单点,比如我们的单独ICD房,我们把所有的

服务器都放在一个机房中,这个机房ICD房就是一个单点,那么单独的网络交换机,单独的网卡,或者说是单独的服务器,

这些都是有可能成为单点的,不过这些都不是关注的重点

什么是高可用架构_第6张图片

在这里我们主要是解决MYSQL服务的单点问题,为了解决MYSQL服务的单点呢,通常可以使用以下方法,第一个是利用

SUN这样的共享存储,或者DRDB磁盘复制方案来解决MYSQL的单点故障,在使用共享存储时,两台服务器呢,能够正常的

挂载相同的文件系统,但是只有一台服务器能对其进行操作,如果当前进行处理的服务器,宕机了,那么备用的服务器,

继续挂载文件系统,执行需要的恢复操作,并在失效的服务器使用MYSQL服务,这个过程在逻辑上,跟宕机的服务器呢没有

什么两样,但是恢复会更加的快速,因为备用服务器呢,启动并且随时都可以运行,使用共享存储的方式,解决单点问题呢,

是有其优势的,首先避免除存储以外的其他任何组件,失效所引起的数据丢失,同时呢也可以解决,非存储主键的单点问题,

但是使用共享存储呢,也有一个最大的缺点,就通常来说,共享本身会存在一个单点,前面在介绍存储数据库性能影响的时候呢,

我们说过,如果共享存储出现问题,想要恢复呢,可能需要更长的时间,并且共享存储对随机IO的性能呢,也并不影响

什么是高可用架构_第7张图片

所以共享存储并不是一种好的解决单点故障的方式,除了使用共享存储外呢,还可以使用磁盘镜像的方式,

来解决MYSQL的单点问题,最常见的就是DRDB这种方式了,这也是在MYSQL中所推荐的方式,DRDR是一个linux

内核模块方式来实现的同步复制技术,他通过网卡,讲主服务器的每一个块,复制到另一个服务器的块设备上,

而且在主设备提交前会被记录下来,当主失效时呢,称之为主设备,单点故障解决的方式,那么从这个方向来看呢,

DRDB和共享存储是很相似的,都有一个热备的机器,开始提供服务时呢,会使用和故障机器相同的数据,最大的不同

就是DRDB对存储进行了镜像,而不是共享存储,所以当使用DRDB时,会获得一份相同的数据,也就是说使用DRDB时,

数据是由冗余的,所以存储和数据本身,不会存在单点的问题,但是DRDB也有其本身的一些问题,如故障转移时所需的

时间比较长,利用服务器处理被动模式,而不能对外提供任何的服务,包括读服务,所以成本比较高,另外由于磁盘本身的

bug问题,造成了磁盘的损坏,同时DRDB主备设备上的文件呢,都会被损坏,所以DRDB也不是一种理想的解决方案

什么是高可用架构_第8张图片

另外一种解决MYSQL故障的解决方案呢,使用多写集群,或者NDB集群这样的架构,目前最常见的多写集群呢,就是

Percona公司所提供的pxc集群,在pxc集群中呢,对于一个事务,所有服务器的事务全部提交后,事务才能被提交,如果

有一台服务器不能提交事务,那么我在的服务器上呢,都会对这个事务来进行回滚操作,从这点上可以看出,性能是取决

于集群中,性能最差的那台服务器的性能,pxc集群有很多的优点,比如所有的服务器上的数据都是同步的,不存在数据的

延迟问题,集群中的任意一台服务器呢,损坏都不会造成单点的问题,但是pxc集群同样有非常明显的缺点,比如前面说过的,

整个集群的性能,取决于集群中最差的那台服务器的性能,使用pxc集群时,MYSQL的写入性能呢,也比单台的MYSQL性能要差,

另外pxc集群只支持innodb存储引擎,如果我们的数据库中还使用了其他的存储引擎,就不能使用pxc这种集群方式了

什么是高可用架构_第9张图片

另外一种MYSQL集群技术呢就是NDB集群,在NDB集群中,所有的节点呢,都会同步的进行复制,也就是说,

可以在任何节点上写入,在NDB集群中,所有的节点都会有相同的读写能力,并且每一行数据都是冗余读写的,

因此就算一个节点损坏,也不会丢失数据,NDB集群呢是一种非常完美的解决方案,不过目前的NDB集群中,所有的

数据都要求存储在内存中,如果内存不足,存放所有的数据,则NDB集群的性能都会非常的差,另外呢使用NDB集群呢,

还有其他的限制,所以目前来说,NDB也很少会使用在生产环境中,那么最后一种解决方案呢,是我们已经介绍过的,

利用MYSQL的主从复制,来解决MYSQL的单点故障了,关于MYSQL的复制呢我们前面已经讲了很多了,这里要说的就是,

想要用MYSQL复制来解决这个单点问题,实际上最重要的一点是解决主服务器的问题

什么是高可用架构_第10张图片

要解决这个问题呢,就必须解决以下三个问题,一是主服务器切换后,如何通知应用新的主服务器的IP地址,

但是如何检查MYSQL主服务器是否可用,如何处理从服务器和主服务器之间的那种复制关系,解决了这些问题呢,

我们可以自己编写程序来实现,也可以使用第三方的复制管理主键,目前最常用的管理主键呢,有两种,一种是MMM,

另外一种就是MMHA,我们下面就看看这种组件是如何工作的

什么是高可用架构_第11张图片

 

你可能感兴趣的:(Mysql,数据库优化)