分布式系统与架构

1. 分布式系统架构有哪些优势?

    1)增大系统容量

    2)加强系统可用性

    3)因为模块化,所以系统模块重用度更高

    4)因为软件模块化被拆分,开发和发布速度可以并发而变得更快

    5)系统扩展性更高

    6)团队协作流程也会得到改善

2. 分布式系统架构有哪些劣势?

    1)架构设计变得复杂(尤其是其中的分布式事务)

    2)部署单个服务会比较快,但如果一次部署多个服务,流程会变得复杂

    3)系统的吞吐量会变大,但响应时间会边长。

    4)运维复杂度会因为服务变多而变得复杂

    5)架构复杂导致学习曲线变大

    6)测试和查错的复杂度增大

    7)技术多元化,这会带来维护和运维的复杂度

    8)管理分布式系统中的服务和调度变得困难和复杂

3. 分布式系统中有哪些需要注意的问题?

    1)异构系统的不标准问题:软件、应用、通讯协议、数据格式、开发和运维的过程。需要统一标准。

    2)服务架构中的系统依赖问题(业务隔离;数据库隔离,不同业务有自己不同的数据库;主要的业务调用路径图)

          a. 如果非关键业务被关键业务所依赖,会导致非关键衣物变成一个关键业务

          b. 服务依赖链中,出现“木桶短板效应” -- 整个SLA(Service Level Agreement,服务级别协议是指提供服务的企业与客户之间就服务的品质、水准、性能等方面所达成的双方共同认可的协议或契约)由最差的那个服务决定。

    3)故障发生的概率更大

          a. 出现故障不可怕,故障恢复时间过长才可怕(怎么避免?)

          b. 出现故障不可怕,故障影响面过大才可怕(怎么避免?)

          需要我们在设计或运维系统时都要为这些故障考虑,即所谓 Design for Failure。在设计时就要考虑如何减轻故障。如果无法避免,也要使用自动化的方式恢复故障,减少故障影响面。

    4)多层架构的运维复杂度更大

          a. 任何一层的问题都会导致整体的问题

          b. 没有统一的视图和管理,导致运维被割裂开来,造成更大的复杂度

   分工不是问题,问题是分工后的协作是否统一和规范。

4. 使用分布式系统的主要目的是什么?

    1)大流量处理:通过集群技术把大规模并发请求的负载分散到不同的机器上。

    2)关键业务保护:提高后来服务的可用性,把故障隔离起来阻止多米诺骨牌效应(雪崩效应)。如果流量过大需要,需要对业务降级,以保护关键业务流转。

5. 怎样提高系统架构的性能?

    1)加缓冲:缓存系统(缓存分区,缓存更新,缓存命中)

    2)负载均衡:网关系统(负载均衡,服务路由,服务发现)

    3)异步调用:异步系统(消息队列,消息持久,异步事务)

    4)数据镜像:数据镜像(数据同步,读写分离,数据一致性)

    5)数据分区:数据分区(分区策略,数据访问层,数据一致性)

6. 怎样提高架构的稳定性?

    1)服务拆分:服务治理,服务调用,服务依赖,服务隔离

    2)服务冗余:服务调度,弹性伸缩,故障迁移,服务发现

    3)限流降级:异步队列,降级控制,服务熔断

    4)高可用架构:多租户系统,灾备多活,高可用服务

    5)高可用运维:运维系统,全栈监控,Devops,自动化运维

7. 分布式服务有哪些关键技术?

    1)服务治理

    2)架构软件管理

    3)DevOps

    4)自动化运维

    5)资源调度管理

    6)整体架构监控

    7)流量控制

8. 分布式系统的纲

    1)全栈系统监控

    2)服务/资源调度

    3)流量调度

    4)状态/数据调度

    5)开发和运维的自动化

9. 全栈监控主要监控哪些方面?

    1)基础层:监控主机和底层资源。如:CPU、内存、网络吞吐、硬盘I/O、硬盘使用等

    2)中间层:就是中间件的监控。如:Nginx、Redis、ActiveMQ、Kafka、MySQL、Tomcat 等

    3)应用层:监控应用层的使用。如:HTTP访问的吞吐量、响应时间、返回码,调用链路分析、性能瓶颈,还包括用户端的监控。

10. 监控系统有哪些常见问题?

    1)监控数据是隔离开来的

    2)监控的数据项太多

11. 监控系统的主要应用场景有哪些?

    1)体检:

          a. 容量管理:提供一个全局的运行时数据展示,可以让工程师团队知道是否需要增加机器或其他资源。

          b. 性能管理:可以通过查看大盘,找到系统瓶颈,并有针对性的优化系统和响应代码。

    2)急诊:

          a. 定位问题

          b. 性能分析:

12. 一个好的监控系统应该实现哪些功能?

     1)服务调用链跟踪:

     2)服务调用时长分布:使用 Zipkin,可以看到一个服务调用链上的时间分布,这样有助于我们知道最耗时的服务是什么。下图是 Zipkin 的服务调用时间分布。

     3)服务的TOP N视图:所谓 TOP N 视图就是一个系统请求的排名情况。一般来说,这个排名会有三种排名的方法:a)按调用量排名,b) 按请求最耗时排名,c)按热点排名(一个时间段内的请求次数的响应时间和)。

     4)数据库操作关联:

     5)服务资源跟踪:我们的服务可能运行在物理机上,也可能运行在虚拟机里,还可能运行在一个 Docker 的容器里,Docker 容器又运行在物理机或是虚拟机上。我们需要把服务运行的机器节点上的数据(如 CPU、MEM、I/O、DISK、NETWORK)关联起来。

13. 我们需要通过监控系统,达成什么样的目标?

     1)当一台机器挂掉是因为 CPU 或 I/O 过高的时候,我们马上可以知道其会影响到哪些对外服务的 API。

     2)当一个服务响应过慢的时候,我们马上能关联出来是否在做 Java GC,或是其所在的计算结点上是否有资源不足的情况,或是依赖的服务是否出现了问题。

     3)当发现一个 SQL 操作过慢的时候,我们能马上知道其会影响哪个对外服务的 API。

     4)当发现一个消息队列拥塞的时候,我们能马上知道其会影响哪些对外服务的 API。

14. 关于服务调度,我们有哪些能做的?

     1)服务关键程度和服务的依赖关系:

     2)服务状态和生命周期的管理:整个架构中有多少种服务?这些服务的版本是什么样的?每个服务的实例数有多少个,它们的状态是什么样的?每个服务的状态是什么样的?是在部署中,运行中,故障中,升级中,还是在回滚中,伸缩中,或者是在下线中……

     3)整个架构的版本管理

     4)资源和服务调度:

           a. 服务状态的维持和拟合

           b. 服务的弹性伸缩和故障迁移

           c. 服务工作流和编排

15. 流量调度应该具有哪些功能?

     1)依据系统运行情况,自动地进行流量调度,在无需人工干预的情况下,提升整个系统的稳定性。

     2)让系统应对爆品等突发事件时,在弹性计算扩缩容的较长时间窗口内或底层资源消耗殆尽的情况下,保护系统平稳运行。

     3)服务流控:服务发现、服务路由、服务降级、服务熔断、服务保护等。

     4)流量控制:负载均衡、流量分配、流量控制、异地灾备(多活)等。

     5)流量管理:协议转换、请求校验、数据缓存、数据计算等。

16. 流量与数据调度:

      1)状态数据调度:一般来说,我们会通过“转移问题”的方法来让服务变成“无状态的服务”。也就是说,会把这些有状态的东西存储到第三方服务上,比如 Redis、MySQL、ZooKeeper,或是 NFS、Ceph 的文件系统中。

      2)分布式事务一致性的问题:

           a. Master-Slave 方案。

           b. Master-Master 方案。

           c. 两阶段和三阶段提交方案。

           d. Paxos 方案。

           现在,很多公司的分布式系统事务基本上都是两阶段提交的变种。比如:阿里推出的 TCC–Try–Confirm–Cancel,或是我在亚马逊见到的 Plan–Reserve–Confirm 的方式,等等。凡是通过业务补偿,或是在业务应用层上做的分布式事务的玩法,基本上都是两阶段提交,或是两阶段提交的变种。

      3)数据结点的分布式方案

17. 状态数据调度小结:

       1)对于应用层上的分布式事务一致性,只有两阶段提交这样的方式。

       2)底层存储可以解决这个问题的方式是通过一些像 Paxos、Raft 或是 NWR 这样的算法和模型来解决。

       3)状态数据调度应该是由分布式存储系统来解决的,这样会更为完美。但是因为数据存储的 Scheme 太多,所以,导致我们有各式各样的分布式存储系统,有文件对象的,有关系型数据库的,有 NoSQL 的,有时序数据的,有搜索数据的,有队列的……

 

posted @ 2019-12-10 11:03  Jtianlin  阅读(4135)  评论(0编辑  收藏  举报