久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

RAFT 寻找一种易于理解的一致性算法(扩展版)

發布時間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 RAFT 寻找一种易于理解的一致性算法(扩展版) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要

Raft 是一種為了管理復制日志的一致性算法。它提供了和 Paxos 算法相同的功能和性能,但是它的算法結構和 Paxos 不同,使得 Raft 算法更加容易理解并且更容易構建實際的系統。為了提升可理解性,Raft 將一致性算法分解成了幾個關鍵模塊,例如領導人選舉、日志復制和安全性。同時它通過實施一個更強的一致性來減少需要考慮的狀態的數量。從一個用戶研究的結果可以證明,對于學生而言,Raft 算法比 Paxos 算法更加容易學習。Raft 算法還包括一個新的機制來允許集群成員的動態改變,它利用重疊的大多數來保證安全性。

1 介紹

一致性算法允許一組機器像一個整體一樣工作,即使其中一些機器出現故障也能夠繼續工作下去。正因為如此,一致性算法在構建可信賴的大規模軟件系統中扮演著重要的角色。在過去的 10 年里,Paxos 算法統治著一致性算法這一領域:絕大多數的實現都是基于 Paxos 或者受其影響。同時 Paxos 也成為了教學領域里講解一致性問題時的示例。

但是不幸的是,盡管有很多工作都在嘗試降低它的復雜性,但是 Paxos 算法依然十分難以理解。并且,Paxos 自身的算法結構需要進行大幅的修改才能夠應用到實際的系統中。這些都導致了工業界和學術界都對 Paxos 算法感到十分頭疼。

和 Paxos 算法進行過努力之后,我們開始尋找一種新的一致性算法,可以為構建實際的系統和教學提供更好的基礎。我們的做法是不尋常的,我們的首要目標是可理解性:我們是否可以在實際系統中定義一個一致性算法,并且能夠比 Paxos 算法以一種更加容易的方式來學習。此外,我們希望該算法方便系統構建者的直覺的發展。不僅一個算法能夠工作很重要,而且能夠顯而易見的知道為什么能工作也很重要。

Raft 一致性算法就是這些工作的結果。在設計 Raft 算法的時候,我們使用一些特別的技巧來提升它的可理解性,包括算法分解(Raft 主要被分成了領導人選舉,日志復制和安全三個模塊)和減少狀態機的狀態(相對于 Paxos,Raft 減少了非確定性和服務器互相處于非一致性的方式)。一份針對兩所大學 43 個學生的研究表明 Raft 明顯比 Paxos 算法更加容易理解。在這些學生同時學習了這兩種算法之后,和 Paxos 比起來,其中 33 個學生能夠回答有關于 Raft 的問題。

Raft 算法在許多方面和現有的一致性算法都很相似(主要是 Oki 和 Liskov 的 Viewstamped Replication),但是它也有一些獨特的特性:

  • 強領導者:和其他一致性算法相比,Raft 使用一種更強的領導能力形式。比如,日志條目只從領導者發送給其他的服務器。這種方式簡化了對復制日志的管理并且使得 Raft 算法更加易于理解。
  • 領導選舉:Raft 算法使用一個隨機計時器來選舉領導者。這種方式只是在任何一致性算法都必須實現的心跳機制上增加了一點機制。在解決沖突的時候會更加簡單快捷。
  • 成員關系調整:Raft 使用一種共同一致的方法來處理集群成員變換的問題,在這種方法下,處于調整過程中的兩種不同的配置集群中大多數機器會有重疊,這就使得集群在成員變換的時候依然可以繼續工作。

我們相信,Raft 算法不論出于教學目的還是作為實踐項目的基礎都是要比 Paxos 或者其他一致性算法要優異的。它比其他算法更加簡單,更加容易理解;它的算法描述足以實現一個現實的系統;它有好多開源的實現并且在很多公司里使用;它的安全性已經被證明;它的效率和其他算法比起來也不相上下。

接下來,這篇論文會介紹以下內容:復制狀態機問題(第 2 節),討論 Paxos 的優點和缺點(第 3 節),討論我們為了理解能力而使用的方法(第 4 節),闡述 Raft 一致性算法(第 5-8 節),評價 Raft 算法(第 9 節),以及一些相關的工作(第 10 節)。

2 復制狀態機

一致性算法是從復制狀態機的背景下提出的(參考英文原文引用37)。在這種方法中,一組服務器上的狀態機產生相同狀態的副本,并且在一些機器宕掉的情況下也可以繼續運行。復制狀態機在分布式系統中被用于解決很多容錯的問題。例如,大規模的系統中通常都有一個集群領導者,像 GFS、HDFS 和 RAMCloud,典型應用就是一個獨立的的復制狀態機去管理領導選舉和存儲配置信息并且在領導人宕機的情況下也要存活下來。比如 Chubby 和 ZooKeeper。

圖 1 :復制狀態機的結構。一致性算法管理著來自客戶端指令的復制日志。狀態機從日志中處理相同順序的相同指令,所以產生的結果也是相同的。

復制狀態機通常都是基于復制日志實現的,如圖 1。每一個服務器存儲一個包含一系列指令的日志,并且按照日志的順序進行執行。每一個日志都按照相同的順序包含相同的指令,所以每一個服務器都執行相同的指令序列。因為每個狀態機都是確定的,每一次執行操作都產生相同的狀態和同樣的序列。

保證復制日志相同就是一致性算法的工作了。在一臺服務器上,一致性模塊接收客戶端發送來的指令然后增加到自己的日志中去。它和其他服務器上的一致性模塊進行通信來保證每一個服務器上的日志最終都以相同的順序包含相同的請求,盡管有些服務器會宕機。一旦指令被正確的復制,每一個服務器的狀態機按照日志順序處理他們,然后輸出結果被返回給客戶端。因此,服務器集群看起來形成一個高可靠的狀態機。

實際系統中使用的一致性算法通常含有以下特性:

  • 安全性保證(絕對不會返回一個錯誤的結果):在非拜占庭錯誤情況下,包括網絡延遲、分區、丟包、冗余和亂序等錯誤都可以保證正確。
  • 可用性:集群中只要有大多數的機器可運行并且能夠相互通信、和客戶端通信,就可以保證可用。因此,一個典型的包含 5 個節點的集群可以容忍兩個節點的失敗。服務器被停止就認為是失敗。他們當有穩定的存儲的時候可以從狀態中恢復回來并重新加入集群。
  • 不依賴時序來保證一致性:物理時鐘錯誤或者極端的消息延遲在可能只有在最壞情況下才會導致可用性問題。
  • 通常情況下,一條指令可以盡可能快的在集群中大多數節點響應一輪遠程過程調用時完成。小部分比較慢的節點不會影響系統整體的性能。

3 Paxos算法的問題

在過去的 10 年里,Leslie Lamport 的 Paxos 算法幾乎已經成為一致性的代名詞:Paxos 是在課程教學中最經常使用的算法,同時也是大多數一致性算法實現的起點。Paxos 首先定義了一個能夠達成單一決策一致的協議,比如單條的復制日志項。我們把這一子集叫做單決策 Paxos。然后通過組合多個 Paxos 協議的實例來促進一系列決策的達成。Paxos 保證安全性和活性,同時也支持集群成員關系的變更。Paxos 的正確性已經被證明,在通常情況下也很高效。

不幸的是,Paxos 有兩個明顯的缺點。第一個缺點是 Paxos 算法特別的難以理解。完整的解釋是出了名的不透明;通過極大的努力之后,也只有少數人成功理解了這個算法。因此,有了幾次用更簡單的術語來解釋 Paxos 的嘗試。盡管這些解釋都只關注了單決策的子集問題,但依然很具有挑戰性。在 2012 年 NSDI 的會議中的一次調查顯示,很少有人對 Paxos 算法感到滿意,甚至在經驗老道的研究者中也是如此。我們自己也嘗試去理解 Paxos;我們一直沒能理解 Paxos 直到我們讀了很多對 Paxos 的簡化解釋并且設計了我們自己的算法之后,這一過程花了近一年時間。

我們假設 Paxos 的不透明性來自它選擇單決策問題作為它的基礎。單決策 Paxos 是晦澀微妙的,它被劃分成了兩種沒有簡單直觀解釋和無法獨立理解的情景。因此,這導致了很難建立起直觀的感受為什么單決策 Paxos 算法能夠工作。構成多決策 Paxos 增加了很多錯綜復雜的規則。我們相信,在多決策上達成一致性的問題(一份日志而不是單一的日志記錄)能夠被分解成其他的方式并且更加直接和明顯。

Paxos算法的第二個問題就是它沒有提供一個足夠好的用來構建一個現實系統的基礎。一個原因是還沒有一種被廣泛認同的多決策問題的算法。Lamport 的描述基本上都是關于單決策 Paxos 的;他簡要描述了實施多決策 Paxos 的方法,但是缺乏很多細節。當然也有很多具體化 Paxos 的嘗試,但是他們都互相不一樣,和 Paxos 的概述也不同。例如 Chubby 這樣的系統實現了一個類似于 Paxos 的算法,但是大多數的細節并沒有被公開。

而且,Paxos 算法的結構也不是十分易于構建實踐的系統;單決策分解也會產生其他的結果。例如,獨立的選擇一組日志條目然后合并成一個序列化的日志并沒有帶來太多的好處,僅僅增加了不少復雜性。圍繞著日志來設計一個系統是更加簡單高效的;新日志條目以嚴格限制的順序增添到日志中去。另一個問題是,Paxos 使用了一種對等的點對點的方式作為它的核心(盡管它最終提議了一種弱領導人的方法來優化性能)。在只有一個決策會被制定的簡化世界中是很有意義的,但是很少有現實的系統使用這種方式。如果有一系列的決策需要被制定,首先選擇一個領導人,然后讓他去協調所有的決議,會更加簡單快速。

因此,實際的系統中很少有和 Paxos 相似的實踐。每一種實現都是從 Paxos 開始研究,然后發現很多實現上的難題,再然后開發了一種和 Paxos 明顯不一樣的結構。這樣是非常費時和容易出錯的,并且理解 Paxos 的難度使得這個問題更加糟糕。Paxos 算法在理論上被證明是正確可行的,但是現實的系統和 Paxos 差別是如此的大,以至于這些證明沒有什么太大的價值。下面來自 Chubby 實現非常典型:

在Paxos算法描述和實現現實系統中間有者巨大的鴻溝。最終的系統建立在一種沒有經過證明的算法之上。

由于以上問題,我們認為 Paxos 算法既沒有提供一個良好的基礎給實踐的系統,也沒有給教學很好的幫助。基于一致性問題在大規模軟件系統中的重要性,我們決定看看我們是否可以設計一個擁有更好特性的替代 Paxos 的一致性算法。Raft算法就是這次實驗的結果。

4 為了可理解性的設計

設計 Raft 算法我們有幾個初衷:它必須提供一個完整的實際的系統實現基礎,這樣才能大大減少開發者的工作;它必須在任何情況下都是安全的并且在大多數的情況下都是可用的;并且它的大部分操作必須是高效的。但是我們最重要也是最大的挑戰是可理解性。它必須保證對于普遍的人群都可以十分容易的去理解。另外,它必須能夠讓人形成直觀的認識,這樣系統的構建者才能夠在現實中進行必然的擴展。

在設計 Raft 算法的時候,有很多的點需要我們在各種備選方案中進行選擇。在這種情況下,我們評估備選方案基于可理解性原則:解釋各個備選方案有多大的難度(例如,Raft 的狀態空間有多復雜,是否有微妙的暗示)?對于一個讀者而言,完全理解這個方案和暗示是否容易?

我們意識到對這種可理解性分析上具有高度的主觀性;盡管如此,我們使用了兩種通常適用的技術來解決這個問題。第一個技術就是眾所周知的問題分解:只要有可能,我們就將問題分解成幾個相對獨立的,可被解決的、可解釋的和可理解的子問題。例如,Raft 算法被我們分成領導人選舉,日志復制,安全性和角色改變幾個部分。

我們使用的第二個方法是通過減少狀態的數量來簡化需要考慮的狀態空間,使得系統更加連貫并且在可能的時候消除不確定性。特別的,所有的日志是不允許有空洞的,并且 Raft 限制了日志之間變成不一致狀態的可能。盡管在大多數情況下我們都試圖去消除不確定性,但是也有一些情況下不確定性可以提升可理解性。尤其是,隨機化方法增加了不確定性,但是他們有利于減少狀態空間數量,通過處理所有可能選擇時使用相似的方法。我們使用隨機化去簡化 Raft 中領導人選舉算法。

5 Raft 一致性算法

Raft 是一種用來管理章節 2 中描述的復制日志的算法。圖 2 為了參考之用,總結這個算法的簡略版本,圖 3 列舉了這個算法的一些關鍵特性。圖中的這些元素會在剩下的章節逐一介紹。

Raft 通過選舉一個高貴的領導人,然后給予他全部的管理復制日志的責任來實現一致性。領導人從客戶端接收日志條目,把日志條目復制到其他服務器上,并且當保證安全性的時候告訴其他的服務器應用日志條目到他們的狀態機中。擁有一個領導人大大簡化了對復制日志的管理。例如,領導人可以決定新的日志條目需要放在日志中的什么位置而不需要和其他服務器商議,并且數據都從領導人流向其他服務器。一個領導人可以宕機,可以和其他服務器失去連接,這時一個新的領導人會被選舉出來。

通過領導人的方式,Raft 將一致性問題分解成了三個相對獨立的子問題,這些問題會在接下來的子章節中進行討論:

  • 領導選舉:一個新的領導人需要被選舉出來,當現存的領導人宕機的時候(章節 5.2)
  • 日志復制:領導人必須從客戶端接收日志然后復制到集群中的其他節點,并且強制要求其他節點的日志保持和自己相同。
  • 安全性:在 Raft 中安全性的關鍵是在圖 3 中展示的狀態機安全:如果有任何的服務器節點已經應用了一個確定的日志條目到它的狀態機中,那么其他服務器節點不能在同一個日志索引位置應用一個不同的指令。章節 5.4 闡述了 Raft 算法是如何保證這個特性的;這個解決方案涉及到一個額外的選舉機制(5.2 節)上的限制。

在展示一致性算法之后,這一章節會討論可用性的一些問題和系統中的候選人角色的問題。

狀態

狀態所有服務器上持久存在的
currentTerm服務器最后一次知道的任期號(初始化為 0,持續遞增)
votedFor在當前獲得選票的候選人的 Id
log[]日志條目集;每一個條目包含一個用戶狀態機執行的指令,和收到時的任期號
狀態所有服務器上經常變的
commitIndex已知的最大的已經被提交的日志條目的索引值
lastApplied最后被應用到狀態機的日志條目索引值(初始化為 0,持續遞增)
狀態在領導人里經常改變的 (選舉后重新初始化)
nextIndex[]對于每一個服務器,需要發送給他的下一個日志條目的索引值(初始化為領導人最后索引值加一)
matchIndex[]對于每一個服務器,已經復制給他的日志的最高索引值

附加日志 RPC

由領導人負責調用來復制日志指令;也會用作heartbeat

參數解釋
term領導人的任期號
leaderId領導人的 Id,以便于跟隨者重定向請求
prevLogIndex新的日志條目緊隨之前的索引值
prevLogTermprevLogIndex 條目的任期號
entries[]準備存儲的日志條目(表示心跳時為空;一次性發送多個是為了提高效率)
leaderCommit領導人已經提交的日志的索引值
返回值解釋
term當前的任期號,用于領導人去更新自己
success跟隨者包含了匹配上 prevLogIndex 和 prevLogTerm 的日志時為真

接收者實現:

  • 如果?term < currentTerm?就返回 false (5.1 節)
  • 如果日志在 prevLogIndex 位置處的日志條目的任期號和 prevLogTerm 不匹配,則返回 false (5.3 節)
  • 如果已經存在的日志條目和新的產生沖突(索引值相同但是任期號不同),刪除這一條和之后所有的 (5.3 節)
  • 附加任何在已有的日志中不存在的條目
  • 如果?leaderCommit > commitIndex,令 commitIndex 等于 leaderCommit 和 新日志條目索引值中較小的一個
  • 請求投票 RPC

    由候選人負責調用用來征集選票(5.2 節)

    參數解釋
    term候選人的任期號
    candidateId請求選票的候選人的 Id
    lastLogIndex候選人的最后日志條目的索引值
    lastLogTerm候選人最后日志條目的任期號
    返回值解釋
    term當前任期號,以便于候選人去更新自己的任期號
    voteGranted候選人贏得了此張選票時為真

    接收者實現:

  • 如果term < currentTerm返回 false (5.2 節)
  • 如果 votedFor 為空或者就是 candidateId,并且候選人的日志至少和自己一樣新,那么就投票給他(5.2 節,5.4 節)
  • 所有服務器需遵守的規則

    所有服務器:

    • 如果commitIndex > lastApplied,那么就 lastApplied 加一,并把log[lastApplied]應用到狀態機中(5.3 節)
    • 如果接收到的 RPC 請求或響應中,任期號T > currentTerm,那么就令 currentTerm 等于 T,并切換狀態為跟隨者(5.1 節)

    跟隨者(5.2 節):

    • 響應來自候選人和領導者的請求
    • 如果在超過選舉超時時間的情況之前都沒有收到領導人的心跳,或者是候選人請求投票的,就自己變成候選人

    候選人(5.2 節):

    • 在轉變成候選人后就立即開始選舉過程
      • 自增當前的任期號(currentTerm)
      • 給自己投票
      • 重置選舉超時計時器
      • 發送請求投票的 RPC 給其他所有服務器
    • 如果接收到大多數服務器的選票,那么就變成領導人
    • 如果接收到來自新的領導人的附加日志 RPC,轉變成跟隨者
    • 如果選舉過程超時,再次發起一輪選舉

    領導人:

    • 一旦成為領導人:發送空的附加日志 RPC(心跳)給其他所有的服務器;在一定的空余時間之后不停的重復發送,以阻止跟隨者超時(5.2 節)
    • 如果接收到來自客戶端的請求:附加條目到本地日志中,在條目被應用到狀態機后響應客戶端(5.3 節)
    • 如果對于一個跟隨者,最后日志條目的索引值大于等于 nextIndex,那么:發送從 nextIndex 開始的所有日志條目:
      • 如果成功:更新相應跟隨者的 nextIndex 和 matchIndex
      • 如果因為日志不一致而失敗,減少 nextIndex 重試
    • 如果存在一個滿足N > commitIndex的 N,并且大多數的matchIndex[i] ≥ N成立,并且log[N].term == currentTerm成立,那么令 commitIndex 等于這個 N (5.3 和 5.4 節)

    圖 2:一個關于 Raft 一致性算法的濃縮總結(不包括成員變換和日志壓縮)。

    特性解釋
    選舉安全特性對于一個給定的任期號,最多只會有一個領導人被選舉出來(5.2 節)
    領導人只附加原則領導人絕對不會刪除或者覆蓋自己的日志,只會增加(5.3 節)
    日志匹配原則如果兩個日志在相同的索引位置的日志條目的任期號相同,那么我們就認為這個日志從頭到這個索引位置之間全部完全相同(5.3 節)
    領導人完全特性如果某個日志條目在某個任期號中已經被提交,那么這個條目必然出現在更大任期號的所有領導人中(5.4 節)
    狀態機安全特性如果一個領導人已經在給定的索引值位置的日志條目應用到狀態機中,那么其他任何的服務器在這個索引位置不會提交一個不同的日志(5.4.3 節)

    圖 3:Raft 在任何時候都保證以上的各個特性。

    5.1 Raft 基礎

    一個 Raft 集群包含若干個服務器節點;通常是 5 個,這允許整個系統容忍 2 個節點的失效。在任何時刻,每一個服務器節點都處于這三個狀態之一:領導人、跟隨者或者候選人。在通常情況下,系統中只有一個領導人并且其他的節點全部都是跟隨者。跟隨者都是被動的:他們不會發送任何請求,只是簡單的響應來自領導者或者候選人的請求。領導人處理所有的客戶端請求(如果一個客戶端和跟隨者聯系,那么跟隨者會把請求重定向給領導人)。第三種狀態,候選人,是用來在 5.2 節描述的選舉新領導人時使用。圖 4 展示了這些狀態和他們之間的轉換關系;這些轉換關系會在接下來進行討論。

    圖 4:服務器狀態。跟隨者只響應來自其他服務器的請求。如果跟隨者接收不到消息,那么他就會變成候選人并發起一次選舉。獲得集群中大多數選票的候選人將成為領導者。在一個任期內,領導人一直都會是領導人直到自己宕機了。

    圖 5:時間被劃分成一個個的任期,每個任期開始都是一次選舉。在選舉成功后,領導人會管理整個集群直到任期結束。有時候選舉會失敗,那么這個任期就會沒有領導人而結束。任期之間的切換可以在不同的時間不同的服務器上觀察到。

    Raft 把時間分割成任意長度的任期,如圖 5。任期用連續的整數標記。每一段任期從一次選舉開始,就像章節 5.2 描述的一樣,一個或者多個候選人嘗試成為領導者。如果一個候選人贏得選舉,然后他就在接下來的任期內充當領導人的職責。在某些情況下,一次選舉過程會造成選票的瓜分。在這種情況下,這一任期會以沒有領導人結束;一個新的任期(和一次新的選舉)會很快重新開始。Raft 保證了在一個給定的任期內,最多只有一個領導者。

    不同的服務器節點可能多次觀察到任期之間的轉換,但在某些情況下,一個節點也可能觀察不到任何一次選舉或者整個任期全程。任期在 Raft 算法中充當邏輯時鐘的作用,這會允許服務器節點查明一些過期的信息比如陳舊的領導者。每一個節點存儲一個當前任期號,這一編號在整個時期內單調的增長。當服務器之間通信的時候會交換當前任期號;如果一個服務器的當前任期號比其他人小,那么他會更新自己的編號到較大的編號值。如果一個候選人或者領導者發現自己的任期號過期了,那么他會立即恢復成跟隨者狀態。如果一個節點接收到一個包含過期的任期號的請求,那么他會直接拒絕這個請求。

    Raft 算法中服務器節點之間通信使用遠程過程調用(RPCs),并且基本的一致性算法只需要兩種類型的 RPCs。請求投票(RequestVote) RPCs 由候選人在選舉期間發起(章節 5.2),然后附加條目(AppendEntries)RPCs 由領導人發起,用來復制日志和提供一種心跳機制(章節 5.3)。第 7 節為了在服務器之間傳輸快照增加了第三種 RPC。當服務器沒有及時的收到 RPC 的響應時,會進行重試, 并且他們能夠并行的發起 RPCs 來獲得最佳的性能。

    5.2 領導人選舉

    Raft 使用一種心跳機制來觸發領導人選舉。當服務器程序啟動時,他們都是跟隨者身份。一個服務器節點繼續保持著跟隨者狀態直到他從領導人或者候選者處接收到有效的 RPCs。領導者周期性的向所有跟隨者發送心跳包(即不包含日志項內容的附加日志項 RPCs)來維持自己的權威。如果一個跟隨者在一段時間里沒有接收到任何消息,也就是選舉超時,那么他就會認為系統中沒有可用的領導者,并且發起選舉以選出新的領導者。

    要開始一次選舉過程,跟隨者先要增加自己的當前任期號并且轉換到候選人狀態。然后他會并行的向集群中的其他服務器節點發送請求投票的 RPCs 來給自己投票。候選人會繼續保持著當前狀態直到以下三件事情之一發生:(a) 他自己贏得了這次的選舉,(b) 其他的服務器成為領導者,(c) 一段時間之后沒有任何一個獲勝的人。這些結果會分別的在下面的段落里進行討論。

    當一個候選人從整個集群的大多數服務器節點獲得了針對同一個任期號的選票,那么他就贏得了這次選舉并成為領導人。每一個服務器最多會對一個任期號投出一張選票,按照先來先服務的原則(注意:5.4 節在投票上增加了一點額外的限制)。要求大多數選票的規則確保了最多只會有一個候選人贏得此次選舉(圖 3 中的選舉安全性)。一旦候選人贏得選舉,他就立即成為領導人。然后他會向其他的服務器發送心跳消息來建立自己的權威并且阻止新的領導人的產生。

    在等待投票的時候,候選人可能會從其他的服務器接收到聲明它是領導人的附加日志項 RPC。如果這個領導人的任期號(包含在此次的 RPC中)不小于候選人當前的任期號,那么候選人會承認領導人合法并回到跟隨者狀態。 如果此次 RPC 中的任期號比自己小,那么候選人就會拒絕這次的 RPC 并且繼續保持候選人狀態。

    第三種可能的結果是候選人既沒有贏得選舉也沒有輸:如果有多個跟隨者同時成為候選人,那么選票可能會被瓜分以至于沒有候選人可以贏得大多數人的支持。當這種情況發生的時候,每一個候選人都會超時,然后通過增加當前任期號來開始一輪新的選舉。然而,沒有其他機制的話,選票可能會被無限的重復瓜分。

    Raft 算法使用隨機選舉超時時間的方法來確保很少會發生選票瓜分的情況,就算發生也能很快的解決。為了阻止選票起初就被瓜分,選舉超時時間是從一個固定的區間(例如 150-300毫秒)隨機選擇。這樣可以把服務器都分散開以至于在大多數情況下只有一個服務器會選舉超時;然后他贏得選舉并在其他服務器超時之前發送心跳包。同樣的機制被用在選票瓜分的情況下。每一個候選人在開始一次選舉的時候會重置一個隨機的選舉超時時間,然后在超時時間內等待投票的結果;這樣減少了在新的選舉中另外的選票瓜分的可能性。9.3 節展示了這種方案能夠快速的選出一個領導人。

    領導人選舉這個例子,體現了可理解性原則是如何指導我們進行方案設計的。起初我們計劃使用一種排名系統:每一個候選人都被賦予一個唯一的排名,供候選人之間競爭時進行選擇。如果一個候選人發現另一個候選人擁有更高的排名,那么他就會回到跟隨者狀態,這樣高排名的候選人能夠更加容易的贏得下一次選舉。但是我們發現這種方法在可用性方面會有一點問題(如果高排名的服務器宕機了,那么低排名的服務器可能會超時并再次進入候選人狀態。而且如果這個行為發生得足夠快,則可能會導致整個選舉過程都被重置掉)。我們針對算法進行了多次調整,但是每次調整之后都會有新的問題。最終我們認為隨機重試的方法是更加明顯和易于理解的。

    5.3 日志復制

    一旦一個領導人被選舉出來,他就開始為客戶端提供服務。客戶端的每一個請求都包含一條被復制狀態機執行的指令。領導人把這條指令作為一條新的日志條目附加到日志中去,然后并行的發起附加條目 RPCs 給其他的服務器,讓他們復制這條日志條目。當這條日志條目被安全的復制(下面會介紹),領導人會應用這條日志條目到它的狀態機中然后把執行的結果返回給客戶端。如果跟隨者崩潰或者運行緩慢,再或者網絡丟包,領導人會不斷的重復嘗試附加日志條目 RPCs (盡管已經回復了客戶端)直到所有的跟隨者都最終存儲了所有的日志條目。

    圖 6:日志由有序序號標記的條目組成。每個條目都包含創建時的任期號(圖中框中的數字),和一個狀態機需要執行的指令。一個條目當可以安全的被應用到狀態機中去的時候,就認為是可以提交了。

    日志以圖 6 展示的方式組織。每一個日志條目存儲一條狀態機指令和從領導人收到這條指令時的任期號。日志中的任期號用來檢查是否出現不一致的情況,同時也用來保證圖 3 中的某些性質。每一條日志條目同時也都有一個整數索引值來表明它在日志中的位置。

    領導人來決定什么時候把日志條目應用到狀態機中是安全的;這種日志條目被稱為已提交。Raft 算法保證所有已提交的日志條目都是持久化的并且最終會被所有可用的狀態機執行。在領導人將創建的日志條目復制到大多數的服務器上的時候,日志條目就會被提交(例如在圖 6 中的條目 7)。同時,領導人的日志中之前的所有日志條目也都會被提交,包括由其他領導人創建的條目。5.4 節會討論某些當在領導人改變之后應用這條規則的隱晦內容,同時他也展示了這種提交的定義是安全的。領導人跟蹤了最大的將會被提交的日志項的索引,并且索引值會被包含在未來的所有附加日志 RPCs (包括心跳包),這樣其他的服務器才能最終知道領導人的提交位置。一旦跟隨者知道一條日志條目已經被提交,那么他也會將這個日志條目應用到本地的狀態機中(按照日志的順序)。

    我們設計了 Raft 的日志機制來維護一個不同服務器的日志之間的高層次的一致性。這么做不僅簡化了系統的行為也使得更加可預計,同時他也是安全性保證的一個重要組件。Raft 維護著以下的特性,這些同時也組成了圖 3 中的日志匹配特性:

    • 如果在不同的日志中的兩個條目擁有相同的索引和任期號,那么他們存儲了相同的指令。
    • 如果在不同的日志中的兩個條目擁有相同的索引和任期號,那么他們之前的所有日志條目也全部相同。

    第一個特性來自這樣的一個事實,領導人最多在一個任期里在指定的一個日志索引位置創建一條日志條目,同時日志條目在日志中的位置也從來不會改變。第二個特性由附加日志 RPC 的一個簡單的一致性檢查所保證。在發送附加日志 RPC 的時候,領導人會把新的日志條目緊接著之前的條目的索引位置和任期號包含在里面。如果跟隨者在它的日志中找不到包含相同索引位置和任期號的條目,那么他就會拒絕接收新的日志條目。一致性檢查就像一個歸納步驟:一開始空的日志狀態肯定是滿足日志匹配特性的,然后一致性檢查保護了日志匹配特性當日志擴展的時候。因此,每當附加日志 RPC 返回成功時,領導人就知道跟隨者的日志一定是和自己相同的了。

    在正常的操作中,領導人和跟隨者的日志保持一致性,所以附加日志 RPC 的一致性檢查從來不會失敗。然而,領導人崩潰的情況會使得日志處于不一致的狀態(老的領導人可能還沒有完全復制所有的日志條目)。這種不一致問題會在領導人和跟隨者的一系列崩潰下加劇。圖 7 展示了跟隨者的日志可能和新的領導人不同的方式。跟隨者可能會丟失一些在新的領導人中有的日志條目,他也可能擁有一些領導人沒有的日志條目,或者兩者都發生。丟失或者多出日志條目可能會持續多個任期。

    圖 7:當一個領導人成功當選時,跟隨者可能是任何情況(a-f)。每一個盒子表示是一個日志條目;里面的數字表示任期號。跟隨者可能會缺少一些日志條目(a-b),可能會有一些未被提交的日志條目(c-d),或者兩種情況都存在(e-f)。例如,場景 f 可能會這樣發生,某服務器在任期 2 的時候是領導人,已附加了一些日志條目到自己的日志中,但在提交之前就崩潰了;很快這個機器就被重啟了,在任期 3 重新被選為領導人,并且又增加了一些日志條目到自己的日志中;在任期 2 和任期 3 的日志被提交之前,這個服務器又宕機了,并且在接下來的幾個任期里一直處于宕機狀態。

    在 Raft 算法中,領導人處理不一致是通過強制跟隨者直接復制自己的日志來解決了。這意味著在跟隨者中的沖突的日志條目會被領導人的日志覆蓋。5.4 節會闡述如何通過增加一些限制來使得這樣的操作是安全的。

    要使得跟隨者的日志進入和自己一致的狀態,領導人必須找到最后兩者達成一致的地方,然后刪除從那個點之后的所有日志條目,發送自己的日志給跟隨者。所有的這些操作都在進行附加日志 RPCs 的一致性檢查時完成。領導人針對每一個跟隨者維護了一個?nextIndex,這表示下一個需要發送給跟隨者的日志條目的索引地址。當一個領導人剛獲得權力的時候,他初始化所有的 nextIndex 值為自己的最后一條日志的index加1(圖 7 中的 11)。如果一個跟隨者的日志和領導人不一致,那么在下一次的附加日志 RPC 時的一致性檢查就會失敗。在被跟隨者拒絕之后,領導人就會減小 nextIndex 值并進行重試。最終 nextIndex 會在某個位置使得領導人和跟隨者的日志達成一致。當這種情況發生,附加日志 RPC 就會成功,這時就會把跟隨者沖突的日志條目全部刪除并且加上領導人的日志。一旦附加日志 RPC 成功,那么跟隨者的日志就會和領導人保持一致,并且在接下來的任期里一直繼續保持。

    如果需要的話,算法可以通過減少被拒絕的附加日志 RPCs 的次數來優化。例如,當附加日志 RPC 的請求被拒絕的時候,跟隨者可以包含沖突的條目的任期號和自己存儲的那個任期的最早的索引地址。借助這些信息,領導人可以減小 nextIndex 越過所有那個任期沖突的所有日志條目;這樣就變成每個任期需要一次附加條目 RPC 而不是每個條目一次。在實踐中,我們十分懷疑這種優化是否是必要的,因為失敗是很少發生的并且也不大可能會有這么多不一致的日志。

    通過這種機制,領導人在獲得權力的時候就不需要任何特殊的操作來恢復一致性。他只需要進行正常的操作,然后日志就能自動的在回復附加日志 RPC 的一致性檢查失敗的時候自動趨于一致。領導人從來不會覆蓋或者刪除自己的日志(圖 3 的領導人只附加特性)。

    日志復制機制展示出了第 2 節中形容的一致性特性:Raft 能夠接受,復制并應用新的日志條目只要大部分的機器是工作的;在通常的情況下,新的日志條目可以在一次 RPC 中被復制給集群中的大多數機器;并且單個的緩慢的跟隨者不會影響整體的性能。

    5.4 安全性

    前面的章節里描述了 Raft 算法是如何選舉和復制日志的。然而,到目前為止描述的機制并不能充分的保證每一個狀態機會按照相同的順序執行相同的指令。例如,一個跟隨者可能會進入不可用狀態同時領導人已經提交了若干的日志條目,然后這個跟隨者可能會被選舉為領導人并且覆蓋這些日志條目;因此,不同的狀態機可能會執行不同的指令序列。

    這一節通過在領導選舉的時候增加一些限制來完善 Raft 算法。這一限制保證了任何的領導人對于給定的任期號,都擁有了之前任期的所有被提交的日志條目(圖 3 中的領導人完整特性)。增加這一選舉時的限制,我們對于提交時的規則也更加清晰。最終,我們將展示對于領導人完整特性的簡要證明,并且說明領導人是如何領導復制狀態機的做出正確行為的。

    5.4.1 選舉限制

    在任何基于領導人的一致性算法中,領導人都必須存儲所有已經提交的日志條目。在某些一致性算法中,例如 Viewstamped Replication,某個節點即使是一開始并沒有包含所有已經提交的日志條目,它也能被選為領導者。這些算法都包含一些額外的機制來識別丟失的日志條目并把他們傳送給新的領導人,要么是在選舉階段要么在之后很快進行。不幸的是,這種方法會導致相當大的額外的機制和復雜性。Raft 使用了一種更加簡單的方法,它可以保證所有之前的任期號中已經提交的日志條目在選舉的時候都會出現在新的領導人中,不需要傳送這些日志條目給領導人。這意味著日志條目的傳送是單向的,只從領導人傳給跟隨者,并且領導人從不會覆蓋自身本地日志中已經存在的條目。

    Raft 使用投票的方式來阻止一個候選人贏得選舉除非這個候選人包含了所有已經提交的日志條目。候選人為了贏得選舉必須聯系集群中的大部分節點,這意味著每一個已經提交的日志條目在這些服務器節點中肯定存在于至少一個節點上。如果候選人的日志至少和大多數的服務器節點一樣新(這個新的定義會在下面討論),那么他一定持有了所有已經提交的日志條目。請求投票 RPC 實現了這樣的限制: RPC 中包含了候選人的日志信息,然后投票人會拒絕掉那些日志沒有自己新的投票請求。

    Raft 通過比較兩份日志中最后一條日志條目的索引值和任期號定義誰的日志比較新。如果兩份日志最后的條目的任期號不同,那么任期號大的日志更加新。如果兩份日志最后的條目任期號相同,那么日志比較長的那個就更加新。

    5.4.2 提交之前任期內的日志條目

    如同 5.3 節介紹的那樣,領導人知道一條當前任期內的日志記錄是可以被提交的,只要它被存儲到了大多數的服務器上。如果一個領導人在提交日志條目之前崩潰了,未來后續的領導人會繼續嘗試復制這條日志記錄。然而,一個領導人不能斷定一個之前任期里的日志條目被保存到大多數服務器上的時候就一定已經提交了。圖 8 展示了一種情況,一條已經被存儲到大多數節點上的老日志條目,也依然有可能會被未來的領導人覆蓋掉。

    圖 8:如圖的時間序列展示了為什么領導人無法決定對老任期號的日志條目進行提交。在 (a) 中,S1 是領導者,部分的復制了索引位置 2 的日志條目。在 (b) 中,S1 崩潰了,然后 S5 在任期 3 里通過 S3、S4 和自己的選票贏得選舉,然后從客戶端接收了一條不一樣的日志條目放在了索引 2 處。然后到 (c),S5 又崩潰了;S1 重新啟動,選舉成功,開始復制日志。在這時,來自任期 2 的那條日志已經被復制到了集群中的大多數機器上,但是還沒有被提交。如果 S1 在 (d) 中又崩潰了,S5 可以重新被選舉成功(通過來自 S2,S3 和 S4 的選票),然后覆蓋了他們在索引 2 處的日志。反之,如果在崩潰之前,S1 把自己主導的新任期里產生的日志條目復制到了大多數機器上,就如 (e) 中那樣,那么在后面任期里面這些新的日志條目就會被提交(因為S5 就不可能選舉成功)。 這樣在同一時刻就同時保證了,之前的所有老的日志條目就會被提交。

    為了消除圖 8 里描述的情況,Raft 永遠不會通過計算副本數目的方式去提交一個之前任期內的日志條目。只有領導人當前任期里的日志條目通過計算副本數目可以被提交;一旦當前任期的日志條目以這種方式被提交,那么由于日志匹配特性,之前的日志條目也都會被間接的提交。在某些情況下,領導人可以安全的知道一個老的日志條目是否已經被提交(例如,該條目是否存儲到所有服務器上),但是 Raft 為了簡化問題使用一種更加保守的方法。

    當領導人復制之前任期里的日志時,Raft 會為所有日志保留原始的任期號, 這在提交規則上產生了額外的復雜性。在其他的一致性算法中,如果一個新的領導人要重新復制之前的任期里的日志時,它必須使用當前新的任期號。Raft 使用的方法更加容易辨別出日志,因為它可以隨著時間和日志的變化對日志維護著同一個任期編號。另外,和其他的算法相比,Raft 中的新領導人只需要發送更少日志條目(其他算法中必須在他們被提交之前發送更多的冗余日志條目來為他們重新編號)。

    5.4.3 安全性論證

    在給定了完整的 Raft 算法之后,我們現在可以更加精確的討論領導人完整性特性(這一討論基于 9.2 節的安全性證明)。我們假設領導人完全性特性是不存在的,然后我們推出矛盾來。假設任期 T 的領導人(領導人 T)在任期內提交了一條日志條目,但是這條日志條目沒有被存儲到未來某個任期的領導人的日志中。設大于 T 的最小任期 U 的領導人 U 沒有這條日志條目。

    圖 9:如果 S1 (任期 T 的領導者)提交了一條新的日志在它的任期里,然后 S5 在之后的任期 U 里被選舉為領導人,然后至少會有一個機器,如 S3,既擁有來自 S1 的日志,也給 S5 投票了。

  • 在領導人 U 選舉的時候一定沒有那條被提交的日志條目(領導人從不會刪除或者覆蓋任何條目)。
  • 領導人 T 復制這條日志條目給集群中的大多數節點,同時,領導人U 從集群中的大多數節點贏得了選票。因此,至少有一個節點(投票者、選民)同時接受了來自領導人T 的日志條目,并且給領導人U 投票了,如圖 9。這個投票者是產生這個矛盾的關鍵。
  • 這個投票者必須在給領導人 U 投票之前先接受了從領導人 T 發來的已經被提交的日志條目;否則他就會拒絕來自領導人 T 的附加日志請求(因為此時他的任期號會比 T 大)。
  • 投票者在給領導人 U 投票時依然保有這條日志條目,因為任何中間的領導人都包含該日志條目(根據上述的假設),領導人從不會刪除條目,并且跟隨者只有和領導人沖突的時候才會刪除條目。
  • 投票者把自己選票投給領導人 U 時,領導人 U 的日志必須和投票者自己一樣新。這就導致了兩者矛盾之一。
  • 首先,如果投票者和領導人 U 的最后一條日志的任期號相同,那么領導人 U 的日志至少和投票者一樣長,所以領導人 U 的日志一定包含所有投票者的日志。這是另一處矛盾,因為投票者包含了那條已經被提交的日志條目,但是在上述的假設里,領導人 U 是不包含的。
  • 除此之外,領導人 U 的最后一條日志的任期號就必須比投票人大了。此外,他也比 T 大,因為投票人的最后一條日志的任期號至少和 T 一樣大(他包含了來自任期 T 的已提交的日志)。創建了領導人 U 最后一條日志的之前領導人一定已經包含了那條被提交的日志(根據上述假設,領導人 U 是第一個不包含該日志條目的領導人)。所以,根據日志匹配特性,領導人 U 一定也包含那條被提交當然日志,這里產生矛盾。
  • 這里完成了矛盾。因此,所有比 T 大的領導人一定包含了所有來自 T 的已經被提交的日志。
  • 日志匹配原則保證了未來的領導人也同時會包含被間接提交的條目,例如圖 8 (d) 中的索引 2。
  • 通過領導人完全特性,我們就能證明圖 3 中的狀態機安全特性,即如果已經服務器已經在某個給定的索引值應用了日志條目到自己的狀態機里,那么其他的服務器不會應用一個不一樣的日志到同一個索引值上。在一個服務器應用一條日志條目到他自己的狀態機中時,他的日志必須和領導人的日志,在該條目和之前的條目上相同,并且已經被提交。現在我們來考慮在任何一個服務器應用一個指定索引位置的日志的最小任期;日志完全特性保證擁有更高任期號的領導人會存儲相同的日志條目,所以之后的任期里應用某個索引位置的日志條目也會是相同的值。因此,狀態機安全特性是成立的。

    最后,Raft 要求服務器按照日志中索引位置順序應用日志條目。和狀態機安全特性結合起來看,這就意味著所有的服務器會應用相同的日志序列集到自己的狀態機中,并且是按照相同的順序。

    5.5 跟隨者和候選人崩潰

    到目前為止,我們都只關注了領導人崩潰的情況。跟隨者和候選人崩潰后的處理方式比領導人要簡單的多,并且他們的處理方式是相同的。如果跟隨者或者候選人崩潰了,那么后續發送給他們的 RPCs 都會失敗。Raft 中處理這種失敗就是簡單的通過無限的重試;如果崩潰的機器重啟了,那么這些 RPC 就會完整的成功。如果一個服務器在完成了一個 RPC,但是還沒有響應的時候崩潰了,那么在他重新啟動之后就會再次收到同樣的請求。Raft 的 RPCs 都是冪等的,所以這樣重試不會造成任何問題。例如一個跟隨者如果收到附加日志請求但是他已經包含了這一日志,那么他就會直接忽略這個新的請求。

    5.6 時間和可用性

    Raft 的要求之一就是安全性不能依賴時間:整個系統不能因為某些事件運行的比預期快一點或者慢一點就產生了錯誤的結果。但是,可用性(系統可以及時的響應客戶端)不可避免的要依賴于時間。例如,如果消息交換在服務器崩潰時花費更多的時間,候選人將不會等待太長的時間來贏得選舉;沒有一個穩定的領導人,Raft 將無法工作。

    領導人選舉是 Raft 中對時間要求最為關鍵的方面。Raft 可以選舉并維持一個穩定的領導人,只要系統滿足下面的時間要求:

    廣播時間(broadcastTime) << 選舉超時時間(electionTimeout) << 平均故障間隔時間(MTBF)

    在這個不等式中,廣播時間指的是從一個服務器并行的發送 RPCs 給集群中的其他服務器并接收響應的平均時間;選舉超時時間就是在 5.2 節中介紹的選舉的超時時間限制;然后平均故障間隔時間就是對于一臺服務器而言,兩次故障之間的平均時間。廣播時間必須比選舉超時時間小一個量級,這樣領導人才能夠發送穩定的心跳消息來阻止跟隨者開始進入選舉狀態;通過隨機化選舉超時時間的方法,這個不等式也使得選票瓜分的情況變得不可能。選舉超時時間應該要比平均故障間隔時間小上幾個數量級,這樣整個系統才能穩定的運行。當領導人崩潰后,整個系統會大約相當于選舉超時的時間里不可用;我們希望這種情況在整個系統的運行中很少出現。

    廣播時間和平均故障間隔時間是由系統決定的,但是選舉超時時間是我們自己選擇的。Raft 的 RPCs 需要接收方將信息持久化的保存到穩定存儲中去,所以廣播時間大約是 0.5 毫秒到 20 毫秒,取決于存儲的技術。因此,選舉超時時間可能需要在 10 毫秒到 500 毫秒之間。大多數的服務器的平均故障間隔時間都在幾個月甚至更長,很容易滿足時間的需求。

    6 集群成員變化

    到目前為止,我們都假設集群的配置(加入到一致性算法的服務器集合)是固定不變的。但是在實踐中,偶爾是會改變集群的配置的,例如替換那些宕機的機器或者改變復制級別。盡管可以通過暫停整個集群,更新所有配置,然后重啟整個集群的方式來實現,但是在更改的時候集群會不可用。另外,如果存在手工操作步驟,那么就會有操作失誤的風險。為了避免這樣的問題,我們決定自動化配置改變并且將其納入到 Raft 一致性算法中來。

    為了讓配置修改機制能夠安全,那么在轉換的過程中不能夠存在任何時間點使得兩個領導人同時被選舉成功在同一個任期里。不幸的是,任何服務器直接從舊的配置直接轉換到新的配置的方案都是不安全的。一次性自動的轉換所有服務器是不可能的,所以在轉換期間整個集群存在劃分成兩個獨立的大多數群體的可能性(見圖 10)。

    圖 10:直接從一種配置轉到新的配置是十分不安全的,因為各個機器可能在任何的時候進行轉換。在這個例子中,集群配額從 3 臺機器變成了 5 臺。不幸的是,存在這樣的一個時間點,兩個不同的領導人在同一個任期里都可以被選舉成功。一個是通過舊的配置,一個通過新的配置。

    為了保證安全性,配置更改必須使用兩階段方法。目前有很多種兩階段的實現。例如,有些系統在第一階段停掉舊的配置所以集群就不能處理客戶端請求;然后在第二階段在啟用新的配置。在 Raft 中,集群先切換到一個過渡的配置,我們稱之為共同一致;一旦共同一致已經被提交了,那么系統就切換到新的配置上。共同一致是老配置和新配置的結合:

    • 日志條目被復制給集群中新、老配置的所有服務器。
    • 新、舊配置的服務器都可以成為領導人。
    • 達成一致(針對選舉和提交)需要分別在兩種配置上獲得大多數的支持。

    共同一致允許獨立的服務器在不影響安全性的前提下,在不同的時間進行配置轉換過程。此外,共同一致可以讓集群在配置轉換的過程人依然響應服務器請求。

    集群配置在復制日志中以特殊的日志條目來存儲和通信;圖 11 展示了配置轉換的過程。當一個領導人接收到一個改變配置從 C-old 到 C-new 的請求,他會為了共同一致存儲配置(圖中的 C-old,new),以前面描述的日志條目和副本的形式。一旦一個服務器將新的配置日志條目增加到它的日志中,他就會用這個配置來做出未來所有的決定(服務器總是使用最新的配置,無論他是否已經被提交)。這意味著領導人要使用 C-old,new 的規則來決定日志條目 C-old,new 什么時候需要被提交。如果領導人崩潰了,被選出來的新領導人可能是使用 C-old 配置也可能是 C-old,new 配置,這取決于贏得選舉的候選人是否已經接收到了 C-old,new 配置。在任何情況下, C-new 配置在這一時期都不會單方面的做出決定。

    一旦 C-old,new 被提交,那么無論是 C-old 還是 C-new,在沒有經過他人批準的情況下都不可能做出決定,并且領導人完全特性保證了只有擁有 C-old,new 日志條目的服務器才有可能被選舉為領導人。這個時候,領導人創建一條關于 C-new 配置的日志條目并復制給集群就是安全的了。再者,每個服務器在見到新的配置的時候就會立即生效。當新的配置在 C-new 的規則下被提交,舊的配置就變得無關緊要,同時不使用新的配置的服務器就可以被關閉了。如圖 11,C-old 和 C-new 沒有任何機會同時做出單方面的決定;這保證了安全性。

    圖 11:一個配置切換的時間線。虛線表示已經被創建但是還沒有被提交的條目,實線表示最后被提交的日志條目。領導人首先創建了 C-old,new 的配置條目在自己的日志中,并提交到 C-old,new 中(C-old 的大多數和 C-new 的大多數)。然后他創建 C-new 條目并提交到 C-new 中的大多數。這樣就不存在 C-new 和 C-old 可以同時做出決定的時間點。

    在關于重新配置還有三個問題需要提出。第一個問題是,新的服務器可能初始化沒有存儲任何的日志條目。當這些服務器以這種狀態加入到集群中,那么他們需要一段時間來更新追趕,這時還不能提交新的日志條目。為了避免這種可用性的間隔時間,Raft 在配置更新的時候使用了一種額外的階段,在這個階段,新的服務器以沒有投票權身份加入到集群中來(領導人復制日志給他們,但是不考慮他們是大多數)。一旦新的服務器追趕上了集群中的其他機器,重新配置可以像上面描述的一樣處理。

    第二個問題是,集群的領導人可能不是新配置的一員。在這種情況下,領導人就會在提交了 C-new 日志之后退位(回到跟隨者狀態)。這意味著有這樣的一段時間,領導人管理著集群,但是不包括他自己;他復制日志但是不把他自己算作是大多數之一。當 C-new 被提交時,會發生領導人過渡,因為這時是最早新的配置可以獨立工作的時間點(將總是能夠在 C-new 配置下選出新的領導人)。在此之前,可能只能從 C-old 中選出領導人。

    第三個問題是,移除不在 C-new 中的服務器可能會擾亂集群。這些服務器將不會再接收到心跳,所以當選舉超時,他們就會進行新的選舉過程。他們會發送擁有新的任期號的請求投票 RPCs,這樣會導致當前的領導人回退成跟隨者狀態。新的領導人最終會被選出來,但是被移除的服務器將會再次超時,然后這個過程會再次重復,導致整體可用性大幅降低。

    為了避免這個問題,當服務器確認當前領導人存在時,服務器會忽略請求投票 RPCs。特別的,當服務器在當前最小選舉超時時間內收到一個請求投票 RPC,他不會更新當前的任期號或者投出選票。這不會影響正常的選舉,每個服務器在開始一次選舉之前,至少等待一個最小選舉超時時間。然而,這有利于避免被移除的服務器擾亂:如果領導人能夠發送心跳給集群,那么他就不會被更大的任期號廢黜。

    7 日志壓縮

    Raft 的日志在正常操作中不斷的增長,但是在實際的系統中,日志不能無限制的增長。隨著日志不斷增長,他會占用越來越多的空間,花費越來越多的時間來重置。如果沒有一定的機制去清除日志里積累的陳舊的信息,那么會帶來可用性問題。

    快照是最簡單的壓縮方法。在快照系統中,整個系統的狀態都以快照的形式寫入到穩定的持久化存儲中,然后到那個時間點之前的日志全部丟棄。快照技術被使用在 Chubby 和 ZooKeeper 中,接下來的章節會介紹 Raft 中的快照技術。

    增量壓縮的方法,例如日志清理或者日志結構合并樹,都是可行的。這些方法每次只對一小部分數據進行操作,這樣就分散了壓縮的負載壓力。首先,他們先選擇一個已經積累的大量已經被刪除或者被覆蓋對象的區域,然后重寫那個區域還活躍的對象,之后釋放那個區域。和簡單操作整個數據集合的快照相比,需要增加復雜的機制來實現。狀態機可以實現 LSM tree 使用和快照相同的接口,但是日志清除方法就需要修改 Raft 了。

    圖 12:一個服務器用新的快照替換了從 1 到 5 的條目,快照值存儲了當前的狀態。快照中包含了最后的索引位置和任期號。

    圖 12 展示了 Raft 中快照的基礎思想。每個服務器獨立的創建快照,只包括已經被提交的日志。主要的工作包括將狀態機的狀態寫入到快照中。Raft 也包含一些少量的元數據到快照中:最后被包含索引指的是被快照取代的最后的條目在日志中的索引值(狀態機最后應用的日志),最后被包含的任期指的是該條目的任期號。保留這些數據是為了支持快照前的第一個條目的附加日志請求時的一致性檢查,因為這個條目需要最后的索引值和任期號。為了支持集群成員更新(第 6 節),快照中也將最后的一次配置作為最后一個條目存下來。一旦服務器完成一次快照,他就可以刪除最后索引位置之前的所有日志和快照了。

    盡管通常服務器都是獨立的創建快照,但是領導人必須偶爾的發送快照給一些落后的跟隨者。這通常發生在當領導人已經丟棄了下一條需要發送給跟隨者的日志條目的時候。幸運的是這種情況不是常規操作:一個與領導人保持同步的跟隨者通常都會有這個條目。然而一個運行非常緩慢的跟隨者或者新加入集群的服務器(第 6 節)將不會有這個條目。這時讓這個跟隨者更新到最新的狀態的方式就是通過網絡把快照發送給他們。

    安裝快照 RPC

    在領導人發送快照給跟隨者時使用到。領導人總是按順序發送。

    參數解釋
    term領導人的任期號
    leaderId領導人的 Id,以便于跟隨者重定向請求
    lastIncludedIndex快照中包含的最后日志條目的索引值
    lastIncludedTerm快照中包含的最后日志條目的任期號
    offset分塊在快照中的偏移量
    data[]原始數據
    done如果這是最后一個分塊則為 true
    結果解釋
    term當前任期號,便于領導人更新自己

    接收者實現

  • 如果term < currentTerm就立即回復
  • 如果是第一個分塊(offset 為 0)就創建一個新的快照
  • 在指定偏移量寫入數據
  • 如果 done 是 false,則繼續等待更多的數據
  • 保存快照文件,丟棄索引值小于快照的日志
  • 如果現存的日志擁有相同的最后任期號和索引值,則后面的數據繼續保持
  • 丟棄整個日志
  • 使用快照重置狀態機
  • 圖 13:一個關于安裝快照的簡要概述。為了便于傳輸,快照都是被分成分塊的;每個分塊都給了跟隨者生命的跡象,所以跟隨者可以重置選舉超時計時器。

    在這種情況下領導人使用一種叫做安裝快照的新的 RPC 來發送快照給太落后的跟隨者;見圖 13。當跟隨者通過這種 RPC 接收到快照時,他必須自己決定對于已經存在的日志該如何處理。通常快照會包含沒有在接收者日志中存在的信息。在這種情況下,跟隨者直接丟棄他所有的日志;這些會被快照所取代,但是可能會和沒有提交的日志產生沖突。如果接收到的快照是自己日志的前面部分(由于網絡重傳或者錯誤),那么被快照包含的條目將會被全部刪除,但是快照之后的條目必須正確和保留。

    這種快照的方式背離了 Raft 的強領導人原則,因為跟隨者可以在不知道領導人情況下創建快照。但是我們認為這種背離是值得的。領導人的存在,是為了解決在達成一致性的時候的沖突,但是在創建快照的時候,一致性已經達成,這時不存在沖突了,所以沒有領導人也是可以的。數據依然是從領導人傳給跟隨者,只是跟隨者可以重新組織他們的數據了。

    我們考慮過一種替代的基于領導人的快照方案,即只有領導人創建快照,然后發送給所有的跟隨者。但是這樣做有兩個缺點。第一,發送快照會浪費網絡帶寬并且延緩了快照處理的時間。每個跟隨者都已經擁有了所有產生快照需要的信息,而且很顯然,自己從本地的狀態中創建快照比通過網絡接收別人發來的要經濟。第二,領導人的實現會更加復雜。例如,領導人需要發送快照的同時并行的將新的日志條目發送給跟隨者,這樣才不會阻塞新的客戶端請求。

    還有兩個問題影響了快照的性能。首先,服務器必須決定什么時候應該創建快照。如果快照創建的過于頻繁,那么就會浪費大量的磁盤帶寬和其他資源;如果創建快照頻率太低,他就要承受耗盡存儲容量的風險,同時也增加了從日志重建的時間。一個簡單的策略就是當日志大小達到一個固定大小的時候就創建一次快照。如果這個閾值設置的顯著大于期望的快照的大小,那么快照對磁盤壓力的影響就會很小了。

    第二個影響性能的問題就是寫入快照需要花費顯著的一段時間,并且我們還不希望影響到正常操作。解決方案是通過寫時復制的技術,這樣新的更新就可以被接收而不影響到快照。例如,具有函數式數據結構的狀態機天然支持這樣的功能。另外,操作系統的寫時復制技術的支持(如 Linux 上的 fork)可以被用來創建完整的狀態機的內存快照(我們的實現就是這樣的)。

    8 客戶端交互

    這一節將介紹客戶端是如何和 Raft 進行交互的,包括客戶端如何發現領導人和 Raft 是如何支持線性化語義的。這些問題對于所有基于一致性的系統都存在,并且 Raft 的解決方案和其他的也差不多。

    Raft 中的客戶端發送所有請求給領導人。當客戶端啟動的時候,他會隨機挑選一個服務器進行通信。如果客戶端第一次挑選的服務器不是領導人,那么那個服務器會拒絕客戶端的請求并且提供他最近接收到的領導人的信息(附加條目請求包含了領導人的網絡地址)。如果領導人已經崩潰了,那么客戶端的請求就會超時;客戶端之后會再次重試隨機挑選服務器的過程。

    我們 Raft 的目標是要實現線性化語義(每一次操作立即執行,只執行一次,在他調用和收到回復之間)。但是,如上述,Raft 是可以執行同一條命令多次的:例如,如果領導人在提交了這條日志之后,但是在響應客戶端之前崩潰了,那么客戶端會和新的領導人重試這條指令,導致這條命令就被再次執行了。解決方案就是客戶端對于每一條指令都賦予一個唯一的序列號。然后,狀態機跟蹤每條指令最新的序列號和相應的響應。如果接收到一條指令,它的序列號已經被執行了,那么就立即返回結果,而不重新執行指令。

    只讀的操作可以直接處理而不需要記錄日志。但是,在不增加任何限制的情況下,這么做可能會冒著返回臟數據的風險,因為領導人響應客戶端請求時可能已經被新的領導人作廢了,但是他還不知道。線性化的讀操作必須不能返回臟數據,Raft 需要使用兩個額外的措施在不使用日志的情況下保證這一點。首先,領導人必須有關于被提交日志的最新信息。領導人完全特性保證了領導人一定擁有所有已經被提交的日志條目,但是在他任期開始的時候,他可能不知道那些是已經被提交的。為了知道這些信息,他需要在他的任期里提交一條日志條目。Raft 中通過領導人在任期開始的時候提交一個空白的沒有任何操作的日志條目到日志中去來實現。第二,領導人在處理只讀的請求之前必須檢查自己是否已經被廢黜了(他自己的信息已經變臟了如果一個更新的領導人被選舉出來)。Raft 中通過讓領導人在響應只讀請求之前,先和集群中的大多數節點交換一次心跳信息來處理這個問題。可選的,領導人可以依賴心跳機制來實現一種租約的機制,但是這種方法依賴時間來保證安全性(假設時間誤差是有界的)。

    9 算法實現和評估

    我們已經為 RAMCloud 實現了 Raft 算法作為存儲配置信息的復制狀態機的一部分,并且幫助 RAMCloud 協調故障轉移。這個 Raft 實現包含大約 2000 行 C++ 代碼,其中不包括測試、注釋和空行。這些代碼是開源的。同時也有大約 25 個其他獨立的第三方的基于這篇論文草稿的開源實現,針對不同的開發場景。同時,很多公司已經部署了基于 Raft 的系統。

    這一節會從三個方面來評估 Raft 算法:可理解性、正確性和性能。

    9.1 可理解性

    為了和 Paxos 比較 Raft 算法的可理解能力,我們針對高層次的本科生和研究生,在斯坦福大學的高級操作系統課程和加州大學伯克利分校的分布式計算課程上,進行了一次學習的實驗。我們分別拍了針對 Raft 和 Paxos 的視頻課程,并準備了相應的小測驗。Raft 的視頻講課覆蓋了這篇論文的所有內容除了日志壓縮;Paxos 講課包含了足夠的資料來創建一個等價的復制狀態機,包括單決策 Paxos,多決策 Paxos,重新配置和一些實際系統需要的性能優化(例如領導人選舉)。小測驗測試一些對算法的基本理解和解釋一些邊角的示例。每個學生都是看完第一個視頻,回答相應的測試,再看第二個視頻,回答相應的測試。大約有一半的學生先進行 Paxos 部分,然后另一半先進行 Raft 部分,這是為了說明兩者獨立的區別從第一個算法處學來的經驗。我們計算參加人員的每一個小測驗的得分來看參與者是否在 Raft 算法上更加容易理解。

    我們盡可能的使得 Paxos 和 Raft 的比較更加公平。這個實驗偏愛 Paxos 表現在兩個方面:43 個參加者中有 15 個人在之前有一些 Paxos 的經驗,并且 Paxos 的視頻要長 14%。如表格 1 總結的那樣,我們采取了一些措施來減輕這種潛在的偏見。我們所有的材料都可供審查。

    關心緩和偏見采取的手段可供查看的材料
    相同的講課質量兩者使用同一個講師。Paxos 使用的是現在很多大學里經常使用的。Paxos 會長 14%。視頻
    相同的測驗難度問題以難度分組,在兩個測驗里成對出現。小測驗
    公平評分使用紅字標題。隨機順序打分,兩個測驗交替進行。紅字標題

    表 1:考慮到可能會存在的偏見,對于每種情況的解決方法,和相應的材料。

    參加者平均在 Raft 的測驗中比 Paxos 高 4.9 分(總分 60,那么 Raft 的平均得分是 25.7,而 Paxos 是 20.8);圖 14 展示了每個參與者的得分。一對 t -測試表明,擁有 95% 的可信度,真實的 Raft 分數分布至少比 Paxos 高 2.5 分。

    圖 14:一個散點圖表示了 43 個學生在 Paxos 和 Raft 的小測驗中的成績。在對角線之上的點表示在 Raft 獲得了更高分數的學生。

    我們也建立了一個線性回歸模型來預測一個新的學生的測驗成績,基于以下三個因素:他們使用的是哪個小測驗,之前對 Paxos 的經驗,和學習算法的順序。模型顯示,對小測驗的選擇會產生 12.5 分的差別在對 Raft 的好感度上。這顯著的高于之前的 4.9 分,因為很多學生在之前都已經有了對于 Paxos 的經驗,這相當明顯的幫助 Paxos,對 Raft 就沒什么太大影響了。但是奇怪的是,模型預測對于先進性 Paxos 小測驗的人而言,Raft 的小測驗得分會比 Paxos 低 6.3 分;我們不知道為什么,但這在統計學上是這樣的。

    我們同時也在測驗之后調查了參與者,他們認為哪個算法更加容易實現和解釋;這個的結果在圖 15 上。壓倒性的結果表明 Raft 算法更加容易實現和解釋(41 人中的 33個)。但是,這種自己報告的結果不如參與者的成績更加可信,并且參與者可能因為我們的 Raft 更加易于理解的假說而產生偏見。

    圖 15:通過一個 5 分制的問題,參與者(左邊)被問哪個算法他們覺得在一個高效正確的系統里更容易實現,右邊被問哪個更容易向學生解釋。

    關于 Raft 用戶學習有一個更加詳細的討論。

    9.2 正確性

    在第 5 節,我們已經進行了一個正式的說明,和對一致性機制的安全性證明。這個正式說明讓圖 2 中的信息非常清晰通過 TLA+ 說明語言。大約 400 行說明充當了證明的主題。同時對于任何想實現的人也是十分有用的。我們非常機械的證明了日志完全特性通過 TLA 證明系統。然而,這個證明依賴的約束前提還沒有被機械證明(例如,我們還沒有證明這個說明中的類型安全)。而且,我們已經寫了一個非正式的證明關于狀態機安全性質是完備的,并且是相當清晰的(大約 3500 個詞)。

    9.3 性能

    Raft 和其他一致性算法例如 Paxos 有著差不多的性能。在性能方面,最重要的關注點是,當領導人被選舉成功時,什么時候復制新的日志條目。Raft 通過很少數量的消息包(一輪從領導人到集群大多數機器的消息)就達成了這個目的。同時,進一步提升 Raft 的性能也是可行的。例如,很容易通過支持批量操作和管道操作來提高吞吐量和降低延遲。對于其他一致性算法已經提出過很多性能優化方案;其中有很多也可以應用到 Raft 中來,但是我們暫時把這個問題放到未來的工作中去。

    我們使用我們自己的 Raft 實現來衡量 Raft 領導人選舉的性能并且回答兩個問題。首先,領導人選舉的過程收斂是否快速?第二,在領導人宕機之后,最小的系統宕機時間是多久?

    圖 16:發現并替換一個已經崩潰的領導人的時間。上面的圖考察了在選舉超時時間上的隨機化程度,下面的圖考察了最小超時時間。每條線代表了 1000 次實驗(除了 150-150 毫秒只試了 100 次),和相應的確定的選舉超時時間。例如,150-155 毫秒意思是,選舉超時時間從這個區間范圍內隨機選擇并確定下來。這個實驗在一個擁有 5 個節點的集群上進行,其廣播時延大約是 15 毫秒。對于 9 個節點的集群,結果也差不多。

    為了衡量領導人選舉,我們反復的使一個擁有五個節點的服務器集群的領導人宕機,并計算需要多久才能發現領導人已經宕機并選出一個新的領導人(見圖 16)。為了構建一個最壞的場景,在每一的嘗試里,服務器都有不同長度的日志,意味著有些候選人是沒有成為領導人的資格的。另外,為了促成選票瓜分的情況,我們的測試腳本在終止領導人之前同步的發送了一次心跳廣播(這大約和領導人在崩潰前復制一個新的日志給其他機器很像)。領導人均勻的隨機的在心跳間隔里宕機,也就是最小選舉超時時間的一半。因此,最小宕機時間大約就是最小選舉超時時間的一半。

    圖 16 上面的圖表表明,只需要在選舉超時時間上使用很少的隨機化就可以大大避免選票被瓜分的情況。在沒有隨機化的情況下,在我們的測試里,選舉過程往往都需要花費超過 10 秒鐘由于太多的選票瓜分的情況。僅僅增加 5 毫秒的隨機化時間,就大大的改善了選舉過程,現在平均的宕機時間只有 287 毫秒。增加更多的隨機化時間可以大大改善最壞情況:通過增加 50 毫秒的隨機化時間,最壞的完成情況(1000 次嘗試)只要 513 毫秒。

    圖 16 中下面的圖顯示,通過減少選舉超時時間可以減少系統的宕機時間。在選舉超時時間為 12-24 毫秒的情況下,只需要平均 35 毫秒就可以選舉出新的領導人(最長的一次花費了 152 毫秒)。然而,進一步降低選舉超時時間的話就會違反 Raft 的時間不等式需求:在選舉新領導人之前,領導人就很難發送完心跳包。這會導致沒有意義的領導人改變并降低了系統整體的可用性。我們建議使用更為保守的選舉超時時間,比如 150-300 毫秒;這樣的時間不大可能導致沒有意義的領導人改變,而且依然提供不錯的可用性。

    10 相關工作

    已經有很多關于一致性算法的工作被發表出來,其中很多都可以歸到下面的類別中:

    • Lamport 關于 Paxos 的原始描述,和嘗試描述的更清晰。
    • 關于 Paxos 的更詳盡的描述,補充遺漏的細節并修改算法,使得可以提供更加容易的實現基礎。
    • 實現一致性算法的系統,例如 Chubby,ZooKeeper 和 Spanner。對于 Chubby 和 Spanner 的算法并沒有公開發表其技術細節,盡管他們都聲稱是基于 Paxos 的。ZooKeeper 的算法細節已經發表,但是和 Paxos 著實有著很大的差別。
    • Paxos 可以應用的性能優化。
    • Oki 和 Liskov 的 Viewstamped Replication(VR),一種和 Paxos 差不多的替代算法。原始的算法描述和分布式傳輸協議耦合在了一起,但是核心的一致性算法在最近的更新里被分離了出來。VR 使用了一種基于領導人的方法,和 Raft 有很多相似之處。

    Raft 和 Paxos 最大的不同之處就在于 Raft 的強領導特性:Raft 使用領導人選舉作為一致性協議里必不可少的部分,并且將盡可能多的功能集中到了領導人身上。這樣就可以使得算法更加容易理解。例如,在 Paxos 中,領導人選舉和基本的一致性協議是正交的:領導人選舉僅僅是性能優化的手段,而且不是一致性所必須要求的。但是,這樣就增加了多余的機制:Paxos 同時包含了針對基本一致性要求的兩階段提交協議和針對領導人選舉的獨立的機制。相比較而言,Raft 就直接將領導人選舉納入到一致性算法中,并作為兩階段一致性的第一步。這樣就減少了很多機制。

    像 Raft 一樣,VR 和 ZooKeeper 也是基于領導人的,因此他們也擁有一些 Raft 的優點。但是,Raft 比 VR 和 ZooKeeper 擁有更少的機制因為 Raft 盡可能的減少了非領導人的功能。例如,Raft 中日志條目都遵循著從領導人發送給其他人這一個方向:附加條目 RPC 是向外發送的。在 VR 中,日志條目的流動是雙向的(領導人可以在選舉過程中接收日志);這就導致了額外的機制和復雜性。根據 ZooKeeper 公開的資料看,它的日志條目也是雙向傳輸的,但是它的實現更像 Raft。

    和上述我們提及的其他基于一致性的日志復制算法中,Raft 的消息類型更少。例如,我們數了一下 VR 和 ZooKeeper 使用的用來基本一致性需要和成員改變的消息數(排除了日志壓縮和客戶端交互,因為這些都比較獨立且和算法關系不大)。VR 和 ZooKeeper 都分別定義了 10 中不同的消息類型,相對的,Raft 只有 4 中消息類型(兩種 RPC 請求和對應的響應)。Raft 的消息都稍微比其他算法的要信息量大,但是都很簡單。另外,VR 和 ZooKeeper 都在領導人改變時傳輸了整個日志;所以為了能夠實踐中使用,額外的消息類型就很必要了。

    Raft 的強領導人模型簡化了整個算法,但是同時也排斥了一些性能優化的方法。例如,平等主義 Paxos (EPaxos)在某些沒有領導人的情況下可以達到很高的性能。平等主義 Paxos 充分發揮了在狀態機指令中的交換性。任何服務器都可以在一輪通信下就提交指令,除非其他指令同時被提出了。然而,如果指令都是并發的被提出,并且互相之間不通信溝通,那么 EPaxos 就需要額外的一輪通信。因為任何服務器都可以提交指令,所以 EPaxos 在服務器之間的負載均衡做的很好,并且很容易在 WAN 網絡環境下獲得很低的延遲。但是,他在 Paxos 上增加了非常明顯的復雜性。

    一些集群成員變換的方法已經被提出或者在其他的工作中被實現,包括 Lamport 的原始的討論,VR 和 SMART。我們選擇使用共同一致的方法因為他對一致性協議的其他部分影響很小,這樣我們只需要很少的一些機制就可以實現成員變換。Lamport 的基于 α 的方法之所以沒有被 Raft 選擇是因為它假設在沒有領導人的情況下也可以達到一致性。和 VR 和 SMART 相比較,Raft 的重新配置算法可以在不限制正常請求處理的情況下進行;相比較的,VR 需要停止所有的處理過程,SMART 引入了一個和 α 類似的方法,限制了請求處理的數量。Raft 的方法同時也需要更少的額外機制來實現,和 VR、SMART 比較而言。

    11 結論

    算法的設計通常會把正確性,效率或者簡潔作為主要的目標。盡管這些都是很有意義的目標,但是我們相信,可理解性也是一樣的重要。在開發者把算法應用到實際的系統中之前,這些目標沒有一個會被實現,這些都會必然的偏離發表時的形式。除非開發人員對這個算法有著很深的理解并且有著直觀的感覺,否則將會對他們而言很難在實現的時候保持原有期望的特性。

    在這篇論文中,我們嘗試解決分布式一致性問題,但是一個廣為接受但是十分令人費解的算法 Paxos 已經困擾了無數學生和開發者很多年了。我們創造了一種新的算法 Raft,顯而易見的比 Paxos 要容易理解。我們同時也相信,Raft 也可以為實際的實現提供堅實的基礎。把可理解性作為設計的目標改變了我們設計 Raft 的方式;這個過程是我們發現我們最終很少有技術上的重復,例如問題分解和簡化狀態空間。這些技術不僅提升了 Raft 的可理解性,同時也使我們堅信其正確性。

    12 感謝

    這項研究必須感謝以下人員的支持:Ali Ghodsi,David Mazie`res,和伯克利 CS 294-91 課程、斯坦福 CS 240 課程的學生。Scott Klemmer 幫我們設計了用戶調查,Nelson Ray 建議我們進行統計學的分析。在用戶調查時使用的關于 Paxos 的幻燈片很大一部分是從 Lorenzo Alvisi 的幻燈片上借鑒過來的。特別的,非常感謝 DavidMazieres 和 Ezra Hoch,他們找到了 Raft 中一些難以發現的漏洞。許多人提供了關于這篇論文十分有用的反饋和用戶調查材料,包括 Ed Bugnion,Michael Chan,Hugues Evrard,Daniel Giffin,Arjun Gopalan,Jon Howell,Vimalkumar Jeyakumar,Ankita Kejriwal,Aleksandar Kracun,Amit Levy,Joel Martin,Satoshi Matsushita,Oleg Pesok,David Ramos,Robbert van Renesse,Mendel Rosenblum,Nicolas Schiper,Deian Stefan,Andrew Stone,Ryan Stutsman,David Terei,Stephen Yang,Matei Zaharia 以及 24 位匿名的會議審查人員(可能有重復),并且特別感謝我們的領導人 Eddie Kohler。Werner Vogels 發了一條早期草稿鏈接的推特,給 Raft 帶來了極大的關注。我們的工作由 Gigascale 系統研究中心和 Multiscale 系統研究中心給予支持,這兩個研究中心由關注中心研究程序資金支持,一個是半導體研究公司的程序,由 STARnet 支持,一個半導體研究公司的程序由 MARCO 和 DARPA 支持,在國家科學基金會的 0963859 號批準,并且獲得了來自 Facebook,Google,Mellanox,NEC,NetApp,SAP 和 Samsung 的支持。Diego Ongaro 由 Junglee 公司,斯坦福的畢業團體支持。


    https://github.com/maemual/raft-zh_cn/blob/master/raft-zh_cn.md

    總結

    以上是生活随笔為你收集整理的RAFT 寻找一种易于理解的一致性算法(扩展版)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产三级精品三级男人的天堂 | 欧美 日韩 亚洲 在线 | 日本饥渴人妻欲求不满 | 国内精品久久毛片一区二区 | 久久久久国色av免费观看性色 | 久久99精品久久久久久 | 男女猛烈xx00免费视频试看 | 成人欧美一区二区三区黑人免费 | 国产三级精品三级男人的天堂 | 亚洲 激情 小说 另类 欧美 | 欧美黑人巨大xxxxx | 亚洲a无码综合a国产av中文 | 性欧美牲交xxxxx视频 | 欧美熟妇另类久久久久久不卡 | 成人精品一区二区三区中文字幕 | 国产亚洲欧美日韩亚洲中文色 | 中文无码伦av中文字幕 | 俺去俺来也www色官网 | 在线精品国产一区二区三区 | 色情久久久av熟女人妻网站 | 久久久中文久久久无码 | 中文字幕 亚洲精品 第1页 | 奇米影视7777久久精品 | 女人和拘做爰正片视频 | 亚洲成色www久久网站 | 亚洲精品成人福利网站 | 精品日本一区二区三区在线观看 | 欧美日韩视频无码一区二区三 | 色 综合 欧美 亚洲 国产 | 国精产品一品二品国精品69xx | 暴力强奷在线播放无码 | 欧美阿v高清资源不卡在线播放 | 精品国产aⅴ无码一区二区 | а天堂中文在线官网 | 中文字幕无码av激情不卡 | 欧美精品国产综合久久 | 亚无码乱人伦一区二区 | 免费国产黄网站在线观看 | 欧美第一黄网免费网站 | 对白脏话肉麻粗话av | 成人免费视频在线观看 | 中文字幕乱码人妻二区三区 | 亚洲精品成人福利网站 | 国产深夜福利视频在线 | 无码吃奶揉捏奶头高潮视频 | 丝袜人妻一区二区三区 | 国产网红无码精品视频 | 久激情内射婷内射蜜桃人妖 | 蜜桃臀无码内射一区二区三区 | 国产热a欧美热a在线视频 | 婷婷丁香六月激情综合啪 | 国产午夜无码精品免费看 | 国产成人精品久久亚洲高清不卡 | 亚洲日本在线电影 | 成人欧美一区二区三区黑人免费 | 中文字幕乱码人妻二区三区 | 欧美喷潮久久久xxxxx | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美人与牲动交xxxx | 性欧美疯狂xxxxbbbb | 毛片内射-百度 | 欧美阿v高清资源不卡在线播放 | 亚洲国产精品无码久久久久高潮 | 免费人成网站视频在线观看 | 18禁黄网站男男禁片免费观看 | 在线成人www免费观看视频 | 精品无码一区二区三区的天堂 | 国产成人精品久久亚洲高清不卡 | 亚洲自偷精品视频自拍 | 色窝窝无码一区二区三区色欲 | 人妻无码αv中文字幕久久琪琪布 | 夜夜夜高潮夜夜爽夜夜爰爰 | www一区二区www免费 | 天干天干啦夜天干天2017 | 中文字幕乱码中文乱码51精品 | 九九热爱视频精品 | 国产精品久久久一区二区三区 | 国产精品沙发午睡系列 | 日韩 欧美 动漫 国产 制服 | 亚洲欧美日韩国产精品一区二区 | 国产亚洲精品久久久久久久久动漫 | 99精品视频在线观看免费 | av人摸人人人澡人人超碰下载 | 国产人妻大战黑人第1集 | 国产精品无码一区二区桃花视频 | 国精品人妻无码一区二区三区蜜柚 | 日本护士xxxxhd少妇 | 乌克兰少妇性做爰 | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲国产日韩a在线播放 | 亚洲 欧美 激情 小说 另类 | 偷窥日本少妇撒尿chinese | 成在人线av无码免费 | 老头边吃奶边弄进去呻吟 | 午夜福利一区二区三区在线观看 | 99麻豆久久久国产精品免费 | 人妻无码αv中文字幕久久琪琪布 | 国产精品香蕉在线观看 | 人妻少妇被猛烈进入中文字幕 | 国产农村乱对白刺激视频 | 欧美 日韩 人妻 高清 中文 | 人妻天天爽夜夜爽一区二区 | 人妻有码中文字幕在线 | 亚洲中文字幕av在天堂 | 99久久亚洲精品无码毛片 | 亚洲无人区午夜福利码高清完整版 | 日韩av无码一区二区三区 | 成 人 网 站国产免费观看 | 国产免费久久精品国产传媒 | 久久精品国产日本波多野结衣 | 精品乱子伦一区二区三区 | 亚洲成av人影院在线观看 | 亚洲国产成人a精品不卡在线 | 欧美黑人性暴力猛交喷水 | 国产精品自产拍在线观看 | 国产内射老熟女aaaa | 久久久中文字幕日本无吗 | 久久天天躁狠狠躁夜夜免费观看 | 午夜丰满少妇性开放视频 | 午夜嘿嘿嘿影院 | 久久亚洲国产成人精品性色 | 精品欧美一区二区三区久久久 | 国产精品免费大片 | 午夜无码人妻av大片色欲 | 国产香蕉97碰碰久久人人 | 国产卡一卡二卡三 | 亚无码乱人伦一区二区 | 扒开双腿吃奶呻吟做受视频 | а√资源新版在线天堂 | 麻豆精品国产精华精华液好用吗 | 波多野结衣一区二区三区av免费 | 精品人人妻人人澡人人爽人人 | 蜜桃臀无码内射一区二区三区 | 久久这里只有精品视频9 | 色综合天天综合狠狠爱 | 久久久久99精品成人片 | 亚洲日韩中文字幕在线播放 | 动漫av网站免费观看 | 色婷婷av一区二区三区之红樱桃 | 精品国产国产综合精品 | 国产又爽又猛又粗的视频a片 | 性啪啪chinese东北女人 | 精品一区二区三区无码免费视频 | 欧美日韩色另类综合 | 性生交大片免费看l | 欧美日本免费一区二区三区 | 国产另类ts人妖一区二区 | 国产明星裸体无码xxxx视频 | 亚洲一区二区三区国产精华液 | 国产真人无遮挡作爱免费视频 | 日韩精品成人一区二区三区 | 在线a亚洲视频播放在线观看 | 久久伊人色av天堂九九小黄鸭 | 久久久久国色av免费观看性色 | 久久久久人妻一区精品色欧美 | 中文字幕乱码人妻无码久久 | 成人av无码一区二区三区 | 欧美日韩色另类综合 | 一本色道久久综合狠狠躁 | 久久久久久九九精品久 | 精品国产青草久久久久福利 | 伊在人天堂亚洲香蕉精品区 | 国产人妻人伦精品 | 国产高清不卡无码视频 | 无套内谢老熟女 | 国产成人无码区免费内射一片色欲 | 亚洲啪av永久无码精品放毛片 | 国产人妻精品午夜福利免费 | 亚洲小说春色综合另类 | 福利一区二区三区视频在线观看 | 精品国产一区二区三区av 性色 | 国产精品久久久久无码av色戒 | √天堂资源地址中文在线 | 日韩无套无码精品 | 一个人看的视频www在线 | 精品国产一区av天美传媒 | 十八禁视频网站在线观看 | 乱码av麻豆丝袜熟女系列 | 中文字幕无线码免费人妻 | 人人妻人人澡人人爽欧美精品 | 性色欲网站人妻丰满中文久久不卡 | 精品久久久久久人妻无码中文字幕 | 丰满少妇熟乱xxxxx视频 | 久久久成人毛片无码 | 日韩人妻无码中文字幕视频 | 国产精品自产拍在线观看 | 国产女主播喷水视频在线观看 | 一二三四在线观看免费视频 | 在线视频网站www色 | 国产成人亚洲综合无码 | aⅴ亚洲 日韩 色 图网站 播放 | 人人澡人人透人人爽 | a国产一区二区免费入口 | 无码午夜成人1000部免费视频 | 国产两女互慰高潮视频在线观看 | 无码国模国产在线观看 | 日韩少妇白浆无码系列 | 少妇性俱乐部纵欲狂欢电影 | 爆乳一区二区三区无码 | 中文字幕无线码免费人妻 | 樱花草在线社区www | 欧美日韩在线亚洲综合国产人 | 久久精品99久久香蕉国产色戒 | 男女下面进入的视频免费午夜 | 色综合久久88色综合天天 | 成人精品视频一区二区三区尤物 | 18无码粉嫩小泬无套在线观看 | 装睡被陌生人摸出水好爽 | 少妇久久久久久人妻无码 | 欧美一区二区三区视频在线观看 | 牲交欧美兽交欧美 | 免费观看激色视频网站 | 欧美喷潮久久久xxxxx | 日本精品久久久久中文字幕 | 四虎影视成人永久免费观看视频 | 麻豆md0077饥渴少妇 | 狂野欧美性猛xxxx乱大交 | 欧美 亚洲 国产 另类 | 亚洲区小说区激情区图片区 | 大肉大捧一进一出好爽视频 | 欧美黑人性暴力猛交喷水 | 欧美午夜特黄aaaaaa片 | 97夜夜澡人人双人人人喊 | 无码av最新清无码专区吞精 | 国内精品人妻无码久久久影院 | 欧美 亚洲 国产 另类 | 国产乱人无码伦av在线a | 18黄暴禁片在线观看 | 精品欧洲av无码一区二区三区 | 久久99精品久久久久婷婷 | 亚洲一区二区三区四区 | 丝袜 中出 制服 人妻 美腿 | 性啪啪chinese东北女人 | 国产精品二区一区二区aⅴ污介绍 | 国产乱子伦视频在线播放 | 131美女爱做视频 | 国精产品一品二品国精品69xx | 亚洲啪av永久无码精品放毛片 | 小鲜肉自慰网站xnxx | 人妻天天爽夜夜爽一区二区 | 亚洲国产欧美日韩精品一区二区三区 | 青青草原综合久久大伊人精品 | 97夜夜澡人人双人人人喊 | 天下第一社区视频www日本 | 偷窥村妇洗澡毛毛多 | 国产办公室秘书无码精品99 | 国产精品久久久午夜夜伦鲁鲁 | 18禁止看的免费污网站 | 亚洲精品鲁一鲁一区二区三区 | 好男人www社区 | 奇米影视7777久久精品 | 高清国产亚洲精品自在久久 | 亚洲va中文字幕无码久久不卡 | 午夜福利一区二区三区在线观看 | 国产一区二区三区影院 | 欧美丰满熟妇xxxx性ppx人交 | 99精品国产综合久久久久五月天 | 国产精品久久久一区二区三区 | 激情内射亚州一区二区三区爱妻 | 给我免费的视频在线观看 | 国产亚av手机在线观看 | 日韩精品一区二区av在线 | 欧美日本免费一区二区三区 | 日韩在线不卡免费视频一区 | 人妻与老人中文字幕 | 中文字幕中文有码在线 | 呦交小u女精品视频 | 国产乡下妇女做爰 | 东京热无码av男人的天堂 | 九月婷婷人人澡人人添人人爽 | 一本久久a久久精品vr综合 | 少妇愉情理伦片bd | 亚洲乱码国产乱码精品精 | 亚洲а∨天堂久久精品2021 | 亚洲热妇无码av在线播放 | 伊人久久大香线蕉午夜 | 国产成人精品久久亚洲高清不卡 | 伊人久久大香线蕉av一区二区 | 日韩人妻少妇一区二区三区 | 国产69精品久久久久app下载 | 精品厕所偷拍各类美女tp嘘嘘 | 在线亚洲高清揄拍自拍一品区 | 国产香蕉97碰碰久久人人 | 色欲人妻aaaaaaa无码 | 日本又色又爽又黄的a片18禁 | 成人无码影片精品久久久 | 中国女人内谢69xxxx | 亚洲乱亚洲乱妇50p | 俺去俺来也在线www色官网 | 久久久精品456亚洲影院 | 性做久久久久久久免费看 | 青草视频在线播放 | 狂野欧美性猛xxxx乱大交 | 少妇无码一区二区二三区 | 精品久久久无码人妻字幂 | 人妻少妇被猛烈进入中文字幕 | 亚洲经典千人经典日产 | 国内丰满熟女出轨videos | 无遮挡啪啪摇乳动态图 | 欧美真人作爱免费视频 | 国产9 9在线 | 中文 | 麻花豆传媒剧国产免费mv在线 | 精品无人国产偷自产在线 | 人妻无码αv中文字幕久久琪琪布 | 久久综合香蕉国产蜜臀av | 亚洲乱码日产精品bd | 久久久久亚洲精品中文字幕 | 人妻互换免费中文字幕 | 久久天天躁夜夜躁狠狠 | 人妻插b视频一区二区三区 | 国产人妻精品午夜福利免费 | 国产亚洲精品久久久久久大师 | 免费看少妇作爱视频 | 色狠狠av一区二区三区 | 天堂亚洲免费视频 | 久久国产劲爆∧v内射 | 色窝窝无码一区二区三区色欲 | 少妇愉情理伦片bd | 蜜臀aⅴ国产精品久久久国产老师 | 成人精品天堂一区二区三区 | 亚洲欧美国产精品久久 | 欧美黑人性暴力猛交喷水 | 国产精品理论片在线观看 | 内射爽无广熟女亚洲 | 国产精品福利视频导航 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 一本久久a久久精品vr综合 | 狂野欧美激情性xxxx | 波多野结衣一区二区三区av免费 | 亚洲国产欧美日韩精品一区二区三区 | 久久99精品国产麻豆蜜芽 | 国产午夜亚洲精品不卡下载 | 日本精品久久久久中文字幕 | 东京热男人av天堂 | 欧美阿v高清资源不卡在线播放 | 国产成人综合色在线观看网站 | 国语自产偷拍精品视频偷 | 2020久久香蕉国产线看观看 | 国产av一区二区三区最新精品 | 免费人成网站视频在线观看 | 国产情侣作爱视频免费观看 | 兔费看少妇性l交大片免费 | 特大黑人娇小亚洲女 | 无码av最新清无码专区吞精 | 国产suv精品一区二区五 | 人妻熟女一区 | 一本久久a久久精品vr综合 | 中文字幕日韩精品一区二区三区 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 日本精品高清一区二区 | 最新国产麻豆aⅴ精品无码 | 中文字幕无码视频专区 | 国产亚洲视频中文字幕97精品 | 动漫av网站免费观看 | 少妇无套内谢久久久久 | 精品熟女少妇av免费观看 | 国内丰满熟女出轨videos | 久热国产vs视频在线观看 | 日本大乳高潮视频在线观看 | 人人妻人人澡人人爽人人精品 | 在线看片无码永久免费视频 | 永久黄网站色视频免费直播 | 国产精品人人爽人人做我的可爱 | 亚洲精品国偷拍自产在线观看蜜桃 | 一本久道久久综合婷婷五月 | 亚洲国产精品久久久久久 | 波多野结衣一区二区三区av免费 | 玩弄人妻少妇500系列视频 | 任你躁在线精品免费 | 欧美 日韩 人妻 高清 中文 | 人妻天天爽夜夜爽一区二区 | 欧美午夜特黄aaaaaa片 | 久久久久人妻一区精品色欧美 | av无码不卡在线观看免费 | 强伦人妻一区二区三区视频18 | 夜夜躁日日躁狠狠久久av | 精品偷自拍另类在线观看 | 国产精品久久久久久久影院 | 国产av久久久久精东av | 国产成人无码午夜视频在线观看 | 日本肉体xxxx裸交 | 色综合久久久无码中文字幕 | 亚洲精品国偷拍自产在线麻豆 | 亚洲男女内射在线播放 | 午夜精品一区二区三区在线观看 | 亚洲一区二区三区在线观看网站 | 久久99精品久久久久久 | a国产一区二区免费入口 | 夜精品a片一区二区三区无码白浆 | 国产亚洲视频中文字幕97精品 | 性啪啪chinese东北女人 | 亚洲天堂2017无码 | 久久亚洲日韩精品一区二区三区 | 久久久av男人的天堂 | 精品偷自拍另类在线观看 | 最近的中文字幕在线看视频 | 久久综合九色综合欧美狠狠 | 亚洲欧美国产精品久久 | 免费网站看v片在线18禁无码 | 99久久无码一区人妻 | 成人影院yy111111在线观看 | 国产亚洲精品精品国产亚洲综合 | 国产精品va在线观看无码 | 色婷婷综合激情综在线播放 | 日韩av无码中文无码电影 | 在线观看欧美一区二区三区 | 在线欧美精品一区二区三区 | 福利一区二区三区视频在线观看 | 久久成人a毛片免费观看网站 | 久久97精品久久久久久久不卡 | 暴力强奷在线播放无码 | 日本大乳高潮视频在线观看 | 天海翼激烈高潮到腰振不止 | 欧美阿v高清资源不卡在线播放 | 黑人玩弄人妻中文在线 | 国产婷婷色一区二区三区在线 | 国产suv精品一区二区五 | 丰满岳乱妇在线观看中字无码 | 波多野结衣av在线观看 | 免费无码午夜福利片69 | 国产偷国产偷精品高清尤物 | 日本熟妇乱子伦xxxx | 兔费看少妇性l交大片免费 | 国产精品美女久久久久av爽李琼 | 男人的天堂av网站 | 中文字幕无线码免费人妻 | 久久久久人妻一区精品色欧美 | 亚洲熟妇色xxxxx欧美老妇 | 久久99精品久久久久婷婷 | 秋霞成人午夜鲁丝一区二区三区 | 成人影院yy111111在线观看 | 成人女人看片免费视频放人 | 天天拍夜夜添久久精品大 | 黑人巨大精品欧美一区二区 | 无遮挡国产高潮视频免费观看 | 丰满人妻一区二区三区免费视频 | 狂野欧美性猛xxxx乱大交 | 无码吃奶揉捏奶头高潮视频 | 国产精品爱久久久久久久 | 丰满岳乱妇在线观看中字无码 | 久久人妻内射无码一区三区 | 狂野欧美性猛xxxx乱大交 | 夜夜躁日日躁狠狠久久av | 久9re热视频这里只有精品 | 亚洲人成网站色7799 | 亚洲aⅴ无码成人网站国产app | 国产精品无码成人午夜电影 | 特大黑人娇小亚洲女 | 伊在人天堂亚洲香蕉精品区 | 国产精品自产拍在线观看 | 国产一区二区三区日韩精品 | 亚洲人成无码网www | 国产成人一区二区三区别 | 少妇一晚三次一区二区三区 | 97久久超碰中文字幕 | 国产亚洲精品久久久久久久久动漫 | 性色av无码免费一区二区三区 | 激情亚洲一区国产精品 | 久久99精品国产麻豆 | 国产成人无码区免费内射一片色欲 | 亚洲人交乣女bbw | 久久国产36精品色熟妇 | 人妻aⅴ无码一区二区三区 | 国产麻豆精品一区二区三区v视界 | 少妇人妻av毛片在线看 | 捆绑白丝粉色jk震动捧喷白浆 | 国产9 9在线 | 中文 | 国产精品人人爽人人做我的可爱 | 国产农村乱对白刺激视频 | 精品无码av一区二区三区 | 欧美日韩一区二区免费视频 | 国产特级毛片aaaaaa高潮流水 | 内射巨臀欧美在线视频 | 99久久精品无码一区二区毛片 | 国产精品99爱免费视频 | 国产内射爽爽大片视频社区在线 | 精品无码国产一区二区三区av | 精品久久久无码中文字幕 | 日本爽爽爽爽爽爽在线观看免 | aⅴ亚洲 日韩 色 图网站 播放 | 婷婷色婷婷开心五月四房播播 | 夫妻免费无码v看片 | 欧美成人高清在线播放 | 亚洲国产欧美在线成人 | 欧美熟妇另类久久久久久多毛 | 中文字幕人妻无码一夲道 | 人妻互换免费中文字幕 | 国产亚洲欧美日韩亚洲中文色 | 日日橹狠狠爱欧美视频 | 沈阳熟女露脸对白视频 | 亚洲毛片av日韩av无码 | 亚洲一区二区三区播放 | 亚洲自偷自拍另类第1页 | 思思久久99热只有频精品66 | a片免费视频在线观看 | 福利一区二区三区视频在线观看 | 国精产品一区二区三区 | 免费国产黄网站在线观看 | 日本一区二区三区免费播放 | 亚洲成色www久久网站 | 国产三级精品三级男人的天堂 | 2019nv天堂香蕉在线观看 | 俺去俺来也在线www色官网 | 老熟女乱子伦 | 国产精品人人爽人人做我的可爱 | аⅴ资源天堂资源库在线 | 妺妺窝人体色www在线小说 | 国产人妖乱国产精品人妖 | 少妇久久久久久人妻无码 | 大地资源网第二页免费观看 | 国产精品高潮呻吟av久久4虎 | 国产色视频一区二区三区 | 在教室伦流澡到高潮hnp视频 | 又大又紧又粉嫩18p少妇 | 久久久久成人精品免费播放动漫 | 三级4级全黄60分钟 | 东京热无码av男人的天堂 | 日韩在线不卡免费视频一区 | 日本爽爽爽爽爽爽在线观看免 | 又黄又爽又色的视频 | 人妻有码中文字幕在线 | 亚洲熟熟妇xxxx | 狠狠噜狠狠狠狠丁香五月 | 亚洲国产精品一区二区美利坚 | 亚洲国产高清在线观看视频 | 欧美人妻一区二区三区 | 国产成人精品一区二区在线小狼 | 国产精品亚洲а∨无码播放麻豆 | 国产精品久久久久9999小说 | 一本久久a久久精品vr综合 | 日本一卡2卡3卡四卡精品网站 | 欧美三级a做爰在线观看 | 久久久久亚洲精品中文字幕 | 午夜丰满少妇性开放视频 | 日欧一片内射va在线影院 | 中文精品久久久久人妻不卡 | 一本色道婷婷久久欧美 | 2019nv天堂香蕉在线观看 | 超碰97人人射妻 | 亚洲国产高清在线观看视频 | 一本久久伊人热热精品中文字幕 | 无码精品人妻一区二区三区av | 对白脏话肉麻粗话av | 女人被爽到呻吟gif动态图视看 | 日韩人妻无码中文字幕视频 | 亚洲s色大片在线观看 | 性欧美牲交在线视频 | 狠狠色丁香久久婷婷综合五月 | 麻豆av传媒蜜桃天美传媒 | 无码精品国产va在线观看dvd | 精品国产一区av天美传媒 | 欧美人妻一区二区三区 | 2020久久香蕉国产线看观看 | 小鲜肉自慰网站xnxx | 一本色道婷婷久久欧美 | 亚洲国产成人a精品不卡在线 | 51国偷自产一区二区三区 | 天天燥日日燥 | 亚洲国产精品无码一区二区三区 | 国产成人无码av片在线观看不卡 | 成人无码视频免费播放 | 国产精品亚洲五月天高清 | 国产精品99爱免费视频 | 国产人妻精品一区二区三区 | 一区二区三区高清视频一 | 国产av无码专区亚洲awww | 77777熟女视频在线观看 а天堂中文在线官网 | 内射后入在线观看一区 | 久久人妻内射无码一区三区 | 国产av无码专区亚洲awww | 精品乱码久久久久久久 | 欧美性生交xxxxx久久久 | 999久久久国产精品消防器材 | 精品久久8x国产免费观看 | 97久久超碰中文字幕 | a片免费视频在线观看 | 欧美放荡的少妇 | 亚洲中文字幕无码中文字在线 | 亚洲一区二区三区 | 牲欲强的熟妇农村老妇女视频 | 精品成人av一区二区三区 | 白嫩日本少妇做爰 | 亚洲理论电影在线观看 | 久久久久久a亚洲欧洲av冫 | 国产亚洲欧美在线专区 | 国产精品人人爽人人做我的可爱 | a片免费视频在线观看 | 无码播放一区二区三区 | 大屁股大乳丰满人妻 | 日韩av无码中文无码电影 | 强开小婷嫩苞又嫩又紧视频 | 无码av最新清无码专区吞精 | 国产精品久免费的黄网站 | 久久久久久九九精品久 | 5858s亚洲色大成网站www | 国产精品久久久久久亚洲毛片 | 国产超碰人人爽人人做人人添 | 亚洲色大成网站www | 亚洲精品一区二区三区四区五区 | 亚洲欧洲日本无在线码 | 婷婷五月综合激情中文字幕 | 乌克兰少妇xxxx做受 | 国产电影无码午夜在线播放 | 乱人伦中文视频在线观看 | 国产黄在线观看免费观看不卡 | 亚洲aⅴ无码成人网站国产app | 成人毛片一区二区 | 国产午夜亚洲精品不卡 | 免费观看又污又黄的网站 | 亚洲理论电影在线观看 | 久久 国产 尿 小便 嘘嘘 | 国产人妻精品一区二区三区 | 午夜时刻免费入口 | 亚洲精品久久久久avwww潮水 | 国产片av国语在线观看 | 欧美日韩在线亚洲综合国产人 | 欧美人与禽zoz0性伦交 | 宝宝好涨水快流出来免费视频 | 亚洲aⅴ无码成人网站国产app | 亚洲 a v无 码免 费 成 人 a v | 国产成人久久精品流白浆 | 国产麻豆精品精东影业av网站 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 国产农村妇女高潮大叫 | 丰满少妇熟乱xxxxx视频 | 国产精品自产拍在线观看 | 捆绑白丝粉色jk震动捧喷白浆 | 欧美三级a做爰在线观看 | 2019nv天堂香蕉在线观看 | 国产成人无码a区在线观看视频app | 最新国产麻豆aⅴ精品无码 | 99久久亚洲精品无码毛片 | 亚拍精品一区二区三区探花 | 久久视频在线观看精品 | 国产精品久久久久久亚洲影视内衣 | 超碰97人人射妻 | 99久久精品国产一区二区蜜芽 | 中文字幕av日韩精品一区二区 | 久久无码专区国产精品s | 精品午夜福利在线观看 | 自拍偷自拍亚洲精品10p | 综合网日日天干夜夜久久 | 国产做国产爱免费视频 | 红桃av一区二区三区在线无码av | 成人精品视频一区二区三区尤物 | 亚洲一区二区三区播放 | 激情内射日本一区二区三区 | 国精品人妻无码一区二区三区蜜柚 | 动漫av网站免费观看 | 色五月五月丁香亚洲综合网 | 国产精品无码成人午夜电影 | 国产农村乱对白刺激视频 | www国产亚洲精品久久久日本 | 精品 日韩 国产 欧美 视频 | 77777熟女视频在线观看 а天堂中文在线官网 | 中文字幕无码av波多野吉衣 | 亚洲精品一区三区三区在线观看 | 国产人妻久久精品二区三区老狼 | 久久精品一区二区三区四区 | 粗大的内捧猛烈进出视频 | 亚洲综合无码久久精品综合 | 精品 日韩 国产 欧美 视频 | 欧美 日韩 亚洲 在线 | 一二三四在线观看免费视频 | 女人高潮内射99精品 | 中文字幕无码热在线视频 | 色婷婷香蕉在线一区二区 | 久久人妻内射无码一区三区 | 日韩人妻无码一区二区三区久久99 | 亚洲乱码中文字幕在线 | 精品欧洲av无码一区二区三区 | 无码播放一区二区三区 | 午夜熟女插插xx免费视频 | 亚洲综合在线一区二区三区 | 日本欧美一区二区三区乱码 | 免费乱码人妻系列无码专区 | 亚洲国产精品美女久久久久 | 亚洲色成人中文字幕网站 | 性生交片免费无码看人 | 国产成人综合美国十次 | 一本色道婷婷久久欧美 | 丰满岳乱妇在线观看中字无码 | 无套内谢的新婚少妇国语播放 | 亚洲娇小与黑人巨大交 | 精品欧洲av无码一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 久久久精品人妻久久影视 | 色婷婷综合中文久久一本 | 国产午夜无码视频在线观看 | 97夜夜澡人人双人人人喊 | 国产精品成人av在线观看 | 久久午夜无码鲁丝片 | 国产肉丝袜在线观看 | 日本xxxx色视频在线观看免费 | 免费观看的无遮挡av | 精品日本一区二区三区在线观看 | 国产精品久久久久久亚洲毛片 | 欧美老妇交乱视频在线观看 | 少妇性俱乐部纵欲狂欢电影 | 日本一卡二卡不卡视频查询 | 国语自产偷拍精品视频偷 | 性色av无码免费一区二区三区 | 婷婷六月久久综合丁香 | 亚洲成a人一区二区三区 | 国产一区二区三区精品视频 | 丝袜美腿亚洲一区二区 | 亚洲s色大片在线观看 | 日韩亚洲欧美中文高清在线 | 亚洲乱码日产精品bd | 人人妻人人澡人人爽欧美一区九九 | 国语精品一区二区三区 | 日日噜噜噜噜夜夜爽亚洲精品 | 久久久亚洲欧洲日产国码αv | 日韩人妻无码中文字幕视频 | 成人欧美一区二区三区黑人 | 高清不卡一区二区三区 | 亚洲熟悉妇女xxx妇女av | 久久久国产一区二区三区 | 久久久精品欧美一区二区免费 | 妺妺窝人体色www在线小说 | 成人无码精品1区2区3区免费看 | 久久亚洲国产成人精品性色 | 亚洲日韩乱码中文无码蜜桃臀网站 | 欧美人与禽猛交狂配 | 亚洲中文字幕va福利 | 亚洲中文无码av永久不收费 | 亚洲国产精品久久久天堂 | 无码人中文字幕 | 久久人人爽人人爽人人片ⅴ | 人妻少妇精品无码专区二区 | 国产人妻人伦精品1国产丝袜 | 国内少妇偷人精品视频免费 | 蜜桃视频插满18在线观看 | 日韩少妇内射免费播放 | 久久精品成人欧美大片 | 国产麻豆精品一区二区三区v视界 | 久久精品人人做人人综合 | 精品水蜜桃久久久久久久 | 国产美女极度色诱视频www | 国产精品国产三级国产专播 | 熟女体下毛毛黑森林 | 两性色午夜视频免费播放 | 日本大香伊一区二区三区 | 300部国产真实乱 | 国内精品久久久久久中文字幕 | 丝袜 中出 制服 人妻 美腿 | 色五月五月丁香亚洲综合网 | 午夜精品久久久内射近拍高清 | 久久zyz资源站无码中文动漫 | 国产亚洲美女精品久久久2020 | 久久这里只有精品视频9 | 老司机亚洲精品影院无码 | 亚洲欧美日韩成人高清在线一区 | а√资源新版在线天堂 | 丰满少妇高潮惨叫视频 | 亚洲国产精品无码久久久久高潮 | 99久久精品无码一区二区毛片 | 亚洲欧洲日本综合aⅴ在线 | 色综合久久久久综合一本到桃花网 | 亚洲七七久久桃花影院 | 国产无遮挡又黄又爽免费视频 | 麻豆人妻少妇精品无码专区 | 又粗又大又硬毛片免费看 | 午夜熟女插插xx免费视频 | 强伦人妻一区二区三区视频18 | 亚洲成a人片在线观看无码 | 精品无码国产自产拍在线观看蜜 | 色诱久久久久综合网ywww | 偷窥日本少妇撒尿chinese | 美女极度色诱视频国产 | 国产人成高清在线视频99最全资源 | 又大又紧又粉嫩18p少妇 | 亚洲综合精品香蕉久久网 | 国产成人无码av片在线观看不卡 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产精品美女久久久 | 六月丁香婷婷色狠狠久久 | 国产激情综合五月久久 | 熟妇女人妻丰满少妇中文字幕 | 国产精品二区一区二区aⅴ污介绍 | 亚洲人成网站在线播放942 | 亚洲国产精品无码久久久久高潮 | 在线播放无码字幕亚洲 | 丝袜 中出 制服 人妻 美腿 | 动漫av一区二区在线观看 | 亚洲另类伦春色综合小说 | 狠狠色色综合网站 | 鲁鲁鲁爽爽爽在线视频观看 | 熟妇人妻激情偷爽文 | 国产莉萝无码av在线播放 | 日韩av无码中文无码电影 | 亚洲国产精品毛片av不卡在线 | 久久综合九色综合97网 | 激情人妻另类人妻伦 | 亚洲区欧美区综合区自拍区 | 亚洲热妇无码av在线播放 | 牲交欧美兽交欧美 | 国产真实伦对白全集 | 未满成年国产在线观看 | 亚洲gv猛男gv无码男同 | 成人影院yy111111在线观看 | 国产人妻人伦精品1国产丝袜 | 久在线观看福利视频 | 日本熟妇人妻xxxxx人hd | 在线观看免费人成视频 | 国产精品久久福利网站 | 鲁一鲁av2019在线 | 天天燥日日燥 | 亚洲小说春色综合另类 | 亚洲国产欧美国产综合一区 | 日韩欧美中文字幕公布 | 18禁黄网站男男禁片免费观看 | 牛和人交xxxx欧美 | 伊在人天堂亚洲香蕉精品区 | 亚洲 a v无 码免 费 成 人 a v | 色婷婷av一区二区三区之红樱桃 | 图片小说视频一区二区 | 无码毛片视频一区二区本码 | 日本精品少妇一区二区三区 | 一本久久a久久精品vr综合 | 久久久久亚洲精品中文字幕 | 日韩视频 中文字幕 视频一区 | 国产成人精品必看 | 国产亚洲日韩欧美另类第八页 | 日韩无套无码精品 | 亚洲人成网站色7799 | 人人妻人人澡人人爽欧美精品 | 一区二区三区乱码在线 | 欧洲 | 又粗又大又硬毛片免费看 | 久久综合给合久久狠狠狠97色 | 人妻天天爽夜夜爽一区二区 | 亚洲综合另类小说色区 | 内射巨臀欧美在线视频 | av无码电影一区二区三区 | √天堂中文官网8在线 | 对白脏话肉麻粗话av | 99久久婷婷国产综合精品青草免费 | 亚洲精品久久久久久一区二区 | 久久久久久av无码免费看大片 | 99久久无码一区人妻 | 少妇性荡欲午夜性开放视频剧场 | 国产午夜亚洲精品不卡 | 久久aⅴ免费观看 | 无码av免费一区二区三区试看 | 成年女人永久免费看片 | 狠狠cao日日穞夜夜穞av | 九月婷婷人人澡人人添人人爽 | 国产suv精品一区二区五 | 国产免费久久精品国产传媒 | 色综合久久88色综合天天 | 色婷婷av一区二区三区之红樱桃 | 无码人妻出轨黑人中文字幕 | 黄网在线观看免费网站 | 国产va免费精品观看 | 亚洲欧洲无卡二区视頻 | 国产农村妇女高潮大叫 | 人妻无码αv中文字幕久久琪琪布 | 黑人玩弄人妻中文在线 | 亚洲国产欧美在线成人 | 欧美 丝袜 自拍 制服 另类 | 日本在线高清不卡免费播放 | 国产亚洲精品久久久久久 | 国产精品久久国产精品99 | 综合网日日天干夜夜久久 | 欧美猛少妇色xxxxx | 少妇性l交大片欧洲热妇乱xxx | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 中文字幕无码乱人伦 | 亚洲区欧美区综合区自拍区 | 免费人成在线观看网站 | 学生妹亚洲一区二区 | 精品aⅴ一区二区三区 | 狂野欧美性猛交免费视频 | 无遮无挡爽爽免费视频 | 成人性做爰aaa片免费看 | 久久久久se色偷偷亚洲精品av | 无码人中文字幕 | 伊人久久大香线蕉午夜 | 亚洲综合无码久久精品综合 | 伊人色综合久久天天小片 | 亚洲乱码国产乱码精品精 | 牛和人交xxxx欧美 | 偷窥日本少妇撒尿chinese | 日韩av无码中文无码电影 | 国产成人无码av一区二区 | 精品国产青草久久久久福利 | 在教室伦流澡到高潮hnp视频 | 97色伦图片97综合影院 | 牲欲强的熟妇农村老妇女 | 欧美freesex黑人又粗又大 | 国产极品美女高潮无套在线观看 | 国产超碰人人爽人人做人人添 | 亚洲综合伊人久久大杳蕉 | 高潮毛片无遮挡高清免费视频 | 国产亚洲人成在线播放 | 亚欧洲精品在线视频免费观看 | 久久精品国产99精品亚洲 | 国产激情精品一区二区三区 | 亚洲精品久久久久久久久久久 | www一区二区www免费 | 正在播放老肥熟妇露脸 | 亚洲s码欧洲m码国产av | 亚洲第一网站男人都懂 | 丰满人妻一区二区三区免费视频 | 88国产精品欧美一区二区三区 | 色一情一乱一伦 | 无码人妻丰满熟妇区毛片18 | 国产精品亚洲综合色区韩国 | 俺去俺来也www色官网 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲成色在线综合网站 | 2020最新国产自产精品 | 中文字幕+乱码+中文字幕一区 | 亚洲精品国产a久久久久久 | 国产办公室秘书无码精品99 | 天海翼激烈高潮到腰振不止 | 国产手机在线αⅴ片无码观看 | 免费国产成人高清在线观看网站 | 一本大道伊人av久久综合 | 夜夜高潮次次欢爽av女 | 少妇愉情理伦片bd | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲精品国产a久久久久久 | 一本色道久久综合亚洲精品不卡 | 国产精品a成v人在线播放 | 国产无遮挡又黄又爽免费视频 | 98国产精品综合一区二区三区 | 色窝窝无码一区二区三区色欲 | 任你躁国产自任一区二区三区 | 中文毛片无遮挡高清免费 | 国产精品igao视频网 | 国产精品无码mv在线观看 | 国产麻豆精品精东影业av网站 | 天天拍夜夜添久久精品 | 人妻互换免费中文字幕 | 久久99精品久久久久久 | 日日麻批免费40分钟无码 | 午夜精品一区二区三区的区别 | 青青青爽视频在线观看 | aⅴ亚洲 日韩 色 图网站 播放 | 日本免费一区二区三区最新 | 2019午夜福利不卡片在线 | 荫蒂添的好舒服视频囗交 | 中文字幕人妻无码一区二区三区 | 精品国产乱码久久久久乱码 | 熟女少妇在线视频播放 | 日日鲁鲁鲁夜夜爽爽狠狠 | 久久精品无码一区二区三区 | 午夜嘿嘿嘿影院 | 人妻少妇精品视频专区 | 奇米影视7777久久精品人人爽 | 99re在线播放 | 野外少妇愉情中文字幕 | 日本精品人妻无码免费大全 | 国产亚洲精品精品国产亚洲综合 | 国产精品久久久久影院嫩草 | 老熟妇仑乱视频一区二区 | 欧美老熟妇乱xxxxx | 中文字幕人妻丝袜二区 | 久久久久免费看成人影片 | 亲嘴扒胸摸屁股激烈网站 | 中文字幕av无码一区二区三区电影 | 国产精品鲁鲁鲁 | 亚洲精品国偷拍自产在线麻豆 | 丰满诱人的人妻3 | 日韩精品a片一区二区三区妖精 | 无码人妻丰满熟妇区五十路百度 | 色窝窝无码一区二区三区色欲 | 少妇太爽了在线观看 | 亚洲综合无码一区二区三区 | 亚洲一区二区三区 | 四虎永久在线精品免费网址 | 亚洲人成无码网www | 国产成人精品视频ⅴa片软件竹菊 | 成人无码视频在线观看网站 | 日日碰狠狠躁久久躁蜜桃 | 日韩精品一区二区av在线 | 国产av人人夜夜澡人人爽麻豆 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 无码精品人妻一区二区三区av | 熟妇人妻激情偷爽文 | 最新版天堂资源中文官网 | 国产女主播喷水视频在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 精品午夜福利在线观看 | 99riav国产精品视频 | 人妻中文无码久热丝袜 | 天天做天天爱天天爽综合网 | 欧美人与禽zoz0性伦交 | 久久久久免费精品国产 | 超碰97人人做人人爱少妇 | 性欧美videos高清精品 | 亚洲自偷精品视频自拍 | 露脸叫床粗话东北少妇 | 免费播放一区二区三区 | 色诱久久久久综合网ywww | 亚洲最大成人网站 | 亚洲国产高清在线观看视频 | 欧美精品无码一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 熟妇人妻无乱码中文字幕 | 久久久久人妻一区精品色欧美 | 粗大的内捧猛烈进出视频 | 亚洲精品www久久久 | 红桃av一区二区三区在线无码av | 亚洲国产高清在线观看视频 | 激情亚洲一区国产精品 | 婷婷五月综合缴情在线视频 | 亚洲精品国产a久久久久久 | 精品无码一区二区三区爱欲 | √天堂资源地址中文在线 | 国产美女精品一区二区三区 | 欧美精品免费观看二区 | 亚洲欧美日韩成人高清在线一区 | 日本肉体xxxx裸交 | 无码中文字幕色专区 | 狠狠cao日日穞夜夜穞av | 久久99国产综合精品 | 国产两女互慰高潮视频在线观看 | 成人免费视频视频在线观看 免费 | 久久精品女人的天堂av | 天堂亚洲2017在线观看 | 大地资源网第二页免费观看 | 亚洲一区二区三区四区 | 成人无码精品一区二区三区 | 麻豆成人精品国产免费 | 99精品久久毛片a片 | 欧美性猛交xxxx富婆 | 亚洲精品鲁一鲁一区二区三区 | 东京无码熟妇人妻av在线网址 | 97久久超碰中文字幕 | 麻豆蜜桃av蜜臀av色欲av | 国产乱人偷精品人妻a片 | 亚洲а∨天堂久久精品2021 | 久久精品国产一区二区三区 | 国产亚洲精品久久久ai换 | 亚洲精品鲁一鲁一区二区三区 | 国产香蕉尹人综合在线观看 | 中文字幕中文有码在线 | 又大又紧又粉嫩18p少妇 | 亚洲人亚洲人成电影网站色 | 狂野欧美性猛xxxx乱大交 | 国产乱人伦av在线无码 | 久久久久成人片免费观看蜜芽 | 红桃av一区二区三区在线无码av | 色综合天天综合狠狠爱 | 国产亚洲欧美日韩亚洲中文色 | 白嫩日本少妇做爰 | 国产免费久久精品国产传媒 | 久青草影院在线观看国产 | 99国产精品白浆在线观看免费 | 日本精品高清一区二区 | 捆绑白丝粉色jk震动捧喷白浆 | 久久无码专区国产精品s | 国产一区二区三区精品视频 | 青春草在线视频免费观看 | 日本熟妇大屁股人妻 | 久久久久av无码免费网 | 国产亚洲视频中文字幕97精品 | 欧美兽交xxxx×视频 | 中文字幕人妻丝袜二区 | 亚洲国产午夜精品理论片 | 国产亚洲欧美日韩亚洲中文色 | v一区无码内射国产 | 精品亚洲成av人在线观看 | 在线播放免费人成毛片乱码 | 国产后入清纯学生妹 | 欧美老妇交乱视频在线观看 | 无码国产乱人伦偷精品视频 | 成人精品天堂一区二区三区 | 又紧又大又爽精品一区二区 | 亚洲日韩中文字幕在线播放 | 国产免费久久久久久无码 | 日韩无码专区 | 麻豆精产国品 | 亚洲中文字幕在线观看 | 无码av岛国片在线播放 | 丁香啪啪综合成人亚洲 | 亚洲午夜福利在线观看 | 国产高清av在线播放 | 精品久久久久久亚洲精品 | 樱花草在线社区www | 黑人玩弄人妻中文在线 | 久久99精品久久久久久 | 欧美喷潮久久久xxxxx | 乱码午夜-极国产极内射 | 国产人妻大战黑人第1集 | 中文字幕无码日韩专区 | 一本久久伊人热热精品中文字幕 | 又湿又紧又大又爽a视频国产 | 亚洲码国产精品高潮在线 | 国产肉丝袜在线观看 | 国产成人精品一区二区在线小狼 | 领导边摸边吃奶边做爽在线观看 | 曰本女人与公拘交酡免费视频 | 亚洲人成无码网www | 亚洲精品鲁一鲁一区二区三区 | 国产精品久久久久久久影院 | 免费观看的无遮挡av | 又大又硬又爽免费视频 | 欧洲极品少妇 | 久久国产36精品色熟妇 | 乱人伦人妻中文字幕无码久久网 | 老熟妇乱子伦牲交视频 | 日本丰满护士爆乳xxxx | 人人妻人人澡人人爽欧美精品 | 亚洲欧洲无卡二区视頻 | 2019午夜福利不卡片在线 | 中文字幕人成乱码熟女app | 未满成年国产在线观看 | 麻豆精品国产精华精华液好用吗 | 1000部夫妻午夜免费 | 成人精品一区二区三区中文字幕 | 国产亚洲tv在线观看 | 日本精品人妻无码77777 天堂一区人妻无码 | 亚洲色www成人永久网址 | 亚洲精品国产精品乱码不卡 | 又色又爽又黄的美女裸体网站 | 日日天日日夜日日摸 | 免费男性肉肉影院 | 色婷婷综合激情综在线播放 | 99久久人妻精品免费二区 | 久久天天躁狠狠躁夜夜免费观看 | 亚洲人成人无码网www国产 | 亚洲综合无码久久精品综合 | 波多野结衣av在线观看 | 无码人妻精品一区二区三区不卡 | 青青青爽视频在线观看 | 国产国产精品人在线视 | 国产乱人偷精品人妻a片 | 精品国产麻豆免费人成网站 | 免费无码午夜福利片69 | 成熟人妻av无码专区 | 国产69精品久久久久app下载 | 少妇人妻av毛片在线看 | 人妻无码αv中文字幕久久琪琪布 | 欧美性猛交内射兽交老熟妇 | 久久综合九色综合97网 | 在线观看国产一区二区三区 | 国产av无码专区亚洲awww | 人妻无码αv中文字幕久久琪琪布 | 人人超人人超碰超国产 | 九月婷婷人人澡人人添人人爽 | 色 综合 欧美 亚洲 国产 | 67194成是人免费无码 | 亚洲国产成人av在线观看 | 两性色午夜视频免费播放 | 国产真实伦对白全集 | 少妇被粗大的猛进出69影院 | 免费观看又污又黄的网站 | 欧美人与动性行为视频 | 18禁黄网站男男禁片免费观看 | 一本加勒比波多野结衣 | 国产手机在线αⅴ片无码观看 | 白嫩日本少妇做爰 | 国产乱人偷精品人妻a片 | 免费无码午夜福利片69 | 乱码av麻豆丝袜熟女系列 | 亚洲午夜无码久久 | 精品欧洲av无码一区二区三区 | 欧美成人午夜精品久久久 | 宝宝好涨水快流出来免费视频 | 国产精品久久久久影院嫩草 | 国内综合精品午夜久久资源 | 国产亚洲精品久久久久久 | 国色天香社区在线视频 | 精品国产一区二区三区四区在线看 | 欧洲极品少妇 | 六月丁香婷婷色狠狠久久 | 少妇无码av无码专区在线观看 | 乱人伦人妻中文字幕无码 | 少妇无码一区二区二三区 | 夜夜高潮次次欢爽av女 | 国产精品久久福利网站 | 色狠狠av一区二区三区 | 无码精品人妻一区二区三区av | 久久综合给合久久狠狠狠97色 | 国产精品国产自线拍免费软件 | 国产片av国语在线观看 | 高清无码午夜福利视频 | 日韩精品无码免费一区二区三区 | 日韩人妻少妇一区二区三区 | 97精品国产97久久久久久免费 | 欧美激情综合亚洲一二区 | 国产激情精品一区二区三区 | 在线视频网站www色 | 国产精品永久免费视频 | 永久免费观看国产裸体美女 | 中文无码伦av中文字幕 | 亚洲无人区午夜福利码高清完整版 | 欧美亚洲日韩国产人成在线播放 | 国产精品多人p群无码 | 成人欧美一区二区三区黑人免费 | 亚洲欧美色中文字幕在线 | 久久久久久a亚洲欧洲av冫 | 中文字幕av伊人av无码av | 国产人妻精品一区二区三区不卡 | 精品国产乱码久久久久乱码 | 欧美日韩综合一区二区三区 | 成人欧美一区二区三区黑人 | 77777熟女视频在线观看 а天堂中文在线官网 | 欧美人与动性行为视频 | 久久亚洲中文字幕精品一区 | 精品无码av一区二区三区 | 久久午夜无码鲁丝片秋霞 | 亚洲色偷偷男人的天堂 | 蜜臀aⅴ国产精品久久久国产老师 | 国产成人精品视频ⅴa片软件竹菊 | 日韩人妻无码一区二区三区久久99 | 丝袜美腿亚洲一区二区 | 日日天干夜夜狠狠爱 | 亚洲精品一区二区三区四区五区 | 中文字幕无码日韩专区 | 天天躁日日躁狠狠躁免费麻豆 | 色婷婷av一区二区三区之红樱桃 | 97se亚洲精品一区 | 一区二区传媒有限公司 | 国产精品亚洲专区无码不卡 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 亚洲啪av永久无码精品放毛片 | 欧美自拍另类欧美综合图片区 | 熟妇人妻无码xxx视频 | 给我免费的视频在线观看 | 领导边摸边吃奶边做爽在线观看 | 十八禁真人啪啪免费网站 | 在线播放无码字幕亚洲 | 国产一区二区三区四区五区加勒比 | 天天躁夜夜躁狠狠是什么心态 | 国产婷婷色一区二区三区在线 | 久久久久亚洲精品男人的天堂 | 国产成人无码a区在线观看视频app | 亚洲精品一区二区三区婷婷月 | 精品 日韩 国产 欧美 视频 | 露脸叫床粗话东北少妇 | 久久亚洲国产成人精品性色 | 日韩精品久久久肉伦网站 | 天堂亚洲免费视频 | 中文字幕无码视频专区 | 色爱情人网站 | 亚洲精品一区二区三区在线观看 | 亚洲精品www久久久 | 亚洲国产精品毛片av不卡在线 | 色偷偷人人澡人人爽人人模 | 亚洲国产精品一区二区第一页 | 国产电影无码午夜在线播放 | 国产精品无码成人午夜电影 | 影音先锋中文字幕无码 | 久久久亚洲欧洲日产国码αv | 欧美激情内射喷水高潮 | 亚洲狠狠婷婷综合久久 | 麻豆国产丝袜白领秘书在线观看 | 欧美怡红院免费全部视频 | 一本久久伊人热热精品中文字幕 | 女人被男人爽到呻吟的视频 | 午夜精品久久久久久久久 | 无码国模国产在线观看 | 日本在线高清不卡免费播放 | 无码人妻少妇伦在线电影 | 亚拍精品一区二区三区探花 | 夜夜高潮次次欢爽av女 | 99久久精品无码一区二区毛片 | 日本xxxx色视频在线观看免费 | 国产成人一区二区三区在线观看 | 国产高清av在线播放 | 极品嫩模高潮叫床 | 精品欧洲av无码一区二区三区 | 麻豆人妻少妇精品无码专区 | 久久精品国产日本波多野结衣 | 青青青爽视频在线观看 | 俺去俺来也在线www色官网 | 人妻与老人中文字幕 | 无码人妻出轨黑人中文字幕 | 国产国语老龄妇女a片 | 成人精品一区二区三区中文字幕 | 999久久久国产精品消防器材 | 无遮挡国产高潮视频免费观看 | 欧美变态另类xxxx | 少妇人妻av毛片在线看 | 国产精品美女久久久 | 99久久久国产精品无码免费 | 最近的中文字幕在线看视频 | 亚洲gv猛男gv无码男同 | 国产精品嫩草久久久久 | 国产猛烈高潮尖叫视频免费 | а√资源新版在线天堂 | 国产女主播喷水视频在线观看 | 免费看男女做好爽好硬视频 | 久久这里只有精品视频9 | 丰腴饱满的极品熟妇 | 欧美成人午夜精品久久久 | 国产精品多人p群无码 | 欧美日韩精品 | 成人女人看片免费视频放人 | 久久国产精品精品国产色婷婷 | 精品成在人线av无码免费看 | 兔费看少妇性l交大片免费 | 国语自产偷拍精品视频偷 | 无码人中文字幕 | 老熟女乱子伦 | 精品欧洲av无码一区二区三区 | 人人妻人人澡人人爽人人精品浪潮 | 久久久久久a亚洲欧洲av冫 | 日本一本二本三区免费 | 亚洲 a v无 码免 费 成 人 a v | 久久精品国产大片免费观看 | 亚洲中文字幕久久无码 | 亚洲精品成人av在线 | 又湿又紧又大又爽a视频国产 | 亚洲国产午夜精品理论片 | 夜精品a片一区二区三区无码白浆 | 日韩亚洲欧美中文高清在线 | 免费无码av一区二区 | 久久久av男人的天堂 | 婷婷丁香五月天综合东京热 | 沈阳熟女露脸对白视频 | 免费看少妇作爱视频 | 日韩亚洲欧美中文高清在线 | 撕开奶罩揉吮奶头视频 | 久久国产精品二国产精品 | 妺妺窝人体色www在线小说 | 成人免费视频视频在线观看 免费 | 欧美丰满少妇xxxx性 | 国产偷自视频区视频 | 中文字幕av日韩精品一区二区 | 亚洲午夜无码久久 | 中文字幕av日韩精品一区二区 | 丰满少妇人妻久久久久久 | 久久久亚洲欧洲日产国码αv | 午夜肉伦伦影院 | 最新版天堂资源中文官网 | 亚洲色偷偷偷综合网 | 极品尤物被啪到呻吟喷水 | 午夜精品久久久内射近拍高清 | 免费无码肉片在线观看 | 色诱久久久久综合网ywww | 一本精品99久久精品77 | 撕开奶罩揉吮奶头视频 | 乱人伦中文视频在线观看 | 成人亚洲精品久久久久 | 人人澡人人透人人爽 | 亚洲精品午夜无码电影网 | 国产无遮挡吃胸膜奶免费看 | 97se亚洲精品一区 | 欧洲欧美人成视频在线 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 日本一区二区更新不卡 | 高清无码午夜福利视频 | 国产精品va在线观看无码 | 国产精品久久久久影院嫩草 | 给我免费的视频在线观看 | 欧美一区二区三区视频在线观看 | 国产成人人人97超碰超爽8 | 国产av人人夜夜澡人人爽麻豆 | 精品国产乱码久久久久乱码 | 亚洲va中文字幕无码久久不卡 | 风流少妇按摩来高潮 | www国产亚洲精品久久网站 | 亚洲色偷偷偷综合网 | 久久国产精品萌白酱免费 | 日韩精品成人一区二区三区 | 欧美亚洲日韩国产人成在线播放 | 日本乱偷人妻中文字幕 | 精品久久久久久人妻无码中文字幕 | 欧美阿v高清资源不卡在线播放 | 久久99热只有频精品8 | 亚洲精品久久久久avwww潮水 | 精品国产成人一区二区三区 | 欧美国产日产一区二区 | 一本一道久久综合久久 | 欧美日本免费一区二区三区 | 亚洲无人区午夜福利码高清完整版 | 久久午夜无码鲁丝片 | 国产一区二区三区四区五区加勒比 | 亚洲精品www久久久 | 国产无遮挡吃胸膜奶免费看 | 欧美 亚洲 国产 另类 | 婷婷综合久久中文字幕蜜桃三电影 | 美女张开腿让人桶 | 女人被男人躁得好爽免费视频 | 国产亚洲精品久久久ai换 | 国产成人精品一区二区在线小狼 | 九九综合va免费看 | 99久久人妻精品免费一区 | 狠狠色色综合网站 | 国产人成高清在线视频99最全资源 | 国产亚洲欧美在线专区 | 波多野结衣高清一区二区三区 | 性色欲网站人妻丰满中文久久不卡 | 成熟女人特级毛片www免费 | 欧美三级a做爰在线观看 | 免费播放一区二区三区 | 一本色道久久综合狠狠躁 | 玩弄人妻少妇500系列视频 | 国产精品爱久久久久久久 | 精品偷自拍另类在线观看 | 日韩无套无码精品 | 99国产精品白浆在线观看免费 | 免费国产成人高清在线观看网站 | 欧美肥老太牲交大战 | 国产精品久久久久久无码 | 国产真实乱对白精彩久久 | 伊在人天堂亚洲香蕉精品区 | 中文字幕 人妻熟女 | 亚洲乱亚洲乱妇50p | 人人澡人摸人人添 | 国产成人av免费观看 | 人妻少妇被猛烈进入中文字幕 | www国产精品内射老师 | 亚洲精品国产精品乱码不卡 | 欧美激情综合亚洲一二区 | 永久黄网站色视频免费直播 | 兔费看少妇性l交大片免费 | 日本精品高清一区二区 | 色狠狠av一区二区三区 | 永久免费观看美女裸体的网站 | 精品国产福利一区二区 | 给我免费的视频在线观看 | 永久免费精品精品永久-夜色 | 伊人久久大香线蕉av一区二区 | 日韩人妻系列无码专区 | 成人毛片一区二区 | 国産精品久久久久久久 | 亚洲精品鲁一鲁一区二区三区 | 国产偷国产偷精品高清尤物 | 国产农村乱对白刺激视频 | 色一情一乱一伦一视频免费看 | 国产香蕉97碰碰久久人人 | 国内精品九九久久久精品 | 曰韩少妇内射免费播放 | 欧美日本免费一区二区三区 | 久久精品国产大片免费观看 | 日韩av无码中文无码电影 | 亚洲 高清 成人 动漫 | 国产激情精品一区二区三区 | 图片区 小说区 区 亚洲五月 | 熟女俱乐部五十路六十路av | 性色欲网站人妻丰满中文久久不卡 | 性欧美大战久久久久久久 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 欧美一区二区三区 | 99视频精品全部免费免费观看 | 自拍偷自拍亚洲精品被多人伦好爽 | 国产一精品一av一免费 | 亚洲一区二区三区无码久久 | 午夜精品久久久久久久久 | 真人与拘做受免费视频一 | 亚洲成a人片在线观看无码 | 日韩欧美成人免费观看 | 无套内射视频囯产 | 国产成人综合美国十次 | 国产精品成人av在线观看 | 国产人妻精品午夜福利免费 | 国产九九九九九九九a片 | 国产亚洲tv在线观看 | 强开小婷嫩苞又嫩又紧视频 | 99麻豆久久久国产精品免费 | 亚洲性无码av中文字幕 | 久久久精品欧美一区二区免费 | 99麻豆久久久国产精品免费 | 国内丰满熟女出轨videos | 少妇人妻偷人精品无码视频 | 亚洲精品综合一区二区三区在线 | 久久久久久久女国产乱让韩 | 亚洲国产精华液网站w | 色情久久久av熟女人妻网站 | 捆绑白丝粉色jk震动捧喷白浆 | 天天做天天爱天天爽综合网 | 中文字幕日产无线码一区 | 乱人伦人妻中文字幕无码久久网 | 最近的中文字幕在线看视频 | 国产区女主播在线观看 | 国产一区二区三区日韩精品 | 红桃av一区二区三区在线无码av | 欧美35页视频在线观看 | 久久久久久亚洲精品a片成人 | 国产婷婷色一区二区三区在线 | 曰本女人与公拘交酡免费视频 | 一个人看的www免费视频在线观看 | 精品国产福利一区二区 | 永久免费精品精品永久-夜色 | 国产极品美女高潮无套在线观看 | 亚洲综合色区中文字幕 | 荡女精品导航 | 蜜桃av抽搐高潮一区二区 | 亚洲 高清 成人 动漫 | 亚洲区小说区激情区图片区 | 久久亚洲中文字幕无码 | 国产九九九九九九九a片 | 日本www一道久久久免费榴莲 | 精品无码国产一区二区三区av | 国产在线精品一区二区高清不卡 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 国产精品丝袜黑色高跟鞋 | 日本大香伊一区二区三区 | 亚洲日韩av片在线观看 | 纯爱无遮挡h肉动漫在线播放 | 蜜臀aⅴ国产精品久久久国产老师 | 兔费看少妇性l交大片免费 | 三上悠亚人妻中文字幕在线 | 色一情一乱一伦一视频免费看 | 亚洲精品一区二区三区大桥未久 | 四十如虎的丰满熟妇啪啪 | 人妻中文无码久热丝袜 | 亚洲日韩一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 亚洲啪av永久无码精品放毛片 | 蜜桃视频韩日免费播放 | 少妇无套内谢久久久久 | 亚洲中文字幕av在天堂 | 国产一精品一av一免费 | 18精品久久久无码午夜福利 | 老司机亚洲精品影院 | 青青草原综合久久大伊人精品 | 中国女人内谢69xxxxxa片 | 欧美精品在线观看 | 欧美熟妇另类久久久久久不卡 | 亚洲a无码综合a国产av中文 | 98国产精品综合一区二区三区 | 99久久婷婷国产综合精品青草免费 | 亚洲另类伦春色综合小说 | 啦啦啦www在线观看免费视频 | 国内精品九九久久久精品 | 亚洲毛片av日韩av无码 | 无码国产激情在线观看 | 一二三四在线观看免费视频 | 精品熟女少妇av免费观看 | 久久午夜夜伦鲁鲁片无码免费 | 久久99精品久久久久婷婷 | 在线观看国产一区二区三区 | 午夜精品一区二区三区的区别 | 美女黄网站人色视频免费国产 | 18精品久久久无码午夜福利 | 亚洲s码欧洲m码国产av | 东京一本一道一二三区 | 四虎国产精品一区二区 | 2019nv天堂香蕉在线观看 | 午夜精品一区二区三区在线观看 | 亚洲精品国产a久久久久久 | 亚洲人交乣女bbw | 中文字幕av无码一区二区三区电影 | 宝宝好涨水快流出来免费视频 | 国产精品二区一区二区aⅴ污介绍 | 国产精品办公室沙发 | 国产精品第一国产精品 | 成年美女黄网站色大免费全看 | 一本大道伊人av久久综合 | 欧美乱妇无乱码大黄a片 | 少妇被粗大的猛进出69影院 | 男人扒开女人内裤强吻桶进去 | 东京热一精品无码av | 嫩b人妻精品一区二区三区 | 欧洲vodafone精品性 | 欧美人与动性行为视频 | 久久久久se色偷偷亚洲精品av | 精品偷拍一区二区三区在线看 | 蜜臀aⅴ国产精品久久久国产老师 | 久久久久久亚洲精品a片成人 | 午夜福利不卡在线视频 | 牲欲强的熟妇农村老妇女视频 | 人人妻人人澡人人爽欧美一区九九 | 白嫩日本少妇做爰 | 无码吃奶揉捏奶头高潮视频 | 丰满肥臀大屁股熟妇激情视频 | 男人扒开女人内裤强吻桶进去 | 女人和拘做爰正片视频 | а天堂中文在线官网 | 人妻熟女一区 | 久久无码中文字幕免费影院蜜桃 | 国产av无码专区亚洲awww | 国产精品亚洲综合色区韩国 | 欧美熟妇另类久久久久久不卡 | 精品久久综合1区2区3区激情 | 免费国产黄网站在线观看 | 妺妺窝人体色www婷婷 | 成人无码影片精品久久久 | 午夜无码区在线观看 | 强伦人妻一区二区三区视频18 | 乌克兰少妇xxxx做受 | 国产亚洲欧美日韩亚洲中文色 | 一个人免费观看的www视频 | 午夜福利不卡在线视频 | а天堂中文在线官网 | 少妇一晚三次一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 美女黄网站人色视频免费国产 | 暴力强奷在线播放无码 | 国内丰满熟女出轨videos | 亚洲毛片av日韩av无码 | 亚洲精品无码国产 | 300部国产真实乱 | 131美女爱做视频 | 久久 国产 尿 小便 嘘嘘 | 欧美日韩一区二区免费视频 | 色一情一乱一伦一区二区三欧美 | 国产 浪潮av性色四虎 | 中国大陆精品视频xxxx | 欧美丰满熟妇xxxx性ppx人交 | 丰满少妇人妻久久久久久 | 久久成人a毛片免费观看网站 | 欧美日韩人成综合在线播放 | 婷婷综合久久中文字幕蜜桃三电影 | 国产精品久久久久久久9999 | 国产人妻精品一区二区三区 | 精品熟女少妇av免费观看 | 学生妹亚洲一区二区 | 午夜免费福利小电影 | 精品久久久久久亚洲精品 | 欧美日韩综合一区二区三区 | 狠狠色噜噜狠狠狠7777奇米 | 老熟妇仑乱视频一区二区 | 日韩在线不卡免费视频一区 | 亚洲一区二区三区偷拍女厕 | 麻豆国产97在线 | 欧洲 | 国产精品第一区揄拍无码 | 女高中生第一次破苞av | 午夜成人1000部免费视频 | 亚洲欧美色中文字幕在线 | 少妇被黑人到高潮喷出白浆 | 亚洲熟妇色xxxxx欧美老妇y | 无码任你躁久久久久久久 | 国产色精品久久人妻 | 日本一本二本三区免费 | 高清不卡一区二区三区 | 中文字幕乱码人妻二区三区 | 东京热一精品无码av | 精品欧洲av无码一区二区三区 | 国精产品一区二区三区 | 3d动漫精品啪啪一区二区中 | 日日碰狠狠躁久久躁蜜桃 | 久久精品无码一区二区三区 | 久久综合给久久狠狠97色 | 国产福利视频一区二区 | 两性色午夜免费视频 | 国产女主播喷水视频在线观看 | 国产办公室秘书无码精品99 | 国产在线aaa片一区二区99 | 人人澡人人妻人人爽人人蜜桃 | 人妻体内射精一区二区三四 | 九一九色国产 | 久久aⅴ免费观看 | 99国产精品白浆在线观看免费 | 亚洲日韩中文字幕在线播放 | 东京无码熟妇人妻av在线网址 | 亚洲精品国偷拍自产在线麻豆 | 无套内谢的新婚少妇国语播放 | 99久久99久久免费精品蜜桃 | 久久天天躁夜夜躁狠狠 | 色诱久久久久综合网ywww | 中文字幕无码免费久久9一区9 | 无码国产乱人伦偷精品视频 | 久久久久人妻一区精品色欧美 | 亚洲日本va午夜在线电影 | 在线播放免费人成毛片乱码 | 久久人妻内射无码一区三区 | 成人无码视频在线观看网站 | 午夜福利试看120秒体验区 | 中文字幕无码免费久久9一区9 | 国产亚av手机在线观看 | √天堂中文官网8在线 | 国产艳妇av在线观看果冻传媒 | 国产精品久久久av久久久 | 正在播放东北夫妻内射 | 亚洲人交乣女bbw | 欧美激情内射喷水高潮 | 欧美日韩在线亚洲综合国产人 | 综合网日日天干夜夜久久 | 岛国片人妻三上悠亚 | 最新国产乱人伦偷精品免费网站 | 国产无遮挡吃胸膜奶免费看 | 成人无码精品一区二区三区 | 成人aaa片一区国产精品 | 成熟女人特级毛片www免费 | 动漫av一区二区在线观看 | 免费乱码人妻系列无码专区 | 欧美黑人性暴力猛交喷水 | 久久久久久久人妻无码中文字幕爆 |