【系统架构】如何逐步去构建一个大型网站系统
相关阅读:
阿里P7/P8学习路线图——技术封神之路
MySQL大表优化方案,单表优化、读写分离、缓存、分区表……都在这里了
互联网技术(java框架、分布式、集群)干货视频大全,不看后悔!(免费下载)
作者:陈澲
链接:www.cnblogs.com/Java3272858604/p/8907801.html
往往程序员在面试的时候,很多时候面试官会考察你对一个大型网站系统的设计思路。
首先我们要思考一个问题,什么样的网站才是大型网站,从网站的技术指标角度考虑这个问题人们很容易犯一个毛病就是认为网站的访问量是衡量的指标,懂点行的人也许会认为是网站在单位时间里的并发量的大小来作为指标,如果按这些标准那么像hao123这样的网站就是大型网站了。
其实这种网站访问量非常大,并发数也非常高,但是它却能用最为简单的Web技术来实现:我们只要保持网站的充分的静态化,多部署几台服务器,那么就算地球上所有人都用它,网站也能正常运行。
大型网站是技术和业务的结合,一个满足某些用户需求的网站只要技术和业务二者有一方难度很大,必然会让企业投入更多的、更优秀的人力成本实现它,那么这样的网站就是所谓的大型网站了。
互联网时代,怎么构建一个大型网站是不可缺少的技能。当然,本人目前接触的网站都是读远远大于写。本文将一步步讲诉,怎么去使用lamp构建完善一个大型网站(读大于写)。
网站架构,我个人认为最为重要的是两方面的考虑:计算和存储。有些是属于计算密集型,有些是IO密集型。所以以下都将围绕计算和存储来讲述问题。
最简单的搭建
假设我们自己创业了,那么我们可能需要自己去搭建一个网站。
这个时候,我们需要去租借一个主机(比如阿里云的虚拟主机等)。对于网站来说,数据是最为重要的,所以需要有一个备份。但是每天pv肯定不高,所以理论上只需要一个计算机器即可。因此,我们只需要3台机器就能完整一个完整的架构。
从上图可以看到计算机器上主要部署2部分内容,一部分是webserver(轻量级可以考虑niginx,lighttpd等),一个是UI逻辑处理部分,lamp架构则使用php语言来搞定这个问题。因为数据是最重要的,所以database则明显需要2台机器,一台主机,一台做冗余备份。lamp使用mysql来存储数据。
增加数据缓存
随着我们网站知名度变高,每天pv越来越大,导致的问题是数据库压力越来越大。很明显,绝大部分网站,读流量都远远高于写流量。即使我们开了mysql的query cache,它也只能在一定程度上通过减少DB机器I的操作来减少DB服务器压力。更为靠谱的是,减少对DB服务器的请求。那么这个时候就需要使用cache.
cache为非关系型kv存储,在使用过程中一般为内存操作。下面的架构改进如下。
可以看出ui写数据仍然直接写入到数据库,但是读则先从cache读取,cache读取不到再从database读取。因为很有可能大部分数据都直接访问cache就可以搞定,这样就可以大大减少数据库的压力。
增加计算机集群(计算方向)
随着整个系统pv继续上涨。单台的计算机器已经无法满足要求。这个时候就需要使用增加计算机器来解决问题。为了方便起见,可以把这个机器放入一个集群进行统一管理。
这个时候,我们可能需要考虑2个问题:负载均衡、数据同步。负载均衡系统相对难度较大,但是是必不可少的,最简单的可以通过zookkeeper等对配置文件进行统一管理。对于节点下的若干机器,可以简单通过概率来进行请求分发。数据同步也是一个难点,比如session同步、文件操作等。
需要说明的是,好的架构结果如下:N台机器能撑住的PV为X,那么T*N台机器基本能撑住T*X pv。换句话说,架构必须能支持横向扩展。如果机器加了一倍,但是撑住的峰值pv不能增加(接近)一倍,那个这个架构就是失败的架构,不是可扩展性的架构。
可以看出的是在负载均衡系统下可以挂很多机器。好的扩展是,加入多少倍机器,计算能力就相应提高多少倍(暂时不考虑存储的瓶颈)。
搭建简单的数据库集群(存储方向)
流量上升,计算能力提升的同时,也需要提升数据库的能力。这时候,我们可以采用读写分离。也就有了主从之说。主库可以写,当然也肯定能提供写,从库只能提供读,我们目前主从延时在20ms以内。目前这种工具不少,比如mysql proxy等。(下图应该是ui logic访问dbproxy,图有稍许错误,但是不影响理解)。
如上图,dbproxy作用主要有3个:
读写分离:读主要读从库,写只能是写主库。我们在实际设计的时候需要考虑主从延时,比如事务读必须读主库,写完若干秒内最好读主库等等。
负载均衡:他能自动根据dbproxy下面挂在的db进行负载均衡。
维持sql连接池:dbproxy维持sql连接池,里面存在和db的长连接。请求过来之后,直接从连接池取连接即可。
静态页面跨地域缓存
很明显,我们网站有很多静态页面,若干天才会更换一次。但是因为跨地域、跨机房的问题,外地用户可能访问较慢,所以我们可以通过cdn等技术缓存静态页面。这样就可以减少对服务器的请求,同时加快外地、不同机房用户的访问时间。
如上图所示,加入了静态页面缓存
跨地域跨机房设计
当我们业务进一步扩大,我们可能需要跨地域进行机器部署,目前我们主要分为华北(北京)和华东机房(杭州、南京)。跨地域部署,可以加快因为区域带来的访问过慢问题。比如广州访问北京机房数据,就不如北京访问北京机房速度快。这个时候,还是主要分为计算和存储两方面进行讲述。
1:计算方向
除了该机房的标示以外,各个机房的机器部署应该完全一致。
2: 存储方向
在我看来,对于读远远大于写的系统而言,最好只有一个主库,若干个从库。所以只需要在其他机房搭建从库,让从库从主库进行数据同步即可。当然,这样的代价是主从时间比比较长。在数据链路不稳定的情况下,主从同步可能在400ms以上,所以设计需要考虑这个。
当然cache等等也需要跨地域跨机房部署。
如图简要勾勒出了跨地域跨机房的一个部署方案。
通用服务的使用
随着业务拓宽,我们可能会有一些需要考虑新能的模块或者业务。
如搜索业务,我们不可能直接通过数据库的select like来实现,就需要使用C等编译型语言来搭建其他系统。所以需要我们根据业务进行架构调整来通过http等使用一些通用的高性能计算方向的服务。
同样,出于业务发展等因素的考虑,我们需要使用内存型的数据库,比如redis等,这些属于存储方向的通用服务。
这些服务,有的可以跨机房部署,各个机房无耦合,有的则相互之间有耦合,比如类似于数据库的主库从库。
其它考虑
除此以外,我们还需要有其他因素进行考虑
网站数据:这个主要是比如uv/pv。这个有几种做法,第一种是借助第三方的统计攻击,比如百度统计、Google统计等。第二种是对我们现有系统的日志进行统计,同时可以进行深一步的数据挖掘。
安全性:这个需要考虑网站是不是存在sql注入,xss漏洞,csrf漏洞等。这个方面对于网站是非常关键的。一旦有黑客攻入,后果不堪设想。对于管理员后台,最好不要开通外网权限,只能通过内网访问。
seo:搜索引擎优化对于网站作用不言而喻。 后续可能会专门针对百度SEO进行一些分析。
看完本文有收获?请转发分享给更多人
欢迎关注“互联网架构师”,这里是聚集了10W+技术的架构师圈子,我们分享最有价值的互联网技术干货文章,助力您成为有思想的全栈架构师,我们聊互联网、聊架构,聊人生,聊职场,助你最快进阶!打造最有价值的架构师圈子和社区。
本公众号覆盖中国主要首席架构师、高级架构师、CTO、技术总监、技术负责人等人 群。分享最有价值的架构思想和内容。打造中国互联网圈最有价值的架构师圈子。
长按下方的二维码可以快速关注我们
如想加群讨论学习,请点击右下角的“加群学习”菜单入群
【系统架构】如何逐步去构建一个大型网站系统相关推荐
- 程序员,如何逐步去构建一个大型网站系统,面试必问!!!
往往程序员在面试的时候,公司的面试任职资格上,总有一个大型系统网站的开发经验,我们先来看看几张面试招聘信息截图....... 大型网站定义 首先我们要思考一个问题,什么样的网站才是大型网站,从网站的技 ...
- 大型网站系统架构实践(四)http层负载均衡之haproxy实践篇(一)
方案 上篇文章讲到了负载均衡的相关理论知识,这篇文章我打算讲讲实践方法以及实践中遇到的问题 方案:haproxy http层负载均衡 安装一个haproxy服务,两个web服务 haproxy:192 ...
- 【面试精选】关于大型网站系统架构你不得不懂的10个问题
该文已加入笔主的开源项目--JavaGuide(一份涵盖大部分Java程序员所需要掌握的核心知识的文档类项目),地址:github.com/Snailclimb/- .觉得不错的话,记得点个Star. ...
- 亿级流量网站架构核心技术_关于大型网站系统架构你不得不懂的10个问题
来自:JavaGuide(微信号:JavaGuide) 下面这些问题都是一线大厂的真实面试问题,不论是对你面试还是说拓宽知识面应该都很有帮助.之前发过一篇8 张图读懂大型网站技术架构 可以作为不太了解 ...
- 大型网站系统与Java中间件实践pdf
下载地址:网盘下载 基本介绍 编辑 内容简介 到底是本什么书,拥有这样一份作序推荐人列表:阿里集团章文嵩博士|新浪TimYang|去哪网吴永强|丁香园冯大辉|蘑菇街岳旭强|途牛汤峥嵘|豆瓣洪强宁|某电 ...
- 大型网站系统与Java中间件实践
大型网站系统与Java中间件实践(贯通分布式高并发高数据高访问量网站架构与实现之权威著作,九大一线互联网公司CTO联合推荐) 曾宪杰 著 ISBN 978-7-121-22761-5 2014年4 ...
- 大型网站系统与Java中间件实践 第二章大型网站及其架构演进过程
2.1什么是大型网站 通过第 1 章我们了解了分布式系统的相关基础知识, 大型网站是一种很常见的分布式系统,而本书重点要介绍的中间件系统也是在大型网站的架构变化中出现并发展的,那么我们很有必要从大型网 ...
- 系统架构专题(1):大型互联网系统架构演变
1.构设计话题 **须知:**在实际的工作中,不管任何一个公司均不会一开始就可以设计出合理的架构方案,而是在满足业务需求的情况下不断带带诱惑出来的这是一个持续的过 程.当然如果一开始有一个好基础系统设 ...
- 高并发高负载的大型网站系统架构
2019独角兽企业重金招聘Python工程师标准>>> 一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下 ...
- 大型网站系统的特点和架构设计
分布式架构 阿里P8架构师谈:淘宝技术架构从1.0到4.0的架构变迁 优知学院」淘宝技术架构的前世今生(上) 优知学院」淘宝架构的前世今生(下) 揭秘:一位亲历者眼中的淘宝技术架构发展之路 淘宝发展历 ...
最新文章
- 项目/程序的流程走向
- Leetcode 117. 填充每个节点的下一个右侧节点指针 II 解题思路及C++实现
- JVM源码阅读-本地库加载流程和原理
- Visual Studio图形调试器详细使用教程(基于DirectX11)
- 回调函数自定义传参_10分钟教你手写8个常用的自定义hooks
- python 字符串 变量_检查变量是否为字符串的Python程序
- pythonpptx 楷体_python-pptx 实践 4:添加形状、文本
- 地震了?不,是心动了!
- java downloadfile_FileDownload.java:文件下载工具类
- JS中URL编码方法的比较
- android listview 不重绘,重绘listview
- android 地图定位报错,百度地图定位迷之报错(latitude : 4.9E-324 lontitude : 4.9E-324)
- uniapp开发原生android插件,uni-app原生插件(native plugin)开发指南
- 2020年最新UI设计基础入门教程
- C语言中各种格式字符说明
- 小程序如何隐藏滚动条
- linux ptp时钟同步
- Typora结合Git打造完美的个人云笔记本
- css文字怎么显示在一起,css如何让文字成排显示
- 织梦网站如何设置404错误页面?