论坛首页 综合技术论坛

关于如何使用内存擦车的

浏览 8373 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (8)
作者 正文
   发表时间:2009-05-23  

也学人家来一次标题党,其实就是如何使用memcached,对不起,我使用的是中英文混合翻译法。这里讨论的问题不是针对memcached,实际上是通用的缓存策略。

 

前两天,公司技术部群里,大家针对如何使用cache服务器进行了一次热烈的讨论。事情起因是因为对一组cache服务器的维护导致了前台应用的报警。大家讨论很热烈,经过多次发散和收敛,大致的观点有几种:

*cache应该是可有可无的,cache的存在只是为了提高应用的性能的

*cache有时候相当重要,必要的时候,我们需要为cache做mirror copy,fail over,互相同步保证一致性等等,来提高其可用性,而且还有产品规划了上述功能

*有时候应该对cache做warm up,在cache服务器起来的时候,应该做一些数据的初始化,前提当然是实现通过统计能识别出哪些数据是热点,需要warm up的

*在有的应用场景,cache非常重要,比如说数据库复杂sql的结果缓存,这时候实际上cache挂掉的时候,后端的数据库是顶不住的

*有的观点比较实在,强化我们的cache客户端,做更多的容错策略,来保证可用性

*领导的意见很简单,重视这个问题,制定使用的指导方针,推广下去

 

从上面的讨论来看,很多问题其实都很有代表性。以下是我的一些看法:

 

*正如大师(公司里的一大牛)说的,首先要明确这个“神”:

  一是应用要在cache失效的时候能正常工作(至少功能正常,不能挂掉,最多性能稍差),

  二是cache不要存在单点,或者说单点的失败不会导致整个应用失败。

  大师的观点非常精炼,完全可以作为cache使用的指导方针列出来,没什么好评论的。

 

*如何提高cache服务的可用性?

这个争论的很多。有的说要复制、要一致性保证,服务器要2N的策略,我觉得这是盲目的夸大了cache的重要性,在目前阶段,cache不应该成为系统的关键点,只是为了提高性能的一个手段而已。

 

还有一种改进策略,2N太浪费,而且也不是能绝对保证可用性,可以使用N+n(n<<N)来替代,只要做好容错策略,可用性完全可以很好的保证,在有的场景下,比如N比较大,比如说10,使用N+0都可以,因为就算一台挂掉了,后端服务也只需要承受10%的压力而已。

 

很明显,从措辞上来看,我就是赞同第二中观点的。

 

*领导就是领导

领导看问题的角度就是不一样,讨论这么多,还是要落到实处,明显站的高一点,这是很需要学习的一种思维方式。

 

#end

   发表时间:2009-05-23   最后修改:2009-05-23
"我们需要为cache做mirror copy,fail over"

fail over 应该是客户端的事,一般的memcached client都已经有了这个功能

mirror copy这个是服务器端的事,对于memcached,呵呵,这个真没有

自己加功能吧,或者试试toyko tyrant,这个有

只要你们服务器富裕,整个memcached 集群,绝对能满足你们要求
0 请登录后投票
   发表时间:2009-05-23  
bachmozart 写道

"我们需要为cache做mirror copy,fail over"

fail over 应该是客户端的事,一般的memcached client都已经有了这个功能

mirror copy这个是服务器端的事,对于memcached,呵呵,这个真没有

自己加功能吧,或者试试toyko tyrant,这个有

只要你们服务器富裕,整个memcached 集群,绝对能满足你们要求

鬼子的这个东西是好,但是他是有存储的,类似memcachedb,我们需要的只是cache而已,其实就cache而言,memcached已经足够好了,虽然有一些瑕疵,但是已经够用了,关键是使用策略的问题,接下来我会讨论一下使用策略的问题
0 请登录后投票
   发表时间:2009-05-23  
不太清楚你指的瑕疵是哪方面,作为网络缓存,我对它非常信任

toyko tyrant的持久化用的是toyko cabint,几次尝试阅读源码,都被其诡异的代码风格(奇怪的变量名,超长又没分割且毫不含义的函数名)吓退了,郁闷啊

据说这东西比bdb还要快,代码写的没法看太郁闷了
0 请登录后投票
   发表时间:2009-05-23  
bachmozart 写道

不太清楚你指的瑕疵是哪方面,作为网络缓存,我对它非常信任toyko tyrant的持久化用的是toyko cabint,几次尝试阅读源码,都被其诡异的代码风格(奇怪的变量名,超长又没分割且毫不含义的函数名)吓退了,郁闷啊据说这东西比bdb还要快,代码写的没法看太郁闷了

我说的瑕疵其实应该算是可以优化的地方,比如文本协议,完全可以换成更高效的二进制协议http://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol(似乎是facebook提交的),还有内部的两个锁stats_lock,cache_lock(见http://blogs.sun.com/zoran/entry/scaling_memcached_500_000_ops)

大部分时间这些是不影响使用的,而且我对memcached也是极为推崇
0 请登录后投票
   发表时间:2009-05-23  
argan 写道
bachmozart 写道

不太清楚你指的瑕疵是哪方面,作为网络缓存,我对它非常信任toyko tyrant的持久化用的是toyko cabint,几次尝试阅读源码,都被其诡异的代码风格(奇怪的变量名,超长又没分割且毫不含义的函数名)吓退了,郁闷啊据说这东西比bdb还要快,代码写的没法看太郁闷了

我说的瑕疵其实应该算是可以优化的地方,比如文本协议,完全可以换成更高效的二进制协议http://code.google.com/p/memcached/wiki/MemcacheBinaryProtocol(似乎是facebook提交的),还有内部的两个锁stats_lock,cache_lock(见http://blogs.sun.com/zoran/entry/scaling_memcached_500_000_ops)

大部分时间这些是不影响使用的,而且我对memcached也是极为推崇


确实是这样,memcached1.3版本已经加入了binary potocol,和CAS操作

至于锁的问题,memcached确实是一个多线程的模型,有很多全局属性,比如stat命令查询到的那些,都是需要加锁操作的,可能会影响部分性能
0 请登录后投票
   发表时间:2009-05-23  
我记得一个大牛曾经讲过这样一个例子: 某台缓存服务器, 4G内存, 坏了2G, 这样能缓存的数据就只有原来的一半, 所以有一半的数据由于在缓存里找不到, 就经常去查数据库, 然后就导致了整个系统经常CRASH掉, 因为数据库实在受不起这么大的压力, 所以整个系统就。。。。。, 后来他们经验总结为如果缓存服务器挂了, 就直接服务错误, 而不再去读数据库(其实也可以发送警告,当达到抖动阀值的时候, 但是实现要想对复杂很多)。

这只是让我们更多去想想如何平衡的, 也不要异想天开。
0 请登录后投票
   发表时间:2009-05-23  
xiaoyu 写道
..... 因为数据库实在受不起这么大的压力, 所以整个系统就。。。。。, 后来他们经验总结为如果缓存服务器挂了, 就直接服务错误, 而不再去读数据库.....


这实际上就是我主要想讨论的问题了,像这种情况,cache其实已经是一个关键点了,挂了就真个系统跟着挂掉,其实这时候最好的策略是cache里的内容由程序主动去初始化,而取数据的程序只从cache里取,没有fail over到数据库的过程
0 请登录后投票
   发表时间:2009-05-24   最后修改:2009-05-24
argan 写道

鬼子的这个东西是好,但是他是有存储的,类似memcachedb,我们需要的只是cache而已,其实就cache而言,memcached已经足够好了,虽然有一些瑕疵,但是已经够用了,关键是使用策略的问题,接下来我会讨论一下使用策略的问题


引用


http://tokyocabinet.sourceforge.net/tyrantdoc/

After installation of Tokyo Tyrant, you can start the server immediately by executing the command `ttserver' in the terminal. By default, the server listens to the port 1978 and serves as the accessor of an on-memory hash database, which is useful to store cache data.


0 请登录后投票
   发表时间:2009-05-24  
不得不说,鬼子对开源的东西贡献还真的比我们多,我们也得加油了啊

iunknown 写道


http://tokyocabinet.sourceforge.net/tyrantdoc/

After installation of Tokyo Tyrant, you can start the server immediately by executing the command `ttserver' in the terminal. By default, the server listens to the port 1978 and serves as the accessor of an on-memory hash database, which is useful to store cache data.

0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics