分布式架构实现概述(大型网站技术架构-读后感)
主要包含4个篇章,第一篇介绍了网站的演化历程,大型网站架构的架构模式,开发大型网站应该具备的核心要素;第二篇主要围绕大型网站的具体架构实现方式进行讲解;第三篇对知名互联网公司的架构演变历程进行举例,让我看到了业务是技术的最强驱动力;第四篇说了什么是架构师,什么是好的架构师,架构师的职场攻略。
主要收获
服务器硬件选型
- 数据库服务器
需要快速的磁盘检索和数据缓存,因此需要更快的硬盘,更大的内存 - 文件服务器
需要存储大量用户的文件,不需要进行计算,缓存,因此可以减低对cpu和内存的需求,需要达到硬盘空间 - 应用服务器
需要处理大量的业务逻辑,运行应用容器同时需要内存支持,所有对cpu和内存的需求相对较大。 - 缓存服务器
将数据存储于内存的nosql数据库,不言而喻,主要是对内存的需求。
大型网站架构模式
- 分层,通过mvn三层架构的划分,对实现进行分层,实现层与层直接的解耦,同时后期还可以对层直接进行分割,来划分更小粒度的微服务模块。
- 分割,对应用根据进行垂直或水平拆分,拆解为微服务模块。水平拆分为对三层架构进行拆分,垂直拆分是对业务逻辑的拆分,例如:一个简单的个人博客系统,拆分为文章模块、评论模块,每个模块配置单独的数据库。
- 分布式,通过上面的分割,就把一个应用变成了多个微服务的分布式架构
- 集群,当一个微服务不足以支撑对用户请求的处理时,可以把这个微服务的代码部署在多个服务器上,达到集群的目的,注意,集群部署的微服务本身最好是无状态的,这样可以直接部署安装包,不用再考虑微服务本身维护的状态问题。
- 缓存,用户的请求不应该直接到达数据库,应该把热点数据放入分布式缓存系统,如redis,仅在缓存中不存在时,才直连数据库获取数据。
- 异步,通过消息队列实现异步处理,把那些与直接返回无关的数据,放入消息队列中,由消费者处理,达到快速响应目的。通过异步的订阅-发布模型,可以对模块进行解耦,利于扩展。消息队列同时还可以达到削峰的目的。
- 冗余,为了网站的高可用,对于应用、数据存储、缓存、消息队列都应该部署多份(集群),从而在主节点不可用的情况下,由备用节点提供服务。对于数据存储部分,应该有冷热双备,冷备份定期执行备份任务,冷备份的数据库最后可能会丢失一个备份周期的数据,所以还需要热备份,例如mysql的主从同步,主节点的每一次更新操作都会同步到从节点,由此实现了热备份。
- 自动化,通过自动化,减少人为干预,提高开发、运维、测试的工作效率与质量(具体的实现方式学习中,待了解清楚后,补充下方内容)。
• 自动化代码管理
简介:开发工程师提交自己参与开发的产品代号,系统自动创建分支,最后进行代码合并。
• 自动化测试
简介:开发完成,提交测试后,系统自动将代码部署到测试环境,启动自动化测试用例进行测试,向相 关人员发送测试报告,向系统反馈测试结果。
• 自动化安全检测
安全检测工具对代码进行静态安全扫描及部署到安全测试环境进行安全测试攻击,评估其安全性。
• 自动化部署
上面步骤都通过后,自动将代码部署到生产环境。 - 安全,密码加密,防范XSS/CSRF、sql注入攻击。
a. XSS, 用户提交内容包含恶意js脚本攻击,可以使用spring的HtmlUtils对用户提交内容进行转换。
b. CSRF,在同一浏览器,通过访问攻击网站的链接,可以利用浏览器存储的cookie,session等策略,实现恶意攻击,可以通过在请求连接中带上token等参数、验证码、请求头的referer check进行防范。
c. sql注入,在请求过程中加入恶意sql代码,达到避过sql执行条件的目的,这个可以通过参数绑定的方式避免,mybatis的#取值支持这种操作。
网站的伸缩性
应用服务器的伸缩性
前提:应用服务器最好是无状态的,这样直接进行扩展部署,不用考虑其他问题
应用服务器的伸缩性的核心就是集群部署,通过负载均衡选择出真正为用户提供服务的应用。
负载均衡策略:
- HTTP重定向负载均衡,请求首先到达重定向服务器,重定向服务器返回302重定向消息及真正提供服务的服务器地址,这种策略不用考虑,过时了。
- DNS域名负载,通过对同一个域名解析多个ip,把负载的任务交给DNS服务器,同时DNS服务器还支持基于地理位置的解析,返回距离用户地理位置最近的解析,不过DNS负载的缺点是域名绑定的IP更换了,不能马上响应过来,需要很长的时间才能真正替换完成。所有一般交给DNS解析的会是一个虚拟IP,虚拟IP后面是一个服务器集群。
- 反向代理负载均衡,也就是七层负载均衡(nginx),用户请求到达负载均衡服务器,服务器根据配置的负载均衡算法,将请求转发给真正处理用户请求的应用服务器,然后应用服务器把结果返回给用户。
- IP负载均衡,相当与一个网关,这里存储了用来提供服务的ip列表,用户请求到到网关,网关根据负载均衡算法从列表获取应用服务器地址,请求发送给真实服务器,服务器请求完成后,响应数据包返回给网关,网关发送给用户。
- 数据链路层负载均衡,给集群中的所有机器配置虚拟IP,和负载均衡服务器一致,达到不需要修改数据包地址就可以进行数据分发的目的。最典型的开源产品是linux的 LVS
存储服务器的伸缩性
数据存储的伸缩性不在于负载均衡,例如数据库分库,数据会分散存储在多个数据库中,这时,仅仅通过扩展机器是不行的,还需要对存储的数据进行迁移。同时,数据的访问也不是通过复制均衡的策略。通常我们所用的策略是取模运行,例如对3取模,会用三个数据库可能命中。这是时候如果加了一台机器,我们就需要对4进行取模,这时候会导致75%的缓存失效。故而,我们就引入了一致性hash算法。这里仅仅提一下,展开讲内容过多,通过一致性hash算法,我们可以保证,增加一个节点,仅25%的数据需要迁移。
读后感
成为一个优秀的架构师,是我前进的方向,现在,技术储备距离一个架构师的水平还远远不足,不要自满,不要懈怠,坚持学习的方向,补充自己的底层知识,满足自己的技术求知欲。