• 请不要在回答技术问题时复制粘贴 AI 生成的内容
aganlengzi
V2EX  ›  程序员

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

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

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

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

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

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

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

    如果你要是单纯的追求访问(读)速度,并且做好了读写分离,那么应当做成镜像而不是缓存。
    alamaya
    alamaya
    Sep 29, 2019
    41
    @aganlengzi
    看不出来有什么意义,你要更快的本地缓存,那用在同一个进程里面的 memcache 岂不是更快,何必用 redis,还搞同步,你两台机器也许还能搞,以后增加到三台四台十几台的时候还这么同步?
    julyclyde
    julyclyde
    Sep 30, 2019
    42
    从设计上就是错的
    然后你问怎么把这个错误实现
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2027 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 70ms · UTC 16:29 · PVG 00:29 · LAX 08:29 · JFK 11:29
    ♥ Do have faith in what you're doing.