在Web系统规模比较小的时候,这种做法看似完美 。但是,一旦Web系统规模变大 , 例如当我有100台的Web服务器的时候 。那样这些磁盘文件,将会有100份,这个是资源浪费,也不好维护 。这个时候有人会想,可以集中一台服务器存起来,呵呵,不如看看下面一种缓存方式吧,它就是这样做的 。
2. 单台内存缓存
通过页面静态化的例子中,我们可以知道将“缓存”搭建在Web机器本机是不好维护的,会带来更多问题(实际上,通过PHP的apc拓展,可通过Key/value操作Web服务器的本机内存) 。因此,我们选择搭建的内存缓存服务,也必须是一个独立的服务 。
内存缓存的选择,主要有redis/memcache 。从性能上说,两者差别不大,从功能丰富程度上说 , Redis更胜一筹 。
3. 内存缓存集群
当我们搭建单台内存缓存完毕,我们又会面临单点故障的问题,因此 , 我们必须将它变成一个集群 。简单的做法,是给他增加一个slave作为备份机器 。但是,如果请求量真的很多,我们发现cache命中率不高 , 需要更多的机器内存呢?因此 , 我们更建议将它配置成一个集群 。例如 , 类似redis cluster 。
Redis cluster集群内的Redis互为多组主从,同时每个节点都可以接受请求 , 在拓展集群的时候比较方便 。客户端可以向任意一个节点发送请求,如果是它的“负责”的内容 , 则直接返回内容 。否则,查找实际负责Redis节点,然后将地址告知客户端,客户端重新请求 。
对于使用缓存服务的客户端来说 , 这一切是透明的 。
内存缓存服务在切换的时候,是有一定风险的 。从A集群切换到B集群的过程中,必须保证B集群提前做好“预热”(B集群的内存中的热点数据 , 应该尽量与A集群相同,否则,切换的一瞬间大量请求内容,在B集群的内存缓存中查找不到,流量直接冲击后端的数据库服务 , 很可能导致数据库宕机) 。
4. 减少数据库“写”
上面的机制,都实现减少数据库的“读”的操作 , 但是,写的操作也是一个大的压力 。写的操作,虽然无法减少,但是可以通过合并请求,来起到减轻压力的效果 。这个时候,我们就需要在内存缓存集群和数据库集群之间 , 建立一个修改同步机制 。
先将修改请求生效在cache中,让外界查询显示正常,然后将这些sql修改放入到一个队列中存储起来 , 队列满或者每隔一段时间,合并为一个请求到数据库中更新数据库 。
除了上述通过改变系统架构的方式提升写的性能外,MySQL本身也可以通过配置参数innodb_flush_log_at_trx_commit来调整写入磁盘的策略 。如果机器成本允许,从硬件层面解决问题,可以选择老一点的RAID(Redundant Arrays of independent Disks,磁盘列阵)或者比较新的SSD(Solid State Drives,固态硬盘) 。
5. NoSQL存储
不管数据库的读还是写,当流量再进一步上涨,终会达到“人力有穷时”的场景 。继续加机器的成本比较高,并且不一定可以真正解决问题的时候 。这个时候,部分核心数据,就可以考虑使用NoSQL的数据库 。NoSQL存储,大部分都是采用key-value的方式,这里比较推荐使用上面介绍过Redis,Redis本身是一个内存cache,同时也可以当做一个存储来使用,让它直接将数据落地到磁盘 。
这样的话,我们就将数据库中某些被频繁读写的数据,分离出来,放在我们新搭建的Redis存储集群中,又进一步减轻原来MySQL数据库的压力,同时因为Redis本身是个内存级别的Cache,读写的性能都会大幅度提升 。
推荐阅读
- mvc如何将值传入js,mvc怎么传数据
- 企业营销应如何培训心得,企业营销管理培训
- java写一套代码,java代码编写
- 撒贝宁直播运营和产品运营,撒贝宁直播运营和产品运营的区别
- 关于vb.net控件组是什么的信息
- 自学go语言去哪找工作,自学go语言能找到工作吗
- 包含saphanastudio的词条
- 直播设备背景电影,直播间背景电视
- linux系统命令调用 linux调用命令行快捷键