精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

基于CRDT的數(shù)據(jù)最終一致性

開發(fā) 開發(fā)工具
對(duì)于分布式系統(tǒng)的架構(gòu)師來說,CAP 定理所描述的一致性和可用性是一個(gè)較大的挑戰(zhàn)。網(wǎng)絡(luò)遠(yuǎn)程跨機(jī)房是不可避免的,數(shù)據(jù)中心之間的高延遲總是導(dǎo)致數(shù)據(jù)中心之間在短時(shí)間內(nèi)出現(xiàn)某種斷開。因此,傳統(tǒng)的分布式應(yīng)用體系結(jié)構(gòu)被設(shè)計(jì)成要么放棄數(shù)據(jù)一致性,要么降低可用性。

[[412955]]

對(duì)于分布式系統(tǒng)的架構(gòu)師來說,CAP 定理所描述的一致性和可用性是一個(gè)較大的挑戰(zhàn)。網(wǎng)絡(luò)遠(yuǎn)程跨機(jī)房是不可避免的,數(shù)據(jù)中心之間的高延遲總是導(dǎo)致數(shù)據(jù)中心之間在短時(shí)間內(nèi)出現(xiàn)某種斷開。因此,傳統(tǒng)的分布式應(yīng)用體系結(jié)構(gòu)被設(shè)計(jì)成要么放棄數(shù)據(jù)一致性,要么降低可用性。

不幸的是,我們不能犧牲應(yīng)用可用性。嘗試保持一致性,業(yè)界接受了最終一致性模型。在這個(gè)模型中,應(yīng)用依賴于數(shù)據(jù)庫管理系統(tǒng)來合并數(shù)據(jù)的所有本地副本,以使它們最終保持一致。除非出現(xiàn)數(shù)據(jù)沖突,最終一致性模型看起來很好。一些最終一致性模型承諾盡最大努力解決沖突,但不能保證強(qiáng)一致性。

1. 什么是CRDT?

一個(gè)新趨勢是,圍繞CRDT構(gòu)建的模型提供了強(qiáng)最終一致性。那么,什么是CRDT 呢?

CRDT是無沖突復(fù)制數(shù)據(jù)類型的縮寫。CRDT通過預(yù)先確定的一套解決沖突規(guī)則和語義來實(shí)現(xiàn)了最終一致性,它引入一組特殊的基礎(chǔ)數(shù)據(jù)類型, CRDT是一種特殊的數(shù)據(jù)類型,可以從所有數(shù)據(jù)庫副本匯聚數(shù)據(jù)。常用的 CRDTs包括 G-counters (grow-only counters)、 PN-counters (positive-negative counters)、寄存器、 G-sets (grow-only sets)、2P-sets (two-phase sets)、 or- sets (observed-remove sets)等等。

在背后,CRDT依靠以下數(shù)學(xué)特性來處理數(shù)據(jù):

  • 交換律:a ☆ b = b ☆ a
  • 結(jié)合律:a ☆ ( b ☆ c ) = ( a ☆ b ) ☆ c
  • 等冪: a ☆ a = a

G 計(jì)數(shù)器是一個(gè)完美的例子,操作 CRDT合并的業(yè)務(wù)。這里,a + b = b + a 和 a + (b + c) = (a + b) + c。副本之間只交換更新(增加的內(nèi)容)。CRDT 通過添加更新來合并更新。例如,g 集合應(yīng)用冪等({ a,b,c } u { c } = { a,b,c })來合并所有元素。冪等可以避免在元素通過不同路徑傳遞和匯聚時(shí)重復(fù)添加到數(shù)據(jù)結(jié)構(gòu)中的元素。

一個(gè)典型的多主系統(tǒng)的副本同步方式如下:

CRDT能夠自己解決合并沖突,更一般的情況是處理在多l(xiāng)eader分布式系統(tǒng)中的副本同步。

那么, 有哪些典型的副本同步模式呢?

2. 副本同步模式

2.1 基于狀態(tài)的同步

基于狀態(tài)的同步, 也稱為被動(dòng)同步,形式為聚合復(fù)制數(shù)據(jù)類型(Convergent Replicated Data Type,CvRDT), 用于 NFS、 AFS、 Coda 等文件系統(tǒng),以及 Riak、 Dynamo 等 KV存儲(chǔ)。

在這種情況下,副本通過發(fā)送對(duì)象的完整狀態(tài)來傳播更改,必須定義 merge ()函數(shù),以將傳入的更改與當(dāng)前狀態(tài)合并。

基于狀態(tài)的同步必須滿足以下要求,以確保復(fù)制的一致性:

  • 數(shù)據(jù)類型(或復(fù)制上的狀態(tài))形成一個(gè)具有最小上界的偏序集
  • Merge ()函數(shù)產(chǎn)生一個(gè)最小上界
  • 副本構(gòu)成一個(gè)連通圖

例子:

數(shù)據(jù)類型: 自然數(shù)集是N,極小元到正負(fù)無窮大,則Merge (x,y) = max (x,y)

這樣的要求給出了一個(gè)用于交換的冪等merge()函數(shù),它也是給定數(shù)據(jù)類型上的一個(gè)單調(diào)遞增函數(shù)。

這保證了所有的副本最終都會(huì)聚合收斂,并且讓我們不用擔(dān)心傳輸協(xié)議ーー可以丟失傳播更新,也可以多次發(fā)送它們,甚至可以按任何順序發(fā)送它們。

2.2 基于操作的同步

基于操作的同步,也稱為主動(dòng)同步,形式為交換復(fù)制數(shù)據(jù)類型(Commutative Replicated Data Type ,CmRDT),用于 Bayou, Rover, IceCube, Telex這樣的系統(tǒng)。

在這種情況下,副本通過向所有副本發(fā)送操作來傳播更改。當(dāng)對(duì)副本進(jìn)行更改時(shí):

執(zhí)行 generate ()方法,該方法返回一個(gè)要在其他副本上調(diào)用的 effector ()函數(shù)。換句話說,effector ()是一個(gè)用于修改其他副本狀態(tài)的閉包。

將effector ()應(yīng)用于本地狀態(tài)

向所有其他副本傳播effector ()

基于操作的同步必須滿足以下要求,以確保復(fù)制的一致性:

  • 可靠的傳輸協(xié)議
  • 如果effector()以因果順序交付,那么并發(fā) effector ()就必須轉(zhuǎn)換為OR
  • 如果effector()在沒有遵守因果順序的情況下交付,那么所有effector()都必須轉(zhuǎn)換
  • 如果能夠多次傳遞,則 effector ()必須是冪等的.
  • 在現(xiàn)實(shí)中,一般會(huì)依賴于可靠的發(fā)布-訂閱系統(tǒng)(例如,Kafka)作為交付的一部分。

2.3 基于增量的同步

考慮到基于狀態(tài)/操作的同步,如果一個(gè)更改只影響對(duì)象的一部分,那么傳輸整個(gè)對(duì)象的狀態(tài)是沒有意義的。此外,如果更新修改了相同的狀態(tài)(如計(jì)數(shù)器) ,我們可以周期性地只發(fā)送一個(gè)聚合狀態(tài)。

增量同步結(jié)合了狀態(tài)和操作這兩種方法,并傳播所謂的 Delta 變異,這些變異相應(yīng)地將狀態(tài)更新到最后的同步日期。所以,需要發(fā)送一個(gè)完整的狀態(tài)進(jìn)行第一次同步,然而,一些實(shí)現(xiàn)實(shí)際上考慮了遠(yuǎn)程副本的狀態(tài)以降低所需的數(shù)據(jù)量。

如果允許延遲,那么基于操作的日志壓縮可能是下一個(gè)優(yōu)化:

2.4 基于純操作的同步

在基于操作的同步中有一個(gè)延遲,以創(chuàng)建一個(gè)effector()。在某些系統(tǒng)中,這樣的延遲是不可接受的,必須立即傳播更新,需要更復(fù)雜的組織協(xié)議以及更多的元數(shù)據(jù)空間。

典型用法:

  1. 如果在系統(tǒng)中必須立即傳播更新,基于狀態(tài)的同步是一個(gè)糟糕的選擇,因?yàn)樗鼤?huì)增加整個(gè)狀態(tài)的成本。然而,在這種特殊情況下,基于增量的同步是更好的選擇,與基于狀態(tài)更新的差別不會(huì)太大。
  2. 如果你需要在失敗后同步副本,基于狀態(tài)/基于 delta 是正確的選擇。如果必須使用基于操作的同步,則必須:
  • 回復(fù)所有失敗后遺漏的更改
  • 獲取其中一個(gè)副本的完整副本并應(yīng)用于所有錯(cuò)過的操作

3.基于操作的同步只需要將 effector ()傳遞給每個(gè)副本一次。通過要求effector ()具有冪等性,可以放松這一要求。實(shí)際上,前者比后者更容易實(shí)現(xiàn)。

基于操作和基于狀態(tài)的同步之間的關(guān)系是:基于操作和基于狀態(tài)的同步可以在保持 CRDT 要求的前提下相互仿真。

3. 數(shù)據(jù)一致性模型

一致性模型數(shù)據(jù)協(xié)議是分布式數(shù)據(jù)庫和應(yīng)用程序之間的一個(gè)協(xié)議,它定義了在寫操作和讀操作之間數(shù)據(jù)的清潔程度。

例如,在一個(gè)強(qiáng)一致性模型中,數(shù)據(jù)庫保證應(yīng)用程序總是讀取最后一次寫入的數(shù)據(jù)。使用循序一致性數(shù)據(jù)庫的時(shí)候,數(shù)據(jù)庫保證你讀取的數(shù)據(jù)的順序與數(shù)據(jù)寫入數(shù)據(jù)庫的順序一致。在最終一致性模型中,分布式數(shù)據(jù)庫承諾在幕后同步和整合數(shù)據(jù)庫副本之間的數(shù)據(jù)。因此,如果將數(shù)據(jù)寫入一個(gè)數(shù)據(jù)庫副本并從另一個(gè)數(shù)據(jù)庫副本讀取數(shù)據(jù),則可能不會(huì)讀取數(shù)據(jù)的最新副本。

關(guān)于最終一致性的研究已經(jīng)有了許多的研究成果。當(dāng)前的趨勢是從強(qiáng)一致性轉(zhuǎn)向其他可能的一致性變化,研究什么樣的數(shù)據(jù)一致性模型最適合特定的系統(tǒng)/場景,并需要重新考慮當(dāng)前的定義。這就導(dǎo)致了一些矛盾,例如,當(dāng)一些人考慮一個(gè)具有特殊屬性的最終一致性時(shí),同時(shí),其他作者已經(jīng)為這個(gè)特殊情況創(chuàng)建了一個(gè)定義。

簡單地,可以從效果來重新定義最終一致性,即如果所有請(qǐng)求都沒問題,那么它最終是一致的。

3.1 數(shù)據(jù)一致性的分類

強(qiáng)一致性(SC)

所有的寫操作都嚴(yán)格按順序執(zhí)行,對(duì)任何副本的讀請(qǐng)求都返回相同的、最后的寫結(jié)果,需要實(shí)時(shí)的共識(shí)(及其所有后果) 。為了解決沖突,允許 n/2-1節(jié)點(diǎn)關(guān)閉。

最終一致性(EC)

在本地進(jìn)行更新,然后傳播更新。讀取一些副本可能會(huì)返回過時(shí)的狀態(tài)。回滾或以某種方式?jīng)Q定在發(fā)生沖突時(shí)應(yīng)該做什么。也就是說,我們還需要共識(shí),不是實(shí)時(shí)的。

強(qiáng)最終一致性(SEC)

EC + 復(fù)制有一個(gè)自動(dòng)解決沖突的方法。因此,我們不要求達(dá)成共識(shí),允許關(guān)閉 n-1節(jié)點(diǎn)。

如果放松 CAP 定理中的 SC 要求,那么 SEC 就解決了那些惱人的問題。

3.2 強(qiáng)一致性

兩階段提交是實(shí)現(xiàn)強(qiáng)一致性的常用技術(shù)。這里,對(duì)于本地?cái)?shù)據(jù)庫節(jié)點(diǎn)上的每個(gè)寫操作(添加、更新、刪除) ,數(shù)據(jù)庫節(jié)點(diǎn)將更改傳播到所有數(shù)據(jù)庫節(jié)點(diǎn),并等待所有節(jié)點(diǎn)確認(rèn)。然后,本地節(jié)點(diǎn)向所有節(jié)點(diǎn)發(fā)送一個(gè)提交,并等待另一個(gè)確認(rèn)。應(yīng)用程序只能在第二次提交之后才能讀取數(shù)據(jù)。當(dāng)網(wǎng)絡(luò)斷開數(shù)據(jù)庫之間的連接時(shí),分布式數(shù)據(jù)庫將不能進(jìn)行寫操作。

3.3 最終一致性的實(shí)現(xiàn)方法

最終一致性模型的主要優(yōu)點(diǎn)是,即使在分布式數(shù)據(jù)庫副本之間的網(wǎng)絡(luò)連接中斷的情況下,數(shù)據(jù)庫也可以執(zhí)行寫操作。一般來說,這個(gè)模型避免了兩階段提交產(chǎn)生的往返時(shí)間,因此支持的每秒寫操作比其他模型多得多。最終一致性必須解決的一個(gè)問題是沖突,即在不同的地方同時(shí)寫同一個(gè)條目。根據(jù)如何避免或解決沖突,最終一致性可以進(jìn)一步分為以下幾類:

最后寫入的最終一致性(Last writer wins ,LWW)

在這種策略中,分布式數(shù)據(jù)庫依賴于服務(wù)器之間的時(shí)間戳同步。數(shù)據(jù)庫交換每個(gè)寫操作的時(shí)間戳和數(shù)據(jù)本身。如果發(fā)生沖突,使用最新時(shí)間戳的寫操作獲勝。

這種技術(shù)的缺點(diǎn)是假設(shè)所有系統(tǒng)時(shí)鐘都是同步的。實(shí)際上,同步所有的系統(tǒng)時(shí)鐘是困難和昂貴的。

法定人數(shù)的最終一致性(Quorum-based eventual consistency)

此技術(shù)類似于兩階段提交。然而,本地?cái)?shù)據(jù)庫并不等待所有數(shù)據(jù)庫的確認(rèn); 它只是等待大多數(shù)數(shù)據(jù)庫的確認(rèn)。多數(shù)人的確認(rèn)確定了法定人數(shù)。如果發(fā)生沖突,建立仲裁的“寫”操作獲勝。

另一方面,這種技術(shù)增加了寫操作的網(wǎng)絡(luò)延遲,從而降低了應(yīng)用程序的可伸縮性。此外,如果本地?cái)?shù)據(jù)庫與拓?fù)渲械钠渌麛?shù)據(jù)庫副本隔離,那么它將不能進(jìn)行寫操作。

合并復(fù)制(Merge replication)

在這種關(guān)系數(shù)據(jù)庫中常見的傳統(tǒng)方法中,一個(gè)集中的合并代理將所有數(shù)據(jù)合并。這種方法還提供了一些靈活性,可以實(shí)現(xiàn)自己解決沖突的規(guī)則。

合并復(fù)制速度太慢,無法支持實(shí)時(shí)使用的應(yīng)用程序,還存在一個(gè)單點(diǎn)故障。由于此方法不支持沖突解決的預(yù)設(shè)規(guī)則,因此常常導(dǎo)致沖突解決的錯(cuò)誤實(shí)現(xiàn)。

無沖突復(fù)制數(shù)據(jù)類型(Conflict-free replicated data type,CRDT)

簡而言之,基于 CRDT的數(shù)據(jù)庫提供無沖突的最終一致性?;? CRDT的數(shù)據(jù)庫是可用的,即使分布式數(shù)據(jù)庫副本不能交換數(shù)據(jù)。它們總是將本地延遲交付給讀寫操作。

因此,我們希望為不穩(wěn)定且經(jīng)常分區(qū)的分布式系統(tǒng)提供一組基礎(chǔ)數(shù)據(jù)類型。此外,希望這些數(shù)據(jù)類型為我們解決沖突,這樣就不需要與用戶交互或查詢仲裁節(jié)點(diǎn)。

然而,并非所有數(shù)據(jù)庫用例都受益于CRDT,而且,基于 CRDT數(shù)據(jù)庫的沖突解決語義是預(yù)定義的,不能被重寫。

4. CRDT 分析

4.1 CRDT 之 Counter

一個(gè)帶有兩個(gè)操作的整數(shù)值: inc ()和 dec (),讓我們考慮一些基于操作和狀態(tài)同步的實(shí)現(xiàn):

4.1.1 基于操作的計(jì)數(shù)器

很明顯,我們只需要傳播更新。

例如,Inc () : generator (){ return function (counter){ counter + = 1}}。

4.1.2 基于狀態(tài)的計(jì)數(shù)器

這是一個(gè)棘手的問題,因?yàn)槲覀冞€不清楚如何實(shí)現(xiàn) merge ()函數(shù)。

增量計(jì)數(shù)器,g 計(jì)數(shù)器:

讓我們使用一個(gè)具有副本數(shù)量大小的向量(又叫版本向量) ,每個(gè)副本在 inc ()操作中增加它的向量元素。Merge ()函數(shù)取相應(yīng)向量項(xiàng)的最大值,即計(jì)數(shù)器值中所有向量元素的和。

此外,G-Set 也可以使用。

例如,社交媒體中點(diǎn)擊/喜歡 的計(jì)數(shù)器。

加減計(jì)數(shù)器

使用兩個(gè) g 計(jì)數(shù)器,一個(gè)用于增量,另一個(gè)用于減量。

例如,P2P網(wǎng)絡(luò)(Skype)中登錄的用戶數(shù)量。

非負(fù)數(shù)計(jì)數(shù)器:

不幸的是,到目前為止還沒有一個(gè)現(xiàn)實(shí)中的應(yīng)用。

4.2 CRDT之 Register

具有兩個(gè)操作的存儲(chǔ)單元:assign()和value()。問題在于assign()操作,它們不進(jìn)行交換。有兩種方法可以解決這個(gè)問題:

4.2.1 LWW-Register

通過在每個(gè)操作上生成惟一的 id (時(shí)間戳)來引入總順序。

例如,基于狀態(tài)的,通過元組(value,id)的更新:

現(xiàn)實(shí)中,cassandra 中的列和 NFS中整個(gè)文件或其中的一部分都是具體的應(yīng)用場景。

4.2.2 Multi-Value Register

該方法類似于每個(gè)節(jié)點(diǎn)的 G-Counter+ store 的集合。Multi-Value Register的值是所有值,merge ()函數(shù)對(duì)所有向量元素應(yīng)用 LWW 方法。

例如,網(wǎng)上商城中的購物籃。

4.3 CRDT之 Set

一個(gè)集合有兩個(gè)非交換操作: add ()和 rmv () ,它是容器、映射、圖等的基礎(chǔ)類型。

考慮一個(gè)原生的集合實(shí)現(xiàn),其中 add ()和 rmv ()在到達(dá)時(shí)順序執(zhí)行。首先,在第1和第2個(gè)副本上有并發(fā)的 add () ,然后 rmv ()在第1個(gè)副本上到達(dá)。

果然,在同步之后副本發(fā)生了偏移。

4.3.1 Grow-Only Set

一個(gè)非常簡單的解決方案是根本不允許 rmv ()操作。Add ()操作轉(zhuǎn)換,merge ()函數(shù)只是一個(gè)集合。

4.3.2 2P-Set

允許 rmv ()操作,但不能在刪除元素后重新添加元素。一個(gè)附加的 g-set可以用來跟蹤刪除的元素(也稱為墓碑集)。

4.3.3 LWW-element Set

思路是在一個(gè)集合中引入一個(gè)總順序。例如,生成時(shí)間戳。我們需要兩個(gè)集合: 添加集和刪除集。Add ()將(element,unique _ id ())添加到 add-set,rmv ()將添加到 remove-set。Lookup ()檢查 id 在 add-set 或 rmv-set 中的大小。

4.3.4 PN-Set

對(duì)集合進(jìn)行排序的另一種方法ーー為每個(gè)元素添加一個(gè)計(jì)數(shù)器。在 add ()操作上增加它,在 rmv ()上減少它。當(dāng)且僅當(dāng)其計(jì)數(shù)器為正時(shí),集合中要考慮相應(yīng)的元素。

4.3.5 Observe-Remove Set, OR-Set, Add-Win Set:

在此數(shù)據(jù)類型中,add ()優(yōu)先于 rmv ()??赡軐?shí)現(xiàn)的一個(gè)例子是: 向每個(gè)新添加的元素添加唯一的標(biāo)記(每個(gè)元素)。然后 rmv ()將元素的所有可見標(biāo)記發(fā)送給其他副本,副本保留其他標(biāo)記。

4.3.6 Remove-win Set

同上,但是 rmv ()優(yōu)先于 add ().

4.4 CRDT之Graph

圖類型基于集合類型。這里有以下問題: 如果有兩個(gè)并發(fā) addEdge (u,v)和 removeVertex (u)操作ー我們應(yīng)該怎么做?有三種可能的策略:

  1. removeVertex ()具有優(yōu)先級(jí),所有關(guān)聯(lián)的邊都將被刪除
  2. addEdge ()具有優(yōu)先級(jí),所有移除的頂點(diǎn)將被重新添加
  3. 延遲 removeVertex ()的執(zhí)行,直到所有并發(fā) removeVertex ()都執(zhí)行為止

第一個(gè)是最容易實(shí)現(xiàn)的,因?yàn)榭梢灾皇褂脙蓚€(gè)2p 集,得到的數(shù)據(jù)類型稱為2p2p 圖.

4.5 CRDT之 Map

對(duì)于map,有兩個(gè)問題需要解決:

  • 如何處理并發(fā) put ()操作? 可以類比計(jì)數(shù)器,使用 LWW 或 MV 語義嗎?
  • 如何處理并發(fā)的 put ()/rmv ()操作?我們可以通過類比設(shè)置和使用 put-wins 或 rmv-wins 或 last-put-wins 語義么?

Map允許嵌套其他 CRDT 類型。需要注意的是,Map不處理其值的并發(fā)更改,必須由嵌套的 CRDT 本身來處理。

4.5.1 Remove-as-recursive-reset map

在此數(shù)據(jù)類型中,rmv (k)操作“重置”給定 k 下 CRDT 對(duì)象的值,例如,對(duì)于值為零的計(jì)數(shù)器。

例如,一個(gè)共享的購物車。一個(gè)用戶添加更多的面粉,另一個(gè)同時(shí)做一個(gè)檢查(這導(dǎo)致刪除所有元素)。同步之后,有一個(gè)“單元”的面粉,這似乎是合理的。

4.5.2 Remove-wins map

在這種情況下,rmv ()優(yōu)先于 add ()。

例如,玩家張三在一個(gè)網(wǎng)絡(luò)游戲中有10個(gè)硬幣和一個(gè)錘子。接下來發(fā)生了兩個(gè)并發(fā)操作: 在副本 a 上她發(fā)現(xiàn)了一個(gè)釘子,在副本 b 上 Alice 被刪除(刪除所有項(xiàng)目)。

4.5.3 Update-wins map

Add ()優(yōu)先于 rmv () ,更準(zhǔn)確地說,add ()取消了以前所有的并發(fā) rmv ()。

例如,玩家李四在一個(gè)在線游戲中在副本 a 上被刪除,同時(shí)她在副本 b 上做了一些活動(dòng)。很明顯,rmv ()操作必須被取消。

需要注意的是, 假設(shè)我們有兩個(gè)副本 a 和 b,它們以 k 為單位存儲(chǔ)一組復(fù)制品。如果 a 刪除了密鑰 k,b 刪除了集合中的所有元素,那么最終,兩個(gè)副本的密鑰 k 下都會(huì)有一個(gè)空集。

然而,有時(shí)不能取消以前所有的 rmv ()操作??紤]下面的例子,如果用這種方法,同步狀態(tài)將與初始狀態(tài)相同,這是一個(gè)不正確的結(jié)果。

4.6 CRDT之List

這種類型的問題在于,在本地更新操作之后,不同的副本上的元素索引將會(huì)不同。為了解決這個(gè)問題,可以使用操作轉(zhuǎn)換索引的方法,在應(yīng)用接收到的更新操作時(shí),必須考慮原始索引。

5 構(gòu)建基于CRDT的應(yīng)用

將應(yīng)用程序連接到基于CRDT的數(shù)據(jù)庫與將應(yīng)用程序連接到任何其他數(shù)據(jù)庫沒有什么不同。然而,由于最終一致性的策略,應(yīng)用程序需要遵循一定的規(guī)則來提供一致的用戶體驗(yàn),其中的三個(gè)關(guān)鍵點(diǎn)是:

1. 應(yīng)用程序無狀態(tài)

無狀態(tài)應(yīng)用程序通常是 api 驅(qū)動(dòng)的。對(duì) API 的每次調(diào)用都會(huì)導(dǎo)致從頭重新構(gòu)建完整的消息。這可以確保在任何時(shí)候獲得一個(gè)干凈的數(shù)據(jù)副本?;贑RDT的數(shù)據(jù)庫提供的低本地延遲使得重構(gòu)消息更快更容易 。

2. 選擇適合場景的正確 CRDT

計(jì)數(shù)器是 crt 中最簡單的。它可以應(yīng)用于諸如全局投票、跟蹤活動(dòng)會(huì)話、計(jì)量等用例。但是,如果要合并分布式對(duì)象的狀態(tài),那么還必須考慮其他數(shù)據(jù)結(jié)構(gòu)。例如,對(duì)于允許用戶編輯共享文檔的應(yīng)用程序,您可能不僅希望保留編輯,還希望保留執(zhí)行編輯的順序。在這種情況下,將編輯保存在基于 crdt 的列表或隊(duì)列數(shù)據(jù)結(jié)構(gòu)中將是比將編輯保存在寄存器中更好的解決方案。了解由 crt 強(qiáng)制執(zhí)行的沖突解決語義,以及您的解決方案符合規(guī)則也很重要

3. CRDT 不是一個(gè)萬能的解決方案 !

為了實(shí)現(xiàn)更快的上線應(yīng)用,建議擁有一致的開發(fā)、測試、階段化和生產(chǎn)設(shè)置。除此之外,這意味著開發(fā)和測試設(shè)置必須有一個(gè)小型化的模型。檢查基于CRDT的數(shù)據(jù)庫是可用的 Docker 容器還是可用的虛擬設(shè)備。將數(shù)據(jù)庫副本部署到不同的子網(wǎng)上,這樣就可以模擬已連接和斷開連接的集群設(shè)置。

使用分布式多l(xiāng)eader數(shù)據(jù)庫測試應(yīng)用程序可能聽起來很復(fù)雜。但是在大多數(shù)情況下,需要測試的是數(shù)據(jù)一致性和應(yīng)用程序可用性,這兩種情況分別是: 連接分布式數(shù)據(jù)庫時(shí),以及數(shù)據(jù)庫之間存在網(wǎng)絡(luò)劃分時(shí)。

通常,可以在開發(fā)環(huán)境中設(shè)置一個(gè)三節(jié)點(diǎn)的測試用分布式數(shù)據(jù)庫,就可以覆蓋單元測試中的大多數(shù)測試場景。以下是測試應(yīng)用的基本準(zhǔn)則:

(1)網(wǎng)絡(luò)連接和節(jié)點(diǎn)間延遲低的測試用例

測試用例必須更加強(qiáng)調(diào)模擬沖突。通常,可以通過多次跨不同節(jié)點(diǎn)更新相同的數(shù)據(jù)來實(shí)現(xiàn)這一點(diǎn),在所有節(jié)點(diǎn)上合并暫停并驗(yàn)證數(shù)據(jù)的步驟。即使數(shù)據(jù)庫副本是連續(xù)同步的,測試最終一致性數(shù)據(jù)庫也需要暫停測試并檢查數(shù)據(jù)。

對(duì)于驗(yàn)證,要驗(yàn)證兩件事: 所有數(shù)據(jù)庫副本具有相同的數(shù)據(jù),以及每當(dāng)發(fā)生沖突時(shí),沖突解決將按照設(shè)計(jì)進(jìn)行。

(2)分區(qū)網(wǎng)絡(luò)的測試用例

這里,通常執(zhí)行與前面相同的測試用例,但是分為兩個(gè)步驟。在第一步中,使用分區(qū)網(wǎng)絡(luò)測試應(yīng)用程序,也就是說,數(shù)據(jù)庫無法彼此同步的情況。當(dāng)網(wǎng)絡(luò)被拆分時(shí),數(shù)據(jù)庫不會(huì)合并所有數(shù)據(jù)。因此,測試用例必須假設(shè)只讀取數(shù)據(jù)的本地副本。在第二步中,重新連接所有網(wǎng)絡(luò)以測試合并是如何發(fā)生的。如果遵循與前一節(jié)相同的測試用例,那么最終的數(shù)據(jù)必須與前一組步驟中的數(shù)據(jù)相同。

6. CRDT的應(yīng)用示例

6.1 CRDT 用例: 投票,喜歡,愛心,表情符號(hào)等的計(jì)數(shù)

計(jì)數(shù)器有許多應(yīng)用程序。作為一個(gè)分布式的應(yīng)用程序,它可以收集選票,衡量一篇文章中“贊”的數(shù)量,或者跟蹤一條信息的表情符號(hào)反應(yīng)數(shù)量。例如,每個(gè)地理位置的本地應(yīng)用程序連接到最近的數(shù)據(jù)庫集群,更新計(jì)數(shù)器并用本地延遲讀取計(jì)數(shù)器。

可以使用 PN-Counter 的CRDT,示意代碼如下:

  1. void countVote(String pollId){ 
  2.      // CRDT Command: COUNTER_INCREMENT poll:[pollId]:counter 
  3.  
  4. long getVoteCount(String pollId){ 
  5. // CRDT Command: COUNTER_GET poll:[pollId]:counter 

6.2 CRDT 用例: 分布式緩存

分布式緩存的緩存機(jī)制與本地緩存中使用的機(jī)制相同: 應(yīng)用程序嘗試從緩存中獲取對(duì)象。如果對(duì)象不存在,則應(yīng)用程序從主存儲(chǔ)區(qū)檢索并將其保存在緩存中,并設(shè)置適當(dāng)?shù)倪^期時(shí)間。如果將緩存對(duì)象存儲(chǔ)在基于CRDT的數(shù)據(jù)庫中,該數(shù)據(jù)庫將自動(dòng)在所有區(qū)域中提供緩存。例如,將每個(gè)電影的海報(bào)緩存到本地環(huán)境。

采用register的CRDT,示意代碼如下:

  1. void cacheString(String objectId, String cacheData, int ttl){ 
  2.      // CRDT command: REGISTER_SET object:[objectId] [cacheData] ex [ttl] 
  3.  
  4. String getFromCache(String objectId){ 
  5.      // CRDT command: REGISTER_GET object:[objectId] 

6.3 CRDT 用例: 使用共享會(huì)話數(shù)據(jù)進(jìn)行協(xié)作

CRDT最初是為支持多用戶文檔編輯而開發(fā)的。共享會(huì)話用于游戲、電子商務(wù)、社交網(wǎng)絡(luò)、聊天、協(xié)作、應(yīng)急響應(yīng)和許多其他應(yīng)用程序。例如,一個(gè)簡單的婚禮祝福應(yīng)用,在這個(gè)應(yīng)用中,新婚夫婦的所有祝福者都將他們的禮物添加到購物車中,該購物車作為共享會(huì)話進(jìn)行管理。

婚禮祝福的應(yīng)用程序是一個(gè)分布式應(yīng)用,每個(gè)實(shí)例都連接到本地?cái)?shù)據(jù)庫。在開始一個(gè)會(huì)話時(shí),應(yīng)用的所有者邀請(qǐng)他們來自世界各地的朋友。一旦被邀請(qǐng)者接受邀請(qǐng),他們就可以訪問會(huì)話對(duì)象。然后,他們購物并將商品添加到購物車中。

2P-Set 和一個(gè) PN-counter 用于存放購物車中的物品,另外還有一個(gè)2P-Set 用于存儲(chǔ)活動(dòng)會(huì)話,示意代碼如下:

  1. void joinSession(String sharedSessionID, sessionID){ 
  2.      // CRDT command: SET_ADD sharedSession:[sharedSessionId] [sessionID] 
  3.  
  4. void addToCart(String sharedSessionId, String productId, int count){ 
  5.      // CRDT command: 
  6.      //          ZSET_ADD sharedSession:[sharedSessionId] productId count   
  7.  
  8. getCartItems(String sharedSessionId){ 
  9.      // CRDT command: 
  10.      //          ZSET_RANGE sharedSession:sessionSessionId 0 -1 
  11. 6.4 CRDT 應(yīng)用: 多 

6.4 CRDT 應(yīng)用: 多區(qū)域數(shù)據(jù)攝取

List或隊(duì)列在許多應(yīng)用程序中使用。例如,訂單處理系統(tǒng)在基于 CRDT的 List 數(shù)據(jù)結(jié)構(gòu)中維護(hù)活動(dòng)作業(yè)。這個(gè)解決方案在不同的地點(diǎn)收集任務(wù)。每個(gè)位置的分布式應(yīng)用程序連接到最近的數(shù)據(jù)庫副本。這減少了寫操作的網(wǎng)絡(luò)延遲,從而允許應(yīng)用程序支持大量作業(yè)提交。這些作業(yè)是從一個(gè)集群的 List 數(shù)據(jù)結(jié)構(gòu)中彈出的。這保證了作業(yè)只被處理一次。

基于 CRDT的List,列表數(shù)據(jù)結(jié)構(gòu)用作 FIFO 隊(duì)列的示意代碼如下:

  1. pushJob(String jobQueueId, String job){ 
  2.      // CRDT command: LIST_LEFT_PUSH job:[jobQueueId] [job]     
  3.  
  4. popJob(String jobQueueId){ 
  5.      // CRDT command: LIST_RIGHT_POP job:[jobQueueId] 

小結(jié)

CRDT 對(duì)于許多用例來說確實(shí)是一個(gè)很好的工具,通過在這些場景和其他場景中利用基于 crdt 的數(shù)據(jù)庫,您可以專注于業(yè)務(wù)邏輯,而不用擔(dān)心區(qū)域之間的數(shù)據(jù)同步。最重要的是,基于 crdt 的數(shù)據(jù)庫可以提供本地的應(yīng)用延遲,同時(shí)承諾即使在數(shù)據(jù)中心之間出現(xiàn)網(wǎng)絡(luò)故障時(shí)也可以提供強(qiáng)大的最終一致性。

但是,它可能不是所有用例(例如 ACID 事務(wù))的最佳工具?;? CRDT的數(shù)據(jù)庫通常非常適合微服務(wù)體系結(jié)構(gòu),其中每個(gè)微服務(wù)都有一個(gè)專門的數(shù)據(jù)庫。當(dāng)然,區(qū)塊鏈或許是使用CRDT 的又一主要場景。

【參考資料與關(guān)聯(lián)閱讀】

  • https://www.infoq.com/presentations/CRDT
  • Strong Eventual Consistency and Conflict-free Replicated Data Types
  • Key-CRDT Stores https://run.unl.pt/bitstream/10362/7802/1/Sousa_2012.pdf
  • Conflict-free Replicated Data Types: An Overview https://arxiv.org/pdf/1806.10254.pdf
  • A Conflict-Free Replicated JSON Datatype https://arxiv.org/abs/1608.03960
  • A comprehensive study of Convergent and Commutative Replicated Data Types https://hal.inria.fr/inria-00555588/document
  • Convergent and Commutative Replicated Data Type https://core.ac.uk/download/pdf/55634119.pdf
  • Conflict-free replicated data type https://en.wikipedia.org/wiki/Conflict-freereplicateddata_type
  • CRDTs: An UPDATE (or just a PUT) https://speakerdeck.com/lenary/crdts-an-update-or-just-a-put
  • https://medium.com/@amberovsky/crdt-conflict-free-replicated-data-types-b4bfc8459d26

 

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2024-06-04 09:51:48

2019-09-20 21:50:47

數(shù)據(jù)庫緩存

2017-07-25 14:38:56

數(shù)據(jù)庫一致性非鎖定讀一致性鎖定讀

2022-12-14 08:23:30

2025-02-10 03:00:00

2021-12-01 08:26:27

數(shù)據(jù)庫緩存技術(shù)

2025-09-02 00:30:00

系統(tǒng)視頻技術(shù)

2021-06-16 08:33:02

分布式事務(wù)ACID

2025-09-08 07:25:16

2019-08-30 12:46:10

并發(fā)扣款查詢SQL

2022-07-21 06:54:28

微服務(wù)系統(tǒng)RocketMQ

2019-10-12 09:04:59

微服務(wù)架構(gòu)CAP

2025-03-27 08:20:54

2021-02-05 08:00:48

哈希算法?機(jī)器

2021-02-02 12:40:50

哈希算法數(shù)據(jù)

2025-08-05 04:22:00

2021-02-04 06:30:26

Python編程語言

2016-12-21 14:06:55

日志實(shí)現(xiàn)數(shù)據(jù)實(shí)時(shí)抽取

2023-07-25 09:52:00

本地事務(wù)宕機(jī)

2025-05-13 08:44:26

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩一区二区精品葵司在线| 亚洲国产高清不卡| 日韩免费观看网站| 美国黄色特级片| 久久久久久爱| 黑人巨大精品欧美一区二区三区| 秋霞久久久久久一区二区| 亚洲一二区视频| 亚洲日本免费| 久久精品视频播放| 草草地址线路①屁屁影院成人| 日本另类视频| 亚洲第一综合色| 亚洲不卡一卡2卡三卡4卡5卡精品| 亚洲一卡二卡在线观看| 99国产精品视频免费观看一公开 | 一本色道久久综合狠狠躁的推荐| 亚洲午夜精品一区二区| 欧美一级淫片免费视频魅影视频| 日韩av网站在线观看| 国产伦精品一区二区三区免费迷| 色综合色狠狠综合色| 日本高清xxxx| 岛国在线视频免费看| 国产精品18久久久久久久久| 国产精品电影网站| 天天综合网久久综合网| 欧美88av| 久久久精品日本| 老熟妇一区二区| 青青一区二区| 欧美成人a视频| 亚洲一区二区三区四区五区| 国产 日韩 欧美一区| 亚欧色一区w666天堂| 一区二区三区四区免费观看| 自拍视频在线网| 久久日韩精品一区二区五区| 国产综合精品一区二区三区| 性做久久久久久久久久| 久久99九九99精品| 国产精品劲爆视频| 男人晚上看的视频| 久久不见久久见国语| 日韩精品在线电影| 免费的av网站| 久久影视三级福利片| 精品久久国产字幕高潮| 亚洲五月激情网| 91精品网站在线观看| 欧美日韩亚洲国产综合| 欧美一级在线视频| 国产精自产拍久久久久久蜜| 日日夜夜狠狠操| 久久九九免费| 国产mv久久久| 乱子伦一区二区三区| 日韩福利电影在线观看| 国产精品草莓在线免费观看| 中文人妻av久久人妻18| 久久综合中文| 国产精品视频在线观看| 中文字幕乱码在线观看| 久草精品在线观看| 91久久国产精品| 精品人妻一区二区三区换脸明星| 国产一区二三区| 国产99视频精品免费视频36| 日本xxxxxwwwww| 久久久www免费人成精品| 日本一区视频在线播放| 在线国产情侣| 亚洲美女免费在线| 欧美日韩xxxxx| 欧美成欧美va| 欧美日韩18| 午夜精品一区二区三区av| 免费观看一区二区三区毛片| 爽好久久久欧美精品| 成人国产精品久久久| 国产极品999| 91免费观看国产| 亚洲欧洲精品在线观看| 怡红院av在线| 精品久久久久久国产91| 搡女人真爽免费午夜网站| 亚洲精品大片| 亚洲国产精品中文| 四虎成人免费影院| 欧美日韩福利| 国产成人亚洲精品| www.中文字幕| 国产欧美va欧美不卡在线| 国产成人精品免费看在线播放| 日本h片在线| 国产精品日韩精品欧美在线| 国产资源第一页| 都市激情亚洲综合| 91精品国产色综合久久久蜜香臀| 性色av蜜臀av浪潮av老女人| 成久久久网站| 性欧美视频videos6一9| 国产精品露脸视频| 成人av在线资源网站| 亚洲欧美日韩精品久久久| 大香伊人中文字幕精品| 欧美视频一区二区三区| 中文字幕免费在线播放| 亚洲国产精品久久久久蝴蝶传媒| 97精品视频在线播放| 国产精品久久久久久久一区二区| 91视频一区二区三区| 欧美日韩亚洲国产成人| 日韩电影免费观| 精品久久久久久久久久久久久久久久久 | 男人插女人视频在线观看| 欧美一级做一级爱a做片性| 日韩va亚洲va欧洲va国产| 少妇久久久久久被弄高潮| 男女性色大片免费观看一区二区 | 亚洲成人一区二区| 日本人69视频| 欧洲福利电影| 热久久免费视频精品| 国精产品一品二品国精品69xx | 51xx午夜影福利| 福利精品在线| 国产香蕉精品视频一区二区三区| 日韩精品一区二区在线播放| 国产精品一区久久久久| 一区二区视频在线免费| 成人免费毛片嘿嘿连载视频…| 日韩的一区二区| 久久香蕉精品视频| 国产精品一区二区你懂的| 中文字幕久久一区| 88xx成人网| 中文字幕亚洲精品| а中文在线天堂| 国产人久久人人人人爽| 日本va中文字幕| 欧美自拍偷拍| 国产日韩欧美日韩大片| xxxxx日韩| 欧美日韩亚州综合| 人妻无码一区二区三区免费| 蜜桃传媒麻豆第一区在线观看| 蜜桃传媒视频麻豆一区 | 国产精品啊v在线| 69堂成人精品视频免费| 伊人影院在线视频| 欧美v日韩v国产v| 日本少妇激情视频| av一区二区三区| 久久久久久久激情| 久久综合影院| 国产精品露脸av在线| 在线免费观看黄色av| 91精品国产综合久久久久| 农村黄色一级片| 成人免费毛片片v| 欧美日韩亚洲第一| 禁断一区二区三区在线| 国产欧美精品在线播放| 9191在线播放| 亚洲国产欧美一区| √资源天堂中文在线| 欧美国产成人精品| www.国产视频.com| 狠狠爱www人成狠狠爱综合网| 国产伦精品一区二区三区高清| 欧美激情网站| 日韩中文字幕网址| www黄色在线观看| 欧美午夜精品久久久久久浪潮| 国产午夜福利一区| 国产乱理伦片在线观看夜一区| 国产一区 在线播放| 伊人久久大香线蕉无限次| 国产精品久久久久久久一区探花| 成人免费网站在线观看视频| 亚洲国产精品一区二区三区| 青青艹在线观看| 亚洲资源中文字幕| 国产免费看av| 国产精品综合视频| 精品一卡二卡三卡| 亚洲一区欧美| 欧美精品在线一区| www一区二区三区| 国产91ⅴ在线精品免费观看| av在线免费观看网| 精品国产一区二区三区忘忧草 | 日韩精品一区二区av| 国产精品每日更新| 无码成人精品区在线观看| 日本中文一区二区三区| 粉嫩av一区二区三区天美传媒| 亚洲区小说区图片区qvod| 成人午夜激情免费视频| 樱花草涩涩www在线播放| 久久夜精品va视频免费观看| 欧美男男同志| 精品国产伦理网| 91麻豆成人精品国产免费网站| 婷婷六月综合网| 国产精品国产精品88| 91亚洲精华国产精华精华液| 一二三级黄色片| 久久午夜视频| www精品久久| 欧美淫片网站| 杨幂一区欧美专区| 妖精一区二区三区精品视频| 国产二区一区| 精品一区二区三区中文字幕在线 | 国产精品久久久一区麻豆最新章节| 亚洲一级av无码毛片精品| 国产麻豆一精品一av一免费| 激情 小说 亚洲 图片: 伦| 99热在线精品观看| 成人免费a级片| 91精品综合久久久久久久久久久 | jizzjizz在线观看| 亚洲欧美国产va在线影院| 欧美综合视频在线| 欧美大片日本大片免费观看| 国产精品久久久久精| 欧美欧美欧美欧美首页| 欧美在线视频精品| 色诱亚洲精品久久久久久| 天堂中文在线网| 红桃视频成人在线观看| 一级aaa毛片| 亚洲国产视频一区二区| 青青操国产视频| 亚洲色图制服诱惑| 老熟妇高潮一区二区三区| 国产精品毛片a∨一区二区三区| 中文字幕第24页| 国产亚洲成av人在线观看导航 | 精品电影在线| 亚洲无线码在线一区观看| 毛片网站在线观看| 亚洲美女av在线播放| 久久久久久久影视| 国产亚洲一区二区精品| 黄色片在线播放| 一区二区三区美女xx视频| 成年人在线看| 久久黄色av网站| 91精品久久| 久久久久久中文字幕| 老牛影视精品| 日韩av第一页| 国产日本久久| 91精品久久香蕉国产线看观看| 99re6热只有精品免费观看| 成人免费视频视频在| 另类在线视频| 欧美日韩电影一区二区| 不卡日本视频| 久久久久久久久影视| 最新亚洲一区| 日韩视频免费在线播放| 久久精品国产亚洲高清剧情介绍| 日本高清免费在线视频| 成人激情小说乱人伦| 日韩精品电影一区二区| 日韩一区有码在线| 免费一级片在线观看| 色综合视频在线观看| 97人妻精品一区二区三区| 精品久久国产字幕高潮| 国产中文字幕在线| 久久亚洲春色中文字幕| 韩国成人二区| 国产精品自产拍高潮在线观看| 激情视频亚洲| 欧美精品与人动性物交免费看| 午夜精品一区二区三区国产 | 国产成人亚洲精品狼色在线 | 亚洲特级片在线| 国产在线成人精品午夜| 欧美性受极品xxxx喷水| www.精品久久| 国产亚洲精品久久久优势| 91小视频xxxx网站在线| 国产91精品黑色丝袜高跟鞋 | 久99久在线| 99免费精品| 欧美三级一级片| 韩国av一区二区三区| 噜噜噜在线视频| 亚洲欧洲精品一区二区三区| 中文字幕一区二区三区精品 | 成人综合影院| 欧美极品少妇xxxxx| 777午夜精品电影免费看| 国产成人看片| 日韩情爱电影在线观看| 一女被多男玩喷潮视频| 久久综合88| 精品视频在线观看一区| 久久99久久99小草精品免视看| 中文精品在线观看| 一区二区三区视频在线观看| 国产精品51麻豆cm传媒 | 亚洲永久免费观看| 精品一区免费| 成年人午夜免费视频| 极品少妇xxxx偷拍精品少妇| 亚洲午夜福利在线观看| 亚洲一区二区欧美日韩 | 日韩精品中文字幕久久臀| 亚洲男同gay网站| 国产日韩在线视频| 蜜桃成人av| 欧美日本视频在线观看| 国产成人综合亚洲91猫咪| 日本在线观看网址| 色8久久人人97超碰香蕉987| 亚洲 美腿 欧美 偷拍| 欧美美最猛性xxxxxx| 日本在线一区二区| 婷婷四房综合激情五月| 久久亚洲一区| 精品人妻互换一区二区三区 | 在线观看亚洲国产| 亚洲色图美腿丝袜| 欧美调教sm| 另类欧美小说| 亚洲综合精品四区| 亚洲天堂2024| 性做久久久久久免费观看| 丰满人妻一区二区三区无码av | 一区二区三区四区精品| 一区二区三区四区日本视频| 久久国产精品高清| 国产一区二区你懂的| 三级男人添奶爽爽爽视频| 午夜av一区二区| 色视频在线观看福利| 欧美中文字幕视频| 亚州av一区| 99视频精品免费| 国产精品护士白丝一区av| 一二三四区在线| 久久亚洲精品毛片| 欧美成人精品午夜一区二区| 日本大胆人体视频| 成人黄色在线网站| 69视频免费在线观看| 一区二区三区视频免费在线观看 | 日韩国产在线一| 一区二区伦理片| 欧美美女直播网站| 中文字幕在线观看网站| 成人国产1314www色视频| 在线欧美不卡| 中文幕无线码中文字蜜桃| 色成人在线视频| 黄网页免费在线观看| av日韩免费电影| 亚洲欧美日本视频在线观看| 亚洲女优在线观看| 亚洲精品免费在线观看| 激情五月综合色婷婷一区二区| a成人v在线| 最新欧美日韩亚洲| 丁香六月综合激情| 狠狠人妻久久久久久综合| 最近中文字幕mv在线一区二区三区四区 | 免费av在线| 91在线精品观看| 午夜在线播放视频欧美| 天天操天天干天天操天天干| 91精品国产综合久久久久久| 98色花堂精品视频在线观看| 日本一区二区三区视频在线观看 | 国产在线观看无码免费视频| 日本道精品一区二区三区| 国产人成网在线播放va免费| 国产一区二区无遮挡| 蜜芽一区二区三区| 久久久久成人网站| 亚洲人成伊人成综合网久久久| 爱情电影网av一区二区| 欧美日韩黄色一级片| 亚洲欧洲av一区二区三区久久| 后进极品白嫩翘臀在线视频| 国产成人午夜视频网址| 亚洲视频一二| 你懂得视频在线观看| 亚洲护士老师的毛茸茸最新章节| 主播大秀视频在线观看一区二区| av在线播放天堂| 国产精品国产三级国产普通话蜜臀| 天堂av2024| 91在线视频精品|