惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
WordPress大学
WordPress大学
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
V
Visual Studio Blog
Cisco Talos Blog
Cisco Talos Blog
Microsoft Azure Blog
Microsoft Azure Blog
S
Securelist
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
N
News and Events Feed by Topic
Recorded Future
Recorded Future
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
L
Lohrmann on Cybersecurity
U
Unit 42
Hacker News: Ask HN
Hacker News: Ask HN
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
PCI Perspectives
PCI Perspectives
H
Help Net Security
C
Cisco Blogs
爱范儿
爱范儿
Recent Announcements
Recent Announcements
Google DeepMind News
Google DeepMind News
小众软件
小众软件
T
Tor Project blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Schneier on Security
Schneier on Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
www.infosecurity-magazine.com
www.infosecurity-magazine.com
IT之家
IT之家
J
Java Code Geeks
人人都是产品经理
人人都是产品经理
Spread Privacy
Spread Privacy
T
The Blog of Author Tim Ferriss
Application and Cybersecurity Blog
Application and Cybersecurity Blog
AI
AI
S
Security @ Cisco Blogs
T
Tenable Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
aimingoo的专栏
aimingoo的专栏
Cloudbric
Cloudbric
D
Docker
W
WeLiveSecurity
Hacker News - Newest:
Hacker News - Newest: "LLM"
F
Fortinet All Blogs
The Hacker News
The Hacker News
Help Net Security
Help Net Security

pseudoyu

周报 #106 - OpenClaw 实践、搬家与生活的能量 周报 #105 - 打破无聊的社会 2025 年末回顾 - Anything different is good 周报 #104 - 被遗忘的生活一隅 周报 #103 - 工作随想与被吞噬的生活 周报 #102 - 我是如何使用 AI 的 周报 #101 - 消失了三个月,我的生活发生了什么变化 周报 #100 - 过去这十年 周报 #99 - 离开 RSS3,迷茫与重启人生 周报 #98 - 生活之书与 Agentic Coding 周报 #97 - 日本旅行小记 28 岁的自白:去找寻自己 周报 #96 - 基于 Roo Code/Cursor 的 iOS 开发工作流 周报 #95 - All AI 与 No AI 周报 #94 - 生活的界限与真实感 周报 #93 - 婚礼纪录片与失落的电影院 周报 #92 - 数码产品 Porn 与断舍离 周报 #91 - 一席、消失的时代与自由意志 周报 #90 - OVH 服务器、Coolify 与对 AI Coding 的思考 周报 #89 - 博客改版与 TheWan App 发布 周报 #88 - 方大同、《回留》与人生清单 周报 #87 - 我们主持了自己的宝可梦婚礼,还为它办了一个展 周报 #86 - 用影像打败时间 周报 #85 - 京华烟云 Moment in Peking 周报 #84 - 想起他们 Echos of Reverie 周报 #83 - 年初收纳(房间、设备、服务、软件) 周报 #82 - Brand New Year 与写日记 2024 年末回顾 - 不完美的日子 周报 #81 - Engaged -> Married 与时间的尺度 周报 #80 - 关于求婚、爱情与婚姻 求婚誓言 | 爱的本质是被看见 周报 #79 - 清迈旅居、曼谷之行与 Follow RSSHub 开发实践 #01:Telegram 频道 RSS 订阅实现与部署方案 Follow —— 信息获取的另一种形态 周报 #78 - NAS、Chromebook 与 Zeabur 折腾小记 周报 #77 - 一间只属于自己的房间(对亲密关系的思考) 周报 #76 - 关于 Adulting 的思考 周报 #75 - 回答 Dayu 关于独立博客的 9 个问题 周报 #74 - 清迈异闻录 周报 #73 - 《社交网络》、Ego 与中秋的现充生活 周报 #71 - Indie App 体验计划 周报 #70 - 消失的附近,Burnout 与 Boreout 周报 #69 - AI Coding 体验与学习的源动力 周报 #68 - 关于写博客这件事与我生活的色彩 使用 GoatCounter 与 Zeabur 搭建网站数据统计系统 周报 #67 - 使用 follow 重塑我的信息输入系统 周报 #66 - 10x 工程师、技术热情与个人工具箱 从零开始搭建你的免费博客评论系统(Remark42 + fly.io) 周报 #65 - Adventure X 体验、Apple Notes 笔记实践与 EpubKit 周报 #64 - 生活在此处(《斯通纳》与《Normal People》) 使用 WebP Cloud 与 Cloudflare WAF 为你的图床添加隐私和版权保护 当云服务器崩溃时,我是如何救援重要数据的 周报 #63 - 不愉快的订花经历、商家和消费者与日渐 AI 化的人 从零开始搭建你的免费图床系统(Cloudflare R2 + WebP Cloud) 2024 年了,我的博客有了什么变化 周报 #62 - 香港之行、5am club 计划与 Rust 学习 周报 #61 - 好朋友的婚礼与对婚姻的思考 27 岁的自白:成长是一件很扫兴的事 周报 #60 - 虫子旁、教育理念与 EpubKit 周报 #59 - 沙漠之行、家庭与家人 周报 #58 - 远程工作这一年 周报 #57 - 生活在别处(巴厘岛之行) 周报 #56 - 面基 Randy 与考科目二 周报 #55 - 油画体验、博客系统升级与对 self-hosting 的思考 周报 #54 - 漂流计划、钱包被盗与 Home Server 周报 #53 - 空白的三个月、生活漂流与春节 周报 #52 - 自谦型人格与感情的另一个视角 周报 #51 - 追星小鹿 Lawrence 与生病 周报 #50 - 天坛漫步、重拾阅读和费曼学习法 周报 #49 - 烧焦的键盘、庞贝神话展、健康调整与神奇的梦 周报 #48 - 内蒙之行、清迈游民、重启的周报与生活 周报 #47 - 采访、拳击与工作状态 周报 #46 - 告别长发、周报初心与合约开发 个人信息获取与知识管理系统(Heptabase + Logseq + Readwise) 周报 #45 - 读书笔记、知识管理与双城生活 周报 #44 - 静寂工人、xLog 与日常 周报 #43 - In the Mood for Love 周报 #42 - 感情观、生活状态与自我 周报 #41 - 生日的仪式感、时间管理与北京之行 26 岁的自白:推石头的人 周报 #40 - 开源之夏、代码之外与流逝的睡眠 周报 #39 - 初患新冠、过去的心绪与失而复得的分享欲 周报 #38 - Foundry、Logseq 与 Surge Ponte 周报 #37 - 浮生半月闲( 武汉 | 香港 | 五月天) 周报 #36 - 肠胃炎、捏捏近况与新的旅途 周报 #35 - 登报、搬家和生病的捏捏 周报 #34 - Don't Stop the Clocks 周报 #33 - 北京 x 故事 x 离别 周报 #32 - 武汉、久别重逢与流动的心绪 周报 #31 - 开源、前端开发与 ChatGPT 实践 周报 #30 - 开源预算、写作初心与对技术的谦卑 Cosmos 区块链架构与 Tendermint 共识机制 周报 #29 - 日语学习经验、Steam Deck 与居酒屋 周报 #28 - Mastodon、故乡与捉迷藏的猫 周报 #27 - 何以为家 周报 #26 - 博客、客制化键盘和新服务器 周报 #25 - 基于 Crossbell 的个人信息输出与同步系统(重构) 摄影集 #02 - Moment In Peking (The Autumn) 摄影集 #01 - Cat In The Box 2022 年末回顾 - 迷茫、低谷与改变
分布式系统与区块链共识机制
pseudoyu · 2021-09-08 · via pseudoyu

前言

随着互联网系统日益复杂,大多数系统都从单体架构转向分布式架构,而在区块链这样以分布式技术为基础的技术更是高度依赖数据一致性和共识机制。

本文将介绍分布式系统一致性、共识的概念与其在区块链中的实际应用与发展。

分布式系统

一致性问题

随着业务场景的复杂化,同一个业务往往也由多台服务器组成集群提供服务,但如何在这些物理位置和运行状态都不同的系统中达成一致成为了分布式领域的重要问题。

一般而言,分布式系统达成一致有以下三点规范:

  1. 可终止性
  2. 约同性
  3. 合法性

分布式事务需要保障能在有限的时间内达成一致的结果,该结果必须是由某个节点提出的提案且不同节点必须完成相同的决策。

强一致性

想在单体应用或者各个节点的性能、网络带宽等配置在理想状况下做到这一点很容易,然而,在真实的业务场景中,要实现这样的强一致性成本非常高,需要保障系统的绝对稳定性、系统与系统之间的通讯没有延迟,此外,强一致性也会降低系统的性能和拓展性。

在强一致性情况下,任何时刻所有节点中的数据都是一样的。强一致性通常又包括顺序一致性和线性一致性两种。

顺序一致性

顺序一致性要求所有进程的全局执行顺序和各个进程自身的顺序保持一致,但并不要求物理时间上对各个进程保持全局的顺序。因此,这也是一种相对实践性较强的做法。

线性一致性

线性一致性在顺序一致增加了需要对进程间进行全局排序的规则,要求所有时刻所有进程的操作都是实时同步的。这种绝对一致性往往在实践中很难实现,需要通过全局锁或者一些复杂的同步算法实现,且往往以牺牲性能为代价。

弱一致性

而在真实的业务场景里,往往并不需要实时同步这样的绝对一致状态,因此可以容忍部分访问或在一段时间后最终达成一致。这些在某些方面弱化了的一致性称为弱一致性。

共识机制

共识机制是指在分布式系统中多个节点对某个事务达成一致的机制,关于共识的达成,有以下几种理论和原则:

  • FLP 不可能原理
  • CAP 原则
  • ACID 原则
  • BASE 理论
  • 多阶段提交

FLP 不可能原理

FLP 不可能原理是 Fischer、Lynch 和 Patterson 三位科学家提出的一种理论,即在一个网络可靠但允许节点失效(如停机)的异步系统中,不可能在有限时间内完成共识。

异步是指系统各个节点之间的时间等存在差异性,导致无法判断消息未响应是由于节点故障还是传输过程中的故障,因此无法判断消息是否丢失。

CAP 原则

而在工程实践中,往往会弱化某一部分的需求以满足真实业务场景的需求。CAP 原则就是来解决这一问题,CAP 是指:

  • Consistency,一致性
  • Availability,可用性
  • Partition,分区容错性

分布式系统无法同时保障这三点,最多能保障其中两个特性,那这个原理有哪些实际应用呢?

  1. AP 系统,在静态网站、非实时性数据库等业务场景下,可以弱化其一致性,如新版本上线后一段时间才达成一致。
  2. CP 系统,在银行转账等对一致性要求绝对敏感的场景下,可以弱化其可用性,如当系统故障或失败时拒绝服务。
  3. AC 系统,两阶段提交和一些关系性数据库则弱化网络分区,如 ZooKeeper 等。

ACID 原则

分布式数据库的事务需要牺牲部分可用性来达到一致性,需要遵循 ACID 原则,具体如下:

  • Atomicity,原子性。事务的所有操作要么全部执行,要么全部不执行,失败则全部回退。
  • Consistency,一致性。事务执行前后状态需要一致,不存在中间状态。
  • Isolation,隔离性。多个事务可以并发执行但彼此之间相互独立。
  • Durability,持久性。状态改变是永久的。

BASE 原则

BASE 原则是指:

  • Basically Available,基本可用
  • Soft State,软状态
  • Eventual Consistency,最终一致

这是一种牺牲强一致性来实现整个系统的方案,即只保障最终一致性。

多阶段提交

两阶段提交是将事务提交过程分解为预提交和正式提交两个阶段以避免冲突,但仍然存在同步阻塞、单点故障、数据一致性等问题。

TCC 事务机制则主要分为:

  • Try 阶段
  • Confirm 阶段
  • Cancel 阶段

在 Try 阶段对业务进行检查并预留业务资源,在 Confirm 阶段使用资源执行业务,Cancel 阶段取消执行并释放资源。这种方式是对两阶段提交多作了一些业务上的处理,但因为拆分成了三个接口进行,代码复杂性提升了。

三阶段提交引入了超时机制,并在两阶段提交的第一阶段加入了一个尝试预提交环节,主要解决了单点故障和阻塞问题。

共识算法

根据容错类型(是否会有恶意节点),我们把共识算法分为非拜占庭容错(Crash Fault Tolerance, CFT)和拜占庭容错(BFT, Byzantine Fault Tolerance)两种。

CFT (Crash Fault Tolerance)

分布式系统中存在故障节点但不存在错误节点的场景称为 CFT,在这种场景下,消息可能丢失或者重复,但不会错误,在这种条件下如何达成共识是真实世界中非常常见的需求。

Paxos

Paxos 算法原理类似于两阶段提交,设定了三种逻辑节点,提案者、接受者和学习者。由提案者提出提案,接受者对提案进行投票并接受提案,而学习者获取提案结果并广播。

只有提案者提出的提案才可能会批准,而所有节点都可以竞选成为提案者,但每一轮共识只有唯一的一个提案者提提案,这种机制保障了一定的公平性。

然而,Paxos 只能保障一定条件下的共识,当超过半数的节点参与时才会正常运作。

Raft

由于 Paxos 算法实现起来比较困难,出现了许多变体,如 Fast Paxos、Multi-Paxos 等,其中比较有代表性的就是 Raft 算法。

Raft 将一致性过程拆分为领导者选举、日志复制和安全性三个子问题,设定了领导者、候选者和跟随者三种逻辑节点。

所有节点的初始状态都是跟随者,想参与领导者竞选则转变为候选者并提出选举请求,如超过一半票数则成功在本次任期称为领导者。

领导者会处理所有请求并将日志同步至跟随者,并且会定期给所有跟随者发送心跳消息,如果出现故障,心跳消息超时未收到,则会发起新的选举过程。

BFT (Byzantine Fault Tolerance)

Byzantine Fault Tolerance, BFT

拜占庭容错算法则主要是用来处理网络中存在恶意节点的场景,主要是对拜占庭问题的解决,在恶意节点不超过 1/3 的情况下可以有效达成共识,但复杂度非常高(指数级)。

Practical Byzantine Fault Tolerance, PBFT

PBFT 是对 BFT 算法的优化,采用了 RSA 签名算法、消息验证、摘要等密码学技术,结合 Paxos 等相关算法,最后将算法复杂度降到了平方级。

在 PBFT 算法实现中,首先选取(随机/轮换)某个节点,设定其逻辑节点为主节点。主节点在自己的 View 内接收客户端的请求并广播(使用三阶段提交机制,见上文)至其他节点,当所有节点完成处理请求后将结果返回给客户端,如果收到了至少来自 2f + 1 个不同节点的相同结果,则共识完成。

  • 尝试预提交:主节点收到消息后进行签名并向其他节点广播
  • 预提交:其他节点收到消息后进行核对,合法则向签名并向其他节点广播,其他节点也进行核对
  • 正式提交:对消息签名并广播提交状态,如经过 2f + 1 个验证,则系统完成共识

其他

除了 PBFT 外,PoW、PoS、HotStuff 等也广泛应用于比特币、以太坊、Libra 等区块链项目,并在不断优化中,拜占庭容错类算法因为效率不高,大多用于公有链环境,而联盟链则多采用 非拜占庭容错的方式,辅之以权限控制等方式来平衡性能和安全性。

总结

以上就是对分布式系统与区块链共识机制的概念和实际应用总结,之后也会对各类业界投入使用的共识算法作更深入的剖析。

参考资料

  1. 区块链原理、设计与应用
  2. 分布式事务,这一篇就够了
  3. 理解 TCC、2PC 和 3PC
  4. 【共识专栏】共识的分类(上)
  5. 【共识专栏】共识的分类(下)