互联网架构 - 高可用和负载均衡

2020-05-25 00:00:00 数据 请求 服务 权重 冗余

本文主要介绍互联网架构中的高可用及负载均衡,参考文章高可用、负载均衡、异构负载均衡

高可用HA(High Availability)是在互联网架构设计中必须考虑。高可用是指通过设计来减少系统不能提供服务的时间。

高可用实现的核心思想是冗余故障自动转移

下面是典型的互联网分层架构:

下面我们看看各层怎么实现高可用。

客户端 -> 反向代理层

通过反向代理层的冗余来实现。这里以nginx为例,提供多个nginx,对外使用统一的VIP,并使用keepalived进行存活探测。当一台nginx挂掉,keepalived将流量导向shadow nginx,从而实现高可用。

反向代理层 -> 站点层

通过站点层冗余来实现高可用。nginx.conf里能够配置多个web后端,并且nginx能够探测到多个后端的存活性。当一个web server挂掉,nginx能探测到并自动进行故障转移,将流量导向其他web server。

站点层 -> 服务层

站点层到服务层的高可用通过服务层的冗余来实现的。“服务连接池”会与多个下游服务建立连接,每次请求会“随机”选取连接来访问下游服务。服务连接池能够自动进行故障转移。

服务层 -> 缓存层

服务层到缓存层的高可用通过缓存数据的冗余来实现,方法分为缓存双读写或者支持主从同步的缓存集群来实现。注意:缓存层并不一定要求高可用,只是为了加快访问DB速度。

缓存双读写:

主从同步的缓存集群:redis支持master-slave,并使用redis sentinel来做监控master,slave节点的存活性,自动故障转移以及master promotion。

服务层 -> 数据库层

服务层到数据库层的高可用是通过数据库的冗余来实现,包括主从复制,DB sharding,联合,冗余设计。使用keepalived存活探测并使用相同VIP提供服务。

知识点插入=========>

对于订单交易,包含seller和buyer两个方面。若使用分库分表,使用seller_id分库分表,则查询buyer_id需要查询所有数据库;反之,亦然。这时,可以分别创建2个表T1和T2,分别seller_id和buyer_id来分库分表。

T(buyer_id, seller_id, oid);

//数据冗余满足不同查询需求
T1(buyer_id, seller_id, oid)
T2(seller_id, buyer_id, oid)

相关文章