架构师训练营 - 总结 4
1. 大型网站架构模式
1.1. 分层
大型网站架构中常采用分层结构,将软件系统分为应用层、服务层、数据层:
应用层 - 负责具体业务和视图展示。如网站首页及搜索输入和结果展示。
服务层 - 为应用层提供服务支持。如用户管理服务、购物车服务等。
应用层 - 提供数据存储访问服务。如数据库、缓存、文件、搜索引擎等。
分层架构的约束:禁止跨层次的调用(应用层直接调用数据层)及逆向调用(数据层调用服务层,或者服务层调用应用层)。
分层结构内部还可以继续分层,如应用可以再细分为视图层和业务逻辑层;服务层也可以细分为数据接口层和逻辑处理层。
1.2. 分割
将不同的功能和服务分割开来,包装成高内聚低耦合的模块单元。这有助于软件的开发和维护,便于不同模块的分布式部署,提高网站的并发处理能力和功能扩展能力。
1.3. 分布式
大于大型网站,分层和分割的一个主要目的是为了切分后的模块便于分布式部署,即将不同模块部署在不同的服务器上,通过远程调用协同工作。
分布式意味可以用更多的机器工作,那么 CPU、内存、存储资源也就更丰富,能够处理的并发访问和数据量就越大,进而能够为更多的用户提供服务。
分布式也引入了一些问题:
服务调用必须通过网络,网络延迟会影响性能
服务器越多,宕机概率也越大,是可用性降低
数据一致性非常困难,分布式事务也难以保证
网站依赖错综复杂,开发管理维护困难
常用的分布式方案:
分布式应用和服务
分布式静态资源
分布式数据和存储
分布式计算
1.4. 集群
集群即多台服务器部署相同应用构成一个集群,通过负载均衡设备共同对外提供服务。
集群需要具备伸缩性和故障转移机制:伸缩性是指可以根据用户访问量向集群添加或减少机器;故障转移是指,当某台机器出现故障时,负载均衡设备或失效转移机制将请求转发到集群中的其他机器上,从而不影响用户使用。
1.5. 缓存
缓存就是将数据存放在距离最近的位置以加快处理速度。缓存是改善软件性能的第一手段。
网站应用中,缓存除了可以加快数据访问速度以外,还可以减轻后端应用和数据存储的负载压力。
常见缓存手段:
CDN
反向代理
本地缓存
分布式缓存
使用缓存有两个前提:
数据访问热点不均匀,频繁访问的数据应该放在缓存中
数据在某个时间段有效,不过很快过期,否则缓存数据会因已经失效而产生脏读
1.6. 异步
软件发展的一个重要目标和驱动力是降低软件耦合性。事物之间直接关系越少,彼此影响就越小,也就更容易独立发展。
大型网站架构中,系统解耦的手段除了分层、分割、分布式等,还有一个重要手段——异步。
业务间的消息传递不是同步调用,而是将一个业务操作拆分成多阶段,每个阶段间通过共享数据的方式异步执行进行协作。
在单一服务器内部可通过多线程共享内存队列的方式实现异步,处在业务操作前面的线程将操作输出到队列,后面的线程从队列中读取数据进行处理;
在分布式系统中,多个服务器集群通过分布式消息队列实现异步。
异步架构是典型的生产者消费模式,二者不存在直接调用。异步消息队列还有如下特性:
提高系统可用性
加快响应速度
消除并发访问高峰
1.7. 冗余
大型网站,出现服务器宕机是必然事件。要保证部分服务器宕机的情况下网站依然可以继续服务,不丢失数据,就需要一定程度的服务器冗余运行,数据冗余备份。这样当某台服务器宕机是,可以将其上的服务和数据访问转移到其他机器上。
访问和负载很小的服务也必须部署 至少两台服务器构成一个集群,目的就是通过冗余实现服务高可用。数据除了定期备份,存档保存,实现 冷备份 外;为了保证在线业务高可用,还需要对数据库进行主从分离,实时同步实现 热备份。
为了抵御地震、海啸等不可抗因素导致的网站完全瘫痪,某些大型网站会对整个数据中心进行备份,全球范围内部署 灾备数据中心。网站程序和数据实时同步到多个灾备数据中心。
1.8. 自动化
大型网站架构的自动化架构设计主要集中在发布运维方面:
发布过程自动化自动化代码管理自动化测试自动化安全监测自动化部署
运维自动化自动化监控自动化报警自动化失效转移自动化失效恢复自动化降级自动化分配资源
1.9. 安全
密码和手机校验码进行身份认证
登录、交易等重要操作需要对网络通信进行加密,存储的敏感数据如用户信息等也进行加密处理
防止机器人程序攻击网站,使用 验证码 进行识别
对常见用于 攻击 网站的 XSS 攻击、SQL 注入、进行编码转换等相应处理
对垃圾信息、敏感信息进行 过滤
对交易转账等重要操作根据交易模式和交易信息进行风险控制
2. 大型网站核心架构要素
架构的一种通俗说法是:最高层次的规划,难以改变的决定。
除了系统功能需求外,架构还需要关注以下架构要素:
2.1. 性能
性能问题无处不在,所以网站性能优化手段也十分繁多:
前端浏览器缓存静态资源压缩合理布局页面减少 cookie 传输CDN
应用服务器本地缓存分布式缓存异步消息队列集群代码层面:使用多线程、改善内存管理
数据库索引数据库缓存SQL 优化
2.2. 可用性
可用性指部分服务器出现故障时,还能否对用户提供服务
冗余通过负载均衡设备建立集群共同对外提供服务数据存储在多台服务器,互相备份
自动化:通过预发布验证、自动化测试、自动化发布、灰度发布等手段,减少将故障引入线上环境的可能
2.3. 伸缩性
衡量伸缩的标准就是是否可以用多台服务器构建集群,是否容易向集群中增删服务器节点。增删服务器节点后是否可以提供和之前无差别的服务。集群中可容纳的总服务器数是否有限制。
应用服务器集群 - 只要服务器上保存数据,则所有服务器都是对等的,通过负载均衡设备向集群中不断加入服务器即可
缓存服务器集群 - 加入新的服务器可能会导致缓存路由失效,进而导致集群中的大部分缓存数据都无法访问。虽然缓存数据可以通过数据库重新加载,但是如果应用严重依赖缓存,可能会导致网站崩溃。需要改进缓存路由算法保证缓存数据的可访问性。
关系型数据库集群 - 关系型数据库虽然支持数据复制,主从热备等机制,但是很难做到大规模集群的可伸缩性,因此关系型数据库的集群伸缩性方案必须在数据库之外实现,通过路由分区等手段将部署有多个数据库的服务器组成一个集群。
NSql 数据库集群 -为了应对海量数据而产生,对伸缩性的支持通常都非常好。
2.4. 扩展性
衡量扩展性的标准就是增加新的业务产品时,是否可以实现对现有产品透明无影响,不需要任何改动或很少改动,既有功能就可以上线新产品。主要手段有:事件驱动架构和分布式服务。
2.5. 安全性
安全性保护网站不受恶意攻击,保护网站重要数据不被窃取。
评论