大型网站,比如入口网站,在面对大量使用者访问、高并发请求方面带来的问题
1.大并发:在同一个时间点,有大量的客户来访问我们的网站,如果访问量过大,就可能造成网站瘫痪。
2.大流量:当网站大后,有大量的图片,视讯, 这样就会对流量要求高,需要更多更大的带宽。
3.大储存:你的资料量会成海量的资料,如果我们的资料放入一张表,是无法应对的。可能对资料储存和查询出现问题。
基本的解决方案集中在这样几个环节:使用高效能的服务器、高效能的数据库、高效率的程式语言、还有高效能的Web容器,(对架构分层+负载均衡+丛集)这几个解决思路在一定程度上意味着更大的投入。
解决方案:
一、提高硬件能力、增加系统服务器。(当服务器增加到某个程度的时候系统所能提供的并发访问量几乎不变,所以不能根本解决问题)
二、使用快取(本地快取:本地可以使用JDK自带的 Map、Guava Cache.分散式快取:Redis、Memcache.本地快取不适用于提高系统并发量,一般是用处用在程式中。比如Spring是如何实现单例的呢?大家如果看过源代码的话,应该知道,Spiring把已经初始过的变数放在一个Map中,下次再要使用这个变数的时候,先判断Map中有没有,这也就是系统中常见的单例模式的实现。)
分散式快取利器Redis丛集,Redis丛集的搭建至少需要三主三从。
1. 所有的redis节点彼此互联(PING-PONG机制),内部使用二进位制协议优化传输速度和带宽。
2. 节点的fail是通过丛集中超过半数的节点检测失效时才生效(所以一个丛集中至少要有三个节点)。
3. 客户端与redis节点直连,不需要中间proxy层.客户端不需要连线丛集所有节点,连线丛集中任何一个可用节点即可。
4. 丛集中每一个节点都存放不同的内容,每一个节点都应有备份机。
5. redis-cluster把所有的物理节点对映到[0-16383]slot上,cluster 负责维护nodeslotvalue
Redis 丛集中内建了16384 个杂凑槽,当需要在Redis 丛集中放置一个key-value 时,redis先对 key 使用 crc16 算法算出一个结果,然后把结果对16384 求余数,这样每个key 都会对应一个编号在0-16383 之间的杂凑槽,redis会根据节点数量大致均等的将杂凑槽对映到不同的节点。
三 、讯息伫列 (解耦+削峰+异步)通过异步处理提高系统性能,降低系统耦合性
在不使用讯息伫列服务器的时候,使用者的请求资料直接写入数据库,在高并发的情况下数据库压力剧增,使得响应速度变慢。但是在使用讯息伫列之后,使用者的请求资料传送给讯息伫列之后立即 返回,再由讯息伫列的消费者程序从讯息伫列中获取资料,异步写入数据库。由于讯息伫列服务器处理速度快于数据库(讯息伫列也比数据库有更好的伸缩性),因此响应速度得到大幅改善。
通过使用讯息中介软件对Dubbo服务间的呼叫进行解耦, 讯息中介软件可利用高效可靠的讯息传递机制进行平台无关的资料交流,并基于资料通讯来进行分散式系统的整合。通过提供讯息传递和讯息排队模型,可以在分散式环境下扩充套件程序间的通讯。通过讯息中介软件,应用程序或元件之间可以进行可靠的异步通讯,从而降低系统之间的耦合度,提高系统的可扩充套件性和可用性。
四 、采用分散式开发 (不同的服务部署在不同的机器节点上,并且一个服务也可以部署在多台机器上,然后利用 Nginx 负载均衡访问。这样就解决了单点部署(All In)的缺点,大大提高的系统并发量)
五 、数据库分库(读写分离)、分表(水平分表、垂直分表)
PXC高可用丛集与Replication丛集结合方案
这种的丛集在遇到单表资料量超过2000万的时候,mysql效能会受损,所以一个丛集还不够,我们需要把资料分到另一个丛集,这个称为“切片”,就是把大量的资料拆分到不同的丛集中,每个丛集的资料都是不一样的,通过MyCat这个阿里巴巴的开源中介软件,可以把sql分到不同的丛集里面去。
PXC丛集方案与Replication区别
PXC丛集方案所有节点都是可读可写的,Replication从节点不能写入,因为主从同步是单向的,无法从slave节点向master点同步。
PXC同步机制是同步进行的,这也是它能保证资料强一致性的根本原因,Replication同步机制是异步进行的,它如果从节点停止同步,依然可以向主节点插入资料,正确返回,造成资料主从资料的不一致性。
PXC是用牺牲效能保证资料的一致性,Replication在效能上是高于PXC的。所以两者用途也不一致。PXC是用于重要资讯的储存,例如:订单、使用者资讯等。Replication用于一般资讯的储存,能够容忍资料丢失,例如:购物车,使用者行为日志等
六、 采用丛集 (多台机器提供相同的服务)系统架构方案
七、CDN 加速 (将一些静态资源比如图片、视讯等等快取到离使用者最近的网络节点)
八、浏览器快取 页面静态化(使用php自己的ob快取技术实现, 主流的mvc框架(tp,yii,laravel)模板引擎一般都自带页面静态化 )
九、使用合适的连线池(数据库连线池、执行绪池等等)
十、适当使用多执行绪进行开发。
十一、使用映象
映象是大型网站常采用的提高效能和资料安全性的方式,映象的技术可以解决不同网络接入商和地域带来的使用者访问速度差异,比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建映象站点,资料进行定时更新或者实时更新。有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路,比如Linux上的rsync等工具。
十二、图片服务器分离
大家知道,对于Web服务器来说,不管是Apache、IIS还是其他容器,图片是最消耗资源的,于是我们有必要将图片与页面进行分离,这是基本上大型网站都会采用的策略,他们都有独立的、甚至很多台的图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力,并且可以保证系统不会因为图片问题而崩溃。
在应用服务器和图片服务器上,可以进行不同的配置优化,比如apache在配置ContentType的时候可以尽量少支援、尽可能少的LoadModule,保证更高的系统消耗和执行效率。
吉海波