浅析大型IM即时通讯系统开发难度

本文从一个简单的系统例子开始,从单机架构、主从副本、同城灾备、同城双活,再到异地双活、异地多活,由浅入深、循序渐进地讲解了大型分布式系统异地多活容灾架构的技术原理和基本的实现思路,非常适合入门者学习。

在软件开发领域,「异地多活」是分布式系统架构设计的一座高峰,很多人经常听过它,但很少人理解其中的原理。

异地多活到底是什么?为什么需要异地多活?它到底解决了什么问题?究竟是怎么解决的?

这些疑问,想必是每个程序看到异地多活这个名词时,都想要搞明白的问题。

我曾经有幸深度参与过一个中等互联网公司异地多活系统的设计与实施过程。所以今天,我就来和你聊一聊异地多活背后的的实现原理。

认真读完这篇文章,我相信你会对异地多活架构,有更加深刻的理解。

什么是系统可用性

要想理解异地多活,我们需要从架构设计的原则说起。

现如今,我们开发一个软件系统,对其要求越来越高,如果你了解一些「架构设计」的要求,就知道一个好的软件架构应该遵循以下 3 个原则。

它们是:

    1)高性能;

    2)高可用;

    3)易扩展。

其中:

    1)高性能:意味着系统拥有更大流量的处理能力,更低的响应延迟(例如 1 秒可处理 10W 并发请求,接口响应时间 5 ms 等等);

    2)易扩展:表示系统在迭代新功能时,能以最小的代价去扩展,系统遇到流量压力时,可以在不改动代码的前提下,去扩容系统。

而「高可用」这个概念,看起来很抽象,怎么理解它呢?

通常用 2 个指标来衡量:

    1)平均故障间隔 MTBF(Mean Time Between Failure):表示两次故障的间隔时间,也就是系统「正常运行」的平均时间,这个时间越长,说明系统稳定性越高;

    2)故障恢复时间 MTTR(Mean Time To Repair):表示系统发生故障后「恢复的时间」,这个值越小,故障对用户的影响越小。

可用性与这两者的关系:

    可用性(Availability)= MTBF / (MTBF + MTTR) * 100%

这个公式得出的结果是一个「比例」,通常我们会用「N 个 9」来描述一个系统的可用性。

要想达到 4 个 9 以上的可用性,平均每天故障时间必须控制在 10 秒以内。

也就是说,只有故障的时间「越短」,整个系统的可用性才会越高,每提升 1 个 9,都会对系统提出更高的要求。

我们都知道,系统发生故障其实是不可避免的,尤其是规模越大的系统,发生问题的概率也越大。

这些故障一般体现在 3 个方面:

    1)硬件故障:CPU、内存、磁盘、网卡、交换机、路由器;

    2)软件问题:代码 Bug、版本迭代;

    3)不可抗力:地震、水灾、火灾、战争。

这些风险随时都有可能发生。所以在面对故障时,我们的系统能否以「最快」的速度恢复,就成为了可用性的关键。即时通讯开发

可如何做到快速恢复呢?

这篇文章要讲的「异地多活」架构,就是为了解决这个问题,而提出的高效解决方案。

本文余下的内容,我将会从一个最简单的系统出发,带你一步步演化出一个支持「异地多活」的系统架构。

在这个过程中,你会看到一个系统会遇到哪些可用性问题,以及为什么架构要这样演进,从而理解异地多活架构的意义。

单机架构

我们从最简单的开始讲起。

假设你的业务处于起步阶段,体量非常小,那你的架构是这样的:

这个架构模型非常简单,客户端请求进来,业务应用读写数据库,返回结果,非常好理解。

但需要注意的是,这里的数据库是「单机」部署的,所以它有一个致命的缺点:即一旦遭遇意外(例如磁盘损坏、操作系统异常、误删数据),那这意味着所有数据就全部「丢失」了,这个损失是巨大的。

如何避免这个问题呢?我们很容易想到一个方案:备份。

 你可以对数据做备份,把数据库文件「定期」cp 到另一台机器上。这样,即使原机器丢失数据,你依旧可以通过备份把数据「恢复」回来,以此保证数据安全。

这个方案实施起来虽然比较简单,但存在 2 个问题:

    1)恢复需时间:业务需先停机,再恢复数据,停机时间取决于恢复的速度,恢复期间服务「不可用」;

    2)数据不完整:因为是定期备份,数据肯定不是「最新」的,数据完整程度取决于备份的周期。

很明显:你的数据库越大,意味故障恢复时间越久。按照前面我们提到的「高可用」标准,这个方案可能连 1 个 9 都达不到,远远无法满足我们对可用性的要求。

那有什么更好的方案,既可以快速恢复业务?还能尽可能保证数据完整性呢?

这时你可以采用这个方案:主从副本。

6、主从副本架构

针对上节中单机架构的问题,你可以在另一台机器上,再部署一个数据库实例,让这个新实例成为原实例的「副本」,让两者保持「实时同步」。

 我们一般把原实例叫作主库(master),新实例叫作从库(slave)。

这个方案的优点在于:

    1)数据完整性高:主从副本实时同步,数据「差异」很小;

    2)抗故障能力提升:主库有任何异常,从库可随时「切换」为主库,继续提供服务;

    3)读性能提升:业务应用可直接读从库,分担主库「压力」读压力。

这个方案不错:不仅大大提高了数据库的可用性,还提升了系统的读性能。

同样的思路,你的「业务应用」也可以在其它机器部署一份,避免单点。因为业务应用通常是「无状态」的(不像数据库那样存储数据),所以直接部署即可,非常简单。

猜你喜欢

转载自blog.csdn.net/wecloud1314/article/details/125444015
今日推荐