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

Redis 高可用篇:Cluster 集群能支撐的數據有多大?

開發 前端 Redis
本文將對集群的節點、槽指派、命令執行、重新分片、轉向、故障轉移、消息等各個方面進行深入拆解。

[[394929]]

本文將對集群的節點、槽指派、命令執行、重新分片、轉向、故障轉移、消息等各個方面進行深入拆解。


Redis 集群原理總覽

目的在于掌握什么是 Cluster ?Cluster 分片原理,客戶端定位數據原理、故障切換,選主,什么場景使用 Cluster,如何部署集群 …...

  • 將數據分成多份存在不同實例上
  • 哈希槽與 Redis 實例映射
  • 復制與故障轉移
  • 故障檢測
  • 故障轉移
  • 選主流程
  • 用表保存鍵值對和實例的關聯關系可行么
  • 重新分配哈希槽
  • MOVED 錯誤
  • ASK 錯誤
  • Gossip 消息
  • 實例的通信頻率
  • 降低實例間的通信開銷

為什么需要 Cluster“

  • 65 哥:碼哥,自從用上了你說的哨兵集群實現故障自動轉移后,我終于可以開心的跟女朋友么么噠也不怕 Redis 宕機深夜宕機了。
  • 可是最近遇到一個糟心的問題,Redis 需要保存 800 萬個鍵值對,占用 20 GB 的內存。
  • 我就使用了一臺 32G 的內存主機部署,但是 Redis 響應有時候非常慢,使用 INFO 命令查看 latest_fork_usec 指標(最近一次 fork 耗時),發現特別高。

主要是 Redis RDB 持久化機制導致的,Redis 會 Fork 子進程完成 RDB 持久化操作,fork 執行的耗時與 Redis 數據量成正相關。

而 Fork 執行的時候會阻塞主線程,由于數據量過大導致阻塞主線程過長,所以出現了 Redis 響應慢的表象。

  • 65 哥:隨著業務規模的拓展,數據量越來越大。主從架構升級單個實例硬件難以拓展,且保存大數據量會導致響應慢問題,有什么辦法可以解決么?

保存大量數據,除了使用大內存主機的方式,我們還可以使用切片集群。俗話說「眾人拾材火焰高」,一臺機器無法保存所有數據,那就多臺分擔。

使用 Redis Cluster 集群,主要解決了大數據量存儲導致的各種慢問題,同時也便于橫向拓展。

兩種方案對應著 Redis 數據增多的兩種拓展方案:垂直擴展(scale up)、水平擴展(scale out)。

  1. 垂直拓展:升級單個 Redis 的硬件配置,比如增加內存容量、磁盤容量、使用更強大的 CPU。
  2. 水平拓展:橫向增加 Redis 實例個數,每個節點負責一部分數據。

比如需要一個內存 24 GB 磁盤 150 GB 的服務器資源,有以下兩種方案:

水平拓展與垂直拓展

在面向百萬、千萬級別的用戶規模時,橫向擴展的 Redis 切片集群會是一個非常好的選擇。

65 哥:那這兩種方案都有什么優缺點呢?

  • 垂直拓展部署簡單,但是當數據量大并且使用 RDB 實現持久化,會造成阻塞導致響應慢。另外受限于硬件和成本,拓展內存的成本太大,比如拓展到 1T 內存。
  • 水平拓展便于拓展,同時不需要擔心單個實例的硬件和成本的限制。但是,切片集群會涉及多個實例的分布式管理問題,需要解決如何將數據合理分布到不同實例,同時還要讓客戶端能正確訪問到實例上的數據。

什么是 Cluster 集群

Redis 集群是一種分布式數據庫方案,集群通過分片(sharding)來進行數據管理(「分治思想」的一種實踐),并提供復制和故障轉移功能。

將數據劃分為 16384 的 slots,每個節點負責一部分槽位。槽位的信息存儲于每個節點中。

它是去中心化的,如圖所示,該集群有三個 Redis 節點組成,每個節點負責整個集群的一部分數據,每個節點負責的數據多少可能不一樣。

Redis 集群架構

三個節點相互連接組成一個對等的集群,它們之間通過 Gossip協議相互交互集群信息,最后每個節點都保存著其他節點的 slots 分配情況。

開篇寄語

技術不是萬能的,程序員也不是最厲害的,一定要搞清楚,不要覺得「老子天下第一」。一旦有了這個意識,可能會耽誤我們的成長。

技術是為了解決問題的,如果說一個技術不能解決問題,那這個技術就一文不值。

不要去炫技,沒有意義。

集群安裝

  • 點擊 -> 《Redis 6.X Cluster 集群搭建》查看

一個 Redis 集群通常由多個節點(node)組成,在剛開始的時候,每個節點都是相互獨立的,它們都處于一個只包含自己的集群當中,要組建一個真正可工作的集群,我們必須將各個獨立的節點連接起來,構成一個包含多個節點的集群。

連接各個節點的工作可以通過 CLUSTER MEET 命令完成:CLUSTER MEET

向一個節點 node 發送 CLUSTER MEET 命令,可以讓 node 節點與 ip 和 port 所指定的節點進行握手(handshake),當握手成功時,node 節點就會將 ip 和 port 所指定的節點添加到 node 節點當前所在的集群中。

 

CLUSTER MEET

就好像 node 節點說:“喂,ip = xx,port = xx 的老哥,要不要加入「碼哥字節」技術群,加入集群就找到了一條大神成長之路,關注「碼哥字節」公眾號回復「加群」,是兄弟就跟我一起來!”

關于 Redis Cluster 集群搭建詳細步驟,請點擊文末左下角「閱讀原文」或者點擊 -> 《Redis 6.X Cluster 集群搭建》查看,官方關于 Redis Cluster 的詳情請看:https://redis.io/topics/cluster-tutorial。

Cluster 實現原理

65 哥:數據切片后,需要將數據分布在不同實例上,數據和實例之間如何對應上呢?

”Redis 3.0 開始,官方提供了 Redis Cluster 方案實現了切片集群,該方案就實現了數據和實例的規則。Redis Cluster 方案采用哈希槽(Hash Slot,接下來我會直接稱之為 Slot),來處理數據和實例之間的映射關系。

跟著「碼哥字節」一起進入 Cluster 實現原理探索之旅…...

將數據分成多份存在不同實例上

集群的整個數據庫被分為 16384 個槽(slot),數據庫中的每個鍵都屬于這 16384 個槽的其中一個,集群中的每個節點可以處理 0 個或最多 16384 個槽。

Key 與哈希槽映射過程可以分為兩大步驟:

根據鍵值對的 key,使用 CRC16 算法,計算出一個 16 bit 的值;

將 16 bit 的值對 16384 執行取模,得到 0 ~ 16383 的數表示 key 對應的哈希槽。

Cluster 還允許用戶強制某個 key 掛在特定槽位上,通過在 key 字符串里面嵌入 tag 標記,這就可以強制 key 所掛在的槽位等于 tag 所在的槽位。

哈希槽與 Redis 實例映射

65 哥:哈希槽又是如何映射到 Redis 實例上呢?

”在 部署集群的樣例中通過 cluster create 創建,Redis 會自動將 16384 個 哈希槽平均分布在集群實例上,比如 N 個節點,每個節點上的哈希槽數 = 16384 / N 個。

除此之外,可以通過 CLUSTER MEET 命令將 7000、7001、7002 三個節點連在一個集群,但是集群目前依然處于下線狀態,因為三個實例都沒有處理任何哈希槽。

可以使用 cluster addslots 命令,指定每個實例上的哈希槽個數。

65 哥:為啥要手動制定呢?

能者多勞嘛,加入集群中的 Redis 實例配置不一樣,如果承擔一樣的壓力,對于垃圾機器來說就太難了,讓牛逼的機器多支持一點。

三個實例的集群,通過下面的指令為每個實例分配哈希槽:實例 1負責 0 ~ 5460 哈希槽,實例 2 負責 5461~10922 哈希槽,實例 3 負責 10923 ~ 16383 哈希槽。

  1. redis-cli -h 172.16.19.1 –p 6379 cluster addslots 0,5460 
  2. redis-cli -h 172.16.19.2 –p 6379 cluster addslots 5461,10922 
  3. redis-cli -h 172.16.19.3 –p 6379 cluster addslots 10923,16383 

鍵值對數據、哈希槽、Redis 實例之間的映射關系如下:

數據、Slot與實例的映射

Redis 鍵值對的 key 「碼哥字節」「牛逼」經過 CRC16 計算后再對哈希槽總個數 16394 取模,模數結果分別映射到實例 1 與實例 2 上。

切記,當 16384 個槽都分配完全,Redis 集群才能正常工作。

復制與故障轉移

65 哥:Redis 集群如何實現高可用呢?Master 與 Slave 還是讀寫分離么?

Master 用于處理槽,Slave 節點則通過《Redis 主從架構數據同步》方式同步主節點數據。

當 Master 下線,Slave 代替主節點繼續處理請求。主從節點之間并沒有讀寫分離, Slave 只用作 Master 宕機的高可用備份。

Redis Cluster 可以為每個主節點設置若干個從節點,單主節點故障時,集群會自動將其中某個從節點提升為主節點。

如果某個主節點沒有從節點,那么當它發生故障時,集群將完全處于不可用狀態。

不過 Redis 也提供了一個參數cluster-require-full-coverage可以允許部分節點故障,其它節點還可以繼續提供對外訪問。

比如 7000 主節點宕機,作為 slave 的 7003 成為 Master 節點繼續提供服務。當下線的節點 7000 重新上線,它將成為當前 70003 的從節點。

故障檢測

65 哥:在《Redis 高可用篇:Sentinel 哨兵集群原理》我知道哨兵通過監控、自動切換主庫、通知客戶端實現故障自動切換,Cluster 又如何實現故障自動轉移呢?

一個節點認為某個節點失聯了并不代表所有的節點都認為它失聯了。只有當大多數負責處理 slot 節點都認定了某個節點下線了,集群才認為該節點需要進行主從切換。

Redis 集群節點采用 Gossip 協議來廣播自己的狀態以及自己對整個集群認知的改變。比如一個節點發現某個節點失聯了 (PFail),它會將這條信息向整個集群廣播,其它節點也就可以收到這點失聯信息。

關于 Gossip 協議可閱讀悟空哥的一篇文章:《病毒入侵,全靠分布式》

如果一個節點收到了某個節點失聯的數量 (PFail Count) 已經達到了集群的大多數,就可以標記該節點為確定下線狀態 (Fail),然后向整個集群廣播,強迫其它節點也接收該節點已經下線的事實,并立即對該失聯節點進行主從切換。

故障轉移

當一個 Slave 發現自己的主節點進入已下線狀態后,從節點將開始對下線的主節點進行故障轉移。

  1. 從下線的 Master 及節點的 Slave 節點列表選擇一個節點成為新主節點。
  2. 新主節點會撤銷所有對已下線主節點的 slot 指派,并將這些 slots 指派給自己。
  3. 新的主節點向集群廣播一條 PONG 消息,這條 PONG 消息可以讓集群中的其他節點立即知道這個節點已經由從節點變成了主節點,并且這個主節點已經接管了原本由已下線節點負責處理的槽。
  4. 新的主節點開始接收處理槽有關的命令請求,故障轉移完成。

選主流程

65 哥:新的主節點如何選舉產生的?

  1. 集群的配置紀元 +1,是一個自曾計數器,初始值 0 ,每次執行故障轉移都會 +1。
  2. 檢測到主節點下線的從節點向集群廣播一條CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST消息,要求所有收到這條消息、并且具有投票權的主節點向這個從節點投票。
  3. 這個主節點尚未投票給其他從節點,那么主節點將向要求投票的從節點返回一條CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK消息,表示這個主節點支持從節點成為新的主節點。
  4. 參與選舉的從節點都會接收CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK消息,如果收集到的票 >= (N/2) + 1 支持,那么這個從節點就被選舉為新主節點。
  5. 如果在一個配置紀元里面沒有從節點能收集到足夠多的支持票,那么集群進入一個新的配置紀元,并再次進行選舉,直到選出新的主節點為止。

跟哨兵類似,兩者都是基于 Raft 算法來實現的,流程如圖所示:

 

集群Leader選舉

用表保存鍵值對和實例的關聯關系可行么

65 哥,我來考考你:“Redis Cluster 方案通過哈希槽的方式把鍵值對分配到不同的實例上,這個過程需要對鍵值對的 key 做 CRC 計算并對 哈希槽總數取模映射到實例上。如果用一個表直接把鍵值對和實例的對應關系記錄下來(例如鍵值對 1 在實例 2 上,鍵值對 2 在實例 1 上),這樣就不用計算 key 和哈希槽的對應關系了,只用查表就行了,Redis 為什么不這么做呢?”

使用一個全局表記錄的話,假如鍵值對和實例之間的關系改變(重新分片、實例增減),需要修改表。如果是單線程操作,所有操作都要串行,性能太慢。

多線程的話,就涉及到加鎖,另外,如果鍵值對數據量非常大,保存鍵值對與實例關系的表數據所需要的存儲空間也會很大。

而哈希槽計算,雖然也要記錄哈希槽與實例時間的關系,但是哈希槽的數量少得多,只有 16384 個,開銷很小。

客戶端如何定位數據所在實例

65 哥:客戶端又怎么確定訪問的數據到底分布在哪個實例上呢?

Redis 實例會將自己的哈希槽信息通過 Gossip 協議發送給集群中其他的實例,實現了哈希槽分配信息的擴散。

這樣,集群中的每個實例都有所有哈希槽與實例之間的映射關系信息。

在切片數據的時候是將 key 通過 CRC16 計算出一個值再對 16384 取模得到對應的 Slot,這個計算任務可以在客戶端上執行發送請求的時候執行。

但是,定位到槽以后還需要進一步定位到該 Slot 所在 Redis 實例。

當客戶端連接任何一個實例,實例就將哈希槽與實例的映射關系響應給客戶端,客戶端就會將哈希槽與實例映射信息緩存在本地。

當客戶端請求時,會計算出鍵所對應的哈希槽,在通過本地緩存的哈希槽實例映射信息定位到數據所在實例上,再將請求發送給對應的實例。

Redis 客戶端定位數據所在節點

重新分配哈希槽

65 哥:哈希槽與實例之間的映射關系由于新增實例或者負載均衡重新分配導致改變了咋辦?

集群中的實例通過 Gossip 協議互相傳遞消息獲取最新的哈希槽分配信息,但是,客戶端無法感知。

Redis Cluster 提供了重定向機制:客戶端將請求發送到實例上,這個實例沒有相應的數據,該 Redis 實例會告訴客戶端將請求發送到其他的實例上。

65 哥:Redis 如何告知客戶端重定向訪問新實例呢?

分為兩種情況:MOVED 錯誤、ASK 錯誤。

MOVED 錯誤

MOVED 錯誤(負載均衡,數據已經遷移到其他實例上):當客戶端將一個鍵值對操作請求發送給某個實例,而這個鍵所在的槽并非由自己負責的時候,該實例會返回一個 MOVED 錯誤指引轉向正在負責該槽的節點。

  1. GET 公眾號:碼哥字節 
  2. (error) MOVED 16330 172.17.18.2:6379 

該響應表示客戶端請求的鍵值對所在的哈希槽 16330 遷移到了 172.17.18.2 這個實例上,端口是 6379。這樣客戶端就與 172.17.18.2:6379 建立連接,并發送 GET 請求。

同時,客戶端還會更新本地緩存,將該 slot 與 Redis 實例對應關系更新正確。

MOVED 指令

ASK 錯誤

65 哥:如果某個 slot 的數據比較多,部分遷移到新實例,還有一部分沒有遷移咋辦?

如果請求的 key 在當前節點找到就直接執行命令,否則時候就需要 ASK 錯誤響應了,槽部分遷移未完成的情況下,如果需要訪問的 key 所在 Slot 正在從從 實例 1 遷移到 實例 2,實例 1 會返回客戶端一條 ASK 報錯信息:客戶端請求的 key 所在的哈希槽正在遷移到實例 2 上,你先給實例 2 發送一個 ASKING 命令,接著發發送操作命令。

  1. GET 公眾號:碼哥字節 
  2. (error) ASK 16330 172.17.18.2:6379 

比如客戶端請求定位到 key = 「公眾號:碼哥字節」的槽 16330 在實例 172.17.18.1 上,節點 1 如果找得到就直接執行命令,否則響應 ASK 錯誤信息,并指引客戶端轉向正在遷移的目標節點 172.17.18.2。

 

ASK 錯誤

注意:ASK 錯誤指令并不會更新客戶端緩存的哈希槽分配信息。

所以客戶端再次請求 Slot 16330 的數據,還是會先給 172.17.18.1 實例發送請求,只不過節點會響應 ASK 命令讓客戶端給新實例發送一次請求。

MOVED指令則更新客戶端本地緩存,讓后續指令都發往新實例。

集群可以設置多大?

65 哥:有了 Redis Cluster,再也不怕大數據量了,我可以無限水平拓展么?

答案是否定的,Redis 官方給的 Redis Cluster 的規模上線是 1000 個實例。

65 哥:到底是什么限制了集群規模呢?

關鍵在于實例間的通信開銷,Cluster 集群中的每個實例都保存所有哈希槽與實例對應關系信息(Slot 映射到節點的表),以及自身的狀態信息。

在集群之間每個實例通過 Gossip協議傳播節點的數據,Gossip 協議工作原理大概如下:

從集群中隨機選擇一些實例按照一定的頻率發送 PING 消息發送給挑選出來的實例,用于檢測實例狀態以及交換彼此的信息。PING 消息中封裝了發送者自身的狀態信息、部分其他實例的狀態信息、Slot 與實例映射表信息。

實例接收到 PING 消息后,響應 PONG 消息,消息包含的信息跟 PING 消息一樣。

集群之間通過 Gossip協議可以在一段時間之后每個實例都能獲取其他所有實例的狀態信息。

所以在有新節點加入,節點故障,Slot 映射變更都可以通過 PING,PONG 的消息傳播完成集群狀態在每個實例的傳播同步。

Gossip 消息

發送的消息結構是 clusterMsgDataGossip結構體組成:

  1. typedef struct { 
  2.     char nodename[CLUSTER_NAMELEN];  //40字節 
  3.     uint32_t ping_sent; //4字節 
  4.     uint32_t pong_received; //4字節 
  5.     char ip[NET_IP_STR_LEN]; //46字節 
  6.     uint16_t port;  //2字節 
  7.     uint16_t cport;  //2字節 
  8.     uint16_t flags;  //2字節 
  9.     uint32_t notused1; //4字節 
  10. } clusterMsgDataGossip; 

所以每個實例發送一個 Gossip消息,就需要發送 104 字節。如果集群是 1000 個實例,那么每個實例發送一個 PING 消息則會占用 大約 10KB。

除此之外,實例間在傳播 Slot 映射表的時候,每個消息還包含了 一個長度為 16384 bit 的 Bitmap。

每一位對應一個 Slot,如果值 = 1 則表示這個 Slot 屬于當前實例,這個 Bitmap 占用 2KB,所以一個 PING 消息大約 12KB。

PONG與PING 消息一樣,一發一回兩個消息加起來就是 24 KB。集群規模的增加,心跳消息越來越多就會占據集群的網絡通信帶寬,降低了集群吞吐量。

實例的通信頻率

65 哥:碼哥,發送 PING 消息的頻率也會影響集群帶寬吧?

Redis Cluster 的實例啟動后,默認會每秒從本地的實例列表中隨機選出 5 個實例,再從這 5 個實例中找出一個最久沒有收到 PING 消息的實例,把 PING 消息發送給該實例。

65 哥:隨機選擇 5 個,但是無法保證選中的是整個集群最久沒有收到 PING 通信的實例,有的實例可能一直沒有收到消息,導致他們維護的集群信息早就過期了,咋辦呢?

”這個問題問的好,Redis Cluster 的實例每 100 ms 就會掃描本地實例列表,當發現有實例最近一次收到 PONG 消息的時間 > cluster-node-timeout / 2。那么就立刻給這個實例發送 PING 消息,更新這個節點的集群狀態信息。

當集群規模變大,就會進一步導致實例間網絡通信延遲怎加。可能會引起更多的 PING 消息頻繁發送。

降低實例間的通信開銷

  • 每個實例每秒發送一條 PING消息,降低這個頻率可能會導致集群每個實例的狀態信息無法及時傳播。
  • 每 100 ms 檢測實例 PONG消息接收是否超過 cluster-node-timeout / 2,這個是 Redis 實例默認的周期性檢測任務頻率,我們不會輕易修改。

所以,只能修改 cluster-node-timeout的值:集群中判斷實例是否故障的心跳時間,默認 15 S。

所以,為了避免過多的心跳消息占用集群寬帶,將 cluster-node-timeout調成 20 秒或者 30 秒,這樣 PONG 消息接收超時的情況就會緩解。

但是,也不能設置的太大。都則就會導致實例發生故障了,卻要等待 cluster-node-timeout時長才能檢測出這個故障,影響集群正常服務、

總結

《Redis 系列》至今已發布 7 篇,每一篇「碼哥字節」都耗費大量精力,精益求精。確保每一篇都給讀者帶來價值,讓大家得到真正的提升。

  • 哨兵集群實現故障自動轉移,但是當數據量過大導致生成 RDB 時間過長。而 Fork 執行的時候會阻塞主線程,由于數據量過大導致阻塞主線程過長,所以出現了 Redis 響應慢的表象。
  • 使用 Redis Cluster 集群,主要解決了大數據量存儲導致的各種慢問題,同時也便于橫向拓展。在面向百萬、千萬級別的用戶規模時,橫向擴展的 Redis 切片集群會是一個非常好的選擇。
  • 集群的整個數據庫被分為 16384 個槽(slot),數據庫中的每個鍵都屬于這 16384 個槽的其中一個,集群中的每個節點可以處理 0 個或最多 16384 個槽。
  • Redis 集群節點采用 Gossip 協議來廣播自己的狀態以及自己對整個集群認知的改變。
  • 客戶端連接到集群候任何一個實例后,實例會將哈希槽與實例映射信息發送給客戶端,客戶端將信息保存,用于將 key 定位到對應的節點。
  • 集群并不能無限增加,由于集群通過 Gossip協議傳播集群實例信息,所以通信頻率是限制集群大小的主要原因,主要可以通過修改 cluster-node-timeout調整頻率。

 

責任編輯:姜華 來源: 碼哥字節
相關推薦

2024-02-27 09:48:25

Redis集群數據庫

2021-04-01 08:50:54

SentinelRedis 集群原理

2019-01-29 10:16:38

Redis高可用集群

2022-05-31 08:04:03

Redis高可用集群

2020-10-30 16:20:38

Redis單線程高并發

2023-03-01 22:28:15

Redis高可用

2023-11-13 09:03:10

2014-05-30 13:35:21

MySQL Clust架構

2024-03-07 16:03:56

RedisDocker

2025-09-16 07:08:59

MySQL高可用數據庫

2021-03-11 11:01:22

Redis架構數據

2021-03-17 10:05:42

KubernetesRedis數據庫

2024-07-25 08:39:48

2015-03-16 13:49:27

大數據大數據誤區大數據錯誤

2023-11-07 07:30:18

Hadoop高可用

2012-02-15 22:40:23

heartbeat高可用

2024-05-07 08:32:45

Redis高可用映射關系

2019-12-13 10:50:49

集群Redis存儲

2020-10-28 07:10:07

Nginx高可用高并發

2017-11-13 11:07:32

Nginx搭建高可用
點贊
收藏

51CTO技術棧公眾號

国产91对白刺激露脸在线观看| 国产精品免费小视频| 人妻精品一区一区三区蜜桃91| 亚洲欧洲在线免费| 日韩精品一区二区三区中文| 成年人网站av| 色8久久精品久久久久久蜜| 在线观看三级视频| 国产中文字幕乱人伦在线观看| 成人激情午夜影院| 欧洲一区av| 色狠狠久久av五月综合|| 国产精品久久99| 国产特黄在线| 永久域名在线精品| 欧洲亚洲精品在线| 亚洲精品v亚洲精品v日韩精品| 精品在线一区| 亚洲视频一二区| 免费成人在线电影| 杨幂一区欧美专区| 国产亚洲制服色| 无码国产精品一区二区免费16| 国产丝袜一区二区三区免费视频| 日韩免费福利视频| 秘密基地免费观看完整版中文| 亚洲一区二区美女| 日韩精品第一| 第一区免费在线观看| 亚洲伊人色欲综合网| 羞羞的视频在线看| 日韩久久在线| 欧美激情一二三区| 国产精品久久久久一区二区国产 | 波多野结衣黄色| 一本到不卡免费一区二区| 五月婷婷六月色| 蜜桃999成人看片在线观看| 亚洲毛片av在线| 欧美男人天堂| 人妻av一区二区| 九九热最新视频//这里只有精品| 久久9热精品视频| 日韩理伦片在线| 北条麻妃在线视频| 亚洲精品第一页| 伊人精品综合| 久久精品免费av| 久久免费视频1| 一本到一区二区三区| 五月激情综合| 999久久久久久| 亚洲欧美日韩综合一区| 日韩一区二区在线观看视频| 91成人免费| 一区二区日韩视频| 中文字幕日韩一区二区三区| 欧美性20hd另类| 欧美精品系列| 黄色在线视频网址| 欧美日本国产精品| 欧美精品色综合| 激情五月***国产精品| 亚洲 另类 春色 国产| 可以免费看的黄色网址| 亚洲激情视频网站| 一区福利视频| 国产美女主播在线观看| 久青草视频在线播放| 精品国产一二三| 视频精品一区二区| 精品美女在线观看视频在线观看| 久久久久久久人妻无码中文字幕爆| 午夜伦理精品一区| 午夜伦理一区二区| 国产精品成久久久久| 风间由美一区| 日韩免费成人av| 水蜜桃亚洲精品| 日韩精品在线观看网站| 欧美色综合一区二区三区| 中文字幕视频在线免费欧美日韩综合在线看 | 亚洲成人tv| 天堂在线资源网| 亚洲国产精品三区| 国内偷自视频区视频综合| 欧美激情在线一区二区三区| 男女视频在线| 国产va在线播放| 亚洲精品一区二区三区樱花 | 一区二区三区美女视频| 91精品影视| 亚洲另类在线观看| 中国丰满人妻videoshd | 日本视频一区在线观看| 国产精品一区二区在线看| а√中文在线8| 男女黄床上色视频| 这里只有精品66| 亚洲国模精品一区| 国产99精品在线观看| 狂野欧美xxxx韩国少妇| 男人久久精品| 一区二区三区四区免费| 精品亚洲欧美日韩| 亚洲欧美日韩精品久久亚洲区 | 欧美亚洲日本国产| 丝袜美腿一区二区三区动态图| av综合在线观看| 国内精品国产三级国产aⅴ久| 国产成人亚洲综合| 欧美优质美女网站| 国产精品美女| caopon在线免费视频| 性欧美13一14内谢| 国产欧美在线看| 欧美日韩精品免费| 日韩av不卡一区二区| 国产亚洲高清一区| 国产九色在线播放九色| 妺妺窝人体色www看人体| 综合国产在线观看| 久久久电影一区二区三区| 免费观看成人性生生活片 | 天天精品视频| 日本成人动漫在线观看| 手机av在线网站| 久久精品一区二区三区不卡免费视频| 日韩精品中文字幕有码专区| 欧美日本久久| 国产精品**亚洲精品| 欧美熟妇乱码在线一区| 国产成人精品无码免费看夜聊软件| 国产伦精品一区二区三区四区免费| 日韩av最新在线观看| 国产日韩av一区| 日韩二区在线观看| 久久黄色影视| 亚洲av激情无码专区在线播放| 美女100%无挡| 欧美丰满熟妇bbbbbb百度| 日韩av手机在线| 日韩电影网在线| 亚洲高清免费观看高清完整版在线观看| 精品一区二区免费在线观看| 九九久久婷婷| 欧美一区国产| 麻豆导航在线观看| 亚洲欧美一区二区三区在线观看| 中文字幕免费高清| 午夜视频在线网站| 91免费黄视频| 91亚洲精品久久久| 欧美黄色三级网站| 亚洲精品日韩丝袜精品| 日韩一区欧美小说| 蜜臀久久99精品久久久久久9| 噜噜噜狠狠夜夜躁精品仙踪林| 黄色影院在线看| 国产三级在线| 熟妇人妻av无码一区二区三区| 国产精品自拍视频一区| 蜜臀视频在线观看| av中文字幕网址| 国内自拍中文字幕| 亚洲综合中文字幕在线| 欧美在线一区二区三区四| 日韩一区二区在线观看视频| 欧美视频在线免费| 日本一区二区三区四区| 99精品欧美一区二区三区综合在线| 视频精品一区二区| 欧美猛男同性videos| 亚洲资源网你懂的| 精品国产乱码久久久久久樱花| 日韩精品中文字幕吗一区二区| av毛片在线免费看| 亚洲欧美丝袜中文综合| www.黄色小说.com| 国产成人a人亚洲精品无码| 日韩欧美高清在线观看| av网站在线不卡| 婷婷久久青草热一区二区| 99精品在线直播| 色妞欧美日韩在线| 日韩av影院在线观看| 亚洲精品一区二区精华| 成人在线播放av| 精品日韩一区二区三区免费视频| 欧美成人久久久| 国产视频久久久久| 国产一区二区av| 在线观看国产欧美| 中文字幕日韩精品在线| 中日韩午夜理伦电影免费| 日韩亚洲在线观看| 亚洲欧美成人一区二区在线电影| 亚洲人成电影在线观看天堂色| 亚洲精品有码在线| 亚洲精品网站在线播放gif| 亚洲精品日韩丝袜精品| 日韩精品一区二区三区在线播放 | 高清精品视频| 久久久成人网| 亚洲欧美日韩国产一区| 日韩精品一级中文字幕精品视频免费观看 | 加勒比色老久久爱综合网| 爱情电影网av一区二区| 97色婷婷成人综合在线观看| 四虎精品一区二区免费| www.com亚洲| 国产精品九九九九九九| 精品爆乳一区二区三区无码av| 国产无遮挡在线观看| 国模无码国产精品视频| 国产喷水theporn| 午夜剧场免费看| 激情五月激情综合| 日韩欧美亚洲视频| 免费又黄又爽又猛大片午夜| 波多野结衣小视频| 欧美 日韩 国产 成人 在线 91| 在线观看美女网站大全免费| 欧美巨大丰满猛性社交| 激情小说一区| 日韩极品少妇| 亚洲激情午夜| 成人国产精品免费观看动漫 | 羞羞视频在线免费国产| 亚洲美女尤物影院| 日韩在线影视| 欧美激情第8页| 国产一区二区福利视频| 国产精品久久久久久久久久免费看| 亚洲国产另类av| 在线电影欧美成精品| 欧美精品日日鲁夜夜添| 欧美视频一区二| 欧美午夜精品久久久| 亚洲视频777| 午夜精品蜜臀一区二区三区免费| 成人信息集中地欧美| 久久精品ww人人做人人爽| 国产精品无码av在线播放| 亚洲一区二区三区四区av| 日本女人性生活视频| 国产精品成人无码| 国产69久久| 另类视频一区二区三区| 欧美残忍xxxx极端| 国产suv一区二区三区88区| 一区二区在线观看av| 日韩激情在线视频| 久久免费播放视频| www.26天天久久天堂| 久久超碰99| 国产一二精品视频| 福利精品视频在线| 精品国产制服丝袜高跟| 国产成人免费av电影| 中文字幕超清在线免费观看| 国产吃瓜黑料一区二区| 日韩 欧美 精品| av网站在线免费播放| 亚洲国产精品嫩草影院久久av| 午夜国产欧美理论在线播放 | 欧美极品少妇xxxxⅹ高跟鞋| 亚洲精品一区二区在线| 国产传媒一区二区| 九九热免费在线观看| 超碰超碰超碰超碰| xxxxx日韩| 亚洲男人都懂第一日本| 不卡在线视频中文字幕| 欧美日韩综合在线| 538国产精品一区二区在线 | 青青草原av在线播放| 国产亚洲精品久久久久久无几年桃| 日本在线天堂| 色综合视频一区二区三区日韩| 国产一区二区三区四区三区四| 国产精品色一区二区三区| 欧美一级二级在线观看| 午夜精品一区二区三区在线| 一级特黄录像免费播放全99| 国产一区二区在线观看免费视频| 日本少妇bbwbbw精品| a级片在线免费观看| 国产精品chinese| 亚洲午夜一区二区三区| 亚洲精品日产| 一区二区不卡在线观看| 一级国产黄色片| 你懂的在线看| 国内精品国产成人国产三级粉色 | 久久精品成人av| 黄色美女网站在线观看| 国产精品17p| 成人av在线一区二区| 亚洲日韩中文字幕| 成人免费a级片| 亚洲香蕉在线视频| 羞羞答答一区二区| 亚洲欧美在线aaa| 国内精品视频一区| 缅甸午夜性猛交xxxx| 久久久久亚洲av成人毛片韩| 国产精品成人**免费视频| 国产主播一区二区三区| 欧美成人vr18sexvr| 久久99国产精品99久久| 一区二区精品免费| 松下纱荣子在线观看| 国产精品正在播放| 亚洲偷欧美偷国内偷| 91国视频在线| 国产一区二区波多野结衣| 欧美a在线观看| 成av人片一区二区| 久久国产精品免费视频| 免费黄色日本网站| 精品人妻一区二区三区日产乱码 | 污污内射在线观看一区二区少妇| 成人信息集中地| caoporn视频在线观看| 亚洲精品1234| 偷拍与自拍一区| 国产成人精品在线看| 久久久久国产精品厨房| 日本视频久久久| 精品国产乱码久久久久久1区二区| 免费黄网站在线观看| 午夜在线精品偷拍| 亚洲欧美第一页| wwwwwxxxx日本| 777电影在线观看| 亚洲美女黄色| 亚洲开心激情网| 超碰av在线免费观看| 国产福利在线| 久久99久久久久| 欧美重口另类videos人妖| 中国男女全黄大片| 欧美1级2级| 亚洲综合成人在线| 国产精品久久精品国产| 美女久久久久久久久久| 99re66热这里只有精品4| 亚洲影院免费观看| 欧美激情论坛| 国产精品一品二区三区的使用体验| 欧美日韩a区| 亚洲免费中文字幕| 九九九九九国产| 日本一本在线免费福利| xnxx国产精品| 91精品视频观看| 欧美日韩成人免费观看| 国产一区二区精品福利地址| 亚洲精品国产品国语在线| 亚洲成人福利视频| 少妇一区视频| 一区二区成人在线| 男人日女人的bb| 大地资源中文在线观看免费版| 国产成人午夜精品影院观看视频| 久久久久久久久国产| 欧美h片在线观看| 欧美丝袜丝交足nylons172| 亚洲精选中文字幕| 国产一级大片免费看| 免费大片黄在线观看视频网站| 91女人视频在线观看| 精品视频一区二区三区四区| 精品国产黄色片| 免费欧美日韩国产三级电影| 1769国内精品视频在线播放| 日本网站免费观看| 亚洲国产高清一区二区三区| 久久99精品久久久久久噜噜| 五月天激情丁香| 亚洲久久一区二区| 国语对白做受69| 欧美日韩三级在线观看| 欧美在线精品一区| 1769国内精品视频在线播放| 国产精品无码粉嫩小泬| 久久精品国产亚洲a| 国产亚洲欧美一区二区三区| 人妻va精品va欧美va| 99久久精品99国产精品| 精品国产一区二区三区四区vr| 四虎精品成人免费网站| 91亚洲永久精品| 亚洲综合视频一区| 色先锋资源久久综合5566| 国产一二三四区在线观看| 婷婷五月综合激情| 久久久久久久久久美女| 中文字幕の友人北条麻妃|