Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RedLock实现分布式锁 #567

Open
guozhongdong opened this issue Nov 23, 2019 · 2 comments
Open

RedLock实现分布式锁 #567

guozhongdong opened this issue Nov 23, 2019 · 2 comments

Comments

@guozhongdong
Copy link

@guozhongdong guozhongdong commented Nov 23, 2019

刚学习到这,有几处问题实在理解不了,希望博主不吝赐教一下:
1、redlock 中的多个节点跟平时理解的redis的集群模式 是不是一回事呢?
2、各个节点之间是如何同步数据的呢?

@Snailclimb

This comment has been minimized.

Copy link
Owner

@Snailclimb Snailclimb commented Nov 27, 2019

刚学习到这,有几处问题实在理解不了,希望博主不吝赐教一下:
1、redlock 中的多个节点跟平时理解的redis的集群模式 是不是一回事呢?
2、各个节点之间是如何同步数据的呢?

你好 这篇文章是读者投稿的,对于 RedLock实现分布式锁 这部分我的了解不多,可能需要自己详细学习一遍才能为你解答。
希望其他小伙伴知道的话可以为你解答。

@LiWenGu

This comment has been minimized.

Copy link
Contributor

@LiWenGu LiWenGu commented Nov 27, 2019

如果有错误请指正。


先说答案:

  1. 不一回事
  2. 不同步

之前研究过一段时间,用的是 Redisson 框架,这里是 Redission 实现 Redlock 的官方文档 。以下为个人见解,可能有误

背景

  1. 平时理解的 Redis 的集群模式:http://www.redis.cn/topics/cluster-tutorial.html
  2. Redlock 多节点:http://redis.cn/topics/distlock.html

重点如下:

  1. 集群模式:Redis 集群是一个提供在多个Redis间节点间共享数据的程序集。

  2. Redlock:有 N 个 Redis master。这些节点完全互相独立,不存在主从复制或者其他集群协调机制。

这里 Redlock 的使用有四个要求,一是需要 N 个 Redis master,二是节点独立、三是不存在主从复制、四是不存在集群协调机制。后三个要求其实就说明了,你要用的这些 master 不能同时存在同一个集群中。

以下用图加深理解

两主两从的集群与 Redlock

红框代表的是一个标准的 Redis 集群:它是有六个 Redis 节点间共享数据的程序集。

对于 Redlock 来说,这个集群中的两个 Master 不是互相独立的,而且是有集群协调机制的。因此它们不符合使用 Redlock 的场景。你会想,那我只连接一个 Master 可以吧,是可以的,但是也不是标准的 Redlock 的,因为不符合 N 个 Redis master 要求。

综上:如果你只有一个标准的集群,无论里面有多少个 Master,都是不符合 Redlock 的使用场景的,主要在于一个集群内的 Master 间它们不是互相独立的。

两个独立集群下的 Redlock

红框和蓝框分别代表两个独立的标准的 Redis 集群,它们分别是有三个 Redis 节点间共享数据的程序集。

对于 Redlock 来说,一共有两个符合要求的 Master,因此是符合 Redlock 的使用场景。这两个 Master 的同步只在自己的集群内和 Slave 同步。但是不允许这两个 Master 跨集群间同步,因为如果跨集群同步了,那么就不符合 Master 互相独立的要求了。

复杂的两个独立集群下的 Redlock

这里每个集群内部有两个 Master,此时对于 Redlock 来说,它只认为有一组 Master(Master1-Master2、Master1-Master22、Master11-Master2、Master11-Master22) 是互相独立的。(前提在于这两个集群之间并不同步)

其实这里说的并不严谨。这里涉及 Redis 集群的哈希槽知识,对于客户端来说,连接 Redis 集群时,连接该集群下的任意一个节点即可,集群会自动给你对 key 做 hash,然后映射到不同的 Master 上,因此对于客户端来说,其实一个集群无论里面有多少个 Master 节点,客户端只会以为有一个节点。

总结

  1. Redlock 所说的多节点,指的是,独立的 Master 节点。但是集群模式下的 Master 它们是归属于同一个集群下的 Master 节点,它们互相是不独立的,所以这不是一回事。
  2. 虽然 Redlock 所说的 Master 间不同步,但是为了高可用,这里每个 Master 节点都会有 Slave,用于冗余容灾,它们各自的 Master-Slave 是同步的。

备注

关于图的连线,是直接连接 Master 还是连接集群,其实这里要说一下 Redis-cluster,客户端连接集群时,选择集群的任意一个节点连接,在集群中会自动转发到对应的 Master 做操作。


发现仓库里关于 Redis 的文章基本都是 Copy 的,感觉可以再细化成一篇做为原创文章 PR~💩

如果有错误请指正。

刚学习到这,有几处问题实在理解不了,希望博主不吝赐教一下:
1、redlock 中的多个节点跟平时理解的redis的集群模式 是不是一回事呢?
2、各个节点之间是如何同步数据的呢?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
3 participants
You can’t perform that action at this time.