首页 > 经验 > 关键词 > 网站架构最新资讯 > 正文

高性能网站架构基础篇

2012-09-14 13:37 · 稿源:飞晏博客

针对大流量高并发,不管是高富帅还是屌丝,首先考虑的都是如何用最少的资源处理最多的业务。一般来说,网站架构最初需要考虑三个方面:数据库瓶颈、代码执行效率和服务器端的配置。如果说这三块,网上千篇一律的资料还是蛮多的,例如Apache和Nginx的争论就能连篇累牍,所以我还是结合项目开发中经验总结一下,内容空洞枯燥无味,非码农请慎重。

1. 合理设计使用数据库

很多关于数据库的疑问其实都可以归纳到这两点:如何设计高性能的数据库?如何使用好数据库才能让数据库按照我们的意愿去工作?

首先,设计数据库之初就应该预估可能产生的数据量和所能承受的压力,该分表的分表,该分区的分区,该建立索引的就建立针对类型的索引,该读写分离的就趁早的做好数据库主从或者数据库集群。虽然大多数互联网公司都有专业的DBA,但是需求第一线的码农必须具有设计优秀数据库的能力,否则在下一步中就不得不消耗较多的资源。

其次,合理使用数据库,基础的概念已经老生常谈的内容:尽量少用或者不用JOIN、IN和GROUP BY等查询和临时表、数据库端编程,配置my.cnf记录慢查询,增加查询内存等。关于JOIN查询,每次JOIN都是两个表数据量的乘积(笛卡尔积),所以尽可能的在程序中处理。关于数据库段编程,我以前倒是经常在SQL Server中写存储过程和触发器,不过在MySQL中除非迫不得已一般都不会使用这些自定义函数,因为数据库的压力已经很大了。不过类似淘宝那种特征量对特征值的设计有时候是不可避免的使用多个JOIN查询的,这个就需要专业的DBA去从底层优化了。

下面这个SQL语句是一个很典型的反面教程,8000条数据卡死了,要是有人当着我的面写这样的查询我就地干掉他:

SELECT COUNT(*) FROM `dbkxdhk`.`shop_goods` AS g ,(SELECT goods_id, attr_value AS cut FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=2) AS cut,(SELECT goods_id, attr_value AS color FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=3) AS color,(SELECT goods_id, attr_value AS symmetry FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=6) AS symmetry,(SELECT goods_id, attr_value AS clarity FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=4) AS clarity,(SELECT goods_id, attr_value AS polish FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=5) AS polish,(SELECT goods_id, attr_value AS cert FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=8) AS cert,(SELECT goods_id, attr_value AS carat FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=1) AS carat,(SELECT goods_id, attr_value AS location FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=62) AS location,(SELECT goods_id, attr_value AS certificate FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=8) AS certificate WHERE g.goods_id = cut.goods_id AND g.goods_id = color.goods_id AND g.goods_id = symmetry.goods_id AND g.goods_id = clarity.goods_id AND g.goods_id = polish.goods_id AND g.goods_id = cert.goods_id AND g.goods_id = carat.goods_id AND g.goods_id = location.goods_id AND g.goods_id = certificate.goods_id AND g.is_on_sale = 1 AND g.cat_id=1 AND g.is_alone_sale = 1 AND g.is_delete = 0 AND g.cat_id IN ('1','2','7','9','8')

最后,关于数据库缓存,现在一般都使用Memcache,PHP等语言也已经对Memcache提供了足够多的支持。此外也可以优化下数据库自身的缓存设置,例如增加查询内存等。而Key-Value的NoSQL的火爆能否完全解决关系型数据库的瓶颈这个我也没有实际的经验,我只能说在某些领域内或许NoSQL可以帮助我们更好的使用关系型数据库。

2. 代码效率 - 细节决定成败

一个最基础的例子,PHP中单引号和双引号的区别。我开始写PHP的时候基本上都用双引号,因为这样在字符串中我可以直接填入变量,例如:

$sql = "SELECT * FROM test WHERE id=$id";
$arr["key"] = $value;

不过,zend在编译PHP代码的时候,如果是双引号的字符串,会首先针对整个字符串进行一次扫描以判断这个字符串是否有需要被替换的变量存在,而单引号的字符串则不会存在这个问题,所以说单引号字符串的执行效率是要高于双引号字符串的。

$sql = 'SELECT * FROM test WHERE id='.$id;
$arr['key'] = $value;

不要觉的这样的写法吹毛求疵,如果一个系统庞大的一定地步,这样的效率损失的绝对要避免的。其他代码问题网上有很多建议。

3. 选择最合适的服务

关于Apache和Nginx的争论从来没有少过,就像不同开发语言之间的争论一样。infoQ上有一篇不错的文章:和LNMP相比,LNMPA是否效率更高?。同样,作为一个从Apache学起的码农,我是比较青睐Apache,在Ubuntu配置开发环境很方便,并且了解的Apache模块比较多,对Nginx了解的比较少。不过Nginx确实在处理静态文件上的效率要高出很多,所以目前大部分项目均采用Apache的前提下,已经开始实施把css、js、图片等静态文件部署到Nginx服务器上,无法实现静态话的程序比如一些API还是部署到Apache。在部署我自己开发的博客之前,我也曾经在服务器上编译了Nginx、MySQL和PHP-fpm,不过后来考虑到知之甚少,深入学习会影响到我最近的安排而作罢。

4. 使用缓存或者CDN减少HTTP请求

一个HTTP请求要经历连接、请求、应答和关闭4个主要过程,数据包经过多个层次的网络协议,所以减少HTTP请求是可以有效的降低服务器压力的。一般来说,网页中最消耗流量的图片甚至是js和css都可以尽可能的缓存到用户的浏览器,这样不仅仅是可以提高再次访问的速度。如果经济能力允许,最好的缓存到CDN。

5. 合并压缩静态文件

可以使用雅虎的Yslow去页面分析,將Css中用到的图片尽可能的合并为一张大图,同理,也不要使用过多的Css和Javascript文件,能合并的合并,能压缩的压缩。然后跳回上一步中执行缓存或者CDN即可。然后,页面内容可以采用Apache的gzip模块进行压缩,文字内容的压缩比例是非常高的。

6. 页面静态化

静态化与否和SEO没有关系,不管是动态还是静态的页面,爬虫抓取到的内容是一样的,不一样的只有抓取的速度问题。同样访问者也一样,静态页面可以在一定程度上提高加载速度,最重要的是可以强有力的缓解数据库的压力。以我这个博客为例,页面全部静态化,访问者唯一能够触发的就是页面访问次数的更改,其他时候只有在页面内容发生改变,比如新增加了评论或者新修改了文章内容后才会重新读取数据库生成页面。

理论上来说大部分网站都是可以静态化的,不过静态化存在服务器IO这个很严重的瓶颈,所以现在大互联网公司采用缓存的方式较多,缓存+squid或者varnish的方式除了数据库效率外和静态页面的加载速度确实基本上没差别的。当然还有很多应用是不能生成静态页面的,比如微博、SNS以及API等。

上面的是我浅显的总结了一些高流量高并发网站的基础工作,可能存在不少适用范围较小的地方。不足和缺点请不吝赐教。

文章来源:飞晏博客,转载请注明出处。

  • 相关推荐
  • 大家在看
  • 华为开源数据库能力 开放openGauss数据库源代码

    今日,华为正式宣布开源数据库能力,开放openGauss数据库源代码,并成立openGauss开源社区,社区官网(opengauss.org)同步上线。

  • 关于数据库的高可用高可靠,华为RDS有话说

    不知从何时起,“6·18”成为了“购物节”,这种全民狂欢式购物对电商行业是一个巨大挑战。 618 大促毫秒必争,短时间的高并发会给数据库带来巨大压力。面对暴涨的业务、暴增的订单,企业该如何确保数据库稳定性和可靠性呢?不要担心,华为云数据库的这份应对策略,时刻为您保驾护航。对于数据库来说,可用性和可靠性是永恒的话题。数据库管理员会按照业务的不同要求选择不同的策略保证系统正常运作,其中包含数据库本身内核提供的?

  • 蚂蚁集团自研数据库业务OceanBase独立 胡晓明任董事长

    今日,蚂蚁集团宣布将原有自研数据库产品OceanBase独立,成立由蚂蚁100%控股的数据库公司北京奥星贝斯科技,蚂蚁集团CEO胡晓明亲自担任董事长。

  • “投资数据库”百家号有什么作用?企业品牌必须知道的推广渠道

    备注:本文数据来自站长之家移动传媒平台,文章涉及的数据依托平台大数据计算所得,非百度官方数据,仅供参考。投资数据库是当前百家号中的普通号,目前账号百家号权重为2,综合排名位列779805名,财经分类排名位列18487名,领先了30.2%的百家号。 投资数据库百家号概况 投资数据库的简介为致力于最专业的投资数据服务,是一家主旨明确、领域专注的自媒体作者,截止目前为止他们已经在百家号上发布了超过23篇的游戏内容,最近该作?

  • 著名开源项目Apache Doris开发者徐冬奇加入微博广告技术团队

    著名开源项目、在线分析型分布式数据库Apache Doris的主要开发者,原百度凤巢广告系统高级架构师、阿里巴巴数据智能商业化技术负责人徐冬奇,已于近日入职微博广告技术团队,担任微博广告技术总架构师。据百度内部人士爆料,Doris最初是只为解决凤巢广告报表需求而设计的专用系统。2012年徐冬奇在前百度首席架构师James Peng(前Google 核心工程师,现自动驾驶独角兽小马智行CEO)指导下,作为Dor

  • 黑客勒索2.3万个MongoDB数据库 要求支付比特币赎金

    黑客已经在 22900 个MongoDB数据库上上传了勒索赎金记录,这些数据库在没有密码的情况下在线暴露,这个数字大约占所有MongoDB在线访问数据库的47%。

  • 数据库业务OceanBase升格为独立公司 蚂蚁集团CEO胡晓明任董事长

    【TechWeb】6月8日消息,蚂蚁集团今天 对外宣布,将自研数据库产品OceanBase独立进行公司化运作,成立由蚂蚁100%控股的数据库公司北京奥星贝斯科技,并由蚂蚁集团CEO胡晓明亲自担任董事长。据了解,新公司将在今年内发布重大版本升级,并计划在未来三年内服务全球超过万家企业客户。对OceanBase独立公司化运作一事,蚂蚁集团表示,“科技是蚂蚁集团的基因,也是蚂蚁集团重要战略方向。经过十年的发展,OceanBase支撑了支付宝、网?

  • 苹果iPhoneApp资源库怎么用 iOS14App资源库使用方法

    苹果在iOS14系统中加入了App资源库的功能,这个功能就是将相同类型的应用添加到同一个组合当中,便于用户快速找到对应的程序应用,这里我们来一起看下App资源库具体的使用方法。

  • 苹果App资源库怎么调整应用位置

    苹果App资源库里的应用程序要怎么调整应用APP的位置,需要进行怎样的操作才可以调整这些应用位置呢,以下我们来一起看下具体的位置调整方法。

  • 阿里云发布六大新品:第七代ECS、PolarDB-X数据库等重磅登场

    【TechWeb】6月9日消息,在2020阿里云峰会上,阿里云宣布推出第七代ECS、POLARDB-X数据库、视觉智能开放平台等重磅新品。此外,阿里云还发布了新一代数据中台、混合云管理平台、云原生数据仓库等产品及解决方案,目前这些产品均已在阿里云官网上线。第七代ECS高主频实例基于阿里云自研的神龙服务器架构,第七代阿里云ECS的算力比上一代提升了160%,最大支持192个vCPU,吞吐能力提升了一倍,并在存储转发能力、延时、稳定性上有了?

  • 苹果手机App资源库怎么排列

    苹果iPhone手机的App资源库是iOS14上新增的一项国内,这个功能是系统帮助用户自动排布已经安装在手机上的应用程序,但是用户自己可以排列应用程序吗,我们来一起看下。

  • 数据化运营,Smartbi助力商业银行打造“数据王国”

    在国内,银行的信息化一直是走在各个行业的前列,BI在银行也有着悠久和广泛的应用。BI可以辅助银行管理者和业务人员的经营决策,提高银行的科学管理水平,是银行信息化不可或缺的一部分,也是银行实现数字化转型的必要手段。银行的BI建设伴随着业务和技术的发展,是一个逐步摸索、不断成熟的过程。刚开始可能只建设某一个部门的一部分报表,在取得一定的成效后,再逐步推广到更多的部门,建设更多的主题,采用更多的可视化方式,支

  • 云测数据:场景化AI数据 破解智能家居“伪智能”

    据IDC的数据研究报告显示,近5年内智能家居市场将以14.9%的复合增长率增长。得益于物联网、人工智能、5G等新型技术的飞速发展,智能家居在短短数年间就已经相继渡过了“自动化”、单品智能化”、“物联网+家居场景”三个阶段,进入了当前的“人工智能+家居场景”的“智能”阶段,开启了智能家居对人的思维和意识的学习与探索。现阶段的智能家居融合了IoT、人工智能、边缘计算等信息技术,以前影视片段中一声令下就能控制所有家具电器、?

  • 数据中台变革在即 阿里云数据中台升级瞄准行业化

    6 月 9 日,在 2020 阿里云线上峰会上,阿里云发布了新一代数据中台,重点发布核心产品矩阵“2+2”升级,并同步推出了四大行业数据中台。据了解,这是阿里云数据中台首次对外宣布升级。记者尝试通过产品矩阵升级和行业数据中台发布来解读背后的信号。从大数据基础能力延伸到精细化业务赋能过去,阿里云数据中台主要围绕两款产品来为企业提供数据中台服务——Dataphin和Quick BI。Dataphin的能力重点主要是智能数据体系的构建及管理

  • Serverless架构的前世今生

    一、Serverless简介云计算的不断发展,涌现出很多改变传统IT架构和运维方式的新技术,而以虚拟机、容器、微服务为代表的技术更是在各个层面不断提升云服务的技术能力,它们将应用和环境中很多通用能力变成了一种服务。但无论这些技术应用在哪里,帮助企业“降本增效”是技术变革永恒的主题。Serverless架构的出现,带来了跨越式的变革。Serverless下主机管理、操作系统管理、基础软件的部署运维、资源分配和扩缩容能力全部由云厂?

  • 苹果发布App Store生态商业数据,完整数据报告汇总

    6月16日苹果公司发布了App Store生态商业数据,这份数据报告中苹果指出2019年App Store商店全球范围促成 5190 亿美元商业交易,淘宝、京东、苏宁易购等零售类 app 完成了 2680 亿美元销售。

  • AMD CTO Mark Papermaster畅谈高性能计算

    日前,Inside HPC对AMD 首席技术官兼执行副总裁Mark Papermaster 进行了专访。*在过去的 18 个月里,AMD在HPC领域东山再起。您认为高性能计算的趋势有哪些?我们正处于高性能计算的转折点上。传统高性能计算(HPC)工作负载如石油天然气勘探、天气预报、仿真、建模等,对计算和性能的需求持续快速增长。这些工作负载需要更多核心驱动、更高的存储和I/O带宽。HPC是AMD全面复兴其中的一个重要领域。AMD EPYC(霄龙) 服务器处理器提供了?

  • 华为开源数据虚拟化引擎openLooKeng:统一SQL接口

    华为在开源软件上又迈出了坚定一步,正式宣布开源数据虚拟化引擎openLooKeng,开源社区官网(https://openlookeng.io)同步上线。openLooKeng致力于为大数据用户提供极简的数据分析体验,让用户

  • 罗永浩评iOS 14 App资源库:基本没什么用 坚果OS比它强大十倍不止

    6月23日凌晨,苹果开发者大会在线上举行,iOS 14正式亮相。一位网友表示,看了看桌上的Smartisan T1,再看看iOS 14新功能,泪目了。对此锤子科技CEO罗永浩表示,iOS 14这个功能基本没什么用

  • 继续去美化 华为MatePad Pro平板美国元件仅占2% 核心已国产化

    前不见日本公司分析了华为Mate 30 5G手机的元件来源,指出美国公司的元件份额仅占1.5%,主要就是一些玻璃壳了。现在华为的MatePad Pro平板也在积极去美化,美国元件占比仅为2%,而国产元件占到了71%。

  • 参与评论
文明上网理性发言,请遵守新闻评论服务协议

热文

  • 3 天
  • 7天