啥是分片技术?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了啥是分片技术?相关的知识,希望对你有一定的参考价值。

写在文前:视频版本和文字版本略有不同,想要看我深情并茂演绎,请看视频版本 (喵懂区块链22期|分片(Sharding):以太坊太慢,“盘”他!),思维逻辑怪,请看文案加长版。

最近以太坊由于君士坦丁堡升级(Constantinople)而出现了压倒性的积极走势,而以太坊的升级之路则犹如升级打怪一般,落入了rabbit hole,谁也不知道这洞有多深。既然是“路漫漫其修远兮”,则把脚下的每一步走好走准,则成了至关重要的点。攻破这一难点之后,以太坊的下一技术难点---Sharding分片,则又被摆到了台面上。本期《喵懂区块链》会带大家走进让以太坊快起来的法宝--- Sharding分片。

什么是sharding分片?

分片技术其实并不是什么新概念,起初是针对大型中心数据库提出的优化方案,具体来说就是将大型数据库中的数据划按照某种规则分成很多数据分片(shard),再将这些数据分片分别存放在不同的服务器中,以减小每个服务器的数据访问压力,从而提高整个数据库系统的性能。

我们举一个通俗的小例子:

比如我们平时经常使用的美团,滴滴打车等软件,就可以按照“城市”来进行分片,由于不同城市的数据不需要互通,就可以将不同城市的数据存放在不同数据库中,这样既可以把数据库服务器部署到离对应城市最近的节点上,还可以提高访问速度,何乐而不为呢?!

从上面的例子中,我大家应该对分片的概念有了初步了解,那么对应到区块链场景中来说,分片又是怎么样的呢?

以以太坊分片为例,在原有的单链系统中,公链整体的性能取决于单个节点的性能,进行分片之后,每个节点只需要承当全网部分工作,各个分片并行工作,按照Vitalik的话来说,each shard is like a separate galaxy每个分片都像是独立的小宇宙,这样效率自然噌噌噌提升!原本以太坊链全网TPS约为20,现在若增加到100个分片,那么全网TPS可以提升至2000,同理,全网容量也将提升至原来的100倍。

“每个节点只需要承担全网部分工作”,这就会引出几大问题,1.怎么确定这个节点是负责哪个分片的工作?2.哪些交易应该归类到哪些分片当中去?3.每个节点是否只需要储存自己所在分片的交易信息(账本)?

根据以上问题的实现与否,我们可以将分片依次分为三种类型:网络分片,交易分片,状态分片。

网络分片:如何将全网节点划分到不同分片当中去。

交易分片:如何将全网交易划分到不同分片当中去。

状态分片:如何让各个节点只维护各自分片内的账本,但又不影响整个系统的安全性。

主链和分片链的区别和联系?

分片的类型我们已经明白了,那么主链(Main chain)和分片链(shard chain)有什么不同呢?

向左转|向右转

在主链中,我们知道记账的人叫做矿工,账本是存在区块当中,对应到分片链当中,则是Collator校对人和Collation校对块。

类似于区块的构成,Collation校对块也包含Collation header校对头和tansaction list具体的交易信息。

向左转|向右转

对比下来,主链和分片链本身来说,还是大同小异,但是一但要把他们联系起来,问题就变得复杂了,这里我们举个通俗的小例子类比一下:

假设,

以太坊主链=温州银行

每个分片=温州银行分行

比如:

shard1(分片1)=温州银行(杭州分行)

Shard2(分片2)=温州银行(宁波分行)

……

在这个系统中,我们就会清晰看到几大问题:1.各大分行的账本如何汇总到总行里去?2.各大分行的账本如何互联?

对应到主链和分片链系统当中来,则变成了1.分片链和主链如何实现跨链链接?2.分片之间怎么互联?甚至分叉的场景要怎么办?

分片链和主链如何实现跨链链接?

为了将分片链加入到主链中,在主链上需要有一个叫做验证人管理员合约(Validator Manager Contract)VMC的特殊合约。VMC具体是这样的:

向左转|向右转

所有的验证人把它们的保证金(stake)存入 VMC当中,这些验证人就会被收录在VMC的common validator pool验证人备选池中。系统将会“隔一段时间”根据stake权益的多少随机为每个分片抽取一名验证人,将各个分片的collation header校对头信息同步到主链中去。

这里的“隔一段时间”,我们需要额外解释一下:“时间”,也叫period周期,这到底是怎么确定的呢?答案是主要看开发人员在最终代码中的实现为准,比如说我们把周期定为5个区块,那么就意味着主链出5个区块,所有分片链分别出一个collation校对块,这就间接决定了分片链的出块时间。

这种随机的形式,使得验证者无法提前预测他们何时会成为验证者,也无法预测会成为哪个分片的验证人,从而预防作恶的可能性。

如果一旦发现我们的分片验证人作恶了,他的stake权益就会被剥夺。

跨分片通信(cross-shard communication)怎么办?

比如说一个转账方小A在分片M中,收款方小B在分片N中,小A可以通过主链这个桥梁,完成扣款操作,并创建一个带有ID的 receipt收据,代表着“自己已经完成了扣款操作”,收款方小B可以根据这个 receipt ID 创建一个receipt-consuming收据消费交易,“消费”成功了之后,收款也就成功了。

向左转|向右转

分片链分叉了怎么办?(fork choice rule)

在以往的分叉情况中,都是“以最长链为主链”,在分片当中,分叉规则是“以最长主链里面的最长分片链为有效分片链(the longest valid shard chain within the longest valid main chain)”。

什么意思呢?我们举个例子:

一条主链出现了分叉,一条分叉连续跟了两个区块,同时也跟了两个Collation校对块,另一条则是一个区块和一个校对块,那么很明显,第一条是有效链。

向左转|向右转

接下来,第二条链又加了一个区块,变成两个区块和一个Collation校对块,依然很明显,第一条链仍然是有效链:

向左转|向右转

接下来,第一条链上又加了一个区块,虽然这条链上只有一个Collation校对块,但是它的主链长度已经超过了第一条,那么第二条则成为了现在的有效链,这就是分片场景下的分叉规则,首先比较主链长度,再比较分片链长度!

向左转|向右转

以太坊分片的实现是一个漫长的过程,就连Vitalik自己也说将会分阶段来逐步实现,分片到底能不能从理论走向实践,我们还是小小期待一下吧。

参考资料:

https://github.com/ethereum/sharding/blob/develop/docs/doc.md

https://www.8btc.com/article/348469

https://ethfans.org/posts/ethereum-sharding-and-finality

http://www.qukuaiwang.com.cn/news/11390.html

参考技术A

分片技术其实并不是什么新概念,起初是针对大型中心数据库提出的优化方案,具体来说就是将大型数据库中的数据划按照某种规则分成很多数据分片(shard),再将这些数据分片分别存放在不同的服务器中,以减小每个服务器的数据访问压力,从而提高整个数据库系统的性能。

这个文章里面讲的很详细,可以参考:分片(Sharding):以太坊太慢,“盘”他!喵懂区块链还是很靠谱的科普视频,可以看看

我们举一个通俗的小例子:

比如我们平时经常使用的美团,滴滴打车等软件,就可以按照“城市”来进行分片,由于不同城市的数据不需要互通,就可以将不同城市的数据存放在不同数据库中,这样既可以把数据库服务器部署到离对应城市最近的节点上,还可以提高访问速度,何乐而不为呢?!

从上面的例子中,我大家应该对分片的概念有了初步了解,那么对应到区块链场景中来说,分片又是怎么样的呢?

以以太坊分片为例,在原有的单链系统中,公链整体的性能取决于单个节点的性能,进行分片之后,每个节点只需要承当全网部分工作,各个分片并行工作,按照Vitalik的话来说,each shard is like a separate galaxy每个分片都像是独立的小宇宙,这样效率自然噌噌噌提升!原本以太坊链全网TPS约为20,现在若增加到100个分片,那么全网TPS可以提升至2000,同理,全网容量也将提升至原来的100倍。

“每个节点只需要承担全网部分工作”,这就会引出几大问题,1.怎么确定这个节点是负责哪个分片的工作?2.哪些交易应该归类到哪些分片当中去?3.每个节点是否只需要储存自己所在分片的交易信息(账本)?

根据以上问题的实现与否,我们可以将分片依次分为三种类型:网络分片,交易分片,状态分片。

网络分片:如何将全网节点划分到不同分片当中去。

交易分片:如何将全网交易划分到不同分片当中去。

状态分片:如何让各个节点只维护各自分片内的账本,但又不影响整个系统的安全性。

参考技术B 分片技术:
互联网协议允许IP分片,这样的话,当数据包比链路最大传输单元大时,就可以被分解为很多的足够小片段,以便能够在其上进行传输。RFC 1191描述了“路径MTU发现”,该技术用于确定两台IP主机间的路径MTU,这样就可以避免IP分片。在Internet协议IPv4版本和较新的IPv6版本中,分片机制的细节和分片机制的整体框架是有所不同的。
链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度,不同的网络类型都有一个上限值。以太网的MTU是1500,你可以用 netstat -i 命令查看这个值。如果IP层有数据包要传,而且数据包的长度超过了MTU,那么IP层就要对数据包进行分片(fragmentation)操作,使每一片的长度都小于或等于MTU。我们假设要传输一个UDP数据包,以太网的MTU为1500字节,一般IP首部为20字节,UDP首部为8字节,数据的净荷(payload)部分预留是1500-20-8=1472字节。如果数据部分大于1472字节,就会出现分片现象。[1]
详细介绍
分片(sharding)是数据库分区的一种,它将大型数据库分成更小、更快、更容易管理的部分,这些部分叫做数据碎片。碎片这个词意思就是整体的一小部分。
Jason Tee表示:“简言之,分片(sharding)数据库需要将数据库(database)分成多个没有共同点的小型数据库,且它们可以跨多台服务器传播。”
技术上来说,分片(sharding)是水平分区的同义词。在实际操作中,这个术语常用来表示让一个大型数据库更易于管理的所有数据库分区。
分片(sharding)的核心理念基于一个想法:数据库大小以及数据库上每单元时间内的交易数呈线型增长,查询数据库的响应时间(response time)以指数方式增长。
另外,在一个地方创建和维护一个大型数据库的成本会成指数增长,因为数据库将需要高端的计算机。相反地,数据碎片可以分布到大量便宜得多的商用服务器上。就硬件和软件要求而言,数据碎片相对来说没什么限制。
参考技术C 通俗点跟你讲,如果以太坊区块链是一整块面包,那么分片就是把这个面包分成若干片。这个面包上的节点也会被划分到不同的片上。这可以提高数据库的读写效率,突破单一服务器的性能瓶颈。在区块链里,分片也是将数据划分成若干部分,交给不同的群组处理。每个群组都被称为一个「分片」。以太坊、夸克链、zil、Penta等都有自己的分片技术。本回答被提问者采纳 参考技术D 用来扩大效率的

从技术上讲,啥是数据库连接?

【中文标题】从技术上讲,啥是数据库连接?【英文标题】:What is a Database Connection, technically?从技术上讲,什么是数据库连接? 【发布时间】:2016-03-23 14:17:04 【问题描述】:

当我们说我们有一个“数据库连接”或“有多个连接打开的连接池”时,在技术层面上,我们实际上是什么意思?

我的理解是:

数据库连接是指向数据库中运行的线程的链接 被阻塞并等待来自另一个线程的输入的进程 在另一个进程中。

这是正确的定义吗?

因此,当我在一台计算机上运行 mysql 并在另一台计算机(或同一台计算机,并不重要..)上运行一个 java 应用程序时,当我执行以下操作时:

conn.open();

打开一个数据库连接..

mysql 进程会为我创建一个新线程并阻止该线程并开始监听输入吗?

客户端呢?如果我不关闭连接会怎样?

【问题讨论】:

连接一词有多种含义。它可以指两个实体之间的物理或逻辑路径,它可以指路径上的流,它可以推断地指与路径的建立相关联的动作,或者它可以指两个或多个之间的关联实体,无论是否考虑它们之间的任何路径。 Vint Cerf 和 Bob Kahn,分组网络互通协议 在分组交换中,没有连接。你所说的连接是两个端点之间的共识错觉。斯图尔特柴郡 【参考方案1】:

从技术上讲,什么是连接池?

连接池是维护的数据库连接缓存,以便在以后需要对数据库的请求时可以重复使用这些连接。连接池用于提高在数据库上执行命令的性能。为每个用户打开和维护数据库连接,特别是对动态数据库驱动的网站应用程序的请求,成本高昂并且浪费资源。 在连接池中,连接创建后,将其放入池中并再次使用,这样就不必建立新的连接。如果所有连接都在使用,则会建立一个新连接并将其添加到池中。 连接池还减少了用户必须等待建立与数据库的连接的时间。

客户端呢?如果我不关闭连接会怎样?

从技术上讲,我们不会关闭从连接池中获得的连接 - 事实上,当我们完成它时,我们会将其返回到池中。

conn.close 会将连接返回到池中。

在使用连接池时,您必须始终调用 Connection.close()。只有当 java 对象被销毁时,物理数据库连接才会释放。

如果您不关闭连接,则会发生连接泄漏,并且您的池将耗尽连接。发生这种情况时,您的应用程序将无限期暂停,等待释放连接,并且需要手动重新启动。

【讨论】:

嗯,是的,谢谢。但主要问题是:首先什么是数据库连接? @KorayTugay 数据库连接是数据库服务器及其客户端软件相互通信的方式。【参考方案2】:

你知道什么是套接字吗? tutorial 中的描述很简短,但很好。

您必须区分客户端和服务器端。我不能告诉 MySQL,但通常服务器端是这样实现的,对于连接,新线程正在处理请求。

连接池可以最大限度地减少套接字打开开销。通常,您不关心通过连接(假设所有连接为同一用户)您从数据库收到的结果集。

你不想消耗资源,所以你想表现得很好,当你完成后关闭你的连接。我相信如果有一段时间没有活动(超时),今天的每台服务器都会结束连接。

【讨论】:

以上是关于啥是分片技术?的主要内容,如果未能解决你的问题,请参考以下文章

Redis技巧:分片技术和Hash Tag

redis分片技术

深入学习MongoDB分片(Sharding)集群技术

实战MongoDB 分片原理概述 + 部署 MongoDB 分片群集 +源码包

分片Sharding || 百科

分片技术(Sharding):如何使区块链更具可扩展性?