系统知识 · 分布式系统
分布式系统的三大难题:一致性、可用性、分区容错;从 CAP 到 Raft 与 RPC 一次理清。
知识简介
分布式系统 由多台自治计算机协作,对外呈现单一系统。核心挑战:网络不可靠、时钟不同步、节点会崩溃——由此产生一致性协议与容错设计。
核心概念
- CAP:网络分区(P)必发生;分区时只能二选一:一致性(C)或可用性(A)。
- 一致性模型:强一致(线性一致)、最终一致(BASE)、因果一致。
- 共识算法:Paxos / Raft 让多节点对同一日志达成一致,选举 Leader 后复制日志。
- RPC:跨进程函数调用,序列化(JSON/Protobuf)+ 传输 + 服务发现。
- 分布式事务:2PC/3PC 强一致;Saga / TCC 最终一致,生产多用后者。
代码示例:最终一致计数器(乐观锁)
py
import threading, time
# 简化模拟:多副本 + 版本号冲突检测
class Replica:
def __init__(self, name):
self.name = name
self.value = 0
self.version = 0
self.lock = threading.Lock()
def write(self, value, expect_version):
with self.lock:
if expect_version != self.version:
return False # 冲突,拒绝
self.value = value
self.version += 1
return True
a, b = Replica("A"), Replica("B")
# 客户端同时写不同副本 -> 版本冲突,业务层做合并
assert a.write(1, 0) is True
assert b.write(2, 0) is True # 冲突被拒,需重读合并代码示例:Raft 心跳选举简化示意
py
import random, time
class Node:
def __init__(self, nid, peers):
self.id, self.peers = nid, peers
self.term = 0
self.leader = None
self.voted_for = None
def become_candidate(self):
self.term += 1
self.voted_for = self.id
# 实际实现:向 peers 发送 RequestVote RPC
# 超时随机化 150-300ms 避免同时选举
return random.randint(150, 300) / 1000
def on_timeout(self):
delay = self.become_candidate()
time.sleep(delay)
# 收到多数派投票 -> 成为 Leader,开始心跳
print(f"node{self.id} term{self.term} -> leader?")
# 说明:Raft 的完整实现需处理日志复制、任期比较、安全校验学习路径
- 读《Designing Data-Intensive Applications》(DDIA)前三章。
- 用 Python 实现一个带心跳的迷你 Raft 选举。
- 手写 JSON-RPC 服务,理解序列化与超时重试。
- 选型对比:etcd(Raft)/ ZooKeeper(ZAB)/ Redis Cluster(Gossip)。
来源参考
GitHub 关键词:raft-zh_cn、mini-raft、distributed-systems-labs(链接可替换为实际仓库地址)。