写点什么

P2PDB 白皮书

作者:Rock-李益
  • 2022 年 6 月 24 日
  • 本文字数:5232 字

    阅读完需:约 17 分钟

介绍

P2PDB 最早源于 KK 集团离线收银项目的研发,早期采用了 Raft 协议+Sqlite 实现一个轻量级的分布式数据库,随着对 Raft 协议的深入研究,发现 Raft 协议对于离线场景存在较大缺陷(故障节点数量大于 50%,整个集群无法工作),随后开启了深入研究分布式数据库协议的道路,在一年后发现基于默克尔有向无环图+CRDT 实现的逻辑时钟merker-CRDT可以实现最终一致性的去中心化、分布式、点对点数据库,并且针对离线场景做了充分的支持。


P2PDB 是一个点对点数据库,这意味着每个对等点都有自己的特定数据库实例。数据库在对等点之间自动复制,从而在任何对等点更新时生成数据库的最新视图。也就是说,数据库被拉到客户端。


这意味着每个应用程序都包含他们正在使用的完整数据库。与客户端-服务器模型相比,这反过来又改变了数据建模,客户端-服务器模型通常为所有数据使用一个大数据库:在 P2PDB 中,应该根据该数据的访问权限进行存储、“分区”或“分片”。例如,在类似微博的应用程序中,推文不会保存在数百万用户同时写入的全局“推文”数据库中,而是每个用户都有自己的微博数据库。要订阅别的用户推文,只需关注主题(topic)


1、离线优先应用

离线优先 web 浏览器的运行应用程序,可将客户端产生的数据存储在 p2pdb 中,举个实际场景: 在实体行业,线下实体店需要多台收银系统,目前普遍的解决方案是采用在线收银系统,数据交换通过中心化的云服务器,当网络不佳、甚至出现断网时,直接会影响到线下实体店收入,导致线下实体店无法正常营业,而更好的解决方法应该是使用离线存储,当网络恢复后再将数据上报,那么离线情况下数据的一致性如何保障, 使用 raft 协议可以在离线的情况下通过局域网搭建离线存储网络,但是类似 Raft Paxos 强一致性协议有着天然的缺陷,当节点一半以上不可用时,集群将无法工作,线下实体店的收银系统经常会开机及关机、在业务低峰期会关闭多余的收银机,因此需要一种更有效的解决方案。


2、分布式边缘缓存

在全球化的今天,我们经常会浏览各个国家、省份的网站数据,由于服务器节点分布在全球不同范围,导致访问及慢,如从大陆访问美国服务器,具有高延迟。尽管 CDNS 厂商提供了分布式文件云存储,cdns 费用高昂,不是每个网站都能支付得起费用,IPFS 出现优化了这一问题,但是 IPFS 中的 filecoin 仅仅只是解决了文件存储,对于交换数据要求快的数据库存储尚欠缺可行的方案。

3、dapp 去中心化应用场景

dapp 既去中化的应用,也称之为分布式应用,它被认为开启了 web3.0 时代, DApp 通过网络节点去中心化操作。可以运行在用户的个人设备之上,比如:手机、个人电脑等终端设备,DApp 运行在对等网络。不依赖中心服务器,不需要专门的通信服务器传递消息,也不需要中心数据库来记数据。数据保存在用户个人空间,可能是手机,也可能是个人云盘,p2pdb 设计天然符合去中心化标准,会成为 dapp 应用程序数据存储的绝佳选择。

4、多人在线协作

客户端应用多人在线协作时。需解决并发相互冲突问题,基于 merkle-CRDT 的不可篡改日志,自动解决数据最终一致性问题。

5、物联网

物理网应用接入 p2pdb 实现边缘存储,在云端部署一个订阅节点,可实现自动采集所有边缘节点的物联网数据,由数据库层面实现的数据对等同步,省去了应用层面的诸多麻烦。


二、满足条件

要解决以上行业问题,需要实现以下目标

  • 1、低延迟:网络稳定情况下,秒级实现百台节点同步数据

  • 2、大规模:支持成千上万台节点运行

  • 3、高性能:单机查询 qps 1 万以上、写入 qps 5 千以上

  • 4、去中心化:点对点对等网络

  • 5、存储安全:可验证的数据结构

  • 5、传输安全:公私钥加解密

  • 6、最终一致性机制

  • 7、历史日志不可篡改

  • 8、共识机制

  • 9、开源免费

  • 10、轻松升级和 bug 恢复

  • 11、社区自治

  • 12、支持主流编程语言


三、技术原理摘要

CRDT 无冲突复制数据类型

由于可以使用直接传输进行在线和离线通信,因此必须有一种方法来保持所有消息之间的连贯性和顺序,尤其是在与多个参与者的对话中。例如,如果 Alice 和 Bob 与其他几个人在一个聊天组中,并且他们都因乘坐地铁而失去了互联网连接,那么他们仍然可以使用 BLE 在同一对话中相互通信,从而创建此对话的并行版本。当他们重新上线时,BLE 版本和 Internet 版本将不得不合并。因此,有必要使用一种算法来确保所有对等方在同步后具有完全相同的排序消息列表。

这个问题的解决方案是无冲突复制数据类型 (CRDT),它是一种数据结构,允许在分布式系统上对消息进行一致的排序,CRDT 提供乐观复制和强最终一致性,确保一旦同步,每个对等点都将具有相同版本的消息列表。

每条消息都链接到其父级,这是此时连接在一起的对等方之一在对话中发送的最后一条消息。当对话的在线和离线版本同步时会出现问题:一些消息链接到同一个父级,链表变成有向无环图 。 更多详情



这会导致创建几个最终需要合并的并行分支。 P2PDB 通过使用 Lamport Clock 来实现这一点:每条消息将包含一个 Lamport Clock,合并后的列表将根据其值进行排序。

Lamport 时钟

Lamport 时钟是一个包含两个字段的结构:一个身份公钥和一个计数器,该计数器为相关用户/身份发布的每条消息递增 更多详情

// golangtype lamportClock struct {    time int    id   crypto.PublicKey}
复制代码


比较函数很简单,它会首先检查计数器值之间的差距,如果没有,它会检查身份公钥之间的字典差距,知道给定的身份不能用相同的计数器发布两条消息价值。


// golangfunc compareClock(a, b lamportClock) int {  dist := a.time - b.time  if dist == 0 {      dist = comparePubKey(a.id, b.id) // Returns lexicographic distance  }
return dist}
复制代码


merkle-clock

Merkle-clock 的 M 是一个 Merkle-DAG,其中每个节点代表一个事件,换个角度说,给定系统中的一个事件,我们可以在这个 DAG 中找到一个代表它的节点,并允许我们将它与其他事件进行比较排序。DAG 是通过一些简单的规则合并其它节点 DAG 来构建的,新事件被添加为新的根节点(现有节点的父节点),需要注意的是,Merkle-clock 在给定的时间可能有多个根。

例如,给定 Mα和 Mβ(α 和 β 是这些 DAG 中的单个根):

  1. 如果 α = β 不需要任何动作,因为它们是相同的 DAG。

  2. 否则如果 α ∈ Mβ,我们保留 Mβ作为我们的新时钟,因为 Mα中的历史已经是它的一部分。在这种情况下,我们说 Mα < Mβ。

  3. 否则如果 β ∈ Mα,我们出于同样的原因保留 Mα。在这 种情况下,我们说 Mβ< Mα。

  4. 否则,我们通过保持两个 DAG 原样来合并两个时钟,因此 有两个根节点,这些节点由 α 和 β 引用。请注意,Mα和 Mβ可能完全不相交,也可能不相交,这取决于它们是否共 享一些更深的节点。如果我们想记录一个新事件,我们可 以创建一个新的根 γ,它有两个孩子,α 和 β。


我们已经可以看到,通过确定一个 MerkleClock 是否包含在另一个 MerkleClock 中,我们在 Merkle-Clocks 之间引入了顺序的概念。以同样的方式,我们在每个时钟中的节点之间有一个顺序的概念,因为较早发生的事件将始终是较晚发生的事件的后代。此外,我们还引入了一种根据它们的比较方式合并 Merkle-Clocks 的方法。生成的 Merkle-Clock 始终包含来自两个 Merkle-Clock 的因果关系信息。这最终意味着每个副本中存储在 Merkle-Clock 中的因果关系信息在合并后将收敛到同一个 Merkle-Clock。Merkle-Clocks 提供的因果顺序在构建具有类似规则的 Merkle-DAG 时被嵌入,并且通常被忽略为非常直观的东西。然而,重要的是要形式化我们如何定义 Merkle-Clocks 之间的顺序,并证明在它们同步和合并时维护因果关系信息。


对等网络

对等网络是一种网络结构的思想。它与目前网络中占据主导地位的客户端/服务器(Client/Server)结构(也就是 WWW 所采用的结构方式)的一个本质区别是,整个网络结构中不存在中心节点(或中心服务器)。在 P2P 结构中,每一个节点(peer)大都同时具有信息消费者、信息提供者和信息通讯等三方面的功能。从计算模式上来说,P2P 打破了传统的 Client/Server (C/S)模式,在网络中的每个节点的地位都是对等的。每个节点既充当服务器,为其他节点提供服务,同时也享用其他节点提供的服务。


简单的说,P2P 就是直接将人们联系起来,让人们通过互联网直接交互。P2P 使得网络上的沟通变得容易、更直接共享和交互,真正地消除中间商。 P2P 另一个重要特点是改变互联网现在的以太网站为中心的状态、重返“非中心化”,并把权力交还给用户。 对等网络是对分布式概念的成功拓展,它将传统方式下的服务器负担分配到网络中的每一节点上,每一节点都将承担有限的存储与计算任务,加入到网络中的节点越多,节点贡献的资源也就越多,其服务质量也就越高。


对等网络可运用存在于 Internet 边缘的相对强大的计算机(个人计算机),执行较基于客户端的计算任务更高级的任务。现代的 PC 具有速度极快的处理器、海量内存以及超大的硬盘,而在执行常规计算任务(比如:浏览电子邮件和 Web)时,无法完全发挥这些设备的潜力。新式 PC 很容易就能同时充当许多类型的应用程序的客户端和服务器(对等方)。



P2P 网络技术的特点体现在以下几个方面:

  • 去中心化

网络中的资源和服务分散在所有节点上,信息的传输和服务的实现都直接在节点之间进行,可以无需中间环节和服务器的介入,避免了可能的瓶颈。P2P 的非中心化基本特点,带来了其在可扩展性、健壮性等方面的优势。


  • 可扩展性

在 P2P 网络中,随着用户的加入,不仅服务的需求增加了,系统整体的资源和服务能力也在同步地扩充,始终能比较容易地满足用户的需要。理论上其可扩展性几乎可以认为是无限的。例如:在传统的通过 FTP 的文件下载方式中,当下载用户增加之后,下载速度会变得越来越慢,然而 P2P 网络正好相反,加入的用户越多,P2P 网络中提供的资源就越多,下载的速度反而越快。


  • 健壮性

P2P 架构天生具有耐攻击、高容错的优点。由于服务是分散在各个节点之间进行的,部分节点或网络遭到破坏对其它部分的影响很小。P2P 网络一般在部分节点失效时能够自动调整整体拓扑,保持其它节点的连通性。P2P 网络通常都是以自组织的方式建立起来的,并允许节点自由地加入和离开。


  • 高性价比

性能优势是 P2P 被广泛关注的一个重要原因。随着硬件技术的发展,个人计算机的计算和存储能力以及网络带宽等性能依照摩尔定理高速增长。采用 P2P 架构可以有效地利用互联网中散布的大量普通结点,将计算任务或存储资料分布到所有节点上。利用其中闲置的计算能力或存储空间,达到高性能计算和海量存储的目的。目前,P2P 在这方面的应用多在学术研究方面,一旦技术成熟,能够在工业领域推广,则可以为许多企业节省购买大型服务器的成本。


  • 隐私保护

在 P2P 网络中,由于信息的传输分散在各节点之间进行而无需经过某个集中环节,用户的隐私信息被窃听和泄漏的可能性大大缩小。此外,目前解决 Internet 隐私问题主要采用中继转发的技术方法,从而将通信的参与者隐藏在众多的网络实体之中。在传统的一些匿名通信系统中,实现这一机制依赖于某些中继服务器节点。而在 P2P 中,所有参与者都可以提供中继转发的功能,因而大大提高了匿名通讯的灵活性和可靠性,能够为用户提供更好的隐私保护。


版本证明 VOS

Proof of vension ,类似 pos、存储证明的一种算法,存储版本最完整的节点可以打包区块,根据 IPFS 协议存储到全球范围不同的服务器节点,以达到数据永久保存的目的

日志不可篡改

不可篡改指的是,每次生成的变动日志,通过广播到所有节点,每过十分钟会被打包成一个块日志上传到区块链上,此时日志内容是无法进行篡改,参考以太坊、比特币协议


技术术语

1、节点共识

节点共识是指,历史发生的数据变更不可篡改、节点每十分钟会达成一次共识,完成共识时变更日志会永久保存,每个节点都会保存一份完整的变更日志,同时会生成一份数据快照,用于快速恢复数据。

2、版本证明

版本证明是指发生共识时,优先选择版本证明最完整的节点作为数据一致性校验的节点,剩余节点将根据数据版本最全的节点进行数据校对,最终生成数据快照和历史日志块

3、轻节点

遵循默克尔有向无环图结构,对于边缘节点,只需要下载最近 10 分钟前的日志。

4、数据存储快照及日志

存储变更日志(类似 mysql binlog 日志,每十分钟生成一次),数据快照(全量数据,用于快速恢复跟备份)

5、私网

P2PDB 并不仅仅是为公网设计,同时也允许企业根据 P2PDB 搭建私网,私网跟公网一样具有高分区容错性、可用性、但是安全性、跟可控度会更高。

6、公私钥

公私钥是了提供数据在传输过程中的安全性,节点在数据传输前根据发放的公钥对数据进行加密,只有掌握私钥的的用户才能解出秘文。

该白皮书参考论文


发布于: 刚刚阅读数: 3
用户头像

Rock-李益

关注

还未添加个人签名 2021.09.08 加入

还未添加个人简介

评论

发布
暂无评论
P2PDB 白皮书_区块链_Rock-李益_InfoQ写作社区