分布式架构的演进过程

2020-01-16  本文已影响0人  剑道_7ffc

架构的本质

架构的本质

对系统进行有序化重构,使系统不断进化。

如何实现从无序到有序

主要手段是先分后合即先拆分后重新组合。
分:把这个系统拆分成子系统,模块,组件等,核心问题是组件的定位
合:根据需求,把分离的组件组装在一起。

架构的分类

业务架构:从概念层面帮助开发人员更好的理解系统如比如业务流程、业务模块、输入输出、业务域
应用架构:从逻辑层面帮助开发人员更好的开发如数据交互关系、应用形式、交互方式
技术架构:技术平台选型问题如操作系统、中间件、设备、多机房、水平扩展、高可
用等问题

大型网站的架构演进

最初的设计

image.png

数据库与应用分离

将数据库和应用分到两台服务器,主要解决单机负载告警


image.png
单机的性能瓶颈和消耗原因

CPU:上下文的切换指存储当前线程的执行状态并恢复要执行的线程状态(一个时间片的线程之间的切换)
文件IO:比如频繁的io的写入,磁盘本身的处理速度较慢、都会造成 IO 性能问题
网络 IO:带宽不够
内存:内存不足

应用服务器复杂告警

两种解决办法:
水平扩容:提高单机性能,如增加cpu和内存等
垂直扩容:增加机器,做集群


image.png
负载均衡

解决了服务路由选择的问题

负载均衡算法

1 轮询(Round Robin)法:按照顺序轮流分配后台服务器
2 随机法:根据随机函数来随机选择一台机器。
3 源地址哈希法:根据哈希算法,输入是客户端ip来选择后台服务器,因此若客户端ip相同,则会选择相同的服务器。
4 加权轮询(Weight Round Robin)法:按照顺序和权重分配,即给配置高,负载低的服务器更高的权重。
5 最小连接数法:动态分配给当前后台服务器的挤压连接数最少的机器

如何请求会话

解决办法:session+cookie机制来记住每次请求的会话


image.png
分布式下session共享

1 session同步


image.png

问题:网络带宽和服务器内存
2 利用成熟的技术做 session 复制
如利用redis来存储session


image.png
问题:session集群的挂掉
3 将 session 维护在客户端
image.png

问题:安全性

数据库压力变大,读写分离

解决办法:若读多写少,则读写分离


image.png
两个问题

数据如何同步:通过数据库自身的机制如 Mysql 支持 Master+slave 的结构提供数据复制机制
应用对数据源如何路由:应用需要根据不同的情况来选择对应的数据库

搜索引擎

搜索引擎实际上是一个读库,通过索引来查询,可以从两个角度来规划:一个是按照全量/增量划分。一种是按照实时/非实时划分(索引更新的时间)

加速数据读取的利器-缓存及分布式存储

1 分布式文件系统
存储文件,如图片,大文本等,比如淘宝的 TFS、google 的 GFS。还有开源的 HDFS
2 NoSQL
NoSQL 我们可以理解成 Not Only SQL,非关系型数据库
3 数据缓存
把热点数据放入缓存中


image.png

4 页面缓存
对访问量高或动态页面进行缓存
5 弥补关系型数据库的不足,引入分布式存储
比如 redis、mongoDB、cassandra、HBase


image.png

读写分离后,数据库又遇到瓶颈

通过对数据的垂直拆分和水平拆分来缓解数据库压力

专库专用,数据垂直拆分

垂着拆分:根据业务数据拆分成不同的数据库
需要通过分布式事务来单机跨业务的问题


image.png
垂直拆分

拆分原理:某张表的数据量达到单个数据库的瓶颈,解决办法:同一个表的数据拆分到两个数据库中
水平拆分的影响
1 sql路由:根据某个条件选择哪个数据库
2 主键id:使用全局主键id来替换自增主键
3 涉及到跨数据库查询比较难处理


image.png

数据库问题解决后,应用面对的挑战

如何不让应用变大

解决办法:就需要把应用拆开,从一个应用变为两个甚至是多个,若下图把拆分成两个系统


image.png
服务化

主要解决拆分后的系统和服务之间的相互调用
最上层是web系统,主要完成不同的业务功能;中间是服务中心,主要完成服务的提供;最下层是数据库


image.png

什么是分布式系统

分布式系统的定义

分布式架构指分布式系统是指位于网络计算机上的组件仅通过传递消息来通信和协调目标系统。
分布式系统是一种去中心化的思路,对于用户是无感知的。

为什么使用分布式系统

升级单机的性价比越来越低
单机处理存在瓶颈
对于稳定性和可用性的要求

上一篇下一篇

猜你喜欢

热点阅读