系统与子系统
系统:指由一群有关联的个体组成,根据某种规则运作,能完成个别元件不能单独完成的工作的群体。(关联、规则、能力)
子系统也是由一群关联的个体所组成的系统,多半是更大系统中的一部分。
例如微信本身是一个系统,同时又包含聊天、支持、朋友圈等子系统。
朋友圈这个系统又包含动态、评论、点赞等子系统。
模块与组件
软件模块:是一套一致且互相有紧密关联的软件组织,它包含程序和数据结构两部分。
软件组件:定义为自包含的、可编程、可重用的、与语言无关的软件单元,软件组件可以很容易地被用于组装应用程序。
例如学生信息管理系统,从逻辑角度拆分,可以分为登陆注册模块、个人信息模块、个人成绩模块;从物理角度可以拆分成nginx、web服务器、MySQL.
框架与架构
软件框架:为了实现某个业界标准或完成特定基本任务的软件组织规范,也指为了实现某个软件组件规范时,提供规范所要求之基础功能的软件产品。
软件架构:是指软件系统的基础结构,创造这些基础结构的准则,以及对这些准则的描述。
(软件架构指软件系统的顶层结构)
高性能
单机的复杂度
集群的复杂度
任务分配
任务分解
将复杂的业务系统拆分成小而简单的多个系统配合的业务系统
任务分解提升性能的原因
高可用
通过“冗余”来实现高可用。
计算高可用
存储高可用
状态决策高可用
可扩展性
为了应对将来需求变化而提供的一种扩展能力,当有新的需求出现时,系统不需要或仅需要少量修改就可以支持,无需整个系统重构或重建。
低成本
只有创新才能达到低成本目标
例子
安全
功能安全
架构安全
主要依靠防火墙,为隔离网络
DDos
分布式拒绝服务攻击(英文意思是Distributed Denial of Service,简称DDoS)是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,或者一个攻击者控制了位于不同位置的多台机器并利用这些机器对受害者同时实施攻击。由于攻击的发出点是分布在不同地方的,这类攻击称为分布式拒绝服务攻击,其中的攻击者可以有多个。
规模
关系数据库
读写分离:将访问压力分散到集群中的多个节点,但是并没有分散存储压力。
分库分表:既可以分散访问压力,又可以分散存储压力。
业务分库:分散存储和访问压力
引入问题
join操作问题
事务问题
成本问题
分表
垂直分表:适合将表中某些不常用且占了大量空间的列拆分出去。
引入问题
水平分表:适合表行数据特别大的表,例如单表行记录超过5000万条。
引入问题
路由:水平分表后,某条数据具体属于哪个切分后的子表,需要增加路由算法进行计算
count()操作
记录数表
实现方法
程序代码封装:在代码中抽象一个数据访问层来实现读写分离、分库分表
中间件封装:独立一套系统出来,实现读写分离和分库分表操作
实现复杂度:分库分表比读写分离要复杂的多。
存在缺点
NoSQL
关系数据库
NoSQL的本质是牺牲ACID特性中的某个或某些特性,作为关系数据库的补偿。
常用的NoSQL方案有如下4类
K-V存储:解决关系数据库无法存储数据结构的问题,以Redis为代表。
文档数据库:解决关系数据库强schema约束的问题,以MongoDB为代表。
文档数据库最大特点是no-schema,可以存储和读取任意的数据,数据格式一般为JSON.
优势:
新增字段简单;
历史数据不会出错;
可以很容器存储复杂数据。
列式数据库:解决关系数据库大数据场景下I/O问题,以HBase为代表。
例如,统一某城市超重人员的数量,只需读取体重这一列的数据即可。
全文搜索引擎:解决关系数据库的全文搜索性能问题,以Elasticsearch为代表。
缓存
基本原理:将可能重复使用的数据放到内存中,一次生成,多次使用,避免每次使用都去访问存储系统。
面临的问题
单服务器高性能
PPC(Process per Connection),每次有新的连接就新建一个进程专门处理这个连接的请求。
prefork:提前创建进程,便于后续直接使用
TPC(Thread per Connection),每次有新的连接就新建一个线程专门处理这个连接的请求。
prethread:提前创建线程,便于后续直接使用
Reactor(非阻塞同步网络模型):核心组件包括Reactor和处理资源池,其中Reactor负责监听和分配事件,处理资源池负责处理事件。
Proactor(异步网络模型):核心组件包括Proactor和异步操作处理器。
集群高性能
本质:通过增加更多的服务器来提升系统整体的计算能力
复杂性:增加任务分配器,以及选择一个合适的任务分配算法。(任务分配器,更通俗的叫法是 负载均衡器)
负责均衡分类
负载均衡架构
负载均衡的算法
常用的高可用存储架构有主备、主从、主主、集群、分区。
主备复制:客户端的操作都是通过主机完成,备机仅起到备份作用,不参与实际业务读写操作。
主从复制:主机负责读写操作,从机只负责读操作,不负责写操作。
主备倒换与主从倒换
设计关键
常见架构
主主复制
数据集群
概念:集群就是多台机器组合在一起形成一个统一的系统。(主备、主从、主主架构本质上隐含一个假设:主机能够存储所有数据。)
集群分类
数据集中集群
数据分散集群
分布式事务算法
目的:保证分散在多个节点上的数据统一提交或回滚,以满足ACID要求。
二阶段提交(Two-Phase Commit Protocol,2PC)
三阶段提交(Three-Phase Commit Protocol,3PC)
分布式一致性算法
目的:保证同一份数据在多个节点上的一致性
机制:复制状态机
算法:Paxos、Raft、ZAB
数据分区
概念:指将数据按照一定的规则进行分区,不同分区分布在不同的地理位置上,每个分区存储一部分数据,通过这种方式来规避地理级别的故障所造成的巨大影响。
需要考虑的问题
数据量:数据量越大,分区规则会越复杂,考虑的情况也越多。
分区规则:洲际分区、国家分区、城市分区
复制规则
主备
主从
对称集群:集群中每个服务器的角色一致,可以执行所有任务。
非对称集群:集群中的服务器分为多个不同的角色,不同的角色执行不同的任务。
异地多活
目的:应对系统级的故障。
架构:同城异区、跨城异地、跨国异地。
设计技巧
1.保证核心业务的异地多活
2.核心数据的最终一致性
3.采用多种手段同步数据
4.只保证绝大部分用户的异地多活
设计步骤:业务分级、数据分类、数据同步、异常处理
接口级的故障应对方案
降级:将某些业务或接口的功能降低,可以是只提供部分功能,也可以是完全停掉所有功能。
熔断:通过设定阈值,来应对依赖的外部系统故障的情况。
限流:只允许系统能够承受的访问量进入,超出部分的请求将丢弃。
排队:让用户等待很长时间,才能得到处理或长时间等待后仍然无法得到响应。
XMind: ZEN - Trial Version