diff --git a/notes/pics/fencing-token.png b/notes/pics/fencing-token.png new file mode 100644 index 00000000..9f714c3e Binary files /dev/null and b/notes/pics/fencing-token.png differ diff --git a/notes/pics/paxos-example.png b/notes/pics/paxos-example.png new file mode 100644 index 00000000..3f66cdbf Binary files /dev/null and b/notes/pics/paxos-example.png differ diff --git a/notes/分布式.md b/notes/分布式.md index 5653b23d..1e26e4c3 100644 --- a/notes/分布式.md +++ b/notes/分布式.md @@ -89,6 +89,8 @@ Redis 8.4 新增了 `DELEX lock_key IFEQ unique_value` 指令,可以直接原 RedLock 依赖各个节点的时钟基本同步,并且无法应对进程暂停(例如 GC)导致锁过期后客户端仍然认为自己持有锁的情况,因此存在争议。更可靠的做法是让锁服务每次加锁时返回一个单调递增的栅栏令牌(Fencing Token),客户端访问资源时带上令牌,资源拒绝令牌比已处理过的更小的请求。 +

+ ### Zookeeper 的有序节点 #### 1. Zookeeper 抽象模型 @@ -332,6 +334,8 @@ Acceptor 接受一个提议之后,会将该提议发送给所有的 Learner。 - A 发送 Prepare(2),X 和 Y 做出承诺并响应。A 得到大多数响应之后发送 Accept(2, 8),X 和 Y 接受该提议,此时值 8 已经被选定; - 之后 B 发送 Prepare(4),它收到的大多数响应中至少有一个来自 X 或 Y,响应中包含已经接受过的提议 [2, 8],因此 B 只能发送 Accept(4, 8),而不能使用自己的提议值,从而保证了选定的值不会改变。 +

+ ### 约束条件 #### 1\. 正确性 diff --git a/tools/diagram/src/fencing-token.svg b/tools/diagram/src/fencing-token.svg new file mode 100644 index 00000000..d6f2f6fd --- /dev/null +++ b/tools/diagram/src/fencing-token.svg @@ -0,0 +1,59 @@ + + + + + + + + + + + + 栅栏令牌 + + + + + + + 客户端 1 + + + 锁服务 + + + 客户端 2 + + + 存储 + + 获取锁 + + 成功,令牌 33 + + + GC 停顿 + 锁过期 + + 获取锁 + + 成功,令牌 34 + + 写入,令牌 34 + 接受,记录 34 + + 写入,令牌 33 + 拒绝,33 < 34 + diff --git a/tools/diagram/src/paxos-example.svg b/tools/diagram/src/paxos-example.svg new file mode 100644 index 00000000..28e0bcc7 --- /dev/null +++ b/tools/diagram/src/paxos-example.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + Paxos 示例 + + + + + + + + Proposer A + + + Acceptor X + + + Acceptor Y + + + Acceptor Z + + + Proposer B + + Prepare(2) + + Prepare(2) + + 承诺 + + 承诺 + + Accept(2, 8) + + Accept(2, 8) + + 接受 + + 接受 + X、Y 构成多数派,值 8 已被选定 + + Prepare(4) + + Prepare(4) + + 承诺 + + 承诺,已接受 [2, 8] + + Accept(4, 8) + + Accept(4, 8) + B 只能沿用值 8,不能使用自己的提议值 +