锁定老帖子 主题:关于如何使用内存擦车的
精华帖 (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 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-05-23
最后修改:2009-05-23
"我们需要为cache做mirror copy,fail over"
fail over 应该是客户端的事,一般的memcached client都已经有了这个功能 mirror copy这个是服务器端的事,对于memcached,呵呵,这个真没有 自己加功能吧,或者试试toyko tyrant,这个有 只要你们服务器富裕,整个memcached 集群,绝对能满足你们要求 |
|
返回顶楼 | |
发表时间:2009-05-23
bachmozart 写道 "我们需要为cache做mirror copy,fail over" fail over 应该是客户端的事,一般的memcached client都已经有了这个功能 mirror copy这个是服务器端的事,对于memcached,呵呵,这个真没有 自己加功能吧,或者试试toyko tyrant,这个有 只要你们服务器富裕,整个memcached 集群,绝对能满足你们要求 鬼子的这个东西是好,但是他是有存储的,类似memcachedb,我们需要的只是cache而已,其实就cache而言,memcached已经足够好了,虽然有一些瑕疵,但是已经够用了,关键是使用策略的问题,接下来我会讨论一下使用策略的问题 |
|
返回顶楼 | |
发表时间:2009-05-23
不太清楚你指的瑕疵是哪方面,作为网络缓存,我对它非常信任
toyko tyrant的持久化用的是toyko cabint,几次尝试阅读源码,都被其诡异的代码风格(奇怪的变量名,超长又没分割且毫不含义的函数名)吓退了,郁闷啊 据说这东西比bdb还要快,代码写的没法看太郁闷了 |
|
返回顶楼 | |
发表时间: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也是极为推崇 |
|
返回顶楼 | |
发表时间: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命令查询到的那些,都是需要加锁操作的,可能会影响部分性能 |
|
返回顶楼 | |
发表时间:2009-05-23
我记得一个大牛曾经讲过这样一个例子: 某台缓存服务器, 4G内存, 坏了2G, 这样能缓存的数据就只有原来的一半, 所以有一半的数据由于在缓存里找不到, 就经常去查数据库, 然后就导致了整个系统经常CRASH掉, 因为数据库实在受不起这么大的压力, 所以整个系统就。。。。。, 后来他们经验总结为如果缓存服务器挂了, 就直接服务错误, 而不再去读数据库(其实也可以发送警告,当达到抖动阀值的时候, 但是实现要想对复杂很多)。
这只是让我们更多去想想如何平衡的, 也不要异想天开。 |
|
返回顶楼 | |
发表时间:2009-05-23
xiaoyu 写道 ..... 因为数据库实在受不起这么大的压力, 所以整个系统就。。。。。, 后来他们经验总结为如果缓存服务器挂了, 就直接服务错误, 而不再去读数据库.....
这实际上就是我主要想讨论的问题了,像这种情况,cache其实已经是一个关键点了,挂了就真个系统跟着挂掉,其实这时候最好的策略是cache里的内容由程序主动去初始化,而取数据的程序只从cache里取,没有fail over到数据库的过程 |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |
发表时间: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. |
|
返回顶楼 | |