发表于: 2018-02-09 16:44:22

1 566


今天完成的事情:今天本来想结束任务六的,不过服务器的BUG比较多,自己又优化了代码,加了注销登出的功能,所以要到明天才能提交任务六。

那就先做深度思考吧,为提交任务做准备。

1.为什么要使用memcache?memcashe有什么作用?

1.背景介绍

memcache是一套分布式的高速缓存系统,目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 。

Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。其本质上就是一个内存key-value数据库,但是不支持数据的持久化,服务器关闭之后数据全部丢失

2.知识剖析

cache高速缓冲存储器一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问。存储器的高速缓冲存储器存储了频繁访问的RAM位置的内容及这些数据项的存储地址。当处理器引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。如果存有该地址,则将数据返回处理器;如果没有保存该地址,则进行常规的存储器访问。

计算机存储器分为内存,外存,cache高速缓存.cache主要解决主存速度问题,虽然和外存比较,内存速度已经很快了,但是和cpu比较的话,主存速度一般只有cpu的1/10.所以要加一个高速缓冲存储器.把数据暂时存储在cache里.cpu从cache里取数据

MemCache的工作流程如下:先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作;如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序明确实现);每次更新数据库的同时更新memcached中的数据,保证一致性;当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。


可以看出来,对于某些不需要频繁更新,实时性不高的东西,完全可以加个缓存,比如一小时更新一次,就不用耗费资源去数据库里面取了。

而在本次任务中,我分别使用memcache和redis对首页的优秀毕业生名单(随机抽取四个),毕业生总数,在读学员总数加了缓存,经过测试,性能有大大的提高,增删查改的一套流程,从原来的极限并发37次,增长到了极限并发60次(后来经过nginx优化后,指数有了进一步提高,而且主要瓶颈变为了服务器带宽)。

历史压测报告的日报如下:

http://www.jnshu.com/daily/49811?dailyType=others&total=44&page=7&uid=20549&sort=0&orderBy=3


2.什么是负载均衡,为什么要做负载均衡?

由于目前现有网络的各个核心部分随着业务量的提高,访问量和数据流量的快速增长,其处理能力和计算强度也相应地增大,使得单一的服务器设备根本无法承担。在此情况下,如果扔掉现有设备去做大量的硬件升级,这样将造成现有资源的浪费,而且如果再面临下一次业务量的提升时,这又将导致再一次硬件升级的高额成本投入,甚至性能再卓越的设备也不能满足当前业务量增长的需求。

针对此情况而衍生出来的一种廉价有效透明的方法以扩展现有网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性的技术就是负载均衡(Load Balance)。


负载均衡优化了访问请求在服务器组之间的分配,消除了服务器之间的负载不平衡,从而提高了系统的反应速度与总体性能;

负载均衡可以对服务器的运行状况进行监控,及时发现运行异常的服务器,并将访问请求转移到其它可以正常工作的服务器上,从而提高服务器组的可靠性采用了负均衡器器以后,可以根据业务量的发展情况灵活增加服务器,系统的扩展能力得到提高,同时简化了管理。


我用自己的话总结一下,好处有三点:1.集群管理,一个服务器挂掉了,不会导致整个服务停止,而且可以通过nginx的error.log记录,写个脚本可以找出错误状态码为111(111: Connection refused) while connecting to ...)的记录,判断是哪个端口的服务器挂了,方便维护。2.优化了并发,显著减少了噪点。


不过我在实际的测试中发现,集群对于服务器内存的要求还是比较高的,我开三个tomcat实例,然后再开nginx,直接提示22错误码,提示内存不足。所以,我只开了两个,不过通过日志观察,的确是两个实例都生效了的。

3.nginx如何实现负载均衡?

关于这个,我是踩了不少坑的,之前用的是nginx+resin3,直接在cluster的标签下添加多个server,然后在resin.properties文件里面配置端口就行。后来换了resin4,发现这货自带集群,而且谷歌了才发现resin4.0以上只有花钱买专业版才能同一服务器多实例....果然弃用,换回了大众的tomcat!

下面是nginx+tomcat的配置流程:

nginx.conf相关配置:

然后在tomcat的两个实例(两个文件夹)下面的conf子文件夹的server.xml里面分别修改停止端口和服务端口,要和nginx里面分别对应起来,比如我这里的是8081端口和8082端口。

然后分别启动两个实例下bin文件夹的startup.sh,重新加载配置启动nginx,分别查看各自文件夹下的catalina.out输出日志,然后测试一些操作。如果你log4j.properties里面写了输出到控制台的话,那么在catalina.out里面也能看到配置的日志输出。


当然你可能觉得tomcat的日志有可能是多余的,我们用自己配置的日志就行了。tomcat7可以在catalina.sh文件里面指定catalina.out的输出路径到黑洞/dev/null,也就是不产生日志。tomcat9我试了下,好像不行,也不知道为什么...


PS:自己配置的日志文件在bin这个文件夹下面,寻找文件可以用find指令实现:

find  / -name xxxx(文件名)   全局搜索,很慢(注意空格)

find */ -name xxxx   当前目录下全部搜索 

还有whereis grep等指令,各有各的特色...


明天计划的事情: 做一份详细的压测报告,结束任务六


遇到的问题:Tomcat7,Tomcat9生产环境下,javax.management.InstanceNotFoundException: com.alibaba.druid:type=DruidDataSourceStat异常报错

网上搜了很多,说是什么版本原因啊,需要在catalina.sh中添加什么语句啊...经过一上午的排查,发现,是因为tomcat关闭时,未完成会话session.ser文件的锅(在tomcat的work文件夹下)。把项目的work文件夹删了,然后重启,就不会报错了。

其他方法我试了下,并不奏效,包括升级tomcat版本到9和在catalina.sh里面加东西的方法....不过到最后问题算是解决了,就这样子先用着吧。


收获:归纳总结


返回列表 返回列表
评论

    分享到