2.互联网架构设计的四大原则(四)
2.5 章节练习
1.大型互联网架构设计的四大原则是什么?
- (1)高可用原则:系统应该最大程度地保证服务可用性,缩短服务因为各种故障而不可用的时间。
- (2)高伸缩原则:系统的服务能力应该可以随时根据需要进行伸缩,当服务压力较大时,能够提高计算能力、存储能力、传输能力等;当服务压力较小时,能够减小服务规模,减少资源的投入。
- (3)高并发原则:系统应该具有承载超高并发请求的能力,在保证系统可用性的同时,具有更快的响应速度和更好的用户体验。
- (4)安全性原则:系统要具有足够的安全防护能力,网络、服务器、存储、数据都要进行相应的安全设计。
2.可用性达到4个9代表什么意思?
可用性达到4个9是指在一年365天中,99.99%的时间系统都是正常可用的,只有0.01%的时间不可用,也就是365×24×60×0.01%≈53(分钟)。
3.提高系统可用性的方法有哪些?
通过冗余、备份、故障转移、监控等手段可提高系统的可用性。使用负载架构、集群架构、主备架构都可以提高系统的可用性。在系统某节点发生故障时能够继续由其他节点接替服务,或者能够快速地使用备份服务顶替故障服务,或者能够第一时间通过监控发现故障或修复故障。无论采用何种手段,最大的目标就是将系统的不可用时长降到最低,将影响降到最低。
4.什么是负载均衡,有哪些负载方法?
负载均衡就是将单个服务节点的压力分散到多个服务器上的过程,单台服务器很容易达到性能瓶颈,此时可以通过增加服务器的数量,利用负载设备将请求分散到多个服务器上,从而减轻服务器的压力,提高整体服务的性能。
按照负载设备的类型可以分为硬负载和软负载,可以通过硬件设备进行负载(如F5),也可以通过软件进行负载(如Nginx、LVS、HAProxy等)。
按照负载的方式可以分为客户端负载和服务端负载。
- 客户端负载不需要利用负载设备,而是由客户端根据负载算法进行负载。
- 服务端负载需要使用负载硬件或软件,反向代理后端服务器完成, DNS轮询也属于服务端负载。
5.灾备有几种架构方式,它们有何差异和优缺点?
两地三中心灾备架构、异地多活架构,两者的差异和优缺点如下。
- 两地三中心灾备架构:在同一个城市或邻近的城市(如北京、天津)建立两个数据中心(DC),由于距离较近,网络延迟低,因此数据几乎可以达到实时同步。当其中一个数据中心发生故障,如火灾、地震等毁灭性事故时,可以快速将服务切换到另外一个数据中心,保证服务可以短时间内恢复。 异地多活架构:是指在多个距离较远的城市建立IDC(互联网数据中心),同时对外提供服务。
两地三中心灾备架构无法解决不同地区用户访问速度的差异,距离数据中心较远的用户或海外用户访问速度会急剧下降。由于始终有一个数据中心处于备份状态,并不对外提供服务,因此会造成巨大的资源浪费。但是,实现起来会相对简单,成本比较低。
- 异地多活架构的优点是可以为不同地区的用户提供良好的用户体验,多个数据中心同时对外提供服务,不存在资源浪费,但是实现相对困难,数据同步延迟较高,方案更加复杂。由于往往需要专线等设施,因此成本会更加昂贵。
6.提高系统的高并发能力有哪些策略?
- (1)多级缓存策略:从客户端到服务端、从服务端到数据库的整个交易链条上,可以在不同位置增加不同的缓存,目的就是减少请求服务端和数据库的次数,从而提高系统的承压能力,以能够处理更高的并发请求。
- (2)异步化策略:将同步请求转化为异步请求,将同步处理转化为异步处理,从而提高系统的吞吐量。
- (3)读写分离策略:将读写服务进行分离,从而使数据库的承压降低,提供更高的并发处理能力。
7.多级缓存策略都有哪些?
客户端缓存、CDN缓存、负载缓存、应用内存级缓存、中间件缓存。
8. CDN是什么,作用是什么?
CDN的全称是Content Delivery Network,即内容分发网络,作用是将HTML、CSS、JavaScript、图片、音频、视频、文件等静态资源缓存在全国甚至全球的各个边缘存储设备中,使其距离用户更近,从而提高资源的加载速度,提升用户体验。
9. 应用内存级缓存和中间件缓存有什么区别?
- 应用内存级缓存:是将数据存储在服务器的内存中,只能应用自己使用,在集群和分布式系统架构下,内存无法共享,存在大量的数据冗余。虽然其访问速度比中间件缓存更快,但是却无法共享缓存数据,很容易出现缓存不一致的问题。
- 中间件缓存:利用Redis、Memcached等专业的缓存软件存储数据,多个服务共享缓存数据,不存在数据一致性问题,但是访问速度要差一些。在系统建设中,通常需要根据不同的功能使用不同的缓存方式。
10.系统异步化实现方式有哪些?
客户端可以通过Ajax技术进行用户请求的异步化,服务端可以通过线程池等并发编程技术实现异步化,还可以借助消息队列中间件实现异步化。
11.提高系统的伸缩性有哪些策略?
- (1)服务无状态化设计:将单个服务的所有接口都进行无状态设计,从而使服务具有水平扩展能力。
- (2)文件存储伸缩性设计:使用分布式的文件存储如NFS、GFS、FastDFS等来进行数据拆分,使数据存储具有水平扩展能力。
- (3)数据库伸缩性设计:对数据库进行水平拆分、垂直拆分,以此来增加数据库的扩展能力。
12.如何提高数据库的伸缩性,有哪些策略?
分库分表策略:水平分库、水平分表、垂直分库、垂直分表。
13.水平分库、垂直分库会带来哪些问题?
如何进行跨库关联查询,如何进行跨库的分页和排序,如何保证数据事务的一致性,如何进行数据迁移。
14.数据库分表和分库的差异与优缺点是什么?
无论是垂直分表还是水平分表,都是在一个数据库实例中,因此始终存在单节点服务压力问题、连接数上限问题,但是不会存在分布式事务、跨库关联、跨库分页和排序等问题,开发和维护相对简单。
无论是垂直分库还是水平分库,都是将一个数据库实例拆分为多个,因此解决了单节点服务压力问题、连接数上限问题,但是会引入分布式事务、跨库关联、跨库分页和排序等问题,开发和维护比较复杂。
15.垂直分库、垂直分表、水平分库、水平分表哪个可以解决单表数据量过大的问题,最佳的方案是什么?
水平分库、水平分表可以解决单表数据量过大的问题,最佳的方案是先垂直拆分,再水平拆分。
16.常用的负载策略有哪些,它们的区别是什么?
轮询策略、权重轮询策略、动态权重策略、最小连接数策略、最短响应时长策略、IP哈希策略、URL哈希策略、最小会话策略、趋势分析策略、随机策略。详细说明可参见2.1.3小节。
17. MongoDB数据库有几种高可用模式?
- (1)主从模式 :主节点对外提供读写服务,数据同步给从节点,从节点作为备份服务(主备架构),或者提供查询服务(主从架构)。发生故障时从节点不能自动切换为主节点,无法自动故障转移。
- (2)副本集模式:主节点对外提供服务,数据同步给多个从节点,从节点可作为备份服务,也可以提供查询服务,优点是发生故障时能够自主选举出主节点,自动完成故障转移,可用性更强。
- (3)分片模式:无论是主从模式还是副本集模式,所有节点存储的都是全量数据,造成数据存储容量受限,同时只有一个节点对外提供写服务,限制了服务的性能。而分片模式将数据进行水平拆分,不同节点可存储不同的数据,数据存储容量大大提高,每个节点可同时对外提供读写服务,提升服务性能。
18.缓存穿透、缓存击穿、缓存雪崩现象是什么?
- 缓存穿透:属于一种攻击行为,或者严重的程序bug,是指缓存和数据库中都没有指定的数据,而客户端不断发起请求进行查询,导致大量请求到达数据库,使数据库压力过大甚至宕机。
- 缓存击穿:某个单一热点缓存到期,同时并发请求量巨大,引起数据库压力瞬间剧增,造成过大压力甚至宕机。这就像一面墙上被打了一个洞,因此称为击穿现象。
- 缓存雪崩:大批量的缓存集中过期,而此时并发量较大,从而引起数据库压力过大甚至宕机。由于一个服务的故障,还可能会引起其他服务相继出现问题,就像雪崩一样。
19.读写分离架构的优势和挑战是什么?
读写分离架构能够有效减轻数据库的访问压力,将流量分散到不同的数据库节点上,对于读多写少的系统尤其有效。
读写分离最大的挑战是主从不一致的问题,网络分区、服务器配置不同都会导致主从不一致问题的扩大。
20.数据库的高可用架构有哪些方式?
主备架构、一主一从架构、一主多从架构、主从从架构、互为主从架构。
21.数据库的主从同步策略有哪些?
异步复制策略、全同步复制策略、半同步复制策略。
2.6 案例设计
1. 场景设计题:
某公司需要研发一款大型互联网微博平台,具体要求如下。
- (1)本平台含PC端、App端、小程序端、Pad端。
- (2)国内日活用户量5亿,分布在全国各地,北京、上海、广州用户居多。
- (3)用户每日可以发布任意数量的微博,微博的形式可以是文字、图片、视频和音频。
- (4)用户可以查看、评论、转发、点赞自己和他人的微博内容。
- (5)在其他用户评论、转发、点赞了微博后,作者应该立即接收到消息通知。
- (6)用户可以随时查看自己已经发布的所有微博内容,以及别人的评论和点赞信息。
如果您作为企业的系统架构师,会怎样进行系统设计,需要考虑哪些内容?
2.设计思路指引
从大型互联网设计的四大原则来思考这个问题,该系统是一个具有极高用户量、海量数据存储、并发量极高的互联网社交类应用,因此整套系统必须具有高可用、高伸缩、高并发、安全性的特点。
(1)高可用设计原则。
- ① 此系统的用户量高达5亿,尤其在并发高峰期很容易造成系统宕机,因此所有的节点必须采用冗余设计,不可以存在任何单节点缺陷。
- ② 系统用户分布在全国各地,而大量的数据为图片、视频、音频这些静态资源,为了减轻服务端压力,同时提升用户体验,需要使用CDN作为边缘缓存。
- ③ 由于用户量巨大,服务端必须具有极高的请求接入能力,否则用户量一旦增多,就可能连页面都打不开,因此必须采用多级负载设计,支撑足够高的连接数和并发请求。
- ④ 由于用户分布在全国各地,为了保证用户数据的安全性,以及程序应答速度,因此应该建设两地三中心容灾或异地多活架构,并做好数据灾备措施。
- ⑤ 在某些热点话题爆发时会引起请求量暴增的情况,应该进行高并发限流设计,能够自动调节流量进行服务降级,在必要时保证系统不被压垮。
(2)高伸缩设计原则。
- ① 由于日活用户量高达5亿,并且用户发送微博的形式和数量并不受限制,因此会产生海量的数据,数据库应该采用分库分表的设计方式,增加数据库的连接数,提高数据库的存储能力和处理性能。
- ② 数据应该按照用户ID进行分片存储,或者根据用户ID建立索引库,以便用户可以快速地查询自己发布的微博,以及自己曾经点赞、评论、收藏的内容。
- ③ 采用冗余设计,将数据同步到Redis、HBase等数据库中冗余存储,以支持更高并发的查询能力,难点是如何保持数据的一致性。
- ④ 可能随时需要根据压力情况扩充或减少服务节点,因此服务接口都应该采用无状态设计,从而支持服务节点的水平扩展能力。
- ⑤ 由于存在海量的用户图片、视频、音频等静态资源数据,并且不能丢失,因此需要引入分布式文件存储设计,支持存储的弹性伸缩。
(3)高并发设计原则。
- ① 由于日活用户量巨大,查看和更新请求都处于持续的高压状态,为了提高系统的并发能力,因此应该尽最大努力减轻数据库的请求压力,要充分利用客户端、CDN、缓存中间件组成多级缓存架构。
- ② 当发生微博的评论、转发、点赞时会伴随着海量的消息发送,应该采用异步解耦设计,充分利用消息中间件的高吞吐能力进行发送,就算消息发送存在延迟或失败,也不会影响系统的使用。
- ③ 微博的查看次数会远远高于微博的发布、修改次数,因此可以采用读写分离的存储设计。
- ④ 微博内容发布和显示、评论、转发等无须具备极高的实时性和数据一致性,所以可以采用弱事务的设计方式,提高并发能力。例如,一条微博发布失败了,或者发布时出现了延迟都是可以接受的,这与银行转账等强事务是有巨大区别的。
- ⑤ 数据可以采用推荐算法,提前将为用户准备好的数据推送到缓存中,避免用户对数据库的直接请求。
(4)安全性设计原则。
- ① 系统暴露在互联网之中,受攻击的概率较高,因此在PC端和移动端都要进行安全加固,网络传输中采用HTTPS。
- ② 使用网络防火墙、流量防火墙、高防IP、网盾等设备提升系统的抗攻击能力。
- ③ 加入验证码、防注入、防重放、防篡改、防破解等多种措施。
- ④ 用户数据加盐加密分散存储,防止数据泄露风险等。
- ⑤ 有严格的用户数据运维、查看、修改管理措施,避免开发和运维人员泄露或损坏用户数据。