网站架构包括:前端架构+应用层架构+服务层架构+存储层架构+后台架构+数据中心机房架构+安全架构+数据采集与监控。
应用层是处理网站主要业务逻辑的地方。
提供基础服务,供应用层调用,完成网站业务。
分布式文件
网站在线业务需要存储的文件大部分都是图片、网页、视频等比较小的文件,但是这些文件的数量非常庞大,而且通常都在持续增加,需要伸缩性设计比较好的分布式文件系统。
关系数据库
大部分网站的主要业务是基于关系数据库开发的,但是关系数据库对集群伸缩性的支持比较差。通过在应用程序的数据访问层增加数据库访问路由功能,根据业务配置将数据库访问路由到不同的物理数据库上,可实现关系数据库的分布式访问
网站应用中,除了要处理用户的实时访问请求外,还有一些后台非实时数据分析要处理。
监控网站访问情况与系统运行情况,为网站运营决策和运维管理提供支持保障。
保护网站免遭攻击及敏感信息泄露。
山寨与创新的最大区别不在于是否抄袭、是否模仿,而在于对问题和需求是否真正理解与把握
在解决问题之前,能够认真思考自己面对的真正问题究竟是什么,有哪些技术方案可以选择,其基本原理是什么。
网站架构其实并不难,真正能解决问题的技术一定是简单的。
大型网站的特点:
高并发、大流量;高可用;海量数据;用户分布广泛且网络环境复杂;安全环境恶劣;需求快速变更,发布频繁;渐进式发展。
网站系统的演进:
但事物发展到一定阶段,就会拥有自身的发展冲动,摆脱其初衷,向着使自己更强
大的方向发展。既然大型网站架构解决了海量数据的管理和高并发事务的处理,那么就
可以把这些解决方案应用到网站自身以外的业务上去。我们看到目前许多大型网站都开
始建设云计算平台,将计算作为一种基础资源出售,中小网站不需要再关心技术架构问
题,只需要按需付费,就可以使网站随着业务的增长逐渐获得更大的存储空间和更多的
计算资源。
这个世界没有哪个网站从诞生起就是大型网站;也没有哪个网站第一次发布就拥有
庞大的用户,高并发的访问,海量的数据;大型网站都是从小型网站发展而来。网站的
价值在于它能为用户提供什么价值,在于网站能做什么,而不在于它是怎么做的,所以
在网站还很小的时候就去追求网站的架构是舍本逐末,得不偿失的。小型网站最需要做
的就是为用户提供好的服务来创造价值,得到用户的认可,活下去,野蛮生长。
技术是用来解决业务问题的,而业务的问题,也可以通过业务的手段去解决。
恩,不要妄图用技术解决所有问题。
从性能、可用性、伸缩性、扩展性、安全这五个要素。
所谓伸缩性是指通过不断向集群中加入服务器的手段来缓解不断上升的
用户并发访问压力和不断增长的数据存储需求。
衡量架构伸缩性的主要标准就是是否可以用多台服务器构建集群,是否容易向集群
中添加新的服务器。加入新的服务器后是否可以提供和原来的服务器无差别的服务。集
群中可容纳的总的服务器数量是否有限制。
关系数据库虽然支持数据复制,主从热备等机制,但是很难做到大规模集群的可伸
缩性,因此关系数据库的集群伸缩性方案必须在数据库之外实现,通过路由分区等手段
将部署有多个数据库的服务器组成一个集群
至于大部分NoSQL 数据库产品,由于其先天就是为海量数据而生,因此其对伸缩性
的支持通常都非常好,可以做到在较少运维参与的情况下实现集群规模的线性伸缩。
扩展性是指的功能扩展,伸缩是指性能伸缩。
System Load 即系统负载,指当前正在被CPU 执行和等待被CPU 执行的进程数目总和,是反映系统忙闲程度的重要指标。多核CPU 的情况下,完美情况是所有CPU 都在使用,没有进程在等待处理,所以Load 的理想值是CPU 的数目。当Load 值低于CPU 数目的时候,表示CPU 有空闲,资源存在浪费;当Load 值高于CPU 数目的时候,表示进程在排队等待CPU 调度,表示系统资源不足,影响应用程序的执行性能。
在Linux 系统中使用top 命令査看,该值是三个浮点数,表示最近1 分钟,10 分钟,15 分钟的运行队列平均进程数。
性能测试是一个总称,具体可细分为性能测试、负载测试、压力测试、稳定性测试。
排査一个网站的性能瓶颈和排査一个程序的性能瓶颈的手法基本相同:检査请求处
理的各个环节的日志,分析哪个环节响应时间不合理、超过预期;然后检査监控数据,
分析影响性能的主要因素是内存、磁盘、网络、还是cpuÿ 是代码问题还是架构设计不
合理,或者系统资源确实不足。
主要优化手段有优化浏览器访问、使用反向代理、CDN 等。
优化浏览器访问的措施:
5,减少cookie传输
B+树,关系型数据库多采用此数据结构。
NoSql产品多采用LSM树作为主要数据结构。
在LSM 树上进行一次数据更新不需要磁盘访问,在内存即可完成,速度远快于B+
树。当数据访问以写操作为主,而读操作则集中在最近写入的数据上时,使用LSM树可以极大程度地减少磁盘的访问次数,加快访问速度。
RAID,通过使用RAID 技术,实现数据在多块磁盘上的并发读写和数据备份。
RAID 技术在传统关系数据库及文件系统中应用比较广泛,但是在大型网站比
较喜欢使用的NoSQLÿ 以及分布式文件系统中,RAID 技术却遭到冷落。
4个9也就是一年中大约最多53 分钟不可用。
主要手段是数据和服务的冗余备份及失效转移。
分级管理,部署隔离。
超时设置。
异步调用。
服务降级。
幂等性设计。
CAP 原理认为,一个提供数据服务的存储系统无法同时满足数据一致性
(Consistency)、数据可用性(Availibility )、分区耐受性即可扩展性(Patition Toleranceÿ 系统具有跨网络分区的伸缩性)这三个条件。
通常我们必须去保证A可用性和P扩展性,某种程度上放弃C一致性。
数据最终一致性,这是数据一致性中较弱的一种,数据可能不一致,但经过一段时间的自我恢复和修正,数据达到最终一致。
数据备份,冷备和热备。热备又分同步热备和异步热备。
失效转移操作由三部分组成:失效确认、访问转移、数据恢复。
实现负载均衡的基础技术:
分布式缓存
一致性哈希
计算机领域有句话:计算机的任何问题都可以通过增加一个虚拟层来解决。
。那么在实践中,一台物理服务器虚拟为多少个虚拟服务器节点合适呢?太多会影响
性能,太少又会导致负载不均衡,一般说来,经验值是150,当然根据集群规模和负载均
衡的精度需求,这个值应该根据具体情况具体对待。
关系型数据库
使用开源中间件,如Cobar。原理是在数据库之上又加了一层。是一个分布式数据库的访问代理。
当前分布式数据库无法解决的问题是,无法跨库Join,更无法实现跨库事务。
所以需要从业务上避免分布式数据库的缺点:避免事务或者利用事务补偿机制代替数据库事务。分解数据访问逻辑避免Join操作。
还有一类分布式数据库可以支持JOIN 操作执行复杂
的SQL 査询,如GreenPlumÿ 但是这类数据库的访问延迟比较大(可以想象,JOIN 操作
需要在服务器间传输大量的数据), 因此一般使用在数据仓库等非实时业务中。
NoSql
NoSQL数据库产品都放弃了关系数据库的两大重要基础:以关系代数为基础的结构化査询语言
( SQL ) 和事务一致性保证(ACID )。而强化其他一些大型网站更关注的特性:高可用性
和可伸缩性。
设计网站可扩展架构的核心思想是模块化,并在此基础之上,降低模块间的耦合性,
提高模块的复用性。
XSS,跨站点脚本攻击。恶意脚本执行。
防御:消毒(特殊字符转义)
httponly,防止XSS 攻击者窃取Cookie。
注入攻击,消毒,预编译
CSRF,跨站点请求伪造。其核心是利用了浏览器Cookie 或服务器Session 策略,盗取用户身份。
防御:表单Token,验证码,referer check(请求来源检查)
ModSecurity
网站如果为秒杀时的最高并发访问量进行设计部署,就需要比正常运营多得多的服务器,而这些服务器在绝大部分时候都是用不着的,浪费惊人。所以网站的秒杀业务不能使用正常的网站业务流程,也不能和正常的网站交易业务共用服务器,必须设计部署专门的秒杀系统,进行专门应对。
原因:首页访问了数据库
- 首页访问频繁,不要直接访问数据库
- 首页最好应该做出静态的
缓存服务器宕机,数据库压力陡增引发宕机。
原因:应用程序Web 环境使用Apache+JBoss 的模式,用户请求通过Apache 转
发JBossÿ 在发布时,Apache 和JBoss 同时启动,由于JBoss 启动时需要加载很多应用并
初始化,花费时间较长,结果JBoss 还没有完全启动,Apache 就已经启动完毕开始接收
用户请求,大量请求阻塞在JBoss 进程中,最终导致JBoss 崩溃。除了这种Apache 和JBoss
启动不同步的情况,网站还有很多类似的场景,都需要后台服务准备好,前台应用才能
启动,否则就会导致故障。
有几个文件非常大,有数百兆,读写这些大文件一
次需要几十秒,这段时间,磁盘基本被这个文件操作独占,导致其他用户的文件操作缓慢。
架构师作为项目组最资深的专业技术人员,是项目组开发测试工程师的前辈。从架
构师的身上,工程师可以看到自己的未来,因此架构师在做人做事方面需要严格要求自
己,做好表率。
一定要坚信:一群优秀的人做一件他们热爱的事,一定能取得成功。不管过程多么
曲折,不管外人看来多么不可思议不靠谱。
领导的真谛:寻找一个值得共同奋斗的目标,营造一个让大家都能最大限度
发挥自我价值的工作氛围。
没有懒惰的员工,只有没被激发出来的激情。所有强迫员工加班的管理者都应该为
自己的无能而羞愧。
是事情成就了人,而不是人成就了事。指望优秀的人来帮自己成事,不如做成一件
事让自己和参与的人都变得优秀。
架构师要和项目组全体成员共同描绘一个蓝图,这个蓝图是整个团队能够认同的,
是团队共同奋斗的目标。
蓝图应该是表述清楚的:产品要做什么、不做什么、要达到什么业务目标,都需要
描述清楚。
蓝图应该是形象的:产品能为用户创造什么价值、能实现什么样的市场目标、产品
最终会长什么样,都需要形象地想象出来。
蓝图应该是简单的:不管内部还是外部沟通,都能一句话说明白:我们在做什么。
蓝图应该写在软件架构设计文档的扉页、写在邮件的签名档、写在内部即时通信群
的公告上。
在项目过程中,架构师要保持对目标蓝图的关注,对任何偏离蓝图的设计和决定保持警惕,错误的偏离要及时修正,必要的变更要经过大家讨论,并且需要重新获得大家
的认同。
架构师需要对系统架构负责,但并不是说一定要架构师自己完成架构设计,并要项
目团队严格遵守架构决策。
把架构和架构师凌驾于项目和项目组之上,只会让架构师变成孤家寡人,让架构曲
局和寡。
1. 不要只有架构师一个人拥有架构
2. 让其他人维护框架与架构文档
不要企图在项目中证明自己是正确的,一定要记住,你是来做软件的,不是来当老
大的。所以不要企图去证明自己了不起,永远也别干这种浪费时间、伤害感情的事
很多时候,对架构和技术方案的反对意见,其实意味着架构和技术方案被关注、被
试图理解和接受。架构师不应该对意见过于敏感,这时架构师应该做的是坦率地分享自
己的设计思路,让别人理解自己的想法并努力理解别人的想法,求同存异。
对于技术细节的争论应该立即验证而不是继续讨论,当讨论深入到技术细节的时候
也意味着问题已经收敛,对于整体架构设计,各方意见正趋于一致。
而当大家不再讨论架构的时候,表明架构已经融入到项目、系统和开发者中了,架
构师越早被项目组遗忘,越表示架构非常成功;项目组越离不开架构师,越表示架构还
有很多缺陷。
架构师作为团队的技术领导者,在项目过程中不要去试图控制什么,带着一个弹性
的计划和蓝图推进,团队会管好他们自己。你越是强加禁令,队伍就越是没有纪律;你
越是强制,团队就越是不能独立自主;你越是从外面寻找帮助,大家就越是没有信心。
其实即使是在一流的技术团队里,也一定有数不清的问题,只是人们习惯了这些问
题,以至于无视它们的存在。正所谓“鱼是最后一个看见水的”,天天面对这些问题,反
而不觉得有什么问题。
问题被发现,它只是问题发现者的问题,而不是问题拥有者的问题,如果想要解决一个问题,就必须提出这个问题,让问题的拥有者知道问题的存在。
找对关键人
在解决我的问题之前,先解决你的问题
先解决别人的问题有几个好处:
你帮别人解决了问题,礼尚往来,别人也会帮你解决问题。
在帮别人解决问题的过程中,熟悉了情况,后面解决自己的问题也就得
心应手了。
解决别人的问题时使用的是你的解决方案,这个方案在你的控制之中,
将来往这个方案里再塞一些东西解决自己的问题,手到擒来。
适当的逃避问题