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

两台机器,每台相同的 web-server+redis,每台都只读写自己机器上的 redis,两个 redis 可以怎么实现同步,有没有搞过的...

  •  
  •   aganlengzi · 46 天前 · 2233 次点击
    这是一个创建于 46 天前的主题,其中的信息可能已经有所发展或是发生改变。
    42 回复  |  直到 2019-09-30 10:51:42 +08:00
        1
    lcy630409   46 天前
    谷歌一下就出来了
    https://blog.csdn.net/fuyuwei2015/article/details/70922729
    先自己搜索 发现问题再问人
        2
    rootww21   46 天前
    redis 集群轻松搞定
        3
    aganlengzi   46 天前
    @lcy630409 不是只写一台,redis-A 会被写入,redis-B 也会被写入,两台被写入的内容可能不同,想做的是把写入增量想同步到另一台。
        4
    misaka19000   46 天前
    简单,写个中间层
        5
    Michaelssss   46 天前
    增量同步,首先全局自增 uid 要有,接着还要自己实现一个 redis-client。。。
        6
    winterfell30   46 天前 via Android   ♥ 1
    搞双主的目的是写的时候低延迟?要保证强一致的话还是挺难搞的
        7
    andylsr   46 天前 via Android
    要求实时?
        8
    micean   46 天前
    做不到吧,逻辑上怎么保证 2 个 redis 写入同样的 key,以谁的为准?
        9
    aganlengzi   46 天前
    @winterfell30 想实现的是不同机器上 web-server 的本地缓存 -> 不同机器上 web-server 的共享缓存
    主要是现状只有一台机器上有 web-server+redis(只是 cache,不是 buffer),想的是如果能通过 redis 相关配置实现,上层不用关心同步,加一台机器改改配置就行了... ...
    貌似这是个很原始很不好的想法...
        10
    aganlengzi   46 天前
    @micean
        11
    aganlengzi   46 天前
    @andylsr
        12
    phantomzz   46 天前   ♥ 1
    redisson 可以解决你这个问题,本质是发布订阅,注册一个监听器,自己实现监听事件的具体业务就可以了
        13
    phantomzz   46 天前
    另外集群肯定是需要的,cluster 模式还是 sentinel 模式要看你们自己架构
        14
    leviathan0992   46 天前
    @aganlengzi 逻辑上怎么保证 2 个 redis 写入同样的 key,以谁的为准? 这个你们考虑过吗?
        15
    abccccabc   46 天前
    楼主的意思是双主互相备份吗?但两台 redis 里面的 key 一样,值不一样,可就麻烦了。
        16
    aganlengzi   46 天前
    @leviathan0992 这个在现有场景问题不大,redis 只是数据库的 cache,一般不会有一致性问题,如果不一致那说明前后两个操作中间数据库有写入操作,这个以新的和旧的数据都行,旧的数据会在超时后被改写,功能上可以接受。
        17
    aganlengzi   46 天前
    @abccccabc 嗯,我们功能上这个问题可以接受,web-server 不改数据库。
        18
    zdt3476   46 天前
    没理解楼主这种需求的意义。 一个 Redis 不是照样能满足吗
        19
    aganlengzi   46 天前
    @zdt3476 嗯,可以,想的是只访问本地内存,很快,没网络延迟;然后如果 redis 能互相同步,就很爽了...
        20
    Vegetable   46 天前
    那就写两次.两个服务器分别异步向两个缓存写,读只读自己本地这个.
    优势是不需要引入太大的变动,也能满足你读取本地内存这个需求.
    缺点是设计看起来比较蠢,如果 handler 不支持异步任务会比较麻烦
        21
    Tink   46 天前 via iPhone
    这个没办法吧
        22
    alamaya   46 天前
    搞不懂你这里执著写两台 redis 的意义是啥
        23
    xmh51   46 天前
    本地 cache 一致性问题很难搞。另外 redis 的性能已经非常高了 腾讯云实测 10wqps
        24
    df4VW   46 天前
    @aganlengzi 每台机子读同一台机子的 redis,你这架构就没法 scale。。
        25
    rrfeng   46 天前 via Android   ♥ 1
    可以做双向同步,就是数据会有冲突,最简单的解决冲突就是覆写,后来的值为准,看你能不能接受了。

    本地访问 Redis 带来的收益其实很小。除非你俩主机隔得很远
        26
    LeeSeoung   46 天前   ♥ 1
    两个 redis 当成独立的,应用请求数据库后 写两份 redis,与其考虑 redis 同步,这样不是更方便?
        27
    arloor   46 天前 via Android   ♥ 1
    做个伪 slave 去接受两个 redis 主节点的异步拷贝,然后发送给对方。你需要实现这个伪 slave,同时还是有一些问题难以解决的
    1. 在网络波动下,redis 主会给伪 slave 发送全量同步的 rdb 文件,而 redis 没有暴露加载 rdb 的命令——当然可以通过修改 redis 源码然后重新编译安装实现暴露 rdb 命令

    更多可以在 github 上搜 redis replicator 这个项目。

    要深入理解,请看 redis 的 replicate.c 源码

    说了很多,因为一句话根本说不清
        28
    lcy630409   46 天前
    你这样搞来搞去 两个服务器之间的网络连接始终存在,感觉没什么意义
    或者如果有费用的话 推荐你 阿里云的高速通道,两台服务器专线连接
        29
    lisces   46 天前   ♥ 1
    twemproxy 或者 codis 搞一个 proxy
        30
    dangyuluo   46 天前   ♥ 1
    你可以了解一下分布式系统的 CAP 理论:

    一个分布式系统最多只能同时满足一致性( Consistency )、可用性( Availability )和分区容错性( Partition tolerance )这三项中的两项。
        31
    xiaotianhu   46 天前   ♥ 1
    简化一下这样干
    每台机器 webserver+memcache 做本地缓存,sql/模板 /配置一类的
    其他的走独立 redis
    能解决你大部分场景了
        32
    aganlengzi   46 天前
    @rrfeng 嗯,是这样.
        33
    aganlengzi   46 天前
    @lcy630409 有点可能是理想化的,一是代码不用动(如果 redis 有这种的话),二是只访问本地缓存快些(实际有限),像 @rrfeng 说的
        34
    aganlengzi   46 天前
    @arloor 这样真的很麻烦了,/捂脸,这样可能真不如像 @LeeSeoung 说的这样干了
        35
    aganlengzi   46 天前
    @Vegetable 弄成一主一从,然后往主写,都读本地...差不多
        36
    aganlengzi   46 天前
    @alamaya 嗯,你是指像说的收益很小吧 @rrfeng
        37
    pubby   46 天前
    另一个思路是:根据客户来源固定分配到某一台服务器
        38
    jhsea3do   46 天前
    lz 你考虑 redis cluster ha ?
        39
    jhsea3do   46 天前
    另外你如果对 kv 的高可用看重,而对 缓存速度 不看重的话,可以用 etcd / zookeeper, 这个主要做配置共享的。
        40
    passerbytiny   46 天前
    你既然叫缓存,那么你的主存储还是关系数据库,为何不从缓存策略上去考虑。两个一摸一样的 Redis 缓存不是没有意义,但效益成本比例低到可以忽略。

    如果你要是单纯的追求访问(读)速度,并且做好了读写分离,那么应当做成镜像而不是缓存。
        41
    alamaya   46 天前
    @aganlengzi
    看不出来有什么意义,你要更快的本地缓存,那用在同一个进程里面的 memcache 岂不是更快,何必用 redis,还搞同步,你两台机器也许还能搞,以后增加到三台四台十几台的时候还这么同步?
        42
    julyclyde   45 天前
    从设计上就是错的
    然后你问怎么把这个错误实现
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2515 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 36ms · UTC 14:24 · PVG 22:24 · LAX 06:24 · JFK 09:24
    ♥ Do have faith in what you're doing.