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

不懂Redis Cluster原理,我被同事diss了!

原創
存儲 存儲軟件 Redis
Redis 緩存作為使用最多的緩存工具被各大廠商爭相使用。通常我們會使用單體的 Redis 應用作為緩存服務,為了保證其高可用還會使用主從模式(Master-Slave),又或者是讀寫分離的設計。

【51CTO.com原創稿件】Redis 緩存作為使用最多的緩存工具被各大廠商爭相使用。通常我們會使用單體的 Redis 應用作為緩存服務,為了保證其高可用還會使用主從模式(Master-Slave),又或者是讀寫分離的設計。

[[321092]]

圖片來自 Pexels

但是當緩存數據量增加以后,無法用單體服務器承載緩存服務時,就需要對緩存服務進行擴展。

將需要緩存的數據切分成不同的分區,將數據分區放到不同的服務器中,用分布式的緩存來承載高并發的緩存訪問。恰好 Redis Cluster 方案剛好支持這部分功能。

今天就來一起看看 Redis Cluster 的核心原理和實踐:

  • Redis Cluster 實現數據分區
  • 分布式緩存節點之間的通訊
  • 請求分布式緩存的路由
  • 緩存節點的擴展和收縮
  • 故障發現和恢復

Redis Cluster 實現數據分區

正如開篇中提到的,分布式數據庫要解決的就是將整塊數據,按照規則分配到多個緩存節點,解決的是單個緩存節點處理數量大的問題。

如果要將這些數據進行拆分,并且存放必須有一個算法。例如:哈希算法和哈希一致性算法,這些比較經典的算法。

Redis Cluster 則采用的是虛擬槽分區算法。其中提到了槽(Slot)的概念。這個槽是用來存放緩存信息的單位,在 Redis 中將存儲空間分成了 16384 個槽,也就是說 Redis Cluster 槽的范圍是 0 -16383(2^4 * 2^10)。

緩存信息通常是用 Key-Value 的方式來存放的,在存儲信息的時候,集群會對 Key 進行 CRC16 校驗并對 16384 取模(slot = CRC16(key)%16383)。

得到的結果就是 Key-Value 所放入的槽,從而實現自動分割數據到不同的節點上。然后再將這些槽分配到不同的緩存節點中保存。

圖1:Redis 集群中的數據分片

如圖 1 所示,假設有三個緩存節點分別是 1、2、3。Redis Cluster 將存放緩存數據的槽(Slot)分別放入這三個節點中:

  • 緩存節點 1 存放的是(0-5000)Slot 的數據。
  • 緩存節點 2 存放的是(5001-10000)Slot 的數據。
  • 緩存節點 3 存放的是(10000-16383)Slot 的數據。

此時 Redis Client 需要根據一個 Key 獲取對應的 Value 的數據,首先通過 CRC16(key)%16383 計算出 Slot 的值,假設計算的結果是 5002。

將這個數據傳送給 Redis Cluster,集群接受到以后會到一個對照表中查找這個 Slot=5002 屬于那個緩存節點。

發現屬于“緩存節點 2”,于是順著紅線的方向調用緩存節點 2 中存放的 Key-Value 的內容并且返回給 Redis Client。

分布式緩存節點之間的通訊

如果說 Redis Cluster 的虛擬槽算法解決的是數據拆分和存放的問題,那么存放緩存數據的節點之間是如何通訊的,就是接下來我們要討論的。

緩存節點中存放著緩存的數據,在 Redis Cluster 的分布式部署下,緩存節點會被分配到一臺或者多臺服務器上。

圖 2:新上線的緩存節點 2 和緩存節點 1 進行通訊

緩存節點的數目也有可能根據緩存數據量和支持的并發進行擴展。如圖 2 所示,假設 Redis Cluster 中存在“緩存節點 1”,此時由于業務擴展新增了“緩存節點 2”。

新加入的節點會通過 Gossip 協議向老節點,發出一個“Meet 消息”。收到消息以后“緩存節點 1”,會禮貌地回復一個“Pong 消息”。

此后“緩存節點 2”會定期發送給“緩存節點 1” 一個“Ping 消息”,同樣的“緩存節點 1”每次都會回復“Pong 消息”。

上面這個例子說明了,在 Redis Cluster 中緩存節點之間是通過 Gossip 協議進行通訊的。

其實節點之間通訊的目的是為了維護節點之間的元數據信息。這個元數據就是每個節點包含哪些數據,是否出現故障。

節點之間通過 Gossip 協議不斷相互交互這些信息,就好像一群人在一起八卦一樣,沒有多久每個節點就知道其他所有節點的情況了,這個情況就是節點的元數據。

整個傳輸過程大致分為以下幾點:

  • Redis Cluster 的每個緩存節點都會開通一個獨立的 TCP 通道,用于和其他節點通訊。
  • 有一個節點定時任務,每隔一段時間會從系統中選出“發送節點”。這個“發送節點”按照一定頻率,例如:每秒 5 次,隨機向最久沒有通訊的節點發起 Ping 消息。
  • 接受到 Ping 消息的節點會使用 Pong 消息向“發送節點”進行回復。

不斷重復上面行為,讓所有節點保持通訊。他們之間通訊是通過 Gossip 協議實現的。

從類型上來說其分為了四種,分別是:

  • Meet 消息,用于通知新節點加入。就好像上面例子中提到的新節點上線會給老節點發送 Meet 消息,表示有“新成員”加入。
  • Ping 消息,這個消息使用得最為頻繁,該消息中封裝了自身節點和其他節點的狀態數據,有規律地發給其他節點。
  • Pong 消息,在接受到 Meet 和 Ping 消息以后,也將自己的數據狀態發給對方。同時也可以對集群中所有的節點發起廣播,告知大家的自身狀態。
  • Fail 消息,如果一個節點下線或者掛掉了,會向集群中廣播這個消息。

圖 3:Gossip 協議結構

Gossip 協議的結構如圖 3 所示,有其中 type 定義了消息的類型,例如:Meet、Ping、Pong、Fail 等消息。

另外有一個 myslots 的數組定義了節點負責的槽信息。每個節點發送 Gossip 協議給其他節點最重要的就是將該信息告訴其他節點。另外,消息體通過 clusterMsgData 對象傳遞消息征文。

請求分布式緩存的路由

對內,分布式緩存的節點通過 Gossip 協議互相發送消息,為了保證節點之間了解對方的情況。

那么對外來說,一個 Redis 客戶端如何通過分布式節點獲取緩存數據,就是分布式緩存路由要解決的問題了。

上文提到了 Gossip 協議會將每個節點管理的槽信息發送給其他節點,其中用到了 unsigned char myslots[CLUSTER_SLOTS/8] 這樣一個數組存放每個節點的槽信息。

myslots 屬性是一個二進制位數組(bit array),其中 CLUSTER_SLOTS 為 16384。

這個數組的長度為 16384/8=2048 個字節,由于每個字節包含 8 個 bit 位(二進制位),所以共包含 16384 個 bit,也就是 16384 個二進制位。

每個節點用 bit 來標識自己是否擁有某個槽的數據。如圖 4 所示,假設這個圖表示節點 A 所管理槽的情況。

圖 4:通過二進制數組存放槽信息

0、1、2 三個數組下標就表示 0、1、2 三個槽,如果對應的二進制值是 1,表示該節點負責存放 0、1、2 三個槽的數據。同理,后面的數組下標位 0 就表示該節點不負責存放對應槽的數據。

用二進制存放的優點是,判斷的效率高,例如對于編號為 1 的槽,節點只要判斷序列的第二位,時間復雜度為 O(1)。

圖 5:接受節點把節點槽的對應信息保存在本地

如圖 5 所示,當收到發送節點的節點槽信息以后,接受節點會將這些信息保存到本地的 clusterState 的結構中,其中 Slots 的數組就是存放每個槽對應哪些節點信息。

圖 6:ClusterStatus 結構以及槽與節點的對應

如圖 6 所示,ClusterState 中保存的 Slots 數組中每個下標對應一個槽,每個槽信息中對應一個 clusterNode 也就是緩存的節點。

這些節點會對應一個實際存在的 Redis 緩存服務,包括 IP 和 Port 的信息。

Redis Cluster 的通訊機制實際上保證了每個節點都有其他節點和槽數據的對應關系。

Redis 的客戶端無論訪問集群中的哪個節點都可以路由到對應的節點上,因為每個節點都有一份 ClusterState,它記錄了所有槽和節點的對應關系。

下面來看看 Redis 客戶端是如何通過路由來調用緩存節點的:

圖 7:MOVED 重定向請求

如圖 7 所示,Redis 客戶端通過 CRC16(key)%16383 計算出 Slot 的值,發現需要找“緩存節點 1”讀/寫數據,但是由于緩存數據遷移或者其他原因導致這個對應的 Slot 的數據被遷移到了“緩存節點 2”上面。

那么這個時候 Redis 客戶端就無法從“緩存節點 1”中獲取數據了。

但是由于“緩存節點 1”中保存了所有集群中緩存節點的信息,因此它知道這個 Slot 的數據在“緩存節點 2”中保存,因此向 Redis 客戶端發送了一個 MOVED 的重定向請求。

這個請求告訴其應該訪問的“緩存節點 2”的地址。Redis 客戶端拿到這個地址,繼續訪問“緩存節點 2”并且拿到數據。

上面的例子說明了,數據 Slot 從“緩存節點 1”已經遷移到“緩存節點 2”了,那么客戶端可以直接找“緩存節點 2”要數據。

那么如果兩個緩存節點正在做節點的數據遷移,此時客戶端請求會如何處理呢?

圖 8:ASK 重定向請求

如圖 8 所示,Redis 客戶端向“緩存節點 1”發出請求,此時“緩存節點 1”正向“緩存節點 2”遷移數據,如果沒有命中對應的 Slot,它會返回客戶端一個 ASK 重定向請求并且告訴“緩存節點 2”的地址。

客戶端向“緩存節點 2”發送 Asking 命令,詢問需要的數據是否在“緩存節點 2”上,“緩存節點 2”接到消息以后返回數據是否存在的結果。

緩存節點的擴展和收縮

作為分布式部署的緩存節點總會遇到緩存擴容和緩存故障的問題。這就會導致緩存節點的上線和下線的問題。

由于每個節點中保存著槽數據,因此當緩存節點數出現變動時,這些槽數據會根據對應的虛擬槽算法被遷移到其他的緩存節點上。

圖 9:分布式緩存擴容

如圖 9 所示,集群中本來存在“緩存節點 1”和“緩存節點 2”,此時“緩存節點 3”上線了并且加入到集群中。

此時根據虛擬槽的算法,“緩存節點 1”和“緩存節點 2”中對應槽的數據會應該新節點的加入被遷移到“緩存節點 3”上面。

針對節點擴容,新建立的節點需要運行在集群模式下,因此新建節點的配置最好與集群內其他節點配置保持一致。

新節點加入到集群的時候,作為孤兒節點是沒有和其他節點進行通訊的。因此,其會采用 cluster meet 命令加入到集群中。

在集群中任意節點執行 cluster meet 命令讓新節點加入進來。假設新節點是 192.168.1.1 5002,老節點是 192.168.1.1 5003,那么運行以下命令將新節點加入到集群中。

  1. 192.168.1.1 5003> cluster meet 192.168.1.1 5002 

這個是由老節點發起的,有點老成員歡迎新成員加入的意思。新節點剛剛建立沒有建立槽對應的數據,也就是說沒有緩存任何數據。

如果這個節點是主節點,需要對其進行槽數據的擴容;如果這個節點是從節點,就需要同步主節點上的數據??傊褪且綌祿?/p>

圖 10:節點遷移槽數據的過程

如圖 10 所示,由客戶端發起節點之間的槽數據遷移,數據從源節點往目標節點遷移:

  • 客戶端對目標節點發起準備導入槽數據的命令,讓目標節點準備好導入槽數據。這里使用 cluster setslot {slot} importing {sourceNodeId} 命令。
  • 之后對源節點發起送命令,讓源節點準備遷出對應的槽數據。使用命令 cluster setslot {slot} importing {sourceNodeId}。
  • 此時源節點準備遷移數據了,在遷移之前把要遷移的數據獲取出來。通過命令 cluster getkeysinslot {slot} {count}。Count 表示遷移的 Slot 的個數。
  • 然后在源節點上執行,migrate {targetIP} {targetPort} “” 0 {timeout} keys{keys} 命令,把獲取的鍵通過流水線批量遷移到目標節點。
  • 重復 3 和 4 兩步不斷將數據遷移到目標節點。目標節點獲取遷移的數據。
  • 完成數據遷移以后目標節點,通過 cluster setslot {slot} node {targetNodeId} 命令通知對應的槽被分配到目標節點,并且廣播這個信息給全網的其他主節點,更新自身的槽節點對應表。

既然有緩存服務器的上線操作,那么也有下線的操作。下線操作正好和上線操作相反,將要下線緩存節點的槽數據分配到其他的緩存主節點中。

遷移的過程也與上線操作類似,不同的是下線的時候需要通知全網的其他節點忘記自己,此時通過命令 cluster forget{downNodeId} 通知其他的節點。

當節點收到 forget 命令以后會將這個下線節點放到僅用列表中,那么之后就不用再向這個節點發送 Gossip 的 Ping 消息了。

不過這個僅用表的超時時間是 60 秒,超過了這個時間,依舊還會對這個節點發起 Ping 消息。

不過可以使用 redis-trib.rb del-node{host:port} {donwNodeId} 命令幫助我們完成下線操作。

尤其是下線的節點是主節點的情況下,會安排對應的從節點接替主節點的位置。

故障發現和恢復

前面在談到緩存節點擴展和收縮是提到,緩存節點收縮時會有一個下線的動作。

有些時候是為了節約資源,或者是計劃性的下線,但更多時候是節點出現了故障導致下線。

針對下線故障來說有兩種下線的確定方式:

主觀下線:當節點 1 向節點 2 例行發送 Ping 消息的時候,如果節點 2 正常工作就會返回 Pong 消息,同時會記錄節點 1 的相關信息。

同時接受到 Pong 消息以后節點 1 也會更新最近一次與節點 2 通訊的時間。

如果此時兩個節點由于某種原因斷開連接,過一段時間以后節點 1 還會主動連接節點 2,如果一直通訊失敗,節點 1 中就無法更新與節點 2 最后通訊時間了。

此時節點 1 的定時任務檢測到與節點 2 最好通訊的時間超過了 cluster-node-timeout 的時候,就會更新本地節點狀態,把節點 2 更新為主觀下線。

這里的 cluster-node-timeout 是節點掛掉被發現的超時時間,如果超過這個時間還沒有獲得節點返回的 Pong 消息就認為該節點掛掉了。

這里的主觀下線指的是,節點 1 主觀的認為節點 2 沒有返回 Pong 消息,因此認為節點 2 下線。

只是節點 1 的主觀認為,有可能是節點 1 與節點 2 之間的網絡斷開了,但是其他的節點依舊可以和節點 2 進行通訊,因此主觀下線并不能代表某個節點真的下線了。

客觀下線:由于 Redis Cluster 的節點不斷地與集群內的節點進行通訊,下線信息也會通過 Gossip 消息傳遍所有節點。

因此集群內的節點會不斷收到下線報告,當半數以上持有槽的主節點標記了某個節點是主觀下線時,便會觸發客觀下線的流程。

也就是說當集群內的半數以上的主節點,認為某個節點主觀下線了,才會啟動這個流程。

這個流程有一個前提,就是直針對主節點,如果是從節點就會忽略。也就是說集群中的節點每次接受到其他節點的主觀下線是都會做以下的事情。

將主觀下線的報告保存到本地的 ClusterNode 的結構中,并且針對主觀下線報告的時效性進行檢查,如果超過 cluster-node-timeout*2 的時間,就忽略這個報告。

否則就記錄報告內容,并且比較被標記下線的主觀節點的報告數量大于等于持有槽的主節點數量的時候,將其標記為客觀下線。

同時向集群中廣播一條 Fail 消息,通知所有的節點將故障節點標記為客觀下線,這個消息指包含故障節點的 ID。

此后,群內所有的節點都會標記這個節點為客觀下線,通知故障節點的從節點出發故障轉移的流程,也就是故障的恢復。

說白了,客觀下線就是整個集群中有一半的節點都認為某節點主觀下線了,那么這個節點就被標記為客觀下線了。

如果某個主節點被認為客觀下線了,那么需要從它的從節點中選出一個節點替代主節點的位置。

此時下線主節點的所有從節點都擔負著恢復義務,這些從節點會定時監測主節點是否下線。

一旦發現下線會走如下的恢復流程:

①資格檢查,每個節點都會檢查與主節點斷開的時間。如果這個時間超過了 cluster-node-timeout*cluster-slave-validity-factor(從節點有效因子,默認為 10),那么就沒有故障轉移的資格。

也就是說這個從節點和主節點斷開的太久了,很久沒有同步主節點的數據了,不適合成為新的主節點,因為成為主節點以后其他的從節點回同步自己的數據。

②觸發選舉,通過了上面資格的從節點都可以觸發選舉。但是出發選舉是有先后順序的,這里按照復制偏移量的大小來判斷。

這個偏移量記錄了執行命令的字節數。主服務器每次向從服務器傳播 N 個字節時就會將自己的復制偏移量+N,從服務在接收到主服務器傳送來的 N 個字節的命令時,就將自己的復制偏移量+N。

復制偏移量越大說明從節點延遲越低,也就是該從節點和主節點溝通更加頻繁,該從節點上面的數據也會更新一些,因此復制偏移量大的從節點會率先發起選舉。

③發起選舉,首先每個主節點會去更新配置紀元(clusterNode.configEpoch),這個值是不斷增加的整數。

在節點進行 Ping/Pong 消息交互式也會更新這個值,它們都會將最大的值更新到自己的配置紀元中。

這個值記錄了每個節點的版本和整個集群的版本。每當發生重要事情的時候,例如:出現新節點,從節點精選。都會增加全局的配置紀元并且賦給相關的主節點,用來記錄這個事件。

說白了更新這個值目的是,保證所有主節點對這件“大事”保持一致。大家都統一成一個配置紀元(一個整數),表示大家都知道這個“大事”了。

更新完配置紀元以后,會想群內發起廣播選舉的消息(FAILOVER_AUTH_REQUEST)。并且保證每個從節點在一次配置紀元中只能發起一次選舉。

④投票選舉,參與投票的只有主節點,從節點沒有投票權,超過半數的主節點通過某一個節點成為新的主節點時投票完成。

如果在 cluster-node-timeout*2 的時間內從節點沒有獲得足夠數量的票數,本次選舉作廢,進行第二輪選舉。

這里每個候選的從節點會收到其他主節點投的票。在第2步領先的從節點通常此時會獲得更多的票,因為它觸發選舉的時間更早一些。

獲得票的機會更大,也是由于它和原主節點延遲少,理論上數據會更加新一點。

⑤當滿足投票條件的從節點被選出來以后,會觸發替換主節點的操作。新的主節點別選出以后,刪除原主節點負責的槽數據,把這些槽數據添加到自己節點上。

并且廣播讓其他的節點都知道這件事情,新的主節點誕生了。

總結

本文通過 Redis Cluster 提供了分布式緩存的方案為出發點,針對此方案中緩存節點的分區方式進行了描述。

虛擬槽的分區算法,將整塊數據分配到了不同的緩存節點,通過 Slot 和 Node 的對應關系讓數據找到節點的位置。

對于分布式部署的節點,需要通過 Gossip 協議進行 Ping、Pong、Meet、Fail 的通訊,達到互通有無的目的。

當客戶端調用緩存節點數據的時候通過 MOVED 和 ASKED 重定向請求找到正確的緩存節點。

并且介紹了在緩存擴容和收縮時需要注意的處理流程,以及數據遷移的方式。

最后,講述如何發現故障(主觀下線和客觀下線)以及如何恢復故障(選舉節點)的處理流程。

【51CTO原創稿件,合作站點轉載請注明原文作者和出處為51CTO.com】

 

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2021-01-18 11:27:03

Istio架構云環境

2020-12-18 08:28:13

Redis數據數據庫

2020-04-24 09:14:21

術語網絡安全黑客

2021-09-22 10:15:52

裁員選擇公司個人發展

2013-06-20 11:11:00

程序員經理

2021-08-26 14:26:25

Java代碼集合

2021-12-03 11:57:27

代碼##語言

2020-03-20 08:00:32

代碼程序員追求

2024-01-15 09:15:52

parallel語句函數

2021-08-17 11:02:24

isEmptyisBlankJava

2022-10-24 08:41:52

集群配置編輯

2023-06-10 23:09:40

Redis場景內存

2020-07-13 08:40:48

同事代碼

2021-09-26 08:42:51

RedisGeo 類型數據類型

2021-04-27 07:52:19

StarterSpring Boot配置

2021-06-29 10:02:04

亞馬遜機器解雇

2022-05-27 16:03:37

ReactDanVue

2025-06-24 08:32:21

2022-09-05 11:28:07

數據分析活動分析

2023-11-02 08:27:29

點贊
收藏

51CTO技術棧公眾號

中文字幕日韩欧美在线| 在线免费精品视频| 欧洲在线视频一区| 一级黄色片网站| 欧美喷水视频| 亚洲日本aⅴ片在线观看香蕉| 99re精彩视频| 蜜桃av.网站在线观看| 国产精品久久久久影院| 国产精品久久久久久久小唯西川 | 在线视频国内自拍亚洲视频| 一区二区三区四区欧美| 天天操天天干天天| 国内精品伊人久久久久av一坑| 97久久精品国产| 国产波霸爆乳一区二区| 怕怕欧美视频免费大全| 精品动漫一区二区三区在线观看| 国产九九在线视频| 色戒汤唯在线观看| 亚洲国产视频直播| 美女在线免费视频| jizz在线观看中文| 91视频观看免费| 官网99热精品| 国产情侣一区二区| 美国毛片一区二区三区| 日韩免费在线播放| 日本五十熟hd丰满| 国产精品啊啊啊| 久热99视频在线观看| 又嫩又硬又黄又爽的视频| 日韩高清影视在线观看| 精品第一国产综合精品aⅴ| 99九九99九九九99九他书对| 日产精品一区| 欧美性高潮床叫视频| 日本午夜激情视频| sm在线观看| 亚洲电影在线播放| 又大又硬又爽免费视频| av网址在线| 日韩理论片中文av| 亚洲第一精品区| 91在线看片| 国产精品久久久久永久免费观看| 日韩久久精品一区二区三区| 麻豆影视在线| 日本一区二区三区四区在线视频 | 午夜福利一区二区三区| 成人禁用看黄a在线| 高清不卡一区二区三区| 亚洲国产剧情在线观看| 国产精品99久久久久久有的能看| 国产精品视频xxxx| 中国女人真人一级毛片| 青椒成人免费视频| 国产裸体写真av一区二区| 亚洲视频在线免费播放| 美女爽到高潮91| 成人a在线视频| 国产又粗又猛又爽又黄91| 国产一区二区三区国产| 91入口在线观看| 色窝窝无码一区二区三区成人网站 | 国产精品一区二区三区av麻| 在线午夜精品自拍| 美女福利视频网| 欧美黄色一区| 高清欧美性猛交xxxx黑人猛交| 国产成人啪精品午夜在线观看| 日韩午夜在线| 国产精品v日韩精品| 国产精品主播一区二区| 丁香六月久久综合狠狠色| 精品久久中出| seseavlu视频在线| 亚洲另类春色国产| ww国产内射精品后入国产| 在线成人av观看| 777亚洲妇女| 黄色污在线观看| 欧美精品一区二区久久| 久久夜色精品国产| 91视频免费网址| 久久精品国产成人一区二区三区 | 成人精品久久| 欧美大片在线影院| 中文字幕在线欧美| 国产乱码精品一区二区三区av | 国产精品日韩电影| 国产成人精品一区二三区四区五区| 成人免费av资源| 日本一区二区三区www| 成人福利网站| 日本高清无吗v一区| 日韩视频在线观看一区二区三区| 欧美成人基地| 精品国产一区二区三区久久狼黑人 | 国产一区二区高清视频| www亚洲人| 午夜精品久久一牛影视| 欧美特级aaa| 日韩欧美四区| 美女少妇精品视频| 国产亚洲欧美日韩高清| 成人三级在线视频| 中文字幕一区二区三区四区五区| 波多野结衣亚洲| 日韩视频一区二区三区| 成熟人妻av无码专区| 日韩视频一区| 97在线电影| 午夜精品一区| 日本久久电影网| 亚洲婷婷在线观看| 欧美成人综合| 91精品久久久久久久久| 国产精品一级伦理| 精品国产户外野外| 丰满人妻一区二区三区免费视频棣| 色喇叭免费久久综合| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲爱情岛论坛永久| 国产精品三级电影| 久久国产色av免费观看| 女仆av观看一区| 午夜精品三级视频福利| 国产v在线观看| 亚洲天堂免费在线观看视频| 男女视频在线看| 国产99精品一区| 欧美亚洲视频在线看网址| 黄色av免费观看| 亚洲一区在线视频观看| 一级做a爱视频| 国产精品精品| 成人免费福利在线| 黄色网址视频在线观看| 欧美精品久久久久久久多人混战 | 国产精品老女人精品视频| 日本在线视频1区| 精品久久久久久亚洲国产300 | 亚洲欧美视频二区| 菠萝蜜一区二区| 国产精品视频免费在线观看| 91短视频版在线观看www免费| 在线日韩av片| 国产精品成人在线视频| 蜜桃视频第一区免费观看| 亚洲国产高清国产精品| 精品国产黄a∨片高清在线| 中文字幕欧美国内| 91欧美日韩麻豆精品| 国产精品传媒视频| 天天干天天曰天天操| 中文在线日韩| 成人精品一二区| 超碰99在线| 亚洲日本欧美日韩高观看| 在线观看国产成人| 亚洲日本丝袜连裤袜办公室| 中国特级黄色片| 99在线精品免费视频九九视| 久久久综合香蕉尹人综合网| 欧美va在线| 日韩在线视频网站| 国产sm主人调教女m视频| 亚洲va欧美va天堂v国产综合| 久久久久亚洲AV成人无码国产| 国产欧美亚洲一区| 午夜视频久久久| 国产精品亚洲综合在线观看 | 成人国产精品免费观看视频| 国产一区二区网| 欧美在线色图| 97视频中文字幕| 悠悠资源网亚洲青| 久久精品中文字幕一区| 无码精品人妻一区二区三区影院| 一本大道av伊人久久综合| 久久久国产一级片| 国产精品香蕉一区二区三区| 久久久久久久久久久久久国产精品| 国产精品入口久久| 99理论电影网| 成人看片网站| 久久久久久午夜| 超碰免费97在线观看| 精品成人a区在线观看| 九九热最新视频| 亚洲一区二区三区激情| 国产精品无码无卡无需播放器| 国产成人a级片| www.超碰com| 亚洲视频久久| 亚洲一区三区| 日韩福利视频一区| 69堂成人精品视频免费| 日本少妇一区| 91禁外国网站| 在线观看操人| 国产一区二区三区中文| 噜噜噜久久,亚洲精品国产品| 欧美伊人久久久久久久久影院 | 久久久精品少妇| 91丨九色丨黑人外教| 少妇欧美激情一区二区三区| 日韩电影在线一区二区| 欧美午夜小视频| 91精品电影| 日韩精品一线二线三线| 丝袜连裤袜欧美激情日韩| 91丨九色丨国产| 色综合视频一区二区三区日韩| 1769国产精品| a'aaa级片在线观看| 日韩一级黄色av| 成年人视频在线看| 亚洲欧美中文字幕| 瑟瑟在线观看| 亚洲国产91精品在线观看| av在线资源观看| 欧美猛男超大videosgay| 国产午夜麻豆影院在线观看| 高潮白浆女日韩av免费看| 免费在线观看av网址| 亚洲少妇屁股交4| 亚洲综合图片一区| 国产精品丝袜一区| 日本免费www| 国产偷国产偷精品高清尤物| 亚洲第一香蕉网| 久久人人超碰精品| 亚洲av网址在线| 99re视频这里只有精品| av2014天堂网| 99国产精品久久久久久久久久久| 中文字幕乱视频| 99re热这里只有精品免费视频| 老司机午夜免费福利| 99亚偷拍自图区亚洲| 91玉足脚交白嫩脚丫| 波多野结衣中文字幕一区二区三区 | 在线观看久久久久久| 国产区视频在线| 亚洲一区第一页| 午夜在线视频| 日韩中文字幕网| 麻豆91在线| 欧美精品情趣视频| 免费电影网站在线视频观看福利| 欧美激情亚洲一区| 9999精品成人免费毛片在线看| 久久免费视频网| 中文在线аv在线| 日韩美女写真福利在线观看| a成人v在线| 亚洲aaaaaa| jizzjizzjizz欧美| 久久精品日产第一区二区三区乱码 | 日韩在线观看你懂的| 国产精品剧情| 久久免费观看视频| 欧美亚洲韩国| 国产一区私人高清影院| 午夜日韩影院| 久久久综合亚洲91久久98| av资源久久| 日本大胆人体视频| 午夜在线精品| 日韩一级免费片| 国产999精品久久| 久久丫精品国产亚洲av不卡| 中文字幕精品—区二区四季| 男女性高潮免费网站| 精品福利视频导航| 中文字幕在线观看高清| 日韩精品在线网站| 国产天堂素人系列在线视频| 日韩视频精品在线| 老司机深夜福利在线观看| 国产美女精品视频| 久久人人爽人人爽人人片av不| 视频一区二区精品| 欧美三级乱码| 狠狠热免费视频| 国产91综合网| 老司机福利在线观看| 香蕉久久一区二区不卡无毒影院| 无码人妻av免费一区二区三区 | 欧美伊人精品成人久久综合97| 国产高清免费av| 亚洲人成网在线播放| 99视频免费在线观看| 日本久久久久亚洲中字幕| 久久国产精品美女| 欧美日韩在线观看一区| 欧美啪啪一区| 91视频这里只有精品| av不卡一区二区三区| 性欧美疯狂猛交69hd| 色综合久久久久网| 午夜精品久久久久久久第一页按摩| 亚洲欧美日韩网| 成人影音在线| 成人国产精品久久久久久亚洲| 婷婷成人影院| 欧美国产视频一区| 经典一区二区三区| 无码少妇精品一区二区免费动态| 亚洲国产综合91精品麻豆| 国产精品羞羞答答在线| 亚洲网站在线看| 亚洲福利影院| 狠狠干一区二区| 欧美精品啪啪| 国产欧美激情视频| 中文成人av在线| 69亚洲精品久久久蜜桃小说| 亚洲国产精品久久91精品| 性欧美1819sex性高清大胸| 国产美女精品视频| 日韩欧美在线中字| 成人在线免费播放视频| 91婷婷韩国欧美一区二区| 日韩精品国产一区二区| 精品免费视频一区二区| a视频在线观看| 91免费欧美精品| 偷拍欧美精品| 亚洲美女性囗交| 国产精品久久久久久亚洲伦| 午夜视频网站在线观看| 亚洲老头同性xxxxx| 女海盗2成人h版中文字幕| 国产日韩一区二区| 在线精品在线| 久久久久成人精品无码中文字幕| 亚瑟在线精品视频| 色婷婷在线视频| 欧美一级黑人aaaaaaa做受| 日日天天久久| 欧美日韩第二页| 国产亚洲一本大道中文在线| 中文字幕在线日本| 中文字幕亚洲情99在线| 亚洲国产精选| 大片在线观看网站免费收看| 国产精品538一区二区在线| 波多野结衣家庭教师| 日韩精品一区二区三区swag| 免费毛片在线看片免费丝瓜视频| 成人自拍视频网站| 国产精品久久久久久久久久妞妞| 亚洲乱码国产乱码精品精大量| 色乱码一区二区三区88| 91精品大全| 97在线中文字幕| 国产色综合网| 黄免费在线观看| 91精品啪在线观看国产60岁| 污视频在线看网站| 国新精品乱码一区二区三区18| 亚洲自拍另类| 国产一二三av| 精品国产不卡一区二区三区| 欧美激情20| 亚洲精品在线视频观看| 国产黄人亚洲片| 在线观看亚洲天堂| 中日韩美女免费视频网站在线观看| 亚洲伦理一区二区| 国产手机免费视频| 久久精品亚洲麻豆av一区二区| 97超碰人人草| 另类图片亚洲另类| 日韩影视高清在线观看| 男女男精品视频站| 亚洲一区在线观看免费| 男人天堂资源在线| 亚洲999一在线观看www| 亚洲一区图片| 翔田千里88av中文字幕| 亚洲国产精品999| 自拍偷拍欧美日韩| 国产女大学生av| 亚洲欧洲综合另类在线| 深夜福利在线看| 成人在线视频网站| 国产欧美在线| 无码黑人精品一区二区| 亚洲精品日韩丝袜精品| 精品一区二区三区中文字幕在线| 2022亚洲天堂| 亚洲精品国产一区二区精华液| 黄色av网站在线看| 国产精品永久入口久久久| 麻豆精品精品国产自在97香蕉| 日韩免费视频网站|