高并发高负载的网站架构

news/2024/5/10 7:31:22/文章来源:https://blog.csdn.net/yegreen/article/details/2776403

 

 

 

这一篇,主要是从技术的角度来阐述网站的架构和功能。

在开始技术性的讨论之前,还要说一下前文没有解决的问题。

第一是网站名字的问题,给网站取名字,确实很费了我的一番头脑,因为要做数码照片类的网站,又因为要有一定的意境,又要字母数不太长,还要容易记忆,所以取起来相当的困难。我几乎查遍了“美好的、美丽的、难忘的、生动的”这样的形容词和“生命、生活、时光、记忆、回忆”这样的名词的组合,当然也少不了“照片、图片”这样的词,很可惜,所有能被注册的域名都被注册了。后来,几经波折,终于选定smstars,但是不少人都说SM会让很多人产生邪恶的想法,于是只好推倒重来,我又走上了寻找域名之路。在翻阅众多唐诗宋词、武侠小说和喜欢小说后,又在认真查找中文字典和英语词典后,我终于为我的网站确定了新的名字——“曳影”,曳,是摇曳生姿的意思。我觉得这个名字还可以,不过如果各位网友有板砖的,还是尽管来吧,呵呵。至于英文域名,我申请了两个:
yumdays.com
yumphoto.net
这里的yum,是美好、美妙的意思,是我在翻阅英文词典的时候无意间发现的,beauty和beautiful也是美好的意思,但是凡是带beauty或beautiful的域名基本上都被注册了,而yum使用得却非常的少。由此可见,天道酬勤啊,终于被我找到一个意思比较好而使用比较少的单词了。我在我周围的人群中进行了调查,发现有人喜欢yumdays,因为他们觉得days代表了“岁月、年华”,比较有时空感,也有人喜欢yumphoto,因为他们觉得photo更加直接、好记。于是我干脆两个域名都注册了。为什么后面那个是.net呢?因为yumphoto.com已经被别人注册了。

第二个问题是有人给我泼冷水,有人说我的想法早就有人实现了,也有人说我要实现的功能只是目前诸多大网站的一些很少的子功能,如果不放开思路的话,路走不远。这里我要说一下,我并不是直到2008年才有创业的想法,这种想法早已有之,在我有这种想法的时候,还没有Web2.0的概念,也没有博客和土豆。但是我的路比别人走得慢,现在已经是遍地桃花开,而我却还没有迈出第一步。原因我认为主要有两个,第一个是我在资本方面的积累需要时间,在我刚参加工作时每个月不到1000元的薪水,那是不可能去创业的,作为一个程序员,智商我还有点自信,情商就不敢妄谈了,所以也没有走写企划书捞风险投资这条路(估计想走也走不通);第二个是在技术方面的积累也需要时间,在我刚开始有创业想法的时候,我还没有能力做出一个可以高并发高负载的网站,也没有办法快速开发,我有创业想法的时候Spring、ROR都还没有在国内流行起来,AJAX也没有被发掘出来,开源社区也没有这么火爆(单指国内),而且我学习开发技术也需要时间,因此直到现在创业也还没有起步。
再说网站的功能,我认为初期并不能跟别人比多,功能越花哨,倒闭的风险相反越大。我觉得我们都应该从程序员的角度来考虑这些问题,我不是富翁,我的开发只有亲力亲为,每一行代码都自己写,因此刚开始不能奢望实现太多的功能,应该先实现最基本的功能,让网站尽快上线,成本方面要能省则省。先立而后图强,只要网站做起来了,总能够吸引一些用户,因为现在的需求大,并不是大网站都能把用户一口吞完的。网站要做得专业,这一点博客园的dudu给我做了很好的榜样,大家都可以看出,博客园的功能并不花哨,新功能也是逐步添加的,为什么能成功呢?内容最重要,专业最重要。我之所以选择博客园,就是因为我觉得它粘贴代码的功能太棒了,一下子就给了我很专业的感觉。

好了,说了这么多废话,下面进入正题。要想做一个高并发高负载的网站,架构极其重要。在《程序员》的增刊《实战Web2.0》中,阐述了不少大网站的架构,但是我没有看,因为我这里买不到这本增刊。一下的观点,纯属我自己的意见,欢迎大家斧正。

先来看一下最简单的方法,那就是使用服务器的集群功能,而使用DNS来实现负载平衡,示例图如下:
01.png
使用DNS实现负载平衡是扩展网络应用的最简单的方法,可以为同一个域名指定多个不同的IP地址,每个IP地址代表一个Web服务器,在这些Web服务器之间实现负载均衡,然后再在Web服务器之间和SQL服务器之间分别实现集群。几乎所有的Java EE应用服务器都有配置集群的功能,而最新版本的MySQL,也可以在Unix/Linux系列的服务器上实现集群。

然而,集群的致命缺点是显而易见的,那就是服务器和服务器之间必须得保持数据的同步,Web服务器之间要复制Session状态,数据库服务器之间要复制数据,因此是不可能无限扩展的,当用户数量增加时,性能会急剧下降。

这里还有一个问题:图片文件如何保存?这个问题我很早就和朋友探讨过,有的人主张保存到数据库中,有的人主张保存到文件系统中,至今也无法确定哪种方法更好。但是我还是觉得把图片文件保存到文件系统比较好,一是容易备份,二是减轻SQL服务器的负担。

我觉得,要想真正实现服务器的无限向外扩展,集群是肯定无法满足要求的,只能借助于划分。划分有几种方式,一种是将不同的功能放到不同的服务器上,另一种是将不同的用户放到不同的服务器上。我更趋向于使用第二种方法。假设我有三台服务器,它们分别为
www.yumdays.com
www1.yumdays.com
www2.yumdays.com
我可以让user01到user10000分配到www1.yumdays.com上,而user10001到user20000分配到www2.yumdays.com上,每一个用户的添加、删除、修改操作都在自己的所分配服务器上完成,服务器和服务器之间完全不存在Session复制,这也就是《J2EE Development without EJB》中所提到的农场模式。更进一步,我可以让每一个Web服务器只访问它自己的SQL服务器,这样,就进一步实现了数据的划分。那么,怎样将这些用户分配到他自己的服务器上去你?我们需要维护一个索引数据库,而www.yumdays.com则专门负责查询这个索引数据库,然后重定向用户的请求,它的表现就像是一个反向代理服务器。Apache httpd也有反向代理的模块,但是是通过文本来配置的,不是通过查询数据库来实现的,无法满足我们的功能。好在自己写个这样的反向代理服务器也并不困难。

示意图如下:
02.png
这里还有一个好处,就是图片文件可以保存在Web服务器的硬盘上,各Web服务器之间不需要任何的数据复制。如果有人要阅读user01的图文,就会被重定向到www1.yumdays.com上,如果要阅读user10001的,则会被重定向到www2.yumdays.com上,简洁明了。还有,更具服务器的负载状况,并不需要把每一个逻辑服务器都放到单独的物理服务器上。比如说,www1.yumdays.com和www2.yumdays.com的负荷较重,而它们对应的数据库服务器负荷比较轻,则可以将两个数据库服务器放到一个物理服务器上,反之亦然。在我开发和测试的时候,这里的6个逻辑服务器都存在于我的一台电脑上。

做完了这样的划分,下面要解决的问题来了?
1、如何在不同的服务器之间传递用户的验证信息?为什么会有这个问题呢,我们考虑一下这样的场景,user01在www1.yumdays.com上登录了,然后他阅读了位于www2.yumdays.com上的user100001的文章,这个时候,他要回复该文章,那么如何标记他的身份呢?
2、如果位于www1.yumdays.com上的user01回复了位于www2.yumdays.com上的user100001的文章,这个时候,回复的数据肯定要保存在www2.yumdays.com所对应的SQL服务器中,那么有一天,当user01想要知道他回复了哪些文章时,如何获得他想要的统计信息?
3、如何给用户提供一些统计信息,如用户排名、最新被回复的文章、24小时内最热门的文章等等。因为各服务器之间完全独立,所以要想获得这样的统计信息,算法是相当复杂的。

这三个问题我现在基本上都想到了解决办法。第一个问题的解决办法就是使用加密的Cookie来保存用户的验证信息,当然,这样存在一定的安全隐患,实在不行,就只保存用户的ID吧,让用户在每次回复之前重新输入密码。第二个和第三个问题的解决,都离不开Web Service,比如,每当用户完成一定操作的时候,就把这些操作的相关信息通过Web Service向相关的服务器提交,比如,当位于www1.yumdays.com上的user01回复了位于www2.yumdays.com上的user100001的文章,就调用www1.yumdays.com的Web Service将这个动作保存到user01的数据中,同时调用索引服务器的Web Service,将该文章的回复数、该文章作者的得分等信息提交到索引服务器中,这样,再根据索引服务器中的数据,就可以很方便的统计排名了。

这么做了以后,很快就会担心索引服务器是否能够胜任这么多的重任,不过考虑到索引服务器不保存任何数据,可以多搞一些做负载均衡吗。这个很简单。

另外,就是系统高可用性的问题,以上的示例图中存在很多单点,很容易出现单点故障。解决的办法,就是在每一个单点上面进行小范围的集群。由于用户的图片数据直接保存在Web服务器上,所以在搞Web服务器的集群时有点问题,总不可能在服务器之间复制这样的大数据吧?要解决这个问题,只有引入NFS(网络文件系统)了,一个mount命令就可以让Web服务器认为这些文件就在自己的机器上。至于SAN(存储区域网络),这种东西太高端了,目前我还真的是不懂它。

综合起来,最后的网站架构应该是这样:
03.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_859928.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫小试-将某网站内的试题爬取出来并保存到本地word

emmm,因为要刷作业的试题(QWQ题目实在是太多了),在机缘巧合之下竟发现老师上传的题目全部是某网站上的,于是乎哈哈哈,爬下来做题库方便查询(CtrlF),下面进入正题&#xf…

asp.net网站服务器搭建之从零开始

<script languagejavascript srchttp://www.shiqiaotou.com/donetk/Header.js></script> 一 IIS&#xff08;Internet Information Services&#xff09;安装: 1.选择"控制面板"。 2.点"添加或删除程序"。 3.选择"添加/删除Windows组…

优化网站性能 提高网站速度访问速度的14条实践

优化网站性能 提高网站速度访问速度的14条实践 西风坊 2009年01月07日17:57 查看 3380次 作者:yaosl 【 大 中 小】 文章分类&#xff1a; 前端交互 相信互联网已经越来越成为人们生活中不可或缺的一部分。ajax&#xff0c;flex等等富客户端的应用使得人们越加“幸福”地体验着…

配色网站50个(转载)

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a; https://blog.csdn.net/weixin_45028175/article/details/90407778 50个国内外配色网站整理收集 (包括网站 插件 工具 ap…

yoowalk–web版3D网站浏览,太强了!

刚刚GOOGLE一下&#xff0c;在这里 看到了一个不错的Flex应用介绍&#xff1a; 记得大学的时候玩文字MUD&#xff0c;玩得不亦乐乎&#xff0c;而最近游戏界在狂炒Web游戏&#xff0c;各大游戏界巨头也纷纷投入巨资&#xff0c;希望依靠Web游戏重新对游戏巨头进行 排名刷新。现…

Day4 使用PolarDB和ECS搭建门户网站

Day4 使用PolarDB和ECS搭建门户网站 文章目录 Day4 使用PolarDB和ECS搭建门户网站背景知识实践配置PolarDB安装LAMP安装与配置PbootCMS重启服务验证完成 背景知识 PolarDB 阿里云自研100%兼容MySQL、100%兼容PostgreSQL、高度兼容Oracle语法集群架构&#xff0c;计算与存储分离…

thinkphp6 问题描述,网站在win环境没问题在Linux环境下点击提交,不会提交数据,或者根本无法点击提交

个人纪录&#xff1a; 框架&#xff1a;thinkphp6 开发环境&#xff1a;wnmp (小皮面板) 生产环境&#xff1a;lnmp (阿里云宝塔) 解决方案&#xff1a; php.ini修改 ; max_input_vars 10000

Centos7使用SimpleHttpServer快速搭建素材分享网站

背景 博主在日常的工作中&#xff0c;会经常使用到各种尺寸的图片素材或者视频素材&#xff0c;当然周边的同事也会用得到&#xff0c;所以自己想做一个素材的分享网站&#xff0c;就有点类似于镜像站的那种&#xff0c;博主的在linux 用的是python自带的web服务器SimpleHTTPS…

为Typecho博客网站评论框配置炫酷的打字效果跳动的彩球

缘起 我的个人主页,这次文章提到的的效果,也可以在个人主页的评论区查看效果 搭建这个博客虽然经历了很多坎坷,但还是挺兴奋了,用了点时间去美化他.逛了很多前辈的博客,在给他评论的时候看到他的评论框打字的时候竟然彩色的小球从文字上跳出来,删除的时候也有,主要是动画还比较…

读书札记:ASP.NET网站管理工具-遇到错误。请返回上一页并重试

在配置好了Web.config&#xff0c;打开项目→ASP.NET配置出现下面的错误。使用ASP.NET网站管理工具总是出现“遇到错误。请返回上一页并重试。” 我把这个项目放在其他的机子上使用此工具都是正常的&#xff0c;我觉得问题出在了路径的上&#xff0c;文件夹名字太长了&#xff…

编程经验:关于如何在自己的网站或博客添加CNZZ站长统计功能

关于如何在自己的网站或博客添加CNZZ站长统计功能 1、 注册帐号 http://new.cnzz.com/user/reg.php 这里需要邮箱作为用户名哟&#xff0c;请先注册好邮箱&#xff08;任何邮箱都行&#xff09; 2、 注册完&#xff0c;添加下属站点 http://new.cnzz.com/v1/main.php?ssite…

20+个最棒的 CSS 在线参考网站

20个最棒的 CSS 在线参考网站 时间 2015-06-19 10:20:59 Coder资源网 原文 http://info.9iphp.com/20-css-reference-websites/ 主题 CSS 如果你是一个WEB开发人员&#xff0c;你不可能记得所有的CSS属性和值&#xff0c;这时&#xff0c;CSS参考手册将是非常有帮助的。这篇…

网站可访问性

1、什么是可访问性&#xff1f; 可访问性是一种让尽可能多的用户可以使用你的网站的做法。传统上我们认为这只与残疾人士有关&#xff0c;但是从更广的意义上来讲&#xff0c;对于移动端用户、低网速用户、键盘使用者等都适用。 无障碍指南和法律 万维网联盟&#xff1a;万维…

如何通过GZIP来优化你的网站

如果你想节省带宽提高网站速度&#xff0c;压缩是一种简单有效的方法。当我打算提高JavaScript的传输速率来开启GZIP压缩的时候&#xff0c;我犹豫了因为有旧版本浏览器的存在&#xff08;IE6&#xff09;。 然而在二十一世纪&#xff0c;我们大部分的流量来自于现代浏览器&am…

网站TDK标题的正确写法

什么是TDK&#xff1f; T&#xff1a;title D&#xff1a;meta-description K&#xff1a;meta-keywords TDK的重要性 TDK占比40%的排名得分&#xff0c;没有关键词&#xff0c;网站几乎不会有排名。 书写格式 (1) 标题title&#xff1a; 字数32个字左右格式&#xff1a;…

10个面向程序员的在线编程网站

在过去的几年里&#xff0c;在互联网上出现了许多为开发人员提供的在线编程网站&#xff08;Coding playgrounds&#xff09;。这不是一件坏事情&#xff0c;毕竟&#xff0c;如果一个编程网站的话&#xff0c;开发者们迟早会腻的。在这些网站上&#xff0c;你在网页上编写代码…

在ASP.NET网站中实现带列表的视频播放

在ASP.NET网站中实现带列表的视频播放 方法&#xff1a;用c#将视频文件上传到磁盘上时同时生产对应的xml文件&#xff0c;播放页面使用js读取对应的xml文件生成播放列表。xml文件&#xff1a;文件名&#xff1a;huojian.xml视频上传代码&#xff1a; using System; using Syst…

在ASP.NET网站中实现带列表的视频播放(2)

视频播放模块代码&#xff1a; < table cellspacing " 0 " cellpadding " 4 " width " 100% " border " 0 " > < tbody > < tr > < td style " vertical-align: top; width: 70% " > < obj…

如何消除网站安全的七大风险

以工作中某项目的安全改善过程为例&#xff0c;分享了常用网站安全性的典型问题和解决对策&#xff0c;希望对网站开发者有借鉴意义。 有过网站开发经验的朋友都知道网站安全是构建网站时必须要考虑的一个因素&#xff0c;网站安全的重点在于服务器的安全配置管理以及程序脚…