标签:
大型网站我认为指的是高并发,海量数据,业务复杂的网站,搭建这类网站往往需要多种角度技术优化,本文所述的有些技术我并没有实战经验,在这里只是记录一下,以备后续学习
一、数据库相关问题
大型网站一般最容易产生的性能瓶颈就是数据库,因为关系型数据库所能承受的并发链接数是很有限的,可以从以下几点做出优化
1.数据库查询做好足够优化,大多数的网站往往读的次数要远远高于写的次数,尽快将数据取出来,关闭链接,释放资源当然是最简单,也是首要做的。
2.切库,切库能有效的避免高并发所带来的压力,也是较为简单的一种方式,切库又分为两种垂直切库和水平切库。
分库首先会带来两个问题
要尽量避免以上情况就要注意分库的时候拆表的粒度问题,把关联性高的表放在同一个数据库
水平分库更为复杂不光存在以上问题,而且还增加了其它需要解决的问题
1).水平分表时,我们可以根据数据的热度进行拆分,例如订单表我们可以将一个月之类的订单放在一张表里,其余的放在另一张表,这样就能大大提高我们的查询效率
2).水平拆表时我们需要注意被拆分的表主键不可重复,因为这本该是同一张表的,http://www.cnblogs.com/heyuquan/p/3261250.html
3).有时候我们需要从水平拆分的不同表中一起查询数据,这个难度实现起来就有点大了,我们应该尽量避免,实际上大多数情况下我们都无需将所有数据返回,我们应该从业务角度去避免这种情况的产生,很多时候我们都是没有完美的解决方案的,有得必有舍
就像第一点所说的拆分订单之后,我们可以提供两个标签页一个提供查询一个人之内的订单,另一个提供查询历史订单
能在业务角度解决的,尽量避免使用技术去解决,因为这往往会增加风险,所以在这之前应做好充分的评估
3.主从复制,读写分离
读写分离如果数据库的压力过大这时我们可以将数据库进行读写分离,写入单独用一个数据库,做为主库,读取用多个数据库,做为从数据库,做负载均衡,主数据库向从数据库同步数据,但是这会产生一定的延迟性,因为你无法保证读出的数据是不是最新的,所以这需要去评估一下这么做是否合适,http://www.cnblogs.com/netfocus/p/4055346.html 如果既要保证实时性,又要用读写分离,我们可以使用一个中间层,写入数据库的同时,将数据写入中间层,直到确认数据已经同步完成,就将数据从中间层删除,读取时这部分数据先从中间层读取,然后从数据库读取,重复的数据以中间层为准,因为中间层总是最新的,但是有一个问题是我们无法得知数据是否确定已经同步,这个就需要我们去创建一个监控程序用来将从数据库的数据与中间层对比,确认同步完成,这是我的个人想法,还没有实践过
4.队列和分组提交
5.缓存
当一组数据经常读取而更新次数不多,允许一定延迟时,我们可以将数据放入缓存中,缓存能够大大的降低数据库的负担,内存的读取速度是磁盘的数万倍,下面还会进行介绍
6.Nosql
现在Nosql的解决方案已经是数不胜数了,例如国内使用较多的Mongodb,http://www.cnblogs.com/huangxincheng/archive/2012/02/18/2356595.html,关系型数据库与Nosql数据库的搭配能有效的降低服务的延迟性
二、其它相关问题
1.分布式应用所面临的问题和解决方式
大型网站为了能够承受住大的访问并发量,web服务器肯定也会进行负载均衡,实现方式有很多种,例如Nginx反向代理,dns负载均衡,ip负载均衡,http://www.open-open.com/lib/view/open1416924842581.html
http://blog.sina.com.cn/s/blog_493a84550102vjlq.html http://www.cnblogs.com/edisonchou/p/4126742.html http://www.cnblogs.com/edisonchou/p/4281978.html
分布式系统至少会面临4个问题需要解决
1).如果网站中运用了线程锁,在分布式网站部署在不同地方,如果我们的业务逻辑是同一时间只能有一个线程处理,那么这时我们就需要使用分布式锁了,前面所提到的当大量的行锁、表锁、事务充斥着数据库的时候,数据库会造成很多压力,这里给大家介绍的是减轻数据库锁负担的一种方案,使用zookeeper分布式锁服务,http://www.cnblogs.com/shanyou/archive/2012/09/22/2697818.html,http://www.cnblogs.com/shanyou/p/3221990.html
2)网站一般都会有些配置信息,当网站部署于不同地方时,要维护就变得相对麻烦一下,zookeeper也提供了响应的配置管理,
3)网站一般都会有上传图片,海量的图片管理也是一个需要解决的问题,分布式文件系统有很多解决方案,这里介绍一种方式 FastDFS 链接地址 http://www.cnblogs.com/lori/p/3142598.html
当网站中有大量的任务堆积需要等待处理时,例如短信发送,邮件发送,数据库的操作延时任务,我们一般都是采用队列来处理,下面介绍几种队列组件
ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP,下载地址 http://activemq.apache.org/ C# client http://activemq.apache.org/nms/
Beanstalk 是一个简单、快速的消息队列。Beanstalkd之于RabbitMQ,就好比Nginx之于Apache,Varnish之于Squid。后面在项目中使用Beanstalkd的过程中,更发现其简单、轻量级、高性能、易使用等特点,以及优先级、多队列、持久化、分布式容错、超时控制等特性。Beanstalkd 包含多种编程语言的客户端开发包 C# client https://github.com/kr/beanstalkd/wiki/client-libraries
kafka是一种高吞吐量的分布式发布订阅消息系统 http://kafka.apache.org/documentation.html C# client https://github.com/Jroland/kafka-net
标签:
原文地址:http://www.cnblogs.com/yougs12/p/4620320.html