Coder Social home page Coder Social logo

Comments (15)

spinlock avatar spinlock commented on August 29, 2024

CodisLabs/codis#318 参考这个最后的回复

没有办法严格确定达到同步状态。所以实际操作是,判断大致同步时:停止对 master 所有操作,一定时间之后,将所有操作切换到 slave。这里一定时间,取决于服务对一致性的容忍性,例如,如果 redis 只作为 cache 的话,这个一定时间可以非常短。

另外,因为 redis 的 master-slave 同步是流式的协议,没有提供判断严格一致性的方法。

from redis-port.

foolish-boy avatar foolish-boy commented on August 29, 2024

master停止写之后,有可能缓冲区还有未同步的数据吧?这里还是会自动写到slave里吧?可不可以通过判断slave端的写命令有否增加(用info commandstats)来决定切换的时机呢?

from redis-port.

spinlock avatar spinlock commented on August 29, 2024

但是怎么才能确定 "info commandstats 没有增加" 与 "同步完成" 这两件事之间是等价的呢?

from redis-port.

spinlock avatar spinlock commented on August 29, 2024

其实这也是我为什么说 HA 并不可靠的原因。所以正确的做法,

  1. 发出警报
  2. 确认 master 已经死掉了 (确定 master 进程已经退出了,或者所有 slave 都已经断开了)
  3. 手动通过 dashboard 切换主从

除此之外,codis2.x 上的主从切换不是通过2阶段提交完成的,也就是如果旧的 master 还没有断,就存在主从切换过程中,一部分请求写到旧的 master, 一部分请求写到新的 master 的情况发生。

这与 redis 主从同步模型的设计有关,根本没有办法做到主从之间完全一致的同步。

from redis-port.

foolish-boy avatar foolish-boy commented on August 29, 2024

我解释清楚一点哈:
我实际上是想做一个容灾恢复的工具。在每个redis之上还有一个类似你们codis-proxy作用的模块,姑且称之为S。 那redis1对应S1,redis2对应S2。正常情况下,这两组redis+S形成镜像,时刻保持一致,即数据到S1, S1到redis1, S1到S2, S2到redis2这样的流程。突然S2挂掉了,就只有S1+redis2工作,一段时间之后,就要恢复这个S2+redis2,重新恢复上面的数据流程。
所以,我的想法是利用redis-port的同步功能,先redis1与redis2做同步,判断两者的offset相差不大时,认为大致相等,然后阻塞对S1的写,然后再通过判断slave端的写命令有否增加(用info commandstats)来决定同步结束。
判断info commandstats的时间里,S1里阻塞的写请求会缓存。那现在同步结束后,就放开S1的请求,这时所有的缓存请求就会按照原来的流程到redis1、S2、redis2。接下来又是镜像。。。

不知道我的思路有没有什么问题?

from redis-port.

yangzhe1991 avatar yangzhe1991 commented on August 29, 2024

没太明白你的需求。你是有俩redis,想用redis-port让两者的数据同步?那么为啥不直接让redis2挂成redis1的slave?

from redis-port.

foolish-boy avatar foolish-boy commented on August 29, 2024

嗯 我们的应用场景是做热备的,redis之上有S,数据是先到S再到redis的,两个redis不直接通信的。所以正常情况redis1与redis2没有主从关系的,是各自独立的。

from redis-port.

yangzhe1991 avatar yangzhe1991 commented on August 29, 2024

对,所以你们的应用场景为什么不能直接改成两个redis有主从关系……这跟上层有没有那个S关系不大吧

from redis-port.

yangzhe1991 avatar yangzhe1991 commented on August 29, 2024

而且你既然是热备,应该是得让slave的数据尽可能和master同步对吧,那为什么会有判断同步结束的需求呢,应该随时有新数据随时备份到slave上?

from redis-port.

foolish-boy avatar foolish-boy commented on August 29, 2024

额。。因为必须在redis之上有一个S层做数据处理,还要做热备,所以不可能master、slave都挂在一个S下面嘛,要不然S挂掉就不能用了。那两个S之间其实就是类似master与slave的,而不是两个 redis之间。
正常情况是随时备份到slave S上的,这不slave S挂掉了嘛。
另外,这框架也是CTO一开始设计好的,一时半会也不好改,这个功能又比较急。。。

from redis-port.

yangzhe1991 avatar yangzhe1991 commented on August 29, 2024

那S是只负责处理数据还是也负责存储数据?如果全部数据都存在redis上,为啥不能直接让redis自己去同步?

from redis-port.

yangzhe1991 avatar yangzhe1991 commented on August 29, 2024

而且,即使真的需要绕一下,也不需要用redis-port吧?直接先让redis2挂在redis1下同步数据,然后同步完了slaveof no one就可以了?

from redis-port.

foolish-boy avatar foolish-boy commented on August 29, 2024

问题是直接挂着,更没办法判断同步完成啊,不方便操作啊。
我只是想问问我的那种办法有什么问题不?毕竟redis-port太细节的还是没看明白。

from redis-port.

yangzhe1991 avatar yangzhe1991 commented on August 29, 2024

你不是想用info commandstats的数据变化(应该是某个命令的calls数的变化吧?)来判断是否同步完成嘛,这个直接把redis2挂到redis1同步不是一样可以的嘛……

from redis-port.

moooofly avatar moooofly commented on August 29, 2024

问题其实问的挺好的

个人意见,应该可以通过 master 和 slave 上各自的 offset 来判断

from redis-port.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.