1.web前端优化
减少http次数,比如合并css javascript文件
使用浏览器缓存,静态文件设置http头Cache-Control和Expires属性。
更新静态文件时,避免一次更新多个文件,应该一个文件一个文件间隔更新,避免用户浏览器的缓存大量失效,集中更新静态文件,造成服务器压力陡增
启用压缩,文本压缩率比较高,压缩省带宽耗CPU,选择平衡点
css先加载,js垫底。
让css文件尽早下载完开始渲染页面,避免js动作阻塞页面。
HTTP2可以使用Server Push 特性,尽早推送静态资源
减少cookie传输,比如静态资源使用独立域名,避免获取静态资源传输无用的cookie
CDN加速,花点钱,性价比高
反向代理:比如nginx,很多选择
2.应用服务器优化
分布式缓存:
不可过度依赖缓存,缓存总归是不可靠的。
读写比小于2:1,缓存无意义。
上线时注意缓存预热,必要时专门准备预热脚本。
避免缓存穿透:如果因为不恰当的业务或者恶意攻击,持续高并发访问某个不存在的数据,由于缓存中没有该数据,导致压力落到数据库,简单对策,将不存在的数据也缓存起来,只是value为null
分布式缓存架构简述
Jboss Cache为代表的需要同步更新的分布式缓存,每台缓存机器数据相同,缺点是缓存的体量小,受限于单机容量。
常用于企业系统,大型网站少用。
Memcached为代表的集中式缓存集群,使用一致性hash存取数据,每台机器存储一部分数据,合起来才是缓存总量
Memcache采用固定空间分配,将内存分为一组slab,每个slab里又分为一组chunk。
不同slab的chunk大小不同,每个slab内不chunk相同,然后根据数据的size大小,选择最小的适合的slab存储,实现按需存储。
所以,数据大小应该均匀分布,否则大量数据集中在个别slab,导致其他slab浪费。
3.存储性能优化
传统关系型数据库多使用两级索引的B树,NoSQL多使用LSM。
LSM写数据都会创建一个新记录(修改记录新数据,删除打上删除标记),这些数据在内存中仍然是一个排序树,当数据量超过预定的阀,将内存的数据与磁盘数据合并。
查找先内存后磁盘。
4. 应用服务器设计要点
服务无状态:应用服务器不保存任何状态,从而每台服务器绝对对等,请求给谁都能得到相同的处理结果,负载均衡器才能故障转移,不影响业务逻辑
集群环境下session管理:
session绑定。
利用负载均衡器的源地址hash算法,总是将同一个IP的请求分发给同一个应用服务器(也可以根据cookie,同一个用户的请求分发给同一个应用服务器,这个时候负载均衡器必须工作在HTTP协议层)。
适合小规模,存在单点故障,某台应用服务器故障,它负责的一部分用户无法完成业务。
利用cookie记录session,每次请求将session信息发送给服务器,服务器修改后返回session信息。
缺点是:浪费带宽,有损性能;重度依赖cookie,如果客户端关闭cookie,方案失败
推荐:独立部署session服务器集群,这种方案本质上是将有状态和无状态的应用服务器分离。
session服务器利用分布式缓存等技术包装一下,存储session信息。
更高级的,利用session服务器做SSO
异步队列对于削峰效果显著,但是受限于业务逻辑,不是所有业务都适合异步处理
设计降级机制:高峰期,关闭非核心应用或接口带来的访问,确保核心应用或接口可用。
比如淘宝双十一期间,关闭“收货”,评价等业务,腾出资源做秒杀。
幂等设计:请求某个服务成功,因为网络原因没有收到响应,会重复调用,这种重试不可避免。
设计成幂等接口,调用多次无副作用。
比如转账接口,必须强校验,避免重试,导致逻辑错误。
5.几种负载均衡介绍
HTTP重定向负载均衡:利用HTTP协议,均衡器302返回真实的一组服务器地址,重定向机器成为瓶颈
DNS域名解析负载均衡:DNS中配置多个记录,比如 my.com IN A 111.1.1.1 my.com IN A 111.1.1.2等等。
每次域名解析请求到来,就会根据负载均衡算法返回其中一个IP地址。
缺点是DNS是多级解析,每级都可能有缓存,所以配置有变动时生效时间长;而且DNS控制权在域名服务商手里,可操作的空间有限
反向代理:反向代理收到请求,根据均衡算法,将请求转发至后面真实服务器,然后将响应写回客户端。
反向代理可能会成为瓶颈。
IP负载均衡:请求到达均衡器,均衡器在系统内核进程获取数据包,根据均衡算法,修改数据包的目的地址,同时将源地址修改为自身。
从而真实服务器处理请求后,将响应写给均衡器,均衡器再返回给客户端。
如果不修改源地址,则该均衡器充当真实服务器集群的网关服务器,所有的数据自然也能流经均衡器。
数据链路层负载均衡:请求到达均衡器,均衡器修改数据包中的MAC地址,改为真实服务器的地址,请求转发到真实服务器,处理后,直接返回客户端。
此方式又称为三角传输,由于不修改IP,需配置真实服务器虚拟IP与均衡器IP一致,请求进来通过MAC地址分发,请求出去,直接写给客户端,均衡器压力小,又称为DR,直接路由。
LVS是Linux最好的数据链路层负载均衡器。
扩展性:在对现有系统影响最小的情况下,系统功能可以持续扩展或提升。
说的是功能层面的事。
伸缩性:通过增加或减少自身资源规模(比如机器数量)来增强或减少系统的处理事务的能力。
说的是系统吞吐能力层面的事。
除特别注明外,本站所有文章均为轻洽网络原创,转载请注明出处来自http://www.qingqia.net/316.html
暂无评论