-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit ce4c0f6
Showing
107 changed files
with
10,006 additions
and
0 deletions.
There are no files selected for viewing
Binary file added
BIN
+3.68 MB
学习资料/C++刷题/LeetCode 101 - A LeetCode Grinding Guide (C++ Version).pdf
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Submodule Resume-for-2024-Autumn-Recruitment
added at
59df50
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,107 @@ | ||
# 分布式存储系统中的日志、快照和状态机 | ||
|
||
在分布式存储系统中,日志、快照和状态机是确保数据一致性和高可用性的关键概念。下面将详细介绍这些概念,并使用图示进行解释。 | ||
|
||
## 1. 日志(Log) | ||
|
||
### 定义 | ||
日志是记录系统操作历史的顺序条目。每当系统执行一项操作时,该操作会被记录为日志条目。日志条目通常包括操作的类型、操作的具体内容(如命令)、操作的时间戳、操作的索引等。 | ||
|
||
### 作用 | ||
- **持久化操作**:记录所有对系统状态的修改操作,以便在系统崩溃或重启后可以重放这些操作来恢复系统状态。 | ||
- **确保一致性**:在分布式系统中,各个节点通过复制相同的日志条目来保持状态的一致性。 | ||
|
||
|
||
## 2. 快照(Snapshot) | ||
|
||
### 定义 | ||
快照是系统在某个时间点的完整状态的持久化存储。它包含了所有应用到该时间点的日志条目的结果。快照可以用于快速恢复系统状态,而不必从头重放所有日志条目。 | ||
|
||
### 作用 | ||
- **加速恢复**:在系统崩溃或重启后,可以通过加载快照快速恢复系统状态,而不必重放所有日志条目。 | ||
- **节省存储**:定期生成快照并删除旧的日志条目,可以减少存储空间的占用。 | ||
|
||
|
||
|
||
## 3. 状态机(State Machine) | ||
|
||
### 定义 | ||
状态机是指根据输入(如命令、操作)和当前状态来决定下一状态和输出的计算模型。状态机在分布式系统中用于执行日志条目中记录的操作,从而变更系统的状态。 | ||
|
||
### 作用 | ||
- **执行日志条目**:将日志条目中的命令应用到状态机中,从而更新系统状态。 | ||
- **保持一致性**:各个节点的状态机通过执行相同的日志条目来保持状态的一致性。 | ||
|
||
|
||
## 总结 | ||
- **日志**:记录系统操作的顺序条目,用于持久化和恢复系统操作。 | ||
- **快照**:系统在某个时间点的完整状态,用于加速恢复和节省存储空间。 | ||
- **状态机**:根据输入和当前状态来决定下一状态和输出的计算模型,用于执行日志条目并更新系统状态。 | ||
|
||
通过日志和快照的结合,分布式存储系统能够高效地恢复系统状态,并通过状态机确保系统操作的一致性。 | ||
|
||
|
||
|
||
# 分布式存储系统中的任期和索引 | ||
|
||
在分布式存储系统中,任期(term)和索引(index)是用于维护系统一致性和操作顺序的关键概念。下面将详细介绍这些概念,并解释它们在系统中的作用。 | ||
|
||
## 1. 任期(Term) | ||
|
||
### 定义 | ||
任期是指系统中领导者(Leader)在其任职期间的一个时间段。每个任期都有一个唯一的编号,用于区分不同的任期。任期编号在系统启动时从0开始,每当有新的选举发生时,任期编号都会递增。 | ||
|
||
### 作用 | ||
- **领导选举**:任期用于领导选举过程中的标识。每次选举新领导时,当前任期都会递增。 | ||
- **日志一致性**:任期号是日志条目的一部分,用于确保日志条目在不同节点之间的一致性。领导者在一个任期内所提交的日志条目,都必须拥有相同的任期号。 | ||
- **冲突解决**:在处理网络分区或其他故障时,任期号帮助系统解决日志条目冲突,确保只有最新任期的领导者的操作才会被接受。 | ||
|
||
|
||
## 2. 索引(Index) | ||
|
||
### 定义 | ||
索引是日志条目的序号,用于标识日志条目的顺序。每个日志条目在日志中的位置都有一个唯一的索引,从0开始递增。索引是日志条目的一部分,与任期号一起用于标识和比较日志条目。 | ||
|
||
### 作用 | ||
- **日志顺序**:索引用于维护日志条目的顺序,确保日志条目按照正确的顺序被应用到状态机中。 | ||
- **日志复制**:在日志复制过程中,索引用于比较和同步不同节点的日志条目,确保各节点的日志一致。 | ||
- **日志回滚**:在发生冲突或错误时,索引用于回滚到正确的日志条目位置,确保系统状态的正确性。 | ||
|
||
|
||
## 任期和索引的结合 | ||
任期和索引一起用于标识日志条目,并确保系统在面对网络分区、节点故障等情况时能够正确处理日志冲突和保持一致性。每个日志条目都有一个任期号和索引,这两个值共同决定了日志条目的唯一性和顺序。 | ||
|
||
### 示例 | ||
假设系统中有以下日志条目: | ||
|
||
+-------------+-------------+-------------+ | ||
|
||
| Log Entry 1 | Log Entry 2 | Log Entry 3 | | ||
|
||
| (Term 1, 1) | (Term 1, 2) | (Term 2, 3) | | ||
|
||
+-------------+-------------+-------------+ | ||
|
||
在这个示例中: | ||
- 第一个日志条目属于任期1,索引为1。 | ||
- 第二个日志条目属于任期1,索引为2。 | ||
- 第三个日志条目属于任期2,索引为3。 | ||
|
||
当新的领导者在任期3被选举出来时,它可能会在索引4的位置添加一个新的日志条目: | ||
|
||
+-------------+-------------+-------------+-------------+ | ||
|
||
| Log Entry 1 | Log Entry 2 | Log Entry 3 | Log Entry 4 | | ||
|
||
| (Term 1, 1) | (Term 1, 2) | (Term 2, 3) | (Term 3, 4) | | ||
|
||
+-------------+-------------+-------------+-------------+ | ||
|
||
|
||
## 总结 | ||
- **任期**:用于标识领导者的任期,确保领导选举和日志一致性。 | ||
- **索引**:用于标识日志条目的顺序,确保日志操作按正确顺序执行。 | ||
- **任期和索引的结合**:共同用于唯一标识日志条目,确保分布式系统在面对各种故障时能够正确处理和保持一致性。 | ||
|
||
通过任期和索引的结合,分布式存储系统能够高效地管理日志条目,处理冲突,确保系统的一致性和高可用性。 | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
# Raft算法常见名词及解释 | ||
|
||
1. **节点(Node)**:Raft集群中的服务器,可以是领导者(Leader)、候选者(Candidate)或追随者(Follower)。 | ||
|
||
2. **领导者(Leader)**:负责处理客户端的所有请求,并将日志条目复制到其他节点。例如,在一个三节点集群中,当一个节点被选为领导者后,它负责接收和处理所有客户端的请求。 | ||
|
||
3. **追随者(Follower)**:被动接收来自领导者的日志条目和心跳信息,并响应选举请求。例如,在三节点集群中,除领导者外的两个节点为追随者,它们接收和应用来自领导者的日志条目。 | ||
|
||
4. **候选者(Candidate)**:追随者在无法接收到领导者的心跳后,会发起选举成为候选者,并向其他节点请求投票。例如,当一个追随者在规定时间内没有接收到领导者的心跳消息时,它会变成候选者,发起选举。 | ||
|
||
5. **任期(Term)**:Raft算法中的时间分段,每个任期开始于一次选举,可能由一个或多个领导者组成。任期是递增的整数,例如,第一个任期是1,第二个任期是2,依此类推。 | ||
|
||
6. **日志条目(Log Entry)**:领导者记录的操作指令,用于状态机复制,每个日志条目包含一个命令和对应的任期号。例如,日志条目可以是“set x=5”,在第一个任期内添加的日志条目任期号为1。 | ||
|
||
7. **提交索引(Commit Index)**:已被大多数节点复制并可以安全应用到状态机的最高日志条目的索引。例如,提交索引为5表示前5个日志条目已被大多数节点复制并可以应用到状态机。 | ||
|
||
8. **最后应用索引(Last Applied Index)**:已经应用到状态机的最高日志条目的索引。例如,最后应用索引为5表示前5个日志条目已应用到状态机。 | ||
|
||
9. **心跳(Heartbeat)**:领导者定期发送给追随者的消息,用于维持领导者地位并防止追随者发起选举。心跳信息通常是空的附加日志请求。 | ||
|
||
10. **投票请求(Request Vote)**:候选者发起的选举请求,包含候选者的任期号、日志信息等。例如,当一个节点变为候选者时,它会向其他节点发送请求,请求其他节点投票支持它成为领导者。 | ||
|
||
# Raft算法的重要过程 | ||
|
||
## 选举过程 | ||
|
||
- **超时转换为候选者**: | ||
- 追随者在选举超时后转换为候选者,增加当前任期号,并发起投票请求。例如,如果一个追随者在规定时间内没有接收到领导者的心跳消息,它会变成候选者,增加任期号并发起投票请求。 | ||
|
||
- **发起投票请求**: | ||
- 候选者向其他节点发送投票请求,包含自己的任期号和日志信息。例如,候选者节点A向节点B和C发送投票请求,请求B和C投票支持它成为领导者。 | ||
|
||
- **响应投票请求**: | ||
- 节点接收到投票请求后,如果请求者的任期号较大且日志最新,则投票支持。例如,节点B和C接收到节点A的投票请求后,发现A的任期号较大且日志最新,于是投票支持A。 | ||
|
||
- **当选领导者**: | ||
- 候选者收到大多数节点的投票支持后,当选为领导者,开始发送心跳信息。例如,节点A收到B和C的投票支持后,成为领导者,并开始向B和C发送心跳信息。 | ||
|
||
## 日志复制过程 | ||
|
||
- **领导者接收命令**: | ||
- 客户端发送命令给领导者,领导者将命令作为新的日志条目追加到日志中。例如,客户端发送命令“set x=5”给领导者A,A将此命令作为新的日志条目追加到日志中。 | ||
|
||
- **日志复制**: | ||
- 领导者并行地将日志条目发送给所有追随者。例如,领导者A将新的日志条目“set x=5”发送给追随者B和C。 | ||
|
||
- **日志一致性检查**: | ||
- 追随者在接收到日志条目后进行一致性检查,确认日志条目的任期号和索引号。例如,追随者B和C接收到日志条目后,检查其任期号和索引号,确保日志条目的一致性。 | ||
|
||
- **日志应用**: | ||
- 当一个日志条目被大多数节点复制后,领导者将其标记为已提交,并通知追随者应用该日志条目到状态机。例如,当日志条目“set x=5”被B和C确认复制后,领导者A将其标记为已提交,并通知B和C应用该日志条目到状态机。 | ||
|
||
## 心跳过程 | ||
|
||
- **发送心跳**: | ||
- 领导者定期(通常间隔几百毫秒)发送心跳信息(空的附加日志请求)给追随者,以维持其领导者地位。例如,领导者A每隔几百毫秒发送空的附加日志请求给追随者B和C,作为心跳信息。 | ||
|
||
- **防止选举超时**: | ||
- 追随者在接收到心跳信息后,重置选举超时计时器,防止发起新的选举。例如,追随者B和C接收到领导者A的心跳信息后,重置选举超时计时器,不会发起新的选举。 | ||
|
||
## 日志提交 | ||
|
||
- **日志复制确认**: | ||
- 领导者在接收到大多数节点对日志条目的确认后,更新提交索引。例如,领导者A在接收到B和C对日志条目“set x=5”的确认后,更新提交索引。 | ||
|
||
- **通知追随者提交**: | ||
- 领导者将新的提交索引发送给追随者,通知他们将相应的日志条目应用到状态机。例如,领导者A将新的提交索引发送给追随者B和C,通知他们应用日志条目“set x=5”到状态机。 | ||
|
||
- **状态机应用**: | ||
- 追随者在接收到提交索引更新后,将日志条目应用到状态机。例如,追随者B和C在接收到新的提交索引后,将日志条目“set x=5”应用到状态机。 |
Binary file not shown.
Oops, something went wrong.