V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aganlengzi
V2EX  ›  程序员

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

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

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

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

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

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

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

    如果你要是单纯的追求访问(读)速度,并且做好了读写分离,那么应当做成镜像而不是缓存。
    alamaya
        41
    alamaya  
       2019-09-29 15:45:11 +08:00
    @aganlengzi
    看不出来有什么意义,你要更快的本地缓存,那用在同一个进程里面的 memcache 岂不是更快,何必用 redis,还搞同步,你两台机器也许还能搞,以后增加到三台四台十几台的时候还这么同步?
    julyclyde
        42
    julyclyde  
       2019-09-30 10:51:42 +08:00
    从设计上就是错的
    然后你问怎么把这个错误实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1219 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:57 · PVG 01:57 · LAX 09:57 · JFK 12:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.