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

Dubbo負載均衡策略之一致性哈希

人工智能 算法
DNS 負載均衡最早的負載均衡技術是通過 DNS 來實現的,在 DNS 中為多個地址配置同一個名字,因而查詢這個名字的客戶機將得到其中一個地址,從而使得不同的客戶訪問不同的服務器,達到負載均衡的目的。DNS 負載均衡是一種簡單而有效的方法,但是它不能區分服務器的差異,也不能反映服務器的當前運行狀態。

本文主要講解了一致性哈希算法的原理以及其存在的數據傾斜的問題,然后引出解決數據傾斜問題的方法,最后分析一致性哈希算法在 Dubbo 中的使用。通過這篇文章,可以了解到一致性哈希算法的原理以及這種算法存在的問題和解決方案。

一、負載均衡

在這里引用 dubbo 官網的一段話 ——

LoadBalance 中文意思為負載均衡,它的職責是將網絡請求,或者其他形式的負載 “均攤” 到不同的機器上。避免集群中部分服務器壓力過大,而另一些服務器比較空閑的情況。通過負載均衡,可以讓每臺服務器獲取到適合自己處理能力的負載。在為高負載服務器分流的同時,還可以避免資源浪費,一舉兩得。負載均衡可分為軟件負載均衡和硬件負載均衡。在我們日常開發中,一般很難接觸到硬件負載均衡。但軟件負載均衡還是可以接觸到的,比如 Nginx。在 Dubbo 中,也有負載均衡的概念和相應的實現。

Dubbo 需要對服務消費者的調用請求進行分配,避免少數服務提供者負載過大。服務提供者負載過大,會導致部分請求超時。因此將負載均衡到每個服務提供者上,是非常必要的。Dubbo 提供了 4 種負載均衡實現,分別是基于權重隨機算法的 RandomLoadBalance、基于最少活躍調用數算法的 LeastActiveLoadBalance、基于 hash 一致性的 ConsistentHashLoadBalance,以及基于加權輪詢算法的 RoundRobinLoadBalance。這幾個負載均衡算法代碼不是很長,但是想看懂也不是很容易,需要對這幾個算法的原理有一定了解才行。

二、哈希算法

圖 1 無哈希算法請求

如上所示,假設 0,1,2 號服務器都存儲的有用戶信息,那么當我們需要獲取某用戶信息時,因為我們不知道該用戶信息存放在哪一臺服務器中,所以需要分別查詢 0,1,2 號服務器。這樣獲取數據的效率是極低的。

對于這樣的場景,我們可以引入哈希算法。

圖 2 引入哈希算法后的請求

還是上面的場景,但前提是每一臺服務器存放用戶信息時是根據某一種哈希算法存放的。所以取用戶信息的時候,也按照同樣的哈希算法取即可。

假設我們要查詢用戶號為 100 的用戶信息,經過某個哈希算法,比如這里的 userId mod n,即 100 mod 3 結果為 1。所以用戶號 100 的這個請求最終會被 1 號服務器接收并處理。

這樣就解決了無效查詢的問題。

但是這樣的方案會帶來什么問題呢?

擴容或者縮容時,會導致大量的數據遷移。最少也會影響 50% 的數據。

圖 3 增加一臺服務器

為了說明問題,加入一臺服務器 3。服務器的數量 n 就從 3 變成了 4。還是查詢用戶號為 100 的用戶信息時,100 mod 4 結果為 0。這時,請求就被 0 號服務器接收了。

  • 當服務器數量為 3 時,用戶號為 100 的請求會被 1 號服務器處理。
  • 當服務器數量為 4 時,用戶號為 100 的請求會被 0 號服務器處理。

所以,當服務器數量增加或者減少時,一定會涉及到大量數據遷移的問題。

對于上述哈希算法其優點是簡單易用,大多數分庫分表規則就采取的這種方式。一般是提前根據數據量,預先估算好分區數。

其缺點是由于擴容或收縮節點導致節點數量變化時,節點的映射關系需要重新計算,會導致數據進行遷移。所以擴容時通常采用翻倍擴容,避免數據映射全部被打亂,導致全量遷移的情況,這樣只會發生 50% 的數據遷移。

三、一致性哈希算法

** 一致性 hash 算法由麻省理工學院的 Karger 及其合作者于 1997 年提出的,算法提出之初是用于大規模緩存系統的負載均衡。** 它的工作過程是這樣的,首先根據 ip 或者其他的信息為緩存節點生成一個 hash,并將這個 hash 投射到 [0, 232 - 1] 的圓環上。當有查詢或寫入請求時,則為緩存項的 key 生成一個 hash 值。然后查找第一個大于或等于該 hash 值的緩存節點,并到這個節點中查詢或寫入緩存項。如果當前節點掛了,則在下一次查詢或寫入緩存時,為緩存項查找另一個大于其 hash 值的緩存節點即可。大致效果如下圖所示,每個緩存節點在圓環上占據一個位置。如果緩存項的 key 的 hash 值小于緩存節點 hash 值,則到該緩存節點中存儲或讀取緩存項。比如下面綠色點對應的緩存項將會被存儲到 cache-2 節點中。由于 cache-3 掛了,原本應該存到該節點中的緩存項最終會存儲到 cache-4 節點中。

圖 4 一致性哈希算法

在一致性哈希算法中,不管是增加節點,還是宕機節點,受影響的區間僅僅是增加或者宕機服務器在哈希環空間中,逆時針方向遇到的第一臺服務器之間的區間,其它區間不會受到影響。

但是一致性哈希也是存在問題的:

圖 5 數據傾斜

當節點很少的時候可能會出現這樣的分布情況,A 服務會承擔大部分請求。這種情況就叫做數據傾斜。

那如何解決數據傾斜的問題呢?

加入虛擬節點。

首先一個服務器根據需要可以有多個虛擬節點。假設一臺服務器有 n 個虛擬節點。那么哈希計算時,可以使用 IP + 端口 + 編號的形式進行哈希值計算。其中的編號就是 0 到 n 的數字。由于 IP + 端口是一樣的,所以這 n 個節點都是指向的同一臺機器。

圖 6 引入虛擬節點

在沒有加入虛擬節點之前,A 服務器承擔了絕大多數的請求。但是假設每個服務器有一個虛擬節點(A-1,B-1,C-1),經過哈希計算后落在了如上圖所示的位置。那么 A 服務器的承擔的請求就在一定程度上(圖中標注了五角星的部分)分攤給了 B-1、C-1 虛擬節點,實際上就是分攤給了 B、C 服務器。

一致性哈希算法中,加入虛擬節點,可以解決數據傾斜問題。

四、一致性哈希在 DUBBO 中的應用

圖 7 Dubbo 中一致性哈希環

這里相同顏色的節點均屬于同一個服務提供者,比如 Invoker1-1,Invoker1-2,……, Invoker1-160。這樣做的目的是通過引入虛擬節點,讓 Invoker 在圓環上分散開來,避免數據傾斜問題。所謂數據傾斜是指,由于節點不夠分散,導致大量請求落到了同一個節點上,而其他節點只會接收到了少量請求的情況。比如:

圖 8 數據傾斜問題

如上,由于 Invoker-1 和 Invoker-2 在圓環上分布不均,導致系統中 75% 的請求都會落到 Invoker-1 上,只有 25% 的請求會落到 Invoker-2 上。解決這個問題辦法是引入虛擬節點,通過虛擬節點均衡各個節點的請求量。

到這里背景知識就普及完了,接下來開始分析源碼。我們先從 ConsistentHashLoadBalance 的 doSelect 方法開始看起,如下:

public class ConsistentHashLoadBalance extends AbstractLoadBalance {


    private final ConcurrentMap<String, ConsistentHashSelector<?>> selectors = 
        new ConcurrentHashMap<String, ConsistentHashSelector<?>>();


    @Override
    protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
        String methodName = RpcUtils.getMethodName(invocation);
        String key = invokers.get(0).getUrl().getServiceKey() + "." + methodName;


        // 獲取 invokers 原始的 hashcode
        int identityHashCode = System.identityHashCode(invokers);
        ConsistentHashSelector<T> selector = (ConsistentHashSelector<T>) selectors.get(key);
        // 如果 invokers 是一個新的 List 對象,意味著服務提供者數量發生了變化,可能新增也可能減少了。
        // 此時 selector.identityHashCode != identityHashCode 條件成立
        if (selector == null || selector.identityHashCode != identityHashCode) {
            // 創建新的 ConsistentHashSelector
            selectors.put(key, new ConsistentHashSelector<T>(invokers, methodName, identityHashCode));
            selector = (ConsistentHashSelector<T>) selectors.get(key);
        }


        // 調用 ConsistentHashSelector 的 select 方法選擇 Invoker
        return selector.select(invocation);
    }
    
    private static final class ConsistentHashSelector<T> {...}
}

如上,doSelect 方法主要做了一些前置工作,比如檢測 invokers 列表是不是變動過,以及創建 ConsistentHashSelector。這些工作做完后,接下來開始調用 ConsistentHashSelector 的 select 方法執行負載均衡邏輯。在分析 select 方法之前,我們先來看一下一致性 hash 選擇器 ConsistentHashSelector 的初始化過程,如下:

private static final class ConsistentHashSelector<T> {


    // 使用 TreeMap 存儲 Invoker 虛擬節點
    private final TreeMap<Long, Invoker<T>> virtualInvokers;


    private final int replicaNumber;


    private final int identityHashCode;


    private final int[] argumentIndex;


    ConsistentHashSelector(List<Invoker<T>> invokers, String methodName, int identityHashCode) {
        this.virtualInvokers = new TreeMap<Long, Invoker<T>>();
        this.identityHashCode = identityHashCode;
        URL url = invokers.get(0).getUrl();
        // 獲取虛擬節點數,默認為160
        this.replicaNumber = url.getMethodParameter(methodName, "hash.nodes", 160);
        // 獲取參與 hash 計算的參數下標值,默認對第一個參數進行 hash 運算
        String[] index = Constants.COMMA_SPLIT_PATTERN.split(url.getMethodParameter(methodName, "hash.arguments", "0"));
        argumentIndex = new int[index.length];
        for (int i = 0; i < index.length; i++) {
            argumentIndex[i] = Integer.parseInt(index[i]);
        }
        for (Invoker<T> invoker : invokers) {
            String address = invoker.getUrl().getAddress();
            for (int i = 0; i < replicaNumber / 4; i++) {
                // 對 address + i 進行 md5 運算,得到一個長度為16的字節數組
                byte[] digest = md5(address + i);
                // 對 digest 部分字節進行4次 hash 運算,得到四個不同的 long 型正整數
                for (int h = 0; h < 4; h++) {
                    // h = 0 時,取 digest 中下標為 0 ~ 3 的4個字節進行位運算
                    // h = 1 時,取 digest 中下標為 4 ~ 7 的4個字節進行位運算
                    // h = 2, h = 3 時過程同上
                    long m = hash(digest, h);
                    // 將 hash 到 invoker 的映射關系存儲到 virtualInvokers 中,
                    // virtualInvokers 需要提供高效的查詢操作,因此選用 TreeMap 作為存儲結構
                    virtualInvokers.put(m, invoker);
                }
            }
        }
    }
}

ConsistentHashSelector 的構造方法執行了一系列的初始化邏輯,比如從配置中獲取虛擬節點數以及參與 hash 計算的參數下標,默認情況下只使用第一個參數進行 hash。需要特別說明的是,ConsistentHashLoadBalance 的負載均衡邏輯只受參數值影響,具有相同參數值的請求將會被分配給同一個服務提供者。ConsistentHashLoadBalance 不 關系權重,因此使用時需要注意一下。

在獲取虛擬節點數和參數下標配置后,接下來要做的事情是計算虛擬節點 hash 值,并將虛擬節點存儲到 TreeMap 中。到此,ConsistentHashSelector 初始化工作就完成了。接下來,我們來看看 select 方法的邏輯。

public Invoker<T> select(Invocation invocation) {
    // 將參數轉為 key
    String key = toKey(invocation.getArguments());
    // 對參數 key 進行 md5 運算
    byte[] digest = md5(key);
    // 取 digest 數組的前四個字節進行 hash 運算,再將 hash 值傳給 selectForKey 方法,
    // 尋找合適的 Invoker
    return selectForKey(hash(digest, 0));
}


private Invoker<T> selectForKey(long hash) {
    // 到 TreeMap 中查找第一個節點值大于或等于當前 hash 的 Invoker
    Map.Entry<Long, Invoker<T>> entry = virtualInvokers.tailMap(hash, true).firstEntry();
    // 如果 hash 大于 Invoker 在圓環上最大的位置,此時 entry = null,
    // 需要將 TreeMap 的頭節點賦值給 entry
    if (entry == null) {
        entry = virtualInvokers.firstEntry();
    }


    // 返回 Invoker
    return entry.getValue();
}

如上,選擇的過程相對比較簡單了。首先是對參數進行 md5 以及 hash 運算,得到一個 hash 值。然后再拿這個值到 TreeMap 中查找目標 Invoker 即可。

到此關于 ConsistentHashLoadBalance 就分析完了。

在閱讀 ConsistentHashLoadBalance 源碼之前,建議讀者先補充背景知識,不然看懂代碼邏輯會有很大難度。

五、應用場景

  • DNS 負載均衡最早的負載均衡技術是通過 DNS 來實現的,在 DNS 中為多個地址配置同一個名字,因而查詢這個名字的客戶機將得到其中一個地址,從而使得不同的客戶訪問不同的服務器,達到負載均衡的目的。DNS 負載均衡是一種簡單而有效的方法,但是它不能區分服務器的差異,也不能反映服務器的當前運行狀態。
  • 代理服務器負載均衡使用代理服務器,可以將請求轉發給內部的服務器,使用這種加速模式顯然可以提升靜態網頁的訪問速度。然而,也可以考慮這樣一種技術,使用代理服務器將請求均勻轉發給多臺服務器,從而達到負載均衡的目的。
  • 地址轉換網關負載均衡支持負載均衡的地址轉換網關,可以將一個外部 IP 地址映射為多個內部 IP 地址,對每次 TCP 連接請求動態使用其中一個內部地址,達到負載均衡的目的。
  • 協議內部支持負載均衡除了這三種負載均衡方式之外,有的協議內部支持與負載均衡相關的功能,例如 HTTP 協議中的重定向能力等,HTTP 運行于 TCP 連接的最高層。
  • NAT 負載均衡 NAT(Network Address Translation 網絡地址轉換)簡單地說就是將一個 IP 地址轉換為另一個 IP 地址,一般用于未經注冊的內部地址與合法的、已獲注冊的 Internet IP 地址間進行轉換。適用于解決 Internet IP 地址緊張、不想讓網絡外部知道內部網絡結構等的場合下。
  • 反向代理負載均衡普通代理方式是代理內部網絡用戶訪問 internet 上服務器的連接請求,客戶端必須指定代理服務器,并將本來要直接發送到 internet 上服務器的連接請求發送給代理服務器處理。反向代理(Reverse Proxy)方式是指以代理服務器來接受 internet 上的連接請求,然后將請求轉發給內部網絡上的服務器,并將從服務器上得到的結果返回給 internet 上請求連接的客戶端,此時代理服務器對外就表現為一個服務器。反向代理負載均衡技術是把將來自 internet 上的連接請求以反向代理的方式動態地轉發給內部網絡上的多臺服務器進行處理,從而達到負載均衡的目的。
  • 混合型負載均衡在有些大型網絡,由于多個服務器群內硬件設備、各自的規模、提供的服務等的差異,可以考慮給每個服務器群采用最合適的負載均衡方式,然后又在這多個服務器群間再一次負載均衡或群集起來以一個整體向外界提供服務(即把這多個服務器群當做一個新的服務器群),從而達到最佳的性能。將這種方式稱之為混合型負載均衡。此種方式有時也用于單臺均衡設備的性能不能滿足大量連接請求的情況下。

作者:京東物流 喬杰

來源:京東云開發者社區

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2023-12-09 14:30:29

哈希數據分片

2021-02-05 08:00:48

哈希算法?機器

2021-02-02 12:40:50

哈希算法數據

2025-09-08 07:25:16

2020-07-20 08:30:37

算法哈希分布式系統

2021-09-15 07:46:42

哈希一致性哈希算法

2021-07-27 08:57:10

算法一致性哈希哈希算法

2016-12-19 18:41:09

哈希算法Java數據

2023-06-25 09:44:00

一致性哈希數據庫

2023-12-20 08:11:02

Redis節點通信

2022-01-11 17:23:51

算法負載均衡Hash

2017-07-25 14:38:56

數據庫一致性非鎖定讀一致性鎖定讀

2023-12-12 08:00:50

節點哈希算法

2018-07-05 09:41:08

一致性哈希算法

2021-11-12 08:38:26

一致性哈希算法數據結構

2019-11-01 09:13:37

算法哈希緩存

2023-12-05 14:44:01

2019-03-27 13:56:39

緩存雪崩穿透

2022-01-27 08:31:20

一致性哈希

2022-12-14 08:23:30

點贊
收藏

51CTO技術棧公眾號

国产成人激情视频| 日韩激情视频在线播放| www.欧美黄色| 少妇喷水在线观看| 人禽交欧美网站| 麻豆成人在线看| 波多野结衣影院| 成人日韩av| 亚洲妇女屁股眼交7| 欧美一区视久久| 97国产精品久久久| 国产精品综合| 欧美风情在线观看| 国产高清一区二区三区四区| 欧美1区2区3| 91九色02白丝porn| 欧美大黑帍在线播放| 国产三级视频在线看| 激情欧美一区二区三区在线观看| 97精品一区二区视频在线观看| 亚洲精品视频网址| 日韩高清影视在线观看| 日韩一区二区中文字幕| 午夜免费一区二区| 国产污视频在线播放| 亚洲免费资源在线播放| 日本一区二区三不卡| 日本高清视频在线| 久久99日本精品| 国产成人精品视频在线观看| 国产大片aaa| 一区二区三区午夜探花| 国产午夜精品美女视频明星a级| 手机在线播放av| 欧美午夜三级| 欧美主播一区二区三区| 久久久久久久久久久视频| 中中文字幕av在线| 中文字幕佐山爱一区二区免费| 欧美大陆一区二区| 天天色棕合合合合合合合| 国产福利精品一区| 亚洲一区中文字幕| 91精东传媒理伦片在线观看| 美腿丝袜一区二区三区| 日韩美女视频免费看| 国产美女激情视频| 一本不卡影院| 91chinesevideo永久地址| 国产午夜福利片| 欧美视频导航| 欧美精品videossex性护士| 欧美日韩在线视频免费| 欧美成人午夜| 九九热这里只有在线精品视| 69夜色精品国产69乱| 99久久夜色精品国产亚洲狼| 伊人久久综合97精品| 亚洲AV无码成人精品区明星换面| 亚洲调教一区| 亚洲天堂免费视频| 亚洲精品乱码久久久久久久久久久久| 在线成人动漫av| 亚洲人成五月天| 黄色片在线观看免费| 成人亚洲一区| 久久人人爽人人爽人人片亚洲| 韩国一级黄色录像| 欧美在线亚洲| 久久人人爽人人爽人人片av高请 | 国产精品大片| 国产69精品久久久久9| 免费日韩一级片| 久久一日本道色综合久久| 国产精品com| 91资源在线视频| 国产精品一区二区x88av| 国产精品免费观看高清| 丝袜视频国产在线播放| 国产三级精品视频| 日韩视频在线观看视频| 丁香高清在线观看完整电影视频| 五月婷婷久久综合| 97公开免费视频| 亚洲资源在线| 亚洲福利在线看| 国产sm调教视频| 91精品国产视频| 国模精品视频一区二区| 天天操天天干天天摸| 韩国欧美国产一区| 国产欧美韩日| av国产在线观看| 亚洲综合在线观看视频| 黄色av免费在线播放| 精品国产第一国产综合精品| 亚洲国产精品人人爽夜夜爽| 女同毛片一区二区三区| 国产精品久久观看| 91精品国产精品| 一级黄色a视频| www.66久久| 影音先锋亚洲视频| 国产欧洲在线| 日韩一区二区三区在线| 亚洲一级中文字幕| 国产一区日韩一区| 国产精品入口尤物| 婷婷五月综合久久中文字幕| 亚洲欧洲日本在线| 黄色片视频在线播放| 欧美区一区二区| 自拍偷拍亚洲一区| av大片在线免费观看| 国产自产高清不卡| 日本一区二区在线视频观看| 亚洲中文字幕久久精品无码喷水| 全国男人的天堂网| 国产精品视频线看| 草草久久久无码国产专区| 久久伊人久久| 日韩有码在线观看| 免费黄色av片| 99国产欧美另类久久久精品| 喜爱夜蒲2在线| 成人黄色毛片| 亚洲人成欧美中文字幕| 男人的天堂一区| 国产福利一区二区三区在线视频| 亚洲日本无吗高清不卡| 吉吉日韩欧美| 亚洲精品国产成人| 国产在线观看免费av| 极品少妇xxxx精品少妇| 视频一区二区精品| 日韩av中字| 精品亚洲一区二区三区| 国产一级视频在线观看| 国产精品系列在线播放| 国产四区在线观看| 亚洲图片小说区| 日韩中文字幕网站| 中文字幕无码乱码人妻日韩精品| 久久天天做天天爱综合色| 国产原创popny丨九色| 都市激情亚洲| 久久99精品视频一区97| www五月婷婷| 一卡二卡三卡日韩欧美| 可以看的av网址| 国产一区二区三区自拍| 福利精品视频| 91制片在线观看| 亚洲第一区在线观看| 日本学生初尝黑人巨免费视频| 国产成人av电影免费在线观看| 久久观看最新视频| 久热这里只有精品6| 超碰在线最新网址| 欧美在线观看视频一区二区| 少妇无套高潮一二三区| 你懂的视频在线播放| 亚洲黄色录像片| 永久免费未满蜜桃| 国产精品一区亚洲| 日韩av图片| 免费一级欧美在线观看视频| 有码中文亚洲精品| 亚洲一区二区天堂| 亚洲色欲色欲www在线观看| 伊人五月天婷婷| 好看的av在线不卡观看| 精品欧美一区二区三区久久久| aaa在线播放视频| 亚洲视频在线观看免费| 在线免费观看中文字幕| 亚洲欧美日韩在线| 中文成人无字幕乱码精品区| 日韩综合一区二区| 亚洲综合首页| 国产精东传媒成人av电影| 91精品国产九九九久久久亚洲| 成年人视频网站在线| 欧美一区二区三级| 偷偷操不一样的久久| 国产精品视频看| 久久久久亚洲av无码网站| 免费看的黄色欧美网站| 亚洲一区bb| 国产精品丝袜在线播放| 国产精品爽黄69| 曰本三级在线| 亚洲欧美日韩图片| a网站在线观看| 色综合咪咪久久| 国产十六处破外女视频| 久久综合色一综合色88| 三年中文在线观看免费大全中国| av成人黄色| www.亚洲一区二区| 精品国产91乱码一区二区三区四区 | 91电影在线播放| 在线观看日韩毛片| 免看一级a毛片一片成人不卡| 91视频com| 香蕉网在线视频| 国产欧美91| 天天人人精品| 日韩手机在线| 亚洲一区免费网站| 欧美97人人模人人爽人人喊视频| 国内自拍欧美激情| 高清免费电影在线观看| 亚洲午夜av电影| 天天射天天色天天干| 欧美一区二区视频在线观看2020| 天堂网中文字幕| 亚洲va在线va天堂| tube国产麻豆| 国产精品灌醉下药二区| 国产免费一区二区三区网站免费| 国产99久久久久| 日韩精品视频网址| 久久99国产精品久久99| 白嫩少妇丰满一区二区| 亚洲天堂黄色| av电影一区二区三区| 欧美电影免费播放| 日韩三级在线播放| 久久99久久人婷婷精品综合 | 亚洲蜜臀av乱码久久精品| 国产黄色大片免费看| 91美女在线视频| 青青草视频网站| 国产suv精品一区二区883| 亚洲综合激情视频| 久久机这里只有精品| 亚洲综合在线网站| 视频一区视频二区中文字幕| 免费超爽大片黄| 在线观看不卡| h无码动漫在线观看| 欧美日韩一区二区三区四区在线观看 | 久久人人爽av| 日韩av不卡一区二区| 国产v亚洲v天堂无码久久久| 亚洲一区免费| 欧美成人黑人猛交| 日本aⅴ亚洲精品中文乱码| 国产视频一区二区视频| 日本中文字幕不卡| 一区二区成人网| 久久精品国产精品亚洲精品| 999在线免费视频| 欧美aaaaaa午夜精品| 高清av免费看| 久久99精品久久久久久| 午夜啪啪小视频| 国内精品伊人久久久久影院对白| 久久精品一卡二卡| 成人污视频在线观看| 性色av蜜臀av浪潮av老女人 | 午夜影院黄色片| 中文字幕欧美日本乱码一线二线| www亚洲色图| 综合久久给合久久狠狠狠97色 | 国产日韩欧美一二三区| 色成人综合网| 国产精品久久一区二区三区| 精品精品国产三级a∨在线| 久久国产手机看片| 国产aⅴ精品一区二区三区久久| 色噜噜狠狠色综合网| 欧美hd在线| 精品国偷自产一区二区三区| 亚洲国内自拍| 簧片在线免费看| 国产精品一区在线观看你懂的| 美女被爆操网站| 久久一区二区视频| 午夜黄色福利视频| 一区二区成人在线观看| 天天干天天干天天| 欧美精品在欧美一区二区少妇 | 亚洲欧美日韩视频一区| 免费高清完整在线观看| 欧美激情一级欧美精品| 天堂电影一区| 成人信息集中地欧美| 久久夜色精品国产噜噜av小说| 欧美日韩精品免费看| 欧美丰满日韩| 久久网站免费视频| 激情欧美日韩一区二区| 大乳护士喂奶hd| 中文字幕一区在线观看视频| 日韩成人免费观看| 欧美日韩在线播| 欧美自拍第一页| 日韩视频精品在线| 涩涩涩在线视频| 91九色国产社区在线观看| 麻豆精品少妇| 91麻豆天美传媒在线| 久久蜜桃精品| 免费黄色a级片| 国产精品国产三级国产aⅴ中文| 国产精品99re| 4438x成人网最大色成网站| 香蕉视频黄在线观看| 久久久精品中文字幕| 亚洲成av在线| 国内视频一区二区| 欧美性久久久| 天天干天天色天天干| 久久影院视频免费| 日本中文字幕免费| 欧美一区二区女人| 国产69久久| 日本一欧美一欧美一亚洲视频| 亚洲一级大片| 一区二区三区四区五区精品| 美女爽到呻吟久久久久| 成人在线观看一区二区| 日韩理论片中文av| 性色av一区二区三区四区| 亚洲跨种族黑人xxx| 黑人极品ⅴideos精品欧美棵| 国产精品专区一| av中文一区| 久久国产乱子伦免费精品| 成人h动漫精品| 久久久久久久国产精品毛片| 欧美精品 日韩| 尤物网在线观看| 国产美女精品视频免费观看| 神马电影久久| 88av.com| 国产欧美日韩卡一| 亚洲av无码精品一区二区| 日韩精品免费看| 九色porny丨首页入口在线| 国产一区免费| 亚洲美女黄色| 日韩无码精品一区二区| 亚洲一区二区三区中文字幕在线 | 91p九色成人| 日韩国产伦理| 三级影片在线观看欧美日韩一区二区| www.超碰97| 色悠悠亚洲一区二区| 青青青免费视频在线2| 欧美在线性视频| 久久不见久久见中文字幕免费 | 992tv国产精品成人影院| 欧洲国产精品| 日韩 欧美一区二区三区| 少妇愉情理伦三级| 欧美另类一区二区三区| 国产原创视频在线观看| 成人激情av在线| 国产精品扒开腿做爽爽爽软件| 亚洲一区二区三区四区av| 亚洲一区二区av电影| 无码国产精品一区二区色情男同 | 欧美黄色a视频| 女同性恋一区二区| 不卡视频免费播放| 中文字幕一区在线播放| 国产午夜精品免费一区二区三区| 欧美aaa大片视频一二区| 亚洲综合第一| 成人av网站免费| 亚洲欧美一区二区三区在线观看| 亚洲欧美日本另类| 成人午夜888| 欧美在线一区视频| 国产日韩欧美精品一区| h片在线免费看| 欧洲日韩成人av| 午夜免费一区| 在线观看av中文字幕| 在线视频综合导航| 四虎亚洲成人| 欧美精品一区在线| 激情六月婷婷综合| 91在线视频在线观看| zzijzzij亚洲日本成熟少妇| 91大神精品| 爱情岛论坛亚洲首页入口章节| 亚洲男同性恋视频| 天堂资源最新在线| 91人人爽人人爽人人精88v| 一区三区视频| 亚洲天堂精品一区| 亚洲白拍色综合图区| 亚洲mmav| 可以在线看的av网站| 国产精品美女久久久久aⅴ| 国产 日韩 欧美 精品|