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

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

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

[[415300]]

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

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

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

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

1. 兩種思路

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

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

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

2. 數據庫自己搞定

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

2.1 修改數據庫配置

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

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

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

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

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

  1. SHOW VARIABLES LIKE 'auto_increment%' 

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

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

  1. set @@auto_increment_increment=9; 

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

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

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

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

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

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

2.2 MySQL+MyCat+ZooKeeper

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

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

  • 通過本地文件實現
  • 通過數據庫實現
  • 通過本地時間戳實現
  • 通過分布式 ZK ID 生成器實現
  • 通過 ZK 遞增方式實現

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

配置步驟如下:

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

server.xml

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

schema.xml

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

  • 配置 zookeeper 的信息

在 myid.properties 中配置 zookeeper 信息:

  • 配置要自增的表

sequence_conf.properties

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

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

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

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

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

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

3. Java 代碼處理

3.1 UUID

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

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

因此,UUID 并非最佳方案。

3.2 SNOWFLAKE

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

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

例如 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 年,相信能滿足絕大部分系統(tǒng)的要求。

  • 工作進程位 (10bit)

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

  • 序列號位 (12bit)

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

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

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

  1. public class IdWorker { 
  2.     // 時間起始標記點,作為基準,一般取系統(tǒng)的最近時間(一旦確定不能變動) 
  3.     private final static long twepoch = 1288834974657L; 
  4.     // 機器標識位數 
  5.     private final static long workerIdBits = 5L; 
  6.     // 數據中心標識位數 
  7.     private final static long datacenterIdBits = 5L; 
  8.     // 機器ID最大值 
  9.     private final static long maxWorkerId = -1L ^ (-1L << workerIdBits); 
  10.     // 數據中心ID最大值 
  11.     private final static long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); 
  12.     // 毫秒內自增位 
  13.     private final static long sequenceBits = 12L; 
  14.     // 機器ID偏左移12位 
  15.     private final static long workerIdShift = sequenceBits; 
  16.     // 數據中心ID左移17位 
  17.     private final static long datacenterIdShift = sequenceBits + workerIdBits; 
  18.     // 時間毫秒左移22位 
  19.     private final static long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; 
  20.  
  21.     private final static long sequenceMask = -1L ^ (-1L << sequenceBits); 
  22.     /* 上次生產id時間戳 */ 
  23.     private static long lastTimestamp = -1L; 
  24.     // 0,并發(fā)控制 
  25.     private long sequence = 0L; 
  26.  
  27.     private final long workerId; 
  28.     // 數據標識id部分 
  29.     private final long datacenterId; 
  30.  
  31.     public IdWorker(){ 
  32.         this.datacenterId = getDatacenterId(maxDatacenterId); 
  33.         this.workerId = getMaxWorkerId(datacenterId, maxWorkerId); 
  34.     } 
  35.  
  36.     /** 
  37.      * @param workerId 
  38.      *            工作機器ID 
  39.      * @param datacenterId 
  40.      *            序列號 
  41.      */ 
  42.     public IdWorker(long workerId, long datacenterId) { 
  43.         if (workerId > maxWorkerId || workerId < 0) { 
  44.             throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); 
  45.         } 
  46.         if (datacenterId > maxDatacenterId || datacenterId < 0) { 
  47.             throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); 
  48.         } 
  49.         this.workerId = workerId; 
  50.         this.datacenterId = datacenterId; 
  51.     } 
  52.  
  53.     /** 
  54.      * 獲取下一個ID 
  55.      * 
  56.      * @return 
  57.      */ 
  58.     public synchronized long nextId() { 
  59.         long timestamp = timeGen(); 
  60.         if (timestamp < lastTimestamp) { 
  61.             throw new RuntimeException(String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); 
  62.         } 
  63.  
  64.         if (lastTimestamp == timestamp) { 
  65.             // 當前毫秒內,則+1 
  66.             sequence = (sequence + 1) & sequenceMask; 
  67.             if (sequence == 0) { 
  68.                 // 當前毫秒內計數滿了,則等待下一秒 
  69.                 timestamp = tilNextMillis(lastTimestamp); 
  70.             } 
  71.         } else { 
  72.             sequence = 0L; 
  73.         } 
  74.         lastTimestamp = timestamp
  75.         // ID偏移組合生成最終的ID,并返回ID 
  76.         long nextId = ((timestamp - twepoch) << timestampLeftShift) 
  77.                 | (datacenterId << datacenterIdShift) 
  78.                 | (workerId << workerIdShift) | sequence
  79.  
  80.         return nextId; 
  81.     } 
  82.  
  83.     private long tilNextMillis(final long lastTimestamp) { 
  84.         long timestamp = this.timeGen(); 
  85.         while (timestamp <= lastTimestamp) { 
  86.             timestamp = this.timeGen(); 
  87.         } 
  88.         return timestamp
  89.     } 
  90.  
  91.     private long timeGen() { 
  92.         return System.currentTimeMillis(); 
  93.     } 
  94.  
  95.     /** 
  96.      * <p> 
  97.      * 獲取 maxWorkerId 
  98.      * </p> 
  99.      */ 
  100.     protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) { 
  101.         StringBuffer mpid = new StringBuffer(); 
  102.         mpid.append(datacenterId); 
  103.         String name = ManagementFactory.getRuntimeMXBean().getName(); 
  104.         if (!name.isEmpty()) { 
  105.             /* 
  106.              * GET jvmPid 
  107.              */ 
  108.             mpid.append(name.split("@")[0]); 
  109.         } 
  110.         /* 
  111.          * MAC + PID 的 hashcode 獲取16個低位 
  112.          */ 
  113.         return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1); 
  114.     } 
  115.  
  116.     /** 
  117.      * <p> 
  118.      * 數據標識id部分 
  119.      * </p> 
  120.      */ 
  121.     protected static long getDatacenterId(long maxDatacenterId) { 
  122.         long id = 0L; 
  123.         try { 
  124.             InetAddress ip = InetAddress.getLocalHost(); 
  125.             NetworkInterface network = NetworkInterface.getByInetAddress(ip); 
  126.             if (network == null) { 
  127.                 id = 1L; 
  128.             } else { 
  129.                 byte[] mac = network.getHardwareAddress(); 
  130.                 id = ((0x000000FF & (long) mac[mac.length - 1]) 
  131.                         | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6; 
  132.                 id = id % (maxDatacenterId + 1); 
  133.             } 
  134.         } catch (Exception e) { 
  135.             System.out.println(" getDatacenterId: " + e.getMessage()); 
  136.         } 
  137.         return id; 
  138.     } 

用法如下:

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

3.3 LEAF

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

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

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

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

3.3.1 號段模式

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

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

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

  1. CREATE DATABASE leaf 
  2. CREATE TABLE `leaf_alloc` ( 
  3.   `biz_tag` varchar(128)  NOT NULL DEFAULT ''
  4.   `max_id` bigint(20) NOT NULL DEFAULT '1'
  5.   `step` int(11) NOT NULL
  6.   `description` varchar(256)  DEFAULT NULL
  7.   `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
  8.   PRIMARY KEY (`biz_tag`) 
  9. ) ENGINE=InnoDB; 
  10.  
  11. insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-segment-test', 1, 2000, 'Test leaf Segment Mode Get Id'

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

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

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

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

號段模式優(yōu)缺點:

優(yōu)點

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

缺點

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

3.3.2 SNOWFLAKE 模式

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

  1. leaf.snowflake.enable=true 
  2. leaf.snowflake.zk.address=192.168.91.130 
  3. leaf.snowflake.port=2183 

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

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

3.4 Redis 生成

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

3.5 Zookeeper 處理

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

4. 小結

綜上,如果項目中恰好使用了 MyCat,那么可以使用 MyCat+Zookeeper,否則建議使用 LEAF,兩種模式皆可。

本文轉載自微信公眾號「江南一點雨」,可以通過以下二維碼關注。轉載本文請聯(lián)系江南一點雨公眾號。

 

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

2024-03-28 10:01:38

2025-08-05 08:30:08

2021-03-07 16:11:26

Redis分布式

2017-07-01 16:02:39

分布式ID生成器

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雪花算法

2023-02-14 08:32:41

Ribbon負載均衡

2021-06-05 07:33:09

ID分布式架構

2024-11-13 00:57:36

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技術棧公眾號

欧美国产禁国产网站cc| 免费日韩av| 精品少妇一区二区三区在线播放| 久久亚洲a v| 日韩电影在线观看完整版| 老司机精品视频网站| 久久久国产一区二区三区| av免费观看不卡| 成人国产一区二区三区精品麻豆| 亚洲日本一区二区三区| 国产综合动作在线观看| 亚洲一卡二卡在线观看| 亚洲黄色影片| 日韩中文字幕视频在线| 波多野结衣影院| 亚洲一区导航| 一本一道久久a久久精品综合蜜臀| 一本色道久久综合亚洲二区三区 | 色偷偷久久人人79超碰人人澡| 亚洲蜜桃av| 天堂国产一区二区三区| 精品系列免费在线观看| 欧美野外猛男的大粗鳮| 欧美爱爱小视频| 欧美艳星介绍134位艳星| 亚洲精品一区二区三区福利| 三上悠亚在线一区二区| 在线看的毛片| 亚洲午夜久久久| 麻豆中文字幕在线观看| 九色在线观看视频| 99re这里只有精品6| 成人av影视在线| 国产毛片一区二区三区va在线| 日韩专区欧美专区| 欧美性视频精品| 黄色小说在线观看视频| 中文一区一区三区免费在线观看| 伊是香蕉大人久久| 88久久精品无码一区二区毛片| 97一区二区国产好的精华液| 69久久99精品久久久久婷婷 | 欧州一区二区三区| 欧美日韩亚洲一区二区| www.九色.com| 性欧美ⅴideo另类hd| 最新中文字幕一区二区三区| 亚洲免费不卡| 欧洲不卡视频| 中文字幕第一区综合| 欧美日韩一区在线视频| 亚洲欧美日韩动漫| 99r精品视频| 久久久久久久久久久久久久一区 | 欧美色片在线观看| 日韩欧美一区视频| 无码人妻精品一区二区三区在线| 波多一区二区| 天天综合网天天综合色| 国产二区视频在线播放| 韩日成人影院| 欧美午夜精品一区| 亚洲免费av一区| 国产美女视频一区二区| 欧美成人高清电影在线| 91九色蝌蚪porny| 激情小说一区| 国产视频在线观看一区二区| www.色天使| 大胆日韩av| 久久亚洲精品一区二区| 国产盗摄x88av| 国一区二区在线观看| 欧美精品激情视频| 手机在线看片1024| 日本免费新一区视频| 成人免费激情视频| 黄色小视频免费观看| 91网址在线看| 一区二区三区四区视频在线观看 | 久久久久久久一区二区| 久久露脸国语精品国产91| 国产精品入口| 国产精品一香蕉国产线看观看| 一区二区三区黄色片| 国产成人高清视频| 久久综合婷婷综合| 在线视频二区| 亚洲国产视频直播| caoporn超碰97| 韩国三级大全久久网站| 亚洲韩国青草视频| 国产黄色录像视频| 欧美日韩理论| 国产精品扒开腿做爽爽爽的视频| 国产三级第一页| 91老师片黄在线观看| 亚洲精品人成| 极品av在线| 欧美日韩视频专区在线播放| 特级特黄刘亦菲aaa级| 国产不卡一二三区| 久久99久久99精品免观看粉嫩| 午夜影院在线看| 精彩视频一区二区| 美女被啪啪一区二区| 老司机精品视频在线观看6| 欧美日韩免费在线| www.51色.com| 蜜桃a∨噜噜一区二区三区| 欧美另类高清videos| 国产亚洲欧美日韩高清| 成人激情小说网站| 亚洲一卡二卡三卡四卡无卡网站在线看 | 日韩精品一卡二卡| 激情五月激情综合网| 蜜桃传媒一区二区| 国产精品186在线观看在线播放| 在线观看国产一区二区| 中文字幕在线永久| 一区二区三区四区在线观看国产日韩 | 久久偷窥视频| www免费视频观看在线| 在线免费不卡视频| 国产福利在线观看视频| 欧美欧美全黄| 亚洲一区二区在线| av在线中文| 色综合久久久久网| 一级欧美一级日韩片| 欧美日韩精选| 91黄色精品| 日本黄色片在线观看| 在线视频中文字幕一区二区| 日本一区二区三区网站| 亚洲大黄网站| 粉嫩av四季av绯色av第一区| 国产在线观看91| 欧美日韩一区二区不卡| 天天干天天舔天天操| 亚洲欧美卡通另类91av| 国产三区精品| av在线网页| 精品国产乱码久久久久久影片| 超碰手机在线观看| 精品无人区卡一卡二卡三乱码免费卡| 亚洲一卡二卡三卡| 国产精品久久久久久久久久齐齐| 亚洲人精品午夜在线观看| 丁香六月婷婷综合| 久久影院视频免费| 亚洲精品中文字幕无码蜜桃| 国产精品一区二区99| 国产精品99久久久久久久久| 加勒比一区二区三区在线| 在线观看视频91| 性猛交娇小69hd| 日本不卡高清视频| 一区二区三区不卡在线| 国产999精品在线观看| 超碰91人人草人人干| 亚洲黄色小说网| 亚洲成人免费视频| 疯狂揉花蒂控制高潮h| 亚洲在线黄色| 亚洲国产日韩欧美| 高清在线一区二区| 久久久久久久久电影| 亚洲色大成网站www| 色诱亚洲精品久久久久久| 人人妻人人澡人人爽| 紧缚奴在线一区二区三区| 欧洲金发美女大战黑人| 久草在线综合| 国产精品九九九| 久久久久久久久免费视频| 日韩视频一区在线观看| 国产成人在线免费观看视频| 国产日产欧美精品一区二区三区| 无尽裸体动漫2d在线观看| 欧美激情性爽国产精品17p| 国产伦精品一区二区三区在线| 成人爽a毛片免费啪啪| 深夜福利91大全| 亚洲第一色网站| 色偷偷一区二区三区| √天堂中文官网8在线| 成人激情免费网站| 婷婷激情四射五月天| 欧美日本中文| 欧美人xxxxx| 国产精品日韩精品在线播放| 8090成年在线看片午夜| 日本精品在线| 亚洲精品一区二区在线| 国产又大又粗又硬| 午夜精品久久久久久| 粉嫩精品久久99综合一区| 国产福利一区在线| 成人一区二区三| 亚洲欧美亚洲| 色婷婷精品国产一区二区三区| 香蕉成人app| 国产精品福利在线观看| 丁香高清在线观看完整电影视频| 国产亚洲精品久久久| 日韩在线视频第一页| 欧美美女一区二区在线观看| 久久久久久久久久免费视频 | 精品国产欧美日韩一区二区三区| 久久99久久99精品免观看粉嫩| freemovies性欧美| 亚洲精品99久久久久| 国产精品视频无码| 日本高清不卡在线观看| 日本在线小视频| 亚洲天堂免费在线观看视频| 亚洲av无码国产精品麻豆天美| 大白屁股一区二区视频| av在线网址导航| 日韩国产高清影视| 国产一级爱c视频| 午夜精品久久99蜜桃的功能介绍| 日韩欧美在线一区二区| 精品自拍偷拍| 国产视频在线观看一区| 欧美久久亚洲| 91中文字幕在线| 日韩福利影视| 国产精品爽爽爽爽爽爽在线观看| 厕沟全景美女厕沟精品| 国产综合在线看| 久久香蕉一区| 色综合视频一区中文字幕| 成人黄视频在线观看| 久久精品男人天堂| 麻豆tv免费在线观看| 日韩视频在线观看免费| a√资源在线| 日韩视频中文字幕| 69久久夜色| 色婷婷综合久久久久| 成人网视频在线观看| 亚洲午夜小视频| 黄色软件在线观看| 亚洲图片欧美日产| 酒色婷婷桃色成人免费av网| 亚洲欧美国产一区二区三区| 男女av在线| 在线观看精品自拍私拍| 69视频在线观看| 日韩一区二区久久久| 国产激情在线视频| 九九综合九九综合| 日本在线观看大片免费视频| 欧美黑人狂野猛交老妇| 成年网站在线视频网站| 91国偷自产一区二区三区的观看方式| av漫画网站在线观看| 91成人天堂久久成人| 久久电影tv| 国产美女搞久久| 电影一区二区三区久久免费观看| 18成人免费观看网站下载| 成人直播在线观看| 免费久久一级欧美特大黄| 精品国产91| 裸体裸乳免费看| 国产精品va| 日韩av一二三四区| 日本在线不卡视频一二三区| 91小视频在线播放| 成人午夜在线视频| 波多野结衣 在线| 国产精品欧美一区二区三区| 综合五月激情网| 欧美日韩激情视频| 中文字幕一区二区三区人妻四季| 欧美一区二区视频免费观看| 高潮毛片7777777毛片| 亚洲精品自在久久| 日韩毛片久久久| 欧美激情影音先锋| 成人日韩在线观看| 亚洲影院色无极综合| 久久99精品国产自在现线| 午夜精品区一区二区三| 欧美日本二区| 国产精品无码一本二本三本色| 狠狠色丁香婷综合久久| 色婷婷精品久久二区二区密| 亚洲国产精品黑人久久久| 欧美日韩国产精品综合| 色综合中文综合网| 国产男女裸体做爰爽爽| 亚洲免费成人av电影| 黄av在线免费观看| 日韩av男人的天堂| 亚洲精品一区国产| 亚洲一区免费看| 国产精品久久777777毛茸茸| 亚洲一二三av| 久久久综合精品| 久久久久久欧美精品se一二三四| 91黄色免费观看| 欧美自拍第一页| 久久精品国产一区| 欧美日韩不卡| 国产自产精品| 欧美午夜影院| 性生活免费在线观看| 99视频精品在线| 永久免费看黄网站| 欧美在线你懂的| 三级视频网站在线| 欧美国产精品va在线观看| 日韩伦理一区二区| 青青草原成人| 香蕉久久夜色精品| 久久性爱视频网站| 亚洲精品高清视频在线观看| 一本一道人人妻人人妻αv| 日韩精品中文字幕久久臀| 日韩精品分区| 91一区二区三区| 香蕉综合视频| 国产福利在线免费| 国产日韩欧美一区二区三区乱码| 青青草av在线播放| 亚洲国产中文字幕在线观看| 欧美女同一区| 波多野结衣成人在线| 91精品在线观看国产| 欧美成人乱码一二三四区免费| 国产欧美日韩不卡免费| 亚洲色成人www永久网站| 亚洲精品一区久久久久久| 天堂√8在线中文| 国产九色精品| 欧美日本在线| 手机免费看av片| 亚洲一区二区影院| 精品国产无码一区二区| 久久久精品国产网站| www.久久99| 美女在线免费视频| 福利一区二区在线观看| 欧洲猛交xxxx乱大交3| 日韩免费一区二区| 女人黄色免费在线观看| 国产精品theporn88| 极品日韩av| 中文字幕在线播放视频| 欧美午夜xxx| 蜜桃视频在线观看网站| 国产精品白嫩美女在线观看| 不卡一区综合视频| 亚洲色图偷拍视频| 一区二区三区四区中文字幕| 午夜免费福利视频| 午夜精品久久久久久久男人的天堂| 国产成人精品亚洲线观看| 国内性生活视频| 26uuu另类欧美| 日本欧美www| 久久精品国产免费观看| 无人区乱码一区二区三区| 国产原创中文在线观看| 久久蜜桃一区二区| 91精品人妻一区二区三区果冻| 久久精品久久久久久国产 免费| 一区二区三区国产好| 夫妻免费无码v看片| 国产亚洲精品aa| 国产精品伦理一区| 久久久免费av| 欧美欧美黄在线二区| 国产aⅴ爽av久久久久| 亚洲国产综合人成综合网站| 日av在线播放| 成人激情春色网| 一本综合精品| 懂色av粉嫩av浪潮av| 欧美变态凌虐bdsm| 日韩精品一区二区三区| 在线免费观看成人| 成人黄色av电影| 羞羞色院91蜜桃| 欧美激情视频一区二区| 国产成人精品一区二区免费看京| 国产女同无遮挡互慰高潮91| 亚洲va国产va欧美va观看| 黄色片在线免费观看| 成人高清在线观看| 日韩av中文在线观看| 国产精品7777| 日韩在线资源网| 中文字幕av一区二区三区人| 91精品视频国产| 欧美在线视频你懂得|