系统知识 · 分布式系统

分布式系统的三大难题:一致性、可用性、分区容错;从 CAP 到 Raft 与 RPC 一次理清。

系统知识 技术栈:概念 + Go/Python 示例 来源:GitHub 参考

知识简介

分布式系统 由多台自治计算机协作,对外呈现单一系统。核心挑战:网络不可靠、时钟不同步、节点会崩溃——由此产生一致性协议与容错设计。

核心概念

  • 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 的完整实现需处理日志复制、任期比较、安全校验

学习路径

  1. 读《Designing Data-Intensive Applications》(DDIA)前三章。
  2. 用 Python 实现一个带心跳的迷你 Raft 选举。
  3. 手写 JSON-RPC 服务,理解序列化与超时重试。
  4. 选型对比:etcd(Raft)/ ZooKeeper(ZAB)/ Redis Cluster(Gossip)。

来源参考

GitHub 关键词:raft-zh_cnmini-raftdistributed-systems-labs(链接可替换为实际仓库地址)。