keeplived和zookeeper的对比:https://blog.csdn.net/vtopqx/article/details/79066703 架构设计的关键思维是判断和取舍,程序设计的关键思维是逻辑和实现。 1 架构是什么
模块和组件都是系统的组成部分,只是从不同的角度拆分系统而已: 以学生信息管理为例:
从定义的角度看:框架(Framework)关注的是“规范”,架构(Architecture)关注的是“结构” 架构定义中的”基础结构“这个概念通过采用不同的角度或者维度,可以将系统划分为不同的结构 以学生信息管理为例: 可以重新定义架构:软件架构指软件系统的顶层结构,基本上把系统、子系统、模块、组件、架构等概念都串起来了
架构是顶层设计 框架是面向编程或配置的半成品 组件是从技术维度上的复用 模块是从业务维度上职责的划分 系统是相互协同可运行的实体 模块、对象、组件是对软件在不同粒度和层次上的“拆分”; 2 架构的目的整个软件技术发展的历史,其实就是一部与“复杂度”斗争的历史,架构的出现也不例外,架构设计的主要目的是为了解决软件系统复杂度带来的问题,预判可能遇到的困难,用最小的代价解决它,由需求去驱动架构 以学生管理系统为例:基本功能包括登录、注册、成绩管理、课程管理等,接下来找出复杂度体现在哪里: 性能:一个学校的学生大约 1 ~ 2 万人,学生管理系统的访问频率并不高,平均每天单个学生的访问次数平均不到 1 次,因此性能这部分并不复杂,存储用 MySQL可以解决,缓存、队列等可以不用,Web 服务器用 Nginx 可以解决 可扩展性:学生管理系统的功能比较稳定,可扩展的空间并不大,因此可扩展性也不复杂。 高可用:学生管理系统即使宕机 2 小时,对学生管理工作影响并不大,因此可以不做负载均衡,更不用考虑异地多活这类复杂的方案; 高可靠:如果学生的数据全部丢失,修复是非常麻烦的,只能靠人工逐条修复,这个很难接受,因此存储高可靠是此系统的复杂度之一; 安全性:学生管理系统存储的信息有一定的隐私性,例如学生的家庭情况,但并不是和金融相关的,也不包含强隐私的信息,因此安全性方面只要做 3 个事情就基本满足要求了:Nginx 提供 ACL 控制、用户账号密码管理、数据库访问权限控制。 成本:由于系统很简单,基本上几台服务器就能够搞定,对于一所大学来说完全不是问题,可以无需太多关注。 3 复杂度来源3.1 性能操作系统的复杂度直接决定了软件系统的复杂度。 操作系统和性能最相关的就是进程和线程。
单处理-》批处理-》进程-》线程
首先需要任务分配:使用任务分配器将任务分给多台机器;随着业务的复杂提高,任务分配器也需要越来越多 要进一步提高性能,则有任务分解:把系统分为不同的业务模块,因为: 3.2 高可用定义:
难点在“无中断”上面: 高可用方案本质上都是通过“冗余”来实现高可用 通过冗余增强了可用性,但同时也带来了复杂性 计算高可用的复杂度:增设机器形成一主n(n看需求)备,此时: 存储高可用的复杂度:难点不在于如何备份数据,而在于如何减少或者规避数据不一致对业务造成的影响,这时候需要使用CAP理论进行取舍 计算和存储两种高可用的基础都是“状态决策”: 高可用常见的决策方式:独裁式、协商式、民主式 1 独裁式 存在一个独立的决策主体,负责收集信息然后进行决策,所有冗余的个体都将状态信息发送给决策者,不负责决策。 此方式不会出现决策混乱的问题,因为只有一个决策者; 2 协商式 两个独立的个体通过交流信息,然后根据规则进行决策,最常用的协商式决策就是主备决策。 其难点在于,如果两者的信息交换出现问题(比如主备连接中断),此时状态决策应该怎么做,因为当前主机不知道其他主机的状态,因此会不知所措 3 民主式 多个独立的个体通过投票的方式来进行状态决策,如Zookeeper的Leader选举算法 难点在于算法复杂和脑裂问题 脑裂的根本原因:原来统一的集群因为连接中断,造成了两个独立分隔的子集群,每个子集群单独进行选举,于是选出了 2 个主机,此时整个系统就出现了两个主节点。这个状态违背了系统设计的初衷,两个主节点会各自做出自己的决策,整个系统的状态就混乱了。 解决:采用“投票节点数必须超过系统总节点数一半”规则来处理,分隔的相对较小的子集群因为无法达到原集群数超过一半的投票,因此不会进行选举; 可以看到,没有完美的决策方式,需要进行取舍 3.3 可扩展性可扩展性指系统为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或者仅需要少量修改就可以支持,无须整个系统重构或者重建。 设计具备良好可扩展性的系统,有两个基本条件:正确预测变化、完美封装变化。 第一种应对变化的常见方案是将“变化”封装在一个“变化层”,将不变的部分封装在一个独立的“稳定层”; 复杂度: 第二种常见的应对变化的方案是提炼出一个“抽象层”和一个“实现层”; 复杂度:规则引擎和设计模式都是通过灵活的设计来达到可扩展的目的,但“灵活的设计”本身就是一件复杂的事情。 3.4 成本、安全、规模
低成本在服务器数量上看是与高性能和高可用冲突的,因此如果要在保证高性能和高可用的前提下尽可能地低成本,那么就要“创新”吗,这也是成本的复杂度来源,“创新”既包括开创一个全新的技术领域,也包括引入新技术。
安全可以分为两类:一类是功能上的安全,一类是架构上的安全。 功能安全: 架构安全:
常见于企业级系统,功能、数据非常多,量变引起质变 数据越来越多,这也就是大数据、数据库的分库分表产生的原因,也是复杂度所在(大数据复杂,分库分表也复杂) 4 架构设计的三个原则分别是合适原则、简单原则、演化原则 4.1 合适原则“合适优于业界领先” 根据团队人数、团队人员的技术水平选用难度合适的技术 根据业务场景选择合适的技术 4.2 简单原则“简单优于复杂” 软件领域的复杂性体现在两个方面:
结构复杂的系统的特点:组成复杂系统的组件数量更多,同时这些组件之间的关系也更加复杂。 2.逻辑的复杂性 如果想降低结构复杂性,可以降低组件数量,将功能和逻辑聚在一个组件上,但是这带来了新问题:某个组件的逻辑太复杂,一样会带来各种问题。 复杂的电路意味更强大的功能,而复杂的架构却有很多问题的根本原因在于电路一旦设计好后进入生产,就不会再变,复杂性只是在设计时带来影响; 4.3 演化原则“演化优于一步到位” 建筑一旦完成(甚至一旦开建)就不可再变,而软件却需要根据业务的发展不断地变化,因此需要进行演化,一开始业务没那么复杂,性能要求没那么高,就没必要做得太复杂,建议如下:
4.4 总结三个原则其实是一体的,核心就是因为软件系统的复杂就意味着问题,变化才是主题,因此”适当“才是最好地应对变化的方式,而不是“过度” 合适原则第一考虑,优先满足业务需求; |
|
来自: 书剑秋 > 《2022平台与架构》