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

淺談分布式一致性:Raft 與 SOFAJRaft

開發 開發工具 分布式
對于一個無限增長的序列a[1, 2, 3…],如果對于任意整數i, a[i]的值滿足分布式一致性, 這個系統就滿足一致性狀態機的要求。

[[403519]]

 一 分布式共識算法 (Consensus Algorithm)

1 如何理解分布式共識?

多個參與者針對某一件事達成完全一致:一件事,一個結論。

已達成一致的結論,不可推翻。

2 有哪些分布式共識算法?

  • Paxos:被認為是分布式共識算法的根本,其他都是其變種,但是 paxos 論文中只給出了單個提案的過程,并沒有給出復制狀態機中需要的 multi-paxos 的相關細節的描述,實現 paxos 具有很高的工程復雜度(如多點可寫,允許日志空洞等)。
  • Zab:被應用在 zookeeper 中,業界使用廣泛,但沒用抽象成通用 library。
  • Raft:以容易理解著稱,業界也涌現出很多 raft 實現,比如 etcd、braft、tikv 等。

二 Raft 介紹

1 特點:Strong Leader

  • 系統中必須存在且同一時刻只能有一個 leader,只有 leader 可以接受 clients 發過來的請求。
  • Leader 負責主動與所有 followers 通信,負責將“提案”發送給所有followers,同時收集多數派的 followers 應答。
  • Leader 還需向所有 followers 主動發送心跳維持領導地位(保持存在感)。

另外,身為 leader 必須保持一直 heartbeat 的狀態。

2 復制狀態機

對于一個無限增長的序列a[1, 2, 3…],如果對于任意整數i, a[i]的值滿足分布式一致性, 這個系統就滿足一致性狀態機的要求。

基本上所有的真實系統都會有源源不斷的操作,這時候單獨對某個特定的值達成一致顯然是不夠的。為了讓真實系統保證所有的副本的一致性,通常會把操作轉化為 write-ahead-log(WAL)。然后讓系統中所有副本對 WAL 保持一致,這樣每個副本按照順序執行 WAL 里的操作,就能保證最終的狀態是一致的。

  • Client 向 leader 發送寫請求。
  • Leader 把“操作”轉化為 WAL 寫本地 log 的同時也將 log 復制到所有 followers。
  • Leader 收到多數派應答,將 log 對應的“操作”應用到狀態機。
  • 回復 client 處理結果。

3 Raft 中的基本概念

Raft-node 的 3 種角色/狀態

  • Follower:完全被動,不能發送任何請求, 只接受并響應來自 leader 和 candidate 的 message, node啟動后的初始狀態必須是 follower。
  • Leader:處理所有來自客戶端的請求,以及復制 log 到所有 followers。
  • Candidate:用來競選一個新 leader (candidate 由 follower 觸發超時而來)。

Message 的 3 種類型

  • RequestVote RPC:Candidate 發出。
  • AppendEntries (Heartbeat) RPC:Leader 發出。
  • InstallSnapshot RPC:Leader 發出。

任期邏輯時鐘

  • 時間被劃分為一個個任期(term),term id 按時間軸單調遞增。
  • 每一個任期的開始都是 leader 選舉,選舉成功之后,leader在任期內管理整個集群, 也就是“選舉 + 常規操作”。
  • 每個任期最多一個 leader,可以沒有 leader (spilt-vote 導致)。

4 Raft 功能分解

Leader 選舉

超時驅動:Heartbeat / Election timeout

隨機的超時時間:降低選舉碰撞導致選票被瓜分的概率

選舉流程:Follower --> Candidate (選舉超時觸發)

  • 贏得選舉:Candidate --> Leader
  • 另一個節點贏得選舉:Candidate --> Follower
  • 一段時間內沒有任何節點器贏得選舉:Candidate --> Candidate

選舉動作:

  • Current term++
  • 發送 RequestVote RPC

New Leader 選取原則 (最大提交原則):

  • Candidates include log info in RequestVote RPCs(index & term of last log entry)
  • During elections, choose candidate with log most likely to contain all committed entries
  • Voting server V denies vote if its log is “more complete”:(lastTermV > lastTermC) ||((lastTermV == lastTermC) && (lastIndexV > lastIndexC))
  • Leader will have “most complete” log among electing majority

安全性:一個 term,最多選出一個 leader,可以沒 leader,下一個 term 再選。

影響 raft 選舉成功率的幾個時間參數:

  • RTT(Round Trip Time):網絡延時
  • Heartbeat timeout:心跳間隔,通常應該比 election timeout 小一個數量級,目的是讓 leader 能夠持續發送心跳來阻止 followers 觸發選舉
  • Election timeout:Leader 與 followers 間通信超時觸發選舉的時間
  • MTBF(Meantime Between Failure):Servers 連續常規故障時間間隔 RTT << Heartbeat timeout < Election timeout(ET) << MTBF

隨機選主觸發時間:Random(ET, 2ET)

日志復制

Raft 日志格式:

  • (TermId, LogIndex, LogValue)
  • 其中 (TermId, LogIndex) 能確定唯一一條日志

Log replication關鍵點:

  • 連續性:日志不允許出現空洞
  • 有效性:
    • 不同節點,擁有相同 term 和 logIndex 的日志 value 一定相同
    • Leader 上的日志一定是有效的
    • Follower 上的日志是否有效,通過 leader 日志對比判斷 (How?)

Followers 日志有效性檢查:

  • AppendEntries RPC 中還會攜帶前一條日志的唯一標識 (prevTermId, prevLogIndex)
  • 遞歸推導

Followers 日志恢復:

  • Leader 將 nextIndex 遞減并重發 AppendEntries,直到與 leader 日志一致

Commit Index 推進

CommitIndex (TermId, LogIndex) :

  • 所謂 commitIndex,就是已達成多數派,可以應用到狀態機的最新的日志位置
  • 日志被復制到 followers 后,先持久化,并不能馬上被應用到狀態機
  • 只有 leader 知道日志是否達成多數派,是否可以應用到狀態機
  • Followers 記錄 leader 發來的當前 commitIndex,所有小于等于 commitIndex 的日志均可以應用到狀態機

CommitIndex推進:

  • Leader 在下一個 AppendEntries RPC (也包括 Heartbeat)中攜帶當前的 commitIndex
  • Followers 檢查日志有效性通過則接受 AppendEntries 并同時更新本地 commitIndex, 最后把所有小于等于 commitIndex 的日志應用到狀態機

AppendEntries RPC

  • 完整信息:(currentTerm, logEntries[], prevTerm, prevLogIndex, commitTerm, commitLogIndex)
  • currentTerm, logEntries[]:日志信息,為了效率,日志通常為多條
  • prevTerm, prevLogIndex:日志有效性檢查
  • commitTerm, commitLogIndex:最新的提交日志位點(commitIndex)

階段小結:現在我們能用 raft 做什么?

  • 連續確定多個提案,確保集群中各個系統節點狀態完全一致
  • 自動選主,保證在只有少數派宕機的情況下持續可用
  • 日志強同步,宕機后零數據丟失

三 SOFAJRaft

一個純 Java 的 raft 算法實現庫,使用 Java 重寫了所有功能,并有一些改進和優化。

1 SOFAJRaft 整體功能

功能支持

Leader election:選主。

Log replication and recovery:日志復制和日志恢復,log recovery就是要保證已經被 commit 的數據一定不會丟失,log recovery 包含兩個方面

  • Current term 日志恢復,主要針對一些 follower 節點重啟加入集群或者是新增 follower 節點
  • Prev term 日志恢復,主要針對 leader 切換前后的日志一致性

Snapshot and log compaction:定時生成 snapshot,實現 log compaction加速啟動和恢復,以及InstallSnapshot 給 followers 拷貝數據。

Membership change:集群線上配置變更,增加節點、刪除節點、替換節點等。

Transfer leader:主動變更 leader,用于重啟維護,leader 負載平衡等。

Symmetric network partition tolerance:對稱網絡分區容忍性。

Pre-Vote:如上圖 S1 為當前 leader,網絡分區造成 S2 不斷增加本地 term,為了避免網絡恢復后S2發起選舉導致正在良心工作的 leader step-down, 從而導致整個集群重新發起選舉,在 request-vote 之前會先進行 pre-vote(currentTerm + 1,lastLogIndex, lastLogTerm),多數派成功后才會轉換狀態為 candidate 發起真正的 request-vote,所以分區后的節點,pre-vote不會成功,也就不會導致集群一段時間內無法正常提供服務。

Asymmetric network partition tolerance:非對稱網絡分區容忍性。

如上圖 S1 為當前 leader,S2 不斷超時觸發選主,S3 提升 term 打斷當前 lease,從而拒絕 leader 的更新,這個時候可以增加一個 trick 的檢查,每個 follower 維護一個時間戳記錄收到 leader 上數據更新的時間(也包括心跳),只有超過 election timeout 之后才允許接受 request-vote 請求。

Fault tolerance:容錯性,少數派故障,不影響系統整體可用性。

  • 機器掉電
  • 強殺應用
  • 慢節點(GC, OOM等)
  • 網絡故障
  • 其他各種奇葩原因導致 raft 節點無法正常工作

Workaround when quorate peers are dead:多數派故障時整個 grop 已不具備可用性, 安全的做法是等待多數節點恢復,只有這樣才能保證數據安全,但是如果業務更追求可用性,放棄數據一致性的話可以通過手動 reset_peers 指令迅速重建整個集群,恢復集群可用。

Metrics:SOFAJRaft 內置了基于 metrics 類庫的性能指標統計,具有豐富的性能統計指標。

Jepsen:除了單元測試之外,SOFAJRaft 還使用 jepsen 這個分布式驗證和故障注入測試框架模擬了很多種情況,都已驗證通過。

隨機分區,一大一小兩個網絡分區

  • 隨機增加和移除節點
  • 隨機停止和啟動節點
  • 隨機 kill -9 和啟動節點
  • 隨機劃分為兩組,互通一個中間節點,模擬分區情況
  • 隨機劃分為不同的 majority 分組

性能優化

Batch:SOFAJRaft 中整個鏈路都是 batch 的,依靠 disruptor 中的 MPSC 模型批量消費,包括但不限于

  • 批量提交 task
  • 批量網絡發送
  • 本地 IO batch 寫入,要保證日志不丟,一般每一條 log entry 都要進行 fsync, 比較耗時,SOFAJRaft 中做了合并寫入的優化
  • 批量應用到狀態機

Replication pipeline:流水線復制,leader 跟 followers 節點的 log 同步是串行 batch 的方式,每個 batch 發送之后需要等待 batch 同步完成之后才能繼續發送下一批(ping-pong), 這樣會導致較長的延遲。可以通過 leader 跟 followers 節點之間的 pipeline 復制來改進,有效降低更新的延遲, 提高吞吐。

Append log in parallel:Leader 持久化 log entries 和向 followers 發送 log entries 是并行的。

Fully concurrent replication:Leader 向所有 follwers 發送 log 也是完全并發的。

Asynchronous:Jraft 中整個鏈路幾乎沒有任何阻塞,完全異步的,是一個 callback 編程模型。

ReadIndex:優化 raft read 走 raft log 的性能問題,每次 read,僅記錄 commitIndex,然后發送所有 peers heartbeat 來確認 leader 身份,如果 leader 身份確認成功,等到 applied index >= commitIndex,就可以返回 client read 了,基于 ReadIndex 可以很方便的提供線性一致讀,不過 commitIndex 是需要從 leader 那里獲取的,多了一輪RPC。

Lease Read:通過租約(lease)保證 leader 的身份,從而省去了 readIndex 每次 heartbeat 確認 leader 身份,性能更好, 但是通過時鐘維護 lease 本身并不是絕對的安全(jraft 中默認配置是 readIndex,因為 readIndex 性能已足夠好)。

2 SOFAJRaft 設計

SOFAJRaft - Raft Node

Node:Raft 分組中的一個節點,連接封裝底層的所有服務,用戶看到的主要服務接口,特別是 apply(task) 用于向 raft group 組成的復制狀態機集群提交新任務應用到業務狀態機。

存儲:

  • Log 存儲,記錄 raft 用戶提交任務的日志,將從 leader 復制到其他節點上。LogStorage 是存儲實現, LogManager 負責對底層存儲的調用,對調用做緩存、批量提交、必要的檢查和優化。
  • Metadata 存儲,元信息存儲,記錄 raft 實現的內部狀態,比如當前 term、投票給哪個節點等信息。
  • Snapshot 存儲,用于存放用戶的狀態機 snapshot 及元信息,可選. SnapshotStorage 用于 snapshot 存儲實現,SnapshotExecutor 用于 snapshot 實際存儲、遠程安裝、復制的管理。

狀態機:

  • StateMachine:用戶核心邏輯的實現,核心是 onApply(Iterator) 方法,應用通過 Node#apply(task) 提交的日志到業務狀態機。
  • FSMCaller:封裝對業務 StateMachine 的狀態轉換的調用以及日志的寫入等,一個有限狀態機的實現, 做必要的檢查、請求合并提交和并發處理等。

復制:

  • Replicator:用于 leader 向 followers 復制日志,也就是 raft 中的 AppendEntries 調用,包括心跳存活檢查等。
  • ReplicatorGroup:用于單個 raft group 管理所有的 replicator,必要的權限檢查和派發。

RPC 模塊用于節點之間的網絡通訊:

  • RPC Server:內置于 Node 內的 RPC 服務器,接收其他節點或者客戶端發過來的請求, 轉交給對應服務處理。
  • RPC Client:用于向其他節點發起請求,例如投票、復制日志、心跳等。

KV Store:SOFAJRaft 只是一個 lib,KV Store 是 SOFAJRaft 的一個典型的應用場景,把它放進圖中以便更好的理解 SOFAJRaft。

SOFAJRaft - Raft Group

SOFAJRaft - Multi Raft Group

3 SOFAJRaft 實現細節

高效的線性一致讀

什么是線性一致讀?

所謂線性一致讀,一個簡單的例子就是在 t1 的時刻我們寫入了一個值, 那么在 t1 之后, 我們一定能讀到這個值,不可能讀到 t1 之前的舊值 (想想 Java 中的 volatile 關鍵字,說白了線性一致讀就是在分布式系統中實現 volatile 語義)。

上圖Client A、B、C、D均符合線性一致讀,其中 D 看起來是 stale read,其實并不是, D 請求橫跨了3個階段,而讀可能發生在任意時刻,所以讀到 1 或 2 都行。

重要:接下來的討論均基于一個大前提,就是業務狀態機的實現必須是滿足線性一致性的, 簡單說就是也要具有 Java volatile 的語義。

1)直接點,是否可以直接從當前 leader 節點讀?

怎么確定當前的 leader 真的是 leader(網絡分區)?

2)最簡單的實現方式:讀請求走一遍 raft 協議

有什么問題?

  • 不僅有日志寫盤開銷,還有日志復制的 RPC 開銷,在讀比重較大的系統中是無法接受的
  • 還多了一堆的 raft “讀日志”

3)ReadIndex Read

這是 raft 論文中提到過的一種優化方案,具體來說:

  • 將當前自己 log 的 commit index 記錄到一個 local 變量 ReadIndex 里面。
  • 向其他節點發起一次 heartbeat,如果大多數節點返回了對應的 heartbeat response,那么 leader 就能夠確定現在自己仍然是 leader (證明了自己是自己)。
  • Leader 等待自己的狀態機執行,直到 apply index 超過了 ReadIndex,這樣就能夠安全的提供 Linearizable Read 了, 也不必管讀的時刻是否 leader 已飄走 (思考:為什么需要等到 apply index 超過了 ReadIndex 才可以執行讀請求?)。
  • Leader 執行 read 請求,將結果返回給 Client。

通過ReadIndex,也可以很容易在 followers 節點上提供線性一致讀:

  • Follower 節點向 leader 請求最新的 ReadIndex。
  • Leader執行上面 i ~ iii 的過程(確定自己真的是 leader),并返回 ReadIndex 給 follower。
  • Follower 等待自己的 apply index 超過了 ReadIndex (有什么問題?慢節點?)。
  • Follower 執行 read 請求,將結果返回給 client。

ReadIndex小結:

  • 相比較于走 raft log 的方式,ReadIndex 讀省去了磁盤的開銷,能大幅度提升吞吐,結合 SOFAJRaft 的 batch + pipeline ack + 全異步機制,三副本的情況下 leader 讀的吞吐接近于 RPC 的上限。
  • 延遲取決于多數派中最慢的一個 heartbeat response,理論上對于降低延時的效果不會非常顯著。

4)Lease Read

Lease read 與 ReadIndex 類似,但更進一步,不僅省去了 log,還省去了網絡交互。它可以大幅提升讀的吞吐也能顯著降低延時。

基本的思路是 leader 取一個比 election timeout 小的租期(最好小一個數量級),在租約期內不會發生選舉,這就確保了 leader 不會變,所以可以跳過 ReadIndex 的第二步, 也就降低了延時。可以看到, Lease read 的正確性和時間是掛鉤的,因此時間的實現至關重要,如果漂移嚴重,這套機制就會有問題。

實現方式:

  • 定時 heartbeat 獲得多數派響應, 確認 leader 的有效性 (在 SOFAJRaft 中默認的 heartbeat 間隔是 election timeout 的十分之一)。
  • 在租約有效時間內,可以認為當前 leader 是 raft group 內的唯一有效 leader,可忽略 ReadIndex 中的 heartbeat 確認步驟(2)。
  • Leader 等待自己的狀態機執行,直到 apply index 超過了 ReadIndex,這樣就能夠安全的提供 Linearizable Read 了。

5)更進一步:Wait Free

到此為止 lease 省去了 ReadIndex 的第 2 步(heartbeat),實際上還能再進一步,省去第 3 步。

我們想想前面的實現方案的本質是什么? 當前節點的狀態機達到“讀”這一刻的時間點 相同或者更新的狀態。

那么更嚴格一點的約束就是:當前時刻,當前節點的狀態機就是最新的。

問題來了,leader 節點的狀態機能保證一定是最新的嗎?

  • 首先 leader 節點的 log 一定是最新的,即使新選舉產生的 leader,它也一定包含全部的 commit log,但它的狀態機卻可能落后于舊的 leader。
  • 但是在 leader 應用了自己當前 term 的第一條 log 之后,它的狀態機就一定是最新的。
  • 所以可以得出結論:當 leader 已經成功應用了自己 term 的第一條 log 之后,不需要再取 commit index,也不用等狀態機,直接讀,一定是線性一致讀。

小結:Wait Free 機制將最大程度的降低讀延遲,SOFAJRaft 暫未實現 wait free 這一優化,不過已經在計劃中。

在 SOFAJRaft 中發起一次線性一致讀請求:

  1. // KV 存儲實現線性一致讀 
  2. public void readFromQuorum(String key, AsyncContext asyncContext) { 
  3.     // 請求 ID 作為請求上下文傳入 
  4.     byte[] reqContext = new byte[4]; 
  5.     Bits.putInt(reqContext, 0, requestId.incrementAndGet()); 
  6.     // 調用 readIndex 方法, 等待回調執行 
  7.     this.node.readIndex(reqContext, new ReadIndexClosure() { 
  8.  
  9.         @Override 
  10.         public void run(Status status, long index, byte[] reqCtx) { 
  11.             if (status.isOk()) { 
  12.                 try { 
  13.                     // ReadIndexClosure 回調成功, 可以從狀態機讀取最新數據返回 
  14.                     // 如果你的狀態實現有版本概念, 可以根據傳入的日志 index 編號做讀取 
  15.                     asyncContext.sendResponse(new ValueCommand(fsm.getValue(key))); 
  16.                 } catch (KeyNotFoundException e) { 
  17.                     asyncContext.sendResponse(GetCommandProcessor.createKeyNotFoundResponse()); 
  18.                 } 
  19.             } else { 
  20.                 // 特定情況下, 比如發生選舉, 該讀請求將失敗 
  21.                 asyncContext.sendResponse(new BooleanCommand(false, status.getErrorMsg())); 
  22.             } 
  23.         } 
  24.     }); 

四 SOFAJRaft 應用場景

1 SOFAJRaft 可以做什么

  • 選舉
  • 分布式鎖服務,比如 zookeeper
  • 高可靠的元信息管理
  • 分布式存儲系統,如分布式消息隊列、分布式文件系統、分布式塊系統等等。

2 用戶案例

  • AntQ Streams QCoordinator:使用 SOFAJRaft 在 coordinator 集群內做選舉、元信息存儲等功能。
  • Schema Registry:高可靠 schema 管理服務,類似 kafka schema registry。
  • SOFA 服務注冊中心元信息管理模塊:IP 數據信息注冊,要求寫數據達到各個節點一致, 并且在少數派節點掛掉時保證不影響數據正常存儲。
  • RheaKV:基于 SOFAJRaft 和 rocksDB 實現的嵌入式、分布式、高可用、強一致的 KV 存儲類庫。

3 簡單實踐:基于 SOFAJRaft 設計一個簡單的 KV Store

到目前為止,我們似乎還沒看到 SOFAJRaft 作為一個 lib 有什么特別之處, 因為 SOFAJRaft 能辦到的 zk,etcd 似乎基本上也都可以辦到, 那么 SOFAJRaft 算不算重復造輪子?

為了說明 SOFAJRaft 具有很好的想象空間以及擴展能力,下面再介紹一個基于 SOFAJRaft 的復雜一些的實踐。

4 復雜一點的實踐:基于 SOFAJRaft 的 Rhea KV 的設計

功能名詞

  • PD:全局的中心總控節點, 負責整個集群的調度, 不需要自管理的集群可不啟用 PD (一個PD可管理多個集群,基于 clusterId 隔離)。
  • Store:集群中的一個物理存儲節點,一個 store 包含一個或多個 region。
  • Region:最小的 KV 數據單元,每個 region 都有一個左閉右開的區間 [startKey, endKey),可根據請求流量/負載/數據量大小等指標自動分裂以及自動副本搬遷。

特點

  • 嵌入式
  • 強一致性
  • 自驅動:自診斷,自優化,自決策,自恢復。以上幾點(尤其2, 3)基本都是依托于 SOFAJRaft 自身的功能來實現。

 

責任編輯:武曉燕 來源: 51CTO專欄
相關推薦

2024-05-27 10:42:55

2019-10-11 23:27:19

分布式一致性算法開發

2020-05-11 10:30:57

2PC分布式協議

2019-09-05 08:43:34

微服務分布式一致性數據共享

2021-11-22 16:30:30

分布式一致性分布式系統

2024-11-28 10:56:55

2017-09-21 10:59:36

分布式系統線性一致性測試

2022-06-07 12:08:10

Paxos算法

2021-07-28 08:39:25

分布式架構系統

2020-05-29 14:46:23

3PC協議分布式系統

2025-03-27 03:00:00

2021-06-06 12:45:41

分布式CAPBASE

2017-09-22 12:08:01

數據庫分布式系統互聯網

2020-10-28 11:15:24

EPaxos分布式性算法

2023-11-06 09:06:54

分布式一致性數據

2020-03-16 11:55:28

PaxosRaft協議

2021-08-13 07:56:13

Raft算法日志

2023-08-15 09:31:01

分布式緩存

2021-06-16 08:33:02

分布式事務ACID

2025-03-14 08:00:00

分布式系統服務器一致性
點贊
收藏

51CTO技術棧公眾號

日本老熟俱乐部h0930| 18岁视频在线观看| 99在线精品视频免费观看软件| 99久久夜色精品国产亚洲狼| 欧美一区二区三区公司| 日韩视频永久免费观看| 国产欧美激情视频| а√天堂资源官网在线资源| 91视频国产观看| 色偷偷91综合久久噜噜| 国产成人av片| 亚洲电影有码| 亚洲国产成人av好男人在线观看| 国产精品久久久久久久小唯西川| 五月婷婷视频在线| 国产欧美日韩在线一区二区| 欧美人牲a欧美精品| 成年人视频观看| av在线官网| 国产日韩精品一区二区三区| 成人在线资源网址| 一区二区自拍偷拍| 在线亚洲一区| 欧美福利视频网站| 欧美福利第一页| 欧美电影免费网站| 日韩一级片在线播放| 黄色片在线免费| 国产精品xx| 亚洲二区视频在线| 中国 免费 av| 免费观看在线午夜影视| 久久色成人在线| 精品久久久久久亚洲| 国产成人精品一区二三区四区五区 | 男人添女人下部高潮视频在线观看| 久久久www免费人成精品| 国产高清精品一区二区| 国产精品久久综合青草亚洲AV| 亚洲综合三区| 国内精品久久久久影院优| 日本一级特级毛片视频| 日韩欧美精品| 这里只有精品在线播放| 免费在线观看污| 夜色77av精品影院| 日韩黄色高清视频| 日韩Av无码精品| 北条麻妃一区二区三区在线| 91精品在线免费| 五月天婷婷在线观看视频| 久久久久久久性潮| 欧美日韩高清影院| 手机av在线免费| 亚洲欧洲专区| 4438亚洲最大| 中文字幕无人区二| 国产精伦一区二区三区| 精品国产乱码久久久久久1区2区 | 99热自拍偷拍| 欧美办公室脚交xxxx| 精品成人国产在线观看男人呻吟| 日韩一级性生活片| 色偷偷色偷偷色偷偷在线视频| 亚洲成人在线免费| 免费无码国产v片在线观看| 一区二区电影免费观看| 一本到不卡免费一区二区| 黄色一级二级三级| 欧美风情在线视频| 日韩精品自拍偷拍| 国产精品一区二区人妻喷水| 清纯唯美亚洲经典中文字幕| 亚洲毛片在线观看| 无码少妇精品一区二区免费动态| 日韩av久操| 久精品免费视频| wwwxxx亚洲| 日韩av网站免费在线| 国产一区二区在线免费| www.成人在线观看| 91理论电影在线观看| 欧洲在线视频一区| av黄色在线| 精品久久久久久久中文字幕| 在线观看av日韩| 麻豆精品国产| 亚洲欧美激情视频| 亚洲波多野结衣| 99在线热播精品免费99热| 欧美一性一乱一交一视频| 中文字幕人妻色偷偷久久| 国产乱色国产精品免费视频| 久久99久久精品国产| 啊v视频在线| 亚洲午夜精品网| 日韩免费高清在线| 亚洲免费一区三区| 中文字幕一精品亚洲无线一区| 欧美成人片在线观看| 爽爽淫人综合网网站| 91免费版黄色| 国产经典自拍视频在线观看| 亚洲激情图片一区| 国产野外作爱视频播放| 国产精品videossex| 中文字幕在线观看亚洲| 国产成年人免费视频| 久久国产福利国产秒拍| 久久av一区二区| 四虎影院观看视频在线观看| 欧美性淫爽ww久久久久无| 四虎精品一区二区| 午夜国产一区二区| 国产第一区电影| 五月色婷婷综合| 一区二区三区四区中文字幕| 在线看的黄色网址| 久久99精品久久久久久园产越南| 久久成人18免费网站| 国产成人自拍偷拍| 91亚洲精品久久久蜜桃网站 | 久久一卡二卡| 3d成人动漫网站| 亚洲人成人无码网www国产 | 精品日本高清在线播放| 午夜激情视频网| 全球成人免费直播| 国产精品国产三级国产aⅴ浪潮 | 中文字幕一区二区三区电影| 五月天激情四射| 成人午夜精品在线| 激情六月天婷婷| 国产999精品在线观看| 中文字幕精品久久| 怡春院在线视频| 国产日韩欧美精品综合| 丁香啪啪综合成人亚洲| 最新国产精品视频| 欧美中文字幕视频在线观看| 人妻va精品va欧美va| 亚洲已满18点击进入久久| 宇都宫紫苑在线播放| 欧美在线不卡| 91aaaa| 青草视频在线免费直播| 欧美成人综合网站| 久久无码精品丰满人妻| 懂色一区二区三区免费观看 | 国产精品久久久免费看| 人禽交欧美网站| 亚洲蜜桃在线| 电影91久久久| 欧美激情啊啊啊| 日本黄色免费视频| 日韩欧美一区二区三区| 日韩中文字幕电影| 日本亚洲一区二区| 一区二区三区久久网| 日韩经典一区| 久久精彩免费视频| 国产夫绿帽单男3p精品视频| 亚洲一区二区三区四区在线观看 | 国产精品二区影院| 国产精品一区二区av| 免费在线小视频| 亚洲视频在线观看视频| 艳妇乳肉豪妇荡乳av| 亚洲欧美日韩国产成人精品影院| 亚洲成人福利视频| 六月丁香综合| 亚洲精美视频| jazzjazz国产精品麻豆| 欧美一级高清免费| 18视频免费网址在线观看| 91精品国产一区二区人妖| 国产亚洲色婷婷久久99精品| 99精品国产一区二区三区不卡| 欧美 激情 在线| 五月综合激情| 久久久久久九九九九| 香蕉久久一区| 欧美日韩电影一区| 91在线播放观看| 99国内精品久久| 15—17女人毛片| 亚洲性人人天天夜夜摸| 日韩精品成人一区二区在线观看| 宅男噜噜噜66国产精品免费| 午夜欧美不卡精品aaaaa| 成年人视频在线看| 精品成a人在线观看| 国产日韩久久久| 亚洲一区二区综合| 国产精品无码无卡无需播放器| 国产成人在线影院| www.日本xxxx| 国产真实久久| 伊人色综合影院| 婷婷激情久久| 91九色在线免费视频| 亚洲a∨精品一区二区三区导航| 久久国产精品影片| 成人福利在线| 亚洲第一福利网| 国产精品久久久久久免费| 精品免费在线视频| 久久久久国产精品夜夜夜夜夜| 国产日韩精品一区| 国产精品无码在线| 国产精选一区二区三区| 无码人妻精品一区二区三区66| 欧美特黄一区| 国产又黄又爽免费视频| 久久不见久久见免费视频7| 国产精品一区二区三区免费 | 国产伦精品一区二区三| 婷婷激情成人| 国产精品久久久久久久久粉嫩av| segui88久久综合9999| 久久视频国产精品免费视频在线| 理论在线观看| 日韩激情片免费| 亚洲精品国产suv一区| 3d成人动漫网站| 亚洲自拍偷拍另类| 欧洲色大大久久| 日本熟女毛茸茸| 色综合天天天天做夜夜夜夜做| 日本系列第一页| 亚洲香蕉伊在人在线观| 午夜精品一区二区三区视频| 中文字幕免费在线观看视频一区| 免费污网站在线观看| 91丨九色丨国产丨porny| 日本黄色录像片| 成人精品小蝌蚪| 制服丝袜av在线| 粉嫩绯色av一区二区在线观看| 手机在线视频一区| 国产精品资源在线| 日本特黄在线观看| 国产成人精品午夜视频免费| 992tv人人草| 国产精品888| 肉丝美足丝袜一区二区三区四| 国产精品一区久久久久| 国产在线视频三区| 国产不卡免费视频| 色悠悠在线视频| av男人天堂一区| www.久久av| 国产清纯白嫩初高生在线观看91 | 日韩精品永久网址| 中国人体摄影一区二区三区| 99精品综合| 国产亚洲精品久久久久久久| 欧美日韩少妇| 女人和拘做爰正片视频| 新67194成人永久网站| 十八禁视频网站在线观看| 青青草91视频| 日韩欧美理论片| 成人av片在线观看| 不卡一区二区在线观看| 国产精品视频免费看| 成人做爰视频网站| 亚洲国产成人高清精品| 少妇高潮av久久久久久| 欧美视频在线观看一区二区| 国产精品乱码久久久| 精品三级av在线| 精品亚洲综合| 精品国产自在精品国产浪潮| 日本aa在线| 青青草99啪国产免费| 九九九精品视频| 国产精品高清一区二区三区| 蜜桃一区二区三区| 特级毛片在线免费观看| 日韩一级网站| 亚洲免费999| www.日韩av| 亚洲一二三精品| 亚洲午夜电影在线| 黄色网址中文字幕| 日韩小视频在线观看专区| 色视频在线观看| 播播国产欧美激情| 成人三级高清视频在线看| 国产精品久久久久久久美男| 综合视频一区| 天堂av一区二区| 亚洲伦理精品| 国产福利精品一区二区三区| 99热这里都是精品| 手机在线免费看片| 色婷婷综合久久久中文字幕| 精品人妻少妇AV无码专区| 国产亚洲精品va在线观看| 国产探花视频在线观看| 国产精品美乳在线观看| 女同久久另类99精品国产| 中文字幕在线亚洲三区| 模特精品在线| 亚洲欧洲国产视频| 国产精品毛片大码女人| 国产www在线| 日韩精品自拍偷拍| 久草中文在线观看| 国产精品狼人色视频一区| 国产一区二区三区亚洲| 亚洲精品天堂成人片av在线播放| 日本视频一区二区| 99久久国产精| 夜夜爽夜夜爽精品视频| 国产精品欧美激情在线| 一区二区在线视频播放| 蜜桃麻豆av在线| 国产日韩欧美一区二区| 在线看片不卡| 手机版av在线| 国产精品嫩草影院av蜜臀| 欧美一区二区三区不卡视频| 欧美精品一区二区蜜臀亚洲| 色婷婷视频在线观看| 成人网址在线观看| 999成人网| 最新国产黄色网址| 国产精品五月天| 国产99久久久久久免费看| 国产视频一区在线| 黄视频免费在线看| 精品视频在线观看| 国产欧美精品久久| 日韩www视频| 精品久久久久久久久久久久久| 亚洲AV无码成人片在线观看| 精品视频9999| 91精品导航| 日韩 欧美 视频| 99这里只有精品| 狠狠躁夜夜躁人人爽天天高潮| 亚洲成人av片| 中文在线аv在线| 欧美精品欧美精品| 丝袜亚洲另类欧美综合| 中文字幕成人动漫| 欧美性三三影院| 视频三区在线| 91在线中文字幕| 欧美日韩精品免费观看视频完整| 精品人妻人人做人人爽夜夜爽| 亚洲一区二三区| 天堂av在线资源| 国产精品第10页| 欧美3p视频| 男人女人拔萝卜视频| 亚洲成人手机在线| 天堂中文在线视频| 国产成人涩涩涩视频在线观看| 欧美日韩一二| 欧美一二三不卡| 风流少妇一区二区| 天天操夜夜操视频| 中文字幕久热精品视频在线| 男人亚洲天堂| 97超碰国产精品| 91色综合久久久久婷婷| 欧美性受xxx黑人xyx性爽| 久久久精品在线观看| 国产劲爆久久| 欧美黄色性生活| 夜夜嗨av一区二区三区网页| 少妇激情av一区二区| 国产精品福利小视频| **女人18毛片一区二区| 人妻换人妻a片爽麻豆| 在线观看一区二区视频| 最新国产在线拍揄自揄视频| 久久国产精品精品国产色婷婷| 日本最新不卡在线| 精品小视频在线观看| 亚洲天堂av高清| 91麻豆精品激情在线观看最新| 精品一区二区中文字幕| 日韩美女久久久| 免费a级毛片在线观看| 91免费在线视频| 亚洲欧美久久久| 成人观看免费视频| 亚洲欧美制服中文字幕| 亚洲日本va午夜在线电影| 日韩中文字幕免费在线| 一区二区三区波多野结衣在线观看| 亚洲av成人无码网天堂| 国产主播在线一区| 美女诱惑黄网站一区| 免费一级片视频| 中文字幕一区二区精品|