V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jamiesun
V2EX  ›  程序员

关于一个超级缓存的实现,有没有什么好的建议?

  •  
  •   jamiesun ·
    jamiesun · 2014-11-26 21:18:48 +08:00 · 3106 次点击
    这是一个创建于 3650 天前的主题,其中的信息可能已经有所发展或是发生改变。
    目前在设计一个用户规模100万的系统,需要设计一个共享缓存并向最少8个节点提供缓存调用接口。打算低成本解决这个问题。

    数据持久化不需要,但是高可用必须有,高性能必须有。

    单节点要满足10000tps。每10万用户耗内存1G。双机双工负载均衡。读写比率大概是2:8。

    一开始我想到的是使用这样的简单架构,后端存储使用redis,前端用tornado多进程负载,达到10000tps没有什么问题。不过redis并不支持双工模式,在应用层解决复制不是很好。

    其次想到的是ehcache + bigmemory,性能上还不敢确定,有人测试比redis还牛,还是得自己测试一下才行。ehcache企业版支持分布式模式,没用过。如果使用免费的bigmemory32G,还是得自己解决数据复制问题。

    还有什么更好的建议没。


    后期扩容200万,我想老板已经赚翻了,上中间件,实时数据库啥的都不是问题了。
    第 1 条附言  ·  2014-11-27 10:35:53 +08:00
    经过一番考虑,我打算放弃共享缓存这种模式了,

    计划用mysql数据库集群来解决这个问题,在双机mysql HA的基础上挂一群只读节点来提供最少8个节点的数据读取操作。写操作直接入主库无压力。

    看起来这是最简单地方案了,应用层一下子简单了。200万,300万随便扩了。

    另外还有一个在线用户缓存,按70%在线率,100万用户需要2G内存,那就直接在jvm堆内做了,分布在各个节点全无压力。

    好了,我现在开始需求一个DBA了。
    15 条回复    2014-11-29 19:24:42 +08:00
    feilaoda
        1
    feilaoda  
       2014-11-26 21:28:41 +08:00
    Redis还是比较稳定的,双机双工是否必要?一定要的话,看看Twemproxy。
    jamiesun
        2
    jamiesun  
    OP
       2014-11-26 21:38:46 +08:00
    @feilaoda 也考虑过主从读写分离
    jamiesun
        3
    jamiesun  
    OP
       2014-11-26 22:56:31 +08:00
    @feilaoda 如果单线程的redis主节点卡住,就完全悲剧了,这是我担心的原因。
    c4pt0r
        4
    c4pt0r  
       2014-11-27 10:43:59 +08:00
    codis 可以试试
    feilaoda
        5
    feilaoda  
       2014-11-28 08:13:12 +08:00
    @jamiesun 不明白你的“单线程的redis主节点”是什么意思?完全卡不住的啊
    jamiesun
        6
    jamiesun  
    OP
       2014-11-28 09:10:52 +08:00
    @feilaoda redis是单线程的,不可抗力的因素很多,单点故障可能性极大。特别是数据大了以后。
    feilaoda
        7
    feilaoda  
       2014-11-28 10:09:38 +08:00
    @jamiesun
    @c4pt0r 的codis可以试一下。
    用mysql的代价会比redis大,除非你有个好DBA
    feilaoda
        8
    feilaoda  
       2014-11-28 10:11:00 +08:00
    @jamiesun 单线程也可以很稳定,单点故障就采用M/S等方案解决
    c4pt0r
        9
    c4pt0r  
       2014-11-28 10:49:28 +08:00
    @feilaoda 如果使用 codis 有问题, 可以随时在 github 或者这里联系我, 我是作者 :)
    feilaoda
        10
    feilaoda  
       2014-11-28 10:50:32 +08:00
    @c4pt0r 你公司使用的情况怎样?介绍一下?
    c4pt0r
        11
    c4pt0r  
       2014-11-28 12:03:31 +08:00
    @feilaoda 目前我司所有的 redis 服务都已经在 codis 上稳定运行了. 总的集群规模大概 2T 的内存左右. 因为不少业务是完全拿 redis 当存储用, 只有写的请求打到数据库或者 HBase 上, 还有些业务是通过 MapReduce 过程直接生成数据灌进 Redis 里, 读请求全部走 Redis, 所以基本不能容忍缓存 miss, 或者触发 LRU, 而且需要不中断服务的迁移和扩容, 而且还不能有单点, 否则单机的网卡抗不住. 所以, Codis 是在这个背景下开发的. 不知道你的场景如何.
    feilaoda
        12
    feilaoda  
       2014-11-28 14:04:06 +08:00
    @c4pt0r 主要是实时计算的结果数据,需要保存在redis中,数据还不少,写redis的要求会比较高,当然,读和写差不多多。读/写大概分别需要200000tps。
    c4pt0r
        13
    c4pt0r  
       2014-11-28 15:31:16 +08:00
    codis 不是为这个设计的, 不过抛开数据大小, 机器配置谈 tps 不太合适. 我这里有一个 benchmark 的文档, 可以参考下: https://github.com/wandoulabs/codis/blob/master/doc/benchmark_zh.md
    c4pt0r
        14
    c4pt0r  
       2014-11-28 15:31:51 +08:00
    @feilaoda 测试机上的峰值 qps 大概是 25w 左右
    jamiesun
        15
    jamiesun  
    OP
       2014-11-29 19:24:42 +08:00
    @feilaoda @c4pt0r 我做的是电信计费系统,性能能达到一定的指标就好,但并不要求压榨单机性能,但支持良好的扩展是必要的。

    本来我是应该要求直接采购类似timesten的,不过客户比较特别,目前的预算不允许。

    据我一个朋友经历,redis在数据量很大的时候重启恢复要花很久,目前我还是只敢用在一些互联网系统上。

    我的核心数据其实不大,用户数量只是百万规模,不过即使20个用户投诉也是影响很大的,基本上客户只要有短时间10个投诉就会紧急通知我“大面积故障”。

    所以我目前要的就是“稳”,随着业务发展,确实需要一个专业DBA来帮我解决问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2681 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 05:20 · PVG 13:20 · LAX 21:20 · JFK 00:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.