Skip to content

Commit

Permalink
small fix
Browse files Browse the repository at this point in the history
  • Loading branch information
cjc7373 committed Dec 28, 2023
1 parent 325980b commit 3cb709c
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 5 deletions.
6 changes: 3 additions & 3 deletions content/posts/2023/MIT_6.824_2_Raft/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,9 +141,9 @@ snapshot 的创建过程依赖于上层应用,因为 Raft 对于状态机里

client 只会和 leader 交互,在 client 刚启动时,它可能会连接到一个随机的 server,若该 server 不为 leader,则 server 会拒绝这个请求并提供 leader 的信息。

Raft 的目标是提供可线性化(linearizable)的语义,即每个操作会在调用和回复之间的某个时间立刻执行执行一次(exactly once)。然而,Raft 可能会执行一个操作多次,如果 leader 在 commit log entry 之后回复 client 之前崩溃了,client 会重试请求,导致一个操作执行了两次。这个问题的解决方案是对每个操作分配一个独特的序列号,如果 leader 收到了一个请求包含已经被执行的序列号,那么它就不会再次执行这个请求。
Raft 的目标是提供可线性化(linearizable)的语义,即每个操作会在调用和回复之间的某个时间立刻执行执行一次(exactly once)。然而,Raft 可能会执行一个操作多次,如果 leader 在 commit log entry 之后回复 client 之前崩溃了,client 会重试请求,导致一个操作执行了两次。这个问题的解决方案是每个 client 为对每个操作分配一个递增的序列号,leader 维护每个 client 最新的序列号。如果 leader 收到了一个请求包含已经被执行的序列号,那么它就不会再次执行这个请求。

如果没有额外的措施,读请求可能会读到过时的(stale)数据如由于网络分区当前 leader 已经被新的 leader 取代了,但是当前 leader 并不知道这一点。为了保证不会读到过时的数据,在 leader 刚当选时它必须发送一个 no-op entry,以便找出哪些 entry 已经 commit 了。其次 leader 必须检查它是否被新的 leader 取代了,这可以通过发送心跳包来检查是否有多数 server 回应来实现。
我们能够不向 log 写任何东西就处理读请求(Read-only operations),然而如果没有额外的措施,读请求可能会读到过时的(stale)数据如由于网络分区当前 leader 已经被新的 leader 取代了,但是当前 leader 并不知道这一点。为了保证不会读到过时的数据,在 leader 刚当选时它必须发送一个 no-op entry,以便找出哪些 entry 已经 commit 了。其次 leader 必须检查它是否被新的 leader 取代了,这可以通过发送心跳包来检查是否有多数 server 回应来实现。

## Notes

Expand Down Expand Up @@ -173,7 +173,7 @@ Raft 的目标是提供可线性化(linearizable)的语义,即每个操作

![image-20231001151618755](./image-20231001151618755.png)

##
我的理解是 Linearizability 是从外部观测获得的一种性质,它并没有说明具体的实现。

## 参考

Expand Down
10 changes: 8 additions & 2 deletions content/posts/2023/git_入门/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,17 @@ git 中最基础的元素是 object,每个 object 由一个 object ID (OID)

- `blobs`: 存储文件内容,OID 即为文件内容的哈希

- `trees`: 一个文件名(path entries)的有序列表,OID 为这个列表的哈希。子目录同样是 trees。项目的根目录即为 root tree。所有的 trees 构成了一棵 Merkle tree,~~所以 git 就是区块链(即答~~。下图中三角代表 trees,方块为 blobs
- `trees`: 一个文件名(path entries)的有序列表,OID 为这个列表的哈希。列表的每一行如下:

```
100644 blob 1fc4aa8f76027dd0fb8f9b533810770236d5c234 .gitignore
```

容易推测这几个字段分别为权限、object 类型、哈希、文件名。子目录同样是 trees。项目的根目录即为 root tree。所有的 trees 构成了一棵 Merkle tree,~~所以 git 就是区块链(即答~~。下图中三角代表 trees,方块为 blobs

![image-20230918111328708](./image-20230918111328708.png)

- `commits`: 一个**快照**(snapshot),每个 commit 包含了一个到根 tree 的引用,和一个(或多个)到 parent 的引用。parent 就是上一个 commit 的 OID。在一个 merge commit 中会包含多个 parents。下图中圆形代表 commits
- `commits`: 一个**快照**(snapshot),每个 commit 包含了一个到根 tree 的引用,和一个(或多个)到 parent 的引用。parent 就是上一个 commit 的 OID。在一个 merge commit 中会包含多个 parents。由于 Commit 存储的是快照而不是 diff,所以 Git checkout(切换分支)的速度很快。下图中圆形代表 commits

![image-20230918111515508](./image-20230918111515508.png)

Expand Down

0 comments on commit 3cb709c

Please sign in to comment.