`
argan
  • 浏览: 129620 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于如何使用内存擦车的

阅读更多

也学人家来一次标题党,其实就是如何使用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

分享到:
评论
18 楼 Stero 2010-01-21  
1. 缓存应该也是多台机器分布式的,坏一两个不至于对性能影响太大。
2. 缓存的占用率保持一定的空闲应付故障时缺失的缓存。
3. 缓存坏掉要有自动监控系统来报警,要及时填补坏掉的机器。
4. 对数据库压力进行监控,超过一定的阈值返回服务器错误,而不是让服务器崩掉。(Kill long queries before they kill you)

请大家斧正。
17 楼 damoqiongqiu 2009-06-15  
xiaoyu 写道
我记得一个大牛曾经讲过这样一个例子: 某台缓存服务器, 4G内存, 坏了2G, 这样能缓存的数据就只有原来的一半, 所以有一半的数据由于在缓存里找不到, 就经常去查数据库, 然后就导致了整个系统经常CRASH掉, 因为数据库实在受不起这么大的压力, 所以整个系统就。。。。。, 后来他们经验总结为如果缓存服务器挂了, 就直接服务错误, 而不再去读数据库(其实也可以发送警告,当达到抖动阀值的时候, 但是实现要想对复杂很多)。

这只是让我们更多去想想如何平衡的, 也不要异想天开。

是不是看的某个视频上的?我记得我也看过
16 楼 kekeemx 2009-06-05  
argan 写道
xiaoyu 写道
..... 因为数据库实在受不起这么大的压力, 所以整个系统就。。。。。, 后来他们经验总结为如果缓存服务器挂了, 就直接服务错误, 而不再去读数据库.....


这实际上就是我主要想讨论的问题了,像这种情况,cache其实已经是一个关键点了,挂了就真个系统跟着挂掉,其实这时候最好的策略是cache里的内容由程序主动去初始化,而取数据的程序只从cache里取,没有fail over到数据库的过程

不太明白你所说的 cache的内容由程序去初始化 的意思。
cache如果挂了,然后程序再次初始化一个cache并加载内容?这样的意思你是?

我觉得cache要真的挂了的话,只能直接压到数据库那边去了,不过挂了之后立即报警
以便最快速度重建cache还是比较不错的选择。
15 楼 bjhawk 2009-05-31  
bachmozart 写道
whaosoft 写道
argan 写道
不得不说,鬼子对开源的东西贡献还真的比我们多,我们也得加油了啊





memcached 难道和鬼子有关系?  到是挺好用的呢


他说的是toyko tyrant和toyko cabint,呵呵,这2个是made in japan

是不是还有一个Tokyo  hot 那一系列呀!
14 楼 whitesock 2009-05-27  
cache对应用是否透明并不是关键,最重要的是要避免将性能问题转换为可伸缩性的问题。如果缓存了非只读的数据或者计算结果,那么无论采用何种集群方式(terracotta、jms、jgroups...) 应用的架构可能都要随之调整。
13 楼 bachmozart 2009-05-24  
whaosoft 写道
argan 写道
不得不说,鬼子对开源的东西贡献还真的比我们多,我们也得加油了啊





memcached 难道和鬼子有关系?  到是挺好用的呢


他说的是toyko tyrant和toyko cabint,呵呵,这2个是made in japan
12 楼 whaosoft 2009-05-24  
argan 写道
不得不说,鬼子对开源的东西贡献还真的比我们多,我们也得加油了啊





memcached 难道和鬼子有关系?  到是挺好用的呢
11 楼 argan 2009-05-24  
bachmozart 写道
不过他们的开源代码基本跟不开源也差不多了,源代码写的跟加了密似的,对非英语国家的开源代码自此就有了恐惧感

这个就很难说了,也有可能是他们英文不好吧

如果我们写的java代码都用中文来命名类啊,方法的,或者简单点用拼音好了,编译出来人家看看也铁定晕菜,不过这只是好玩而已
10 楼 bachmozart 2009-05-24  
不过他们的开源代码基本跟不开源也差不多了,源代码写的跟加了密似的,对非英语国家的开源代码自此就有了恐惧感
9 楼 argan 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.

8 楼 iunknown 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.


7 楼 argan 2009-05-23  
xiaoyu 写道
..... 因为数据库实在受不起这么大的压力, 所以整个系统就。。。。。, 后来他们经验总结为如果缓存服务器挂了, 就直接服务错误, 而不再去读数据库.....


这实际上就是我主要想讨论的问题了,像这种情况,cache其实已经是一个关键点了,挂了就真个系统跟着挂掉,其实这时候最好的策略是cache里的内容由程序主动去初始化,而取数据的程序只从cache里取,没有fail over到数据库的过程
6 楼 xiaoyu 2009-05-23  
我记得一个大牛曾经讲过这样一个例子: 某台缓存服务器, 4G内存, 坏了2G, 这样能缓存的数据就只有原来的一半, 所以有一半的数据由于在缓存里找不到, 就经常去查数据库, 然后就导致了整个系统经常CRASH掉, 因为数据库实在受不起这么大的压力, 所以整个系统就。。。。。, 后来他们经验总结为如果缓存服务器挂了, 就直接服务错误, 而不再去读数据库(其实也可以发送警告,当达到抖动阀值的时候, 但是实现要想对复杂很多)。

这只是让我们更多去想想如何平衡的, 也不要异想天开。
5 楼 bachmozart 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命令查询到的那些,都是需要加锁操作的,可能会影响部分性能
4 楼 argan 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也是极为推崇
3 楼 bachmozart 2009-05-23  
不太清楚你指的瑕疵是哪方面,作为网络缓存,我对它非常信任

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

据说这东西比bdb还要快,代码写的没法看太郁闷了
2 楼 argan 2009-05-23  
bachmozart 写道

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

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

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

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

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

鬼子的这个东西是好,但是他是有存储的,类似memcachedb,我们需要的只是cache而已,其实就cache而言,memcached已经足够好了,虽然有一些瑕疵,但是已经够用了,关键是使用策略的问题,接下来我会讨论一下使用策略的问题
1 楼 bachmozart 2009-05-23  
"我们需要为cache做mirror copy,fail over"

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

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

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

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

相关推荐

Global site tag (gtag.js) - Google Analytics