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

七種分布式全局 ID 生成策略,你更愛哪種?

云計算 分布式
數據庫自己搞定,就是說我在數據插入的時候,依然不考慮主鍵的問題,希望繼續使用數據庫的主鍵自增,但是很明顯,原本默認的主鍵自增現在沒法用了,我們必須有新的方案。

上了微服務之后,很多原本很簡單的問題現在都變復雜了,例如全局 ID 這事!

松哥最近工作中剛好用到這塊內容,于是調研了市面上幾種常見的全局 ID 生成策略,稍微做了一下對比,供小伙伴們參考。

當數據庫分庫分表之后,原本的主鍵自增就不方便繼續使用了,需要找到一個新的合適的方案,松哥的需求就是在這樣的情況下提出的。

接下來我們一起來捋一捋。

1. 兩種思路

整體上來說,這個問題有兩種不同的思路:

  • 讓數據庫自己搞定
  • Java 代碼來處理主鍵,然后直接插入數據庫中即可。

這兩種思路又對應了不同的方案,我們一個一個來看。

2. 數據庫自己搞定

數據庫自己搞定,就是說我在數據插入的時候,依然不考慮主鍵的問題,希望繼續使用數據庫的主鍵自增,但是很明顯,原本默認的主鍵自增現在沒法用了,我們必須有新的方案。

2.1 修改數據庫配置

數據庫分庫分表之后的結構如下圖(假設數據庫中間件用的 MyCat):

圖片圖片

此時如果原本的 db1、db2、db3 繼續各自主鍵自增,那么對于 MyCat 而言,主鍵就不是自增了,主鍵就會重復,用戶從 MyCat 中查詢到的數據主鍵就有問題。

找到問題的原因,那么剩下的就好解決了。

我們可以直接修改 MySQL 數據庫主鍵自增的起始值和步長。

首先我們可以通過如下 SQL 查看與此相關的兩個變量的取值:

SHOW VARIABLES LIKE 'auto_increment%'

圖片圖片

可以看到,主鍵自增的起始值和步長都是 1。

起始值好改,在定義表的時候就可以設置,步長我們可以通過修改這個配置實現:

set @@auto_increment_increment=9;

修改后,再去查看對應的變量值,發現已經變了:

圖片圖片

此時我們再去插入數據,主鍵自增就不是每次自增 1,而是每次自增 9 了。

至于自增起始值其實很好設置,創建表的時候就可以設置了。

create table test01(id integer PRIMARY KEY auto_increment,username varchar(255)) auto_increment=8;

既然 MySQL 可以修改自增的起始值和每次增長的步長,現在假設我有 db1、db2 和 db3,我就可以分別設置這三個庫中表的自增起始值為 1、2、3,然后自增步長都是 3,這樣就可以實現自增了。

但是很明顯這種方式不夠優雅,而且處理起來很麻煩,將來擴展也不方便,因此不推薦。

2.2 MySQL+MyCat+ZooKeeper

如果大家分庫分表工具恰好使用的是 MyCat,那么結合 Zookeeper 也能很好的實現主鍵全局自增。

MyCat 作為一個分布式數據庫中間,屏蔽了數據庫集群的操作,讓我們操作數據庫集群就像操作單機版數據庫一樣,對于主鍵自增,它有自己的方案:

  1. 通過本地文件實現
  2. 通過數據庫實現
  3. 通過本地時間戳實現
  4. 通過分布式 ZK ID 生成器實現
  5. 通過 ZK 遞增方式實現

這里我們主要來看方案 4。

配置步驟如下:

  • 首先修改主鍵自增方式為 4 ,4 表示使用 zookeeper 實現主鍵自增。

server.xml

圖片圖片

  • 配置表自增,并且設置主鍵

schema.xml

圖片圖片

設置主鍵自增,并且設置主鍵為 id 。

  • 配置 zookeeper 的信息

在 myid.properties 中配置 zookeeper 信息:

圖片圖片

  • 配置要自增的表

sequence_conf.properties

圖片圖片

注意,這里表名字要大寫。

  1. TABLE.MINID 某線程當前區間內最小值
  2. TABLE.MAXID 某線程當前區間內最大值
  3. TABLE.CURID 某線程當前區間內當前值
  4. 文件配置的MAXID以及MINID決定每次取得區間,這個對于每個線程或者進程都有效
  5. 文件中的這三個屬性配置只對第一個進程的第一個線程有效,其他線程和進程會動態讀取 ZK
  • 重啟 MyCat 測試

最后重啟 MyCat ,刪掉之前創建的表,然后創建新表進行測試即可。

這種方式就比較省事一些,而且可擴展性也比較強,如果選擇了 MyCat 作為分庫分表工具,那么這種不失為一種最佳方案。

前面介紹這兩種都是在數據庫或者數據庫中間件層面來處理主鍵自增,我們 Java 代碼并不需要額外工作。

接下來我們再來看幾種需要在 Java 代碼中進行處理的方案。

3. Java 代碼處理

3.1 UUID

最容易想到的就是 UUID (Universally Unique Identifier) 了, UUID 的標準型式包含 32 個 16 進制數字,以連字號分為五段,形式為 8-4-4-4-12 的 36 個字符,這個是 Java 自帶的,用著也簡單,最大的優勢就是本地生成,沒有網絡消耗,但是但凡在公司做開發的小伙伴都知道這個東西在公司項目中使用并不多。原因如下:

  1. 字符串太長,對于 MySQL 而言,不利于索引。
  2. UUID 的隨機性對于 I/O 密集型的應用非常不友好!「它會使得聚簇索引的插入變得完全隨機,使得數據沒有任何聚集特性。」
  3. 信息不安全:基于 MAC 地址生成 UUID 的算法可能會造成 MAC 地址泄露,這個漏洞曾被用于尋找梅麗莎病毒的制作者位置。

因此,UUID 并非最佳方案。

3.2 SNOWFLAKE

雪花算法是由 Twitter 公布的分布式主鍵生成算法,它能夠保證不同進程主鍵的不重復性,以及相同進程主鍵的有序性。在同一個進程中,它首先是通過時間位保證不重復,如果時間相同則是通過序列位保證。

同時由于時間位是單調遞增的,且各個服務器如果大體做了時間同步,那么生成的主鍵在分布式環境可以認為是總體有序的,這就保證了對索引字段的插入的高效性。

例如 MySQL 的 Innodb 存儲引擎的主鍵。使用雪花算法生成的主鍵,二進制表示形式包含 4 部分,從高位到低位分表為:1bit 符號位、41bit 時間戳位、10bit 工作進程位以及 12bit 序列號位。

圖片圖片

  • 符號位 (1bit)

預留的符號位,恒為零。

  • 時間戳位 (41bit)

41 位的時間戳可以容納的毫秒數是 2 的 41 次冪,一年所使用的毫秒數是:365 * 24 * 60 * 60 * 1000。通過計算可知:Math.pow(2, 41) / (365 * 24 * 60 * 60 * 1000L);結果約等于 69.73 年。

ShardingSphere 的雪花算法的時間紀元從 2016 年 11 月 1 日零點開始,可以使用到 2086 年,相信能滿足絕大部分系統的要求。

  • 工作進程位 (10bit)

該標志在 Java 進程內是唯一的,如果是分布式應用部署應保證每個工作進程的 id 是不同的。該值默認為 0,可通過屬性設置。

  • 序列號位 (12bit)

該序列是用來在同一個毫秒內生成不同的 ID。如果在這個毫秒內生成的數量超過 4096 (2 的 12 次冪),那么生成器會等待到下個毫秒繼續生成。

注意:該算法存在 「時鐘回撥」 問題,服務器時鐘回撥會導致產生重復序列,因此默認分布式主鍵生成器提供了一個最大容忍的時鐘回撥毫秒數。如果時鐘回撥的時間超過最大容忍的毫秒數閾值,則程序報錯;如果在可容忍的范圍內,默認分布式主鍵生成器會等待時鐘同步到最后一次主鍵生成的時間后再繼續工作。最大容忍的時鐘回撥毫秒數的默認值為 0,可通過屬性設置。

下面松哥給出一個雪花算法的工具類,大家可以參考:

public class IdWorker {
    // 時間起始標記點,作為基準,一般取系統的最近時間(一旦確定不能變動)
    private final static long twepoch = 1288834974657L;
    // 機器標識位數
    private final static long workerIdBits = 5L;
    // 數據中心標識位數
    private final static long datacenterIdBits = 5L;
    // 機器ID最大值
    private final static long maxWorkerId = -1L ^ (-1L << workerIdBits);
    // 數據中心ID最大值
    private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
    // 毫秒內自增位
    private final static long sequenceBits = 12L;
    // 機器ID偏左移12位
    private final static long workerIdShift = sequenceBits;
    // 數據中心ID左移17位
    private final static long datacenterIdShift = sequenceBits + workerIdBits;
    // 時間毫秒左移22位
    private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;

    private final static long sequenceMask = -1L ^ (-1L << sequenceBits);
    /* 上次生產id時間戳 */
    private static long lastTimestamp = -1L;
    // 0,并發控制
    private long sequence = 0L;

    private final long workerId;
    // 數據標識id部分
    private final long datacenterId;

    public IdWorker(){
        this.datacenterId = getDatacenterId(maxDatacenterId);
        this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);
    }

    /**
     * @param workerId
     *            工作機器ID
     * @param datacenterId
     *            序列號
     */
    public IdWorker(long workerId, long datacenterId) {
        if (workerId > maxWorkerId || workerId < 0) {
            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
        }
        if (datacenterId > maxDatacenterId || datacenterId < 0) {
            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
        }
        this.workerId = workerId;
        this.datacenterId = datacenterId;
    }

    /**
     * 獲取下一個ID
     *
     * @return
     */
    public synchronized long nextId() {
        long timestamp = timeGen();
        if (timestamp < lastTimestamp) {
            throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
        }

        if (lastTimestamp == timestamp) {
            // 當前毫秒內,則+1
            sequence = (sequence + 1) & sequenceMask;
            if (sequence == 0) {
                // 當前毫秒內計數滿了,則等待下一秒
                timestamp = tilNextMillis(lastTimestamp);
            }
        } else {
            sequence = 0L;
        }
        lastTimestamp = timestamp;
        // ID偏移組合生成最終的ID,并返回ID
        long nextId = ((timestamp - twepoch) << timestampLeftShift)
                | (datacenterId << datacenterIdShift)
                | (workerId << workerIdShift) | sequence;

        return nextId;
    }

    private long tilNextMillis(final long lastTimestamp) {
        long timestamp = this.timeGen();
        while (timestamp <= lastTimestamp) {
            timestamp = this.timeGen();
        }
        return timestamp;
    }

    private long timeGen() {
        return System.currentTimeMillis();
    }

    /**
     * <p>
     * 獲取 maxWorkerId
     * </p>
     */
    protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
        StringBuffer mpid = new StringBuffer();
        mpid.append(datacenterId);
        String name = ManagementFactory.getRuntimeMXBean().getName();
        if (!name.isEmpty()) {
            /*
             * GET jvmPid
             */
            mpid.append(name.split("@")[0]);
        }
        /*
         * MAC + PID 的 hashcode 獲取16個低位
         */
        return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
    }

    /**
     * <p>
     * 數據標識id部分
     * </p>
     */
    protected static long getDatacenterId(long maxDatacenterId) {
        long id = 0L;
        try {
            InetAddress ip = InetAddress.getLocalHost();
            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            if (network == null) {
                id = 1L;
            } else {
                byte[] mac = network.getHardwareAddress();
                id = ((0x000000FF & (long) mac[mac.length - 1])
                        | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;
                id = id % (maxDatacenterId + 1);
            }
        } catch (Exception e) {
            System.out.println(" getDatacenterId: " + e.getMessage());
        }
        return id;
    }
}

用法如下:

IdWorker idWorker = new IdWorker(0, 0);
for (int i = 0; i < 1000; i++) {
    System.out.println(idWorker.nextId());
}

3.3 LEAF

Leaf 是美團開源的分布式 ID 生成系統,最早期需求是各個業務線的訂單 ID 生成需求。在美團早期,有的業務直接通過 DB 自增的方式生成 ID,有的業務通過 Redis 緩存來生成 ID,也有的業務直接用 UUID 這種方式來生成 ID。以上的方式各自有各自的問題,因此美團決定實現一套分布式 ID 生成服務來滿足需求目前 Leaf 覆蓋了美團點評公司內部金融、餐飲、外賣、酒店旅游、貓眼電影等眾多業務線。在4C8G VM 基礎上,通過公司 RPC 方式調用,QPS 壓測結果近 5w/s,TP999 1ms(TP=Top Percentile,Top 百分數,是一個統計學里的術語,與平均數、中位數都是一類。TP50、TP90 和 TP99 等指標常用于系統性能監控場景,指高于 50%、90%、99% 等百分線的情況)。

目前 LEAF 的使用有兩種不同的思路,號段模式和 SNOWFLAKE 模式,你可以同時開啟兩種方式,也可以指定開啟某種方式(默認兩種方式為關閉狀態)。

我們從 GitHub 上 Clone LEAF 之后,它的配置文件在 leaf-server/src/main/resources/leaf.properties 中,各項配置的含義如下:

圖片圖片

可以看到,如果使用號段模式,需要數據庫支持;如果使用 SNOWFLAKE 模式,需要 Zookeeper 支持。

3.3.1 號段模式

號段模式還是基于數據庫,但是思路有些變化,如下:

  1. 利用 proxy server 從數據庫中批量獲取 id,每次獲取一個 segment (step 決定其大小) 號段的值,用完之后再去數據庫獲取新的號段,可以大大的減輕數據庫的壓力。
  2. 各個業務不同的發號需求用 biz_tag 字段來區分,每個 biz-tag 的 ID 獲取相互隔離,互不影響。
  3. 如果有新的業務需要擴區 ID,只需要增加表記錄即可。

如果使用號段模式,我們首先需要創建一張數據表,腳本如下:

CREATE DATABASE leaf
CREATE TABLE `leaf_alloc` (
  `biz_tag` varchar(128)  NOT NULL DEFAULT '',
  `max_id` bigint(20) NOT NULL DEFAULT '1',
  `step` int(11) NOT NULL,
  `description` varchar(256)  DEFAULT NULL,
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB;

insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-segment-test', 1, 2000, 'Test leaf Segment Mode Get Id')

這張表中各項字段的含義如下:

  • biz_tag:業務標記(不同業務可以有不同的號段序列)
  • max_id:當前號段下的最大 id
  • step:每次取號段的步長
  • description:描述信息
  • update_time:更新時間

配置完成后,啟動項目,訪問 http://localhost:8080/api/segment/get/leaf-segment-test 路徑(路徑最后面的 leaf-segment-test 是業務標記),即可拿到 ID。

可以通過如下地址訪問到號段模式的監控頁面 http://localhost:8080/cache。

號段模式優缺點:

「優點」

  • Leaf 服務可以很方便的線性擴展,性能完全能夠支撐大多數業務場景。
  • ID 號碼是趨勢遞增的 8byte 的 64 位數字,滿足上述數據庫存儲的主鍵要求。
  • 容災性高:Leaf 服務內部有號段緩存,即使 DB 宕機,短時間內 Leaf 仍能正常對外提供服務。
  • 可以自定義 max_id 的大小,非常方便業務從原有的 ID 方式上遷移過來。

「缺點」

  • ID 號碼不夠隨機,能夠泄露發號數量的信息,不太安全。
  • DB 宕機會造成整個系統不可用。

3.3.2 SNOWFLAKE 模式

SNOWFLAKE 模式需要配合 Zookeeper 一起,不過 SNOWFLAKE 對 Zookeeper 的依賴是弱依賴,把 Zookeeper 啟動之后,我們可以在 SNOWFLAKE 中配置 Zookeeper 信息,如下:

leaf.snowflake.enable=true
leaf.snowflake.zk.address=192.168.91.130
leaf.snowflake.port=2183

然后重新啟動項目,啟動成功后,通過如下地址可以訪問到 ID:

http://localhost:8080/api/snowflake/get/test

3.4 Redis 生成

這個主要是利用 Redis 的 incrby 來實現,這個我覺得沒啥好說的。

3.5 Zookeeper 處理

zookeeper 也能做,但是比較麻煩,不推薦。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2021-08-04 10:38:51

分布式 ID策略

2025-08-05 08:30:08

2017-07-01 16:02:39

分布式ID生成器

2021-03-07 16:11:26

Redis分布式

2021-06-28 14:45:07

分布式框架操作

2019-09-05 13:06:08

雪花算法分布式ID

2024-09-18 00:00:10

UUID識別碼標志符

2025-06-10 08:30:50

2016-11-29 09:12:21

數據庫分布式ID

2024-02-22 17:02:09

IDUUID雪花算法

2021-06-05 07:33:09

ID分布式架構

2024-11-13 00:57:36

2023-02-14 08:32:41

Ribbon負載均衡

2021-05-08 08:01:05

Session登錄瀏覽器

2022-02-23 07:09:30

分布式ID雪花算法

2022-03-14 07:40:14

RibbonSpringNacos

2014-01-10 10:42:33

2022-12-30 17:52:44

分布式容錯架構

2023-12-12 07:13:39

雪花算法分布式ID

2024-12-02 13:08:28

點贊
收藏

51CTO技術棧公眾號

国产在线国偷精品免费看| 欧美一级二级三级区| 伊人久久亚洲热| 日韩国产精品视频| 中文字幕无码不卡免费视频| 在线看的av网站| 国产不卡视频一区二区三区| 7m精品福利视频导航| 天天摸日日摸狠狠添| 2020国产精品极品色在线观看| 精品久久久久久久久国产字幕| 亚洲成人网上| 亚洲欧美国产高清va在线播放| 鲁大师成人一区二区三区| 日韩在线高清视频| 亚洲av成人无码一二三在线观看| 国产成人精选| 精品人伦一区二区三区蜜桃网站 | 成人精品久久| 精品日韩欧美一区二区| www.99av.com| 手机在线观看av| 亚洲天天做日日做天天谢日日欢| 欧美精品亚洲精品| 亚洲美女综合网| 另类小说一区二区三区| 浅井舞香一区二区| 欧美黑人一级片| 日韩电影一区| 国产丝袜精品视频| 激情小说欧美色图| 四虎国产精品免费久久| 一本大道av一区二区在线播放 | 成人区精品一区二区不卡| 波多野结衣中文一区| 亚洲专区在线视频| 一级黄色大片免费| 久久蜜桃精品| 97视频在线观看视频免费视频| 黄色录像免费观看| 成人在线免费观看视频| 亚洲老头老太hd| 91九色蝌蚪porny| 嫩呦国产一区二区三区av| 欧美三级电影网| 激情网站五月天| 欧美人与性动交α欧美精品济南到 | 久久精品国产亚洲a∨麻豆| 成人免费黄色在线| 51国偷自产一区二区三区| 国产精品一二三四五区| 狠狠色综合日日| 成人在线精品视频| 国产精品自偷自拍| 国内久久婷婷综合| 亚洲综合中文字幕在线观看| 国产精品久久欧美久久一区| 国精品**一区二区三区在线蜜桃| 国产日韩在线一区| 国产精品毛片久久久久久久av| 久久国产精品99久久人人澡| 成人a视频在线观看| 国产免费视频一区二区三区| 国产一区二区三区香蕉| 亚洲最大的免费| 性做久久久久久久| 成人av免费观看| 久久青青草原一区二区| 美国一级片在线免费观看视频| 久久久精品中文字幕麻豆发布| 日本高清一区| a天堂在线资源| 中文字幕一区二区三区四区| 18视频在线观看娇喘| 亚洲综合影视| 午夜不卡av在线| 日本一极黄色片| 素人一区二区三区| 欧美久久一二三四区| 中文字幕无人区二| 九九久久精品| 久久精品视频99| 不卡的免费av| 久久激情久久| 成人福利在线视频| 无码精品黑人一区二区三区 | 欧美成人猛片aaaaaaa| 国产精品久久无码| 成人激情视频| 韩国日本不卡在线| 中文在线最新版天堂| 国产成人免费av在线| 欧美18视频| 老司机精品影院| 五月婷婷色综合| 亚洲国产高清av| 第四色在线一区二区| 在线观看日韩专区| 久久久久久av无码免费网站| 三级久久三级久久久| 91久久精品一区二区别| 青春草在线观看 | 中文字幕一区二区三区有限公司| 污视频在线免费观看网站| 欧美午夜激情在线| 制服下的诱惑暮生| 国产精品嫩模av在线| 九九久久综合网站| 老熟妇一区二区三区啪啪| 国产盗摄精品一区二区三区在线 | xxxx视频在线观看| 欧美一区二区麻豆红桃视频| 欧美第一黄网免费网站| 草莓视频18免费观看| 不卡的av电影在线观看| 一本久久a久久精品vr综合 | 欧美13一16娇小xxxx| 欧美性xxxx极品高清hd直播 | 亚洲国产中文在线| 在线精品视频视频中文字幕| 日韩精品人妻中文字幕| 国内精品视频666| 午夜精品一区二区三区在线观看 | 色丁香久综合在线久综合在线观看| 青青草精品在线| 久久精品高清| 国产成人a亚洲精品| 高清毛片aaaaaaaaa片| 亚洲女同ⅹxx女同tv| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| av综合网址| 欧美日韩成人网| aaa一区二区三区| 国产精品美女一区二区| 草草草在线视频| 亚洲精品国产精品粉嫩| 亚洲97在线观看| 黑人精品一区二区| 一区二区三区日韩精品视频| www激情五月| 国产精品久久久久蜜臀| 成人激情免费在线| 三区四区在线视频| 欧美群妇大交群的观看方式| 国产成人免费观看网站| 男女男精品视频| 亚洲国产午夜伦理片大全在线观看网站 | 国产精品美女久久久久久久久| 国产a级一级片| 亚洲另类av| 日韩美女免费观看| 精华区一区二区三区| 在线亚洲一区观看| 鲁丝一区二区三区| 日本欧美大码aⅴ在线播放| 日韩精品大片| 国产精品亲子伦av一区二区三区| 在线播放日韩精品| 91免费视频播放| 亚洲色图视频免费播放| 人妻巨大乳一二三区| 欧美特黄一级| 狠狠色综合色区| 日韩激情电影| 一区国产精品视频| 国产又粗又猛又爽又黄91| 亚洲欧美日韩中文播放| 黄色国产在线视频| 久久综合图片| 亚洲精品第一区二区三区| 97色婷婷成人综合在线观看| 欧美日韩国产成人| 无码精品在线观看| 在线观看日韩电影| 99自拍视频在线| 成人午夜私人影院| 国产一区亚洲二区三区| 日韩av密桃| 亚洲一区亚洲二区亚洲三区| а√天堂中文在线资源8| 亚洲精品一区中文字幕乱码| 中文字幕免费观看视频| 亚洲自拍偷拍网站| 亚洲国产无码精品| 极品少妇xxxx精品少妇| 人体内射精一区二区三区| 综合亚洲自拍| 成人福利在线观看| 阿v视频在线观看| 中文字幕av一区中文字幕天堂| a天堂中文在线观看| 精品久久久久国产| 亚洲 欧美 变态 另类 综合| 成人高清免费观看| 天天干天天干天天干天天干天天干| 亚洲九九视频| 欧美精品一区二区三区在线四季| 91麻豆精品| 欧美一区二区三区免费观看| 精品视频在线一区二区| 亚洲精品小视频在线观看| av天堂一区二区三区| 欧美日韩国产中字| 麻豆明星ai换脸视频| 94色蜜桃网一区二区三区| 特级黄色片视频| 国产一区二区三区久久| 欧美 日韩 国产精品| 国产一区二区三区四区二区| av资源站久久亚洲| 久久女人天堂| 热re91久久精品国99热蜜臀| 国产深夜视频在线观看| 在线视频免费一区二区| 亚洲色图21p| 日韩一级大片在线观看| 一区二区乱子伦在线播放| 午夜视频久久久久久| 午夜少妇久久久久久久久| 国产精品丝袜一区| 色婷婷av777| 99久久伊人网影院| 日本美女视频网站| 国产一区二区三区四| 久久精品免费网站| 久久不射中文字幕| 成人在线观看你懂的| 综合在线视频| 9l视频自拍9l视频自拍| 日韩理论电影院| 日本不卡一区二区三区视频| 美女视频免费精品| 国产精品区一区| 一区二区在线免费播放| 亚洲一区二区三区香蕉 | 国产免费一区二区三区| 免费观看在线一区二区三区| 国产日韩欧美视频在线| 国产成人免费精品| 国产日本欧美一区| 激情小说亚洲| 国产精品美女www| yy6080久久伦理一区二区| 国产成人一区二区| 日韩大尺度黄色| 国产99视频精品免视看7| 韩国成人漫画| 日韩av高清不卡| 欧美日韩五码| 国产精品免费看久久久香蕉| 欧美日韩女优| 国产美女搞久久| 91成人短视频在线观看| 91gao视频| 第四色在线一区二区| 国产精品福利视频| 欧美电影完整版在线观看| 久久婷婷国产综合尤物精品| 要久久爱电视剧全集完整观看| 狠狠色狠狠色合久久伊人| 国产麻花豆剧传媒精品mv在线| 香蕉成人久久| 一区二区三区国产免费| 久久精品国产精品青草| 亚洲男人天堂2021| 成人美女视频在线观看18| 成人手机在线免费视频| 国产亚洲精品bt天堂精选| 一二三四在线观看视频| 亚洲日本护士毛茸茸| 国产精品第108页| 精品久久久国产| 亚洲天堂2021av| 日韩精品中文字幕一区二区三区 | 亚洲午夜国产成人| 亚洲一区二区自拍| 欧美天堂影院| 神马影院我不卡| 综合精品一区| 久久国产亚洲精品无码| 免费人成网站在线观看欧美高清| www.欧美激情.com| av午夜精品一区二区三区| 欧美另类z0zx974| 亚洲品质自拍视频| 国产a∨精品一区二区三区仙踪林| 在线观看亚洲专区| 国产成人免费看一级大黄| 日韩电影网在线| 91成人高清| 97在线视频免费播放| 成人一区视频| 国产自产精品| 在线成人直播| 欧美黄色一级片视频| 国产大陆精品国产| 夜夜春很很躁夜夜躁| 亚洲国产视频一区二区| 波多野结衣影片| 欧美精品一区二区三区四区| av福利在线播放| 97成人精品区在线播放| 在线欧美激情| 欧美午夜精品久久久久免费视| 一区二区在线| 国产一级特黄a大片免费| 不卡av免费在线观看| 久久精品黄色片| 欧美综合亚洲图片综合区| 五月婷婷狠狠干| 久久99久久99精品中文字幕| 99久久精品一区二区成人| 狠狠色综合网站久久久久久久| 伊人久久大香线蕉综合四虎小说| 亚洲精品中文字幕无码蜜桃| 成人国产精品免费观看视频| 欧美手机在线观看| 欧美日韩一区三区| 男女视频在线观看| 国外成人免费在线播放 | 久久久综合亚洲91久久98| 亚洲私人影院| 性高潮久久久久久| 国产精品国产馆在线真实露脸 | 国产第一页第二页| 日韩欧美在线1卡| 欧美一区二区三区在线观看免费| 国产精品扒开腿做| 久久综合亚洲| 国产免费黄视频| 99久久免费国产| 国产在线成人精品午夜| 精品国产一区二区三区忘忧草| 尤物在线网址| 97视频资源在线观看| 亚洲字幕久久| 天天久久综合网| 中文字幕一区二区三| 中文字幕在线一| 色一区av在线| 成人免费毛片嘿嘿连载视频…| 欧美精品七区| 日韩中文字幕区一区有砖一区 | 911av视频| 亚洲三级电影网站| 国产视频手机在线观看| 久久精品一区中文字幕| 亚洲网站免费| 黄黄视频在线观看| 国产乱码精品一区二区三区五月婷| chinese全程对白| 欧美一级理论性理论a| 自由的xxxx在线视频| 国产成人精品免费视频大全最热| 欧美日韩国产成人精品| 精品伦一区二区三区| 亚洲国产综合色| 天天射天天操天天干| 欧洲精品毛片网站| 精品久久国产| 另类小说第一页| 亚洲日本在线看| 亚洲高清视频在线播放| 亚州成人av在线| 精品少妇av| 色婷婷一区二区三区在线观看| 亚洲免费观看高清完整| 国产自产一区二区| 欧美在线欧美在线| 久久激情电影| 欧美日韩一区二区区别是什么| 五月婷婷综合网| 在线免费看黄| av蓝导航精品导航| 久久激情中文| 成人无码精品1区2区3区免费看 | 天堂av在线免费| 国产精品福利久久久| 亚洲激情中文| 黄色片视频免费观看| 在线视频观看一区| 黄色网页在线免费看| 国产在线一区二区三区四区| 亚洲在线观看av| 中文字幕亚洲二区| 一区二区三区视频免费视频观看网站 | 日韩欧美综合在线视频| 在线观看黄色av| 国产精品一区二区三区四区五区| 日韩电影在线免费看| 免费人成视频在线| 亚洲一区二区久久久| 亚洲高清999| 国产精品少妇在线视频| 亚洲精品乱码久久久久| 免费资源在线观看| 成人免费91在线看| 丝袜亚洲另类欧美| 日本天堂在线视频| 日韩中文字幕不卡视频|