精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

www.日韩高清| 欧美日本免费一区二区三区| 91精品久久久久久久91蜜桃 | 超碰资源在线| 欧美疯狂party性派对| www.欧美日韩国产在线| 久久韩国免费视频| 成年人小视频网站| 人妻妺妺窝人体色www聚色窝| 亚洲成人tv| 欧美日韩精品一二三区| 国产资源在线免费观看| 国产丝袜视频在线观看| 久久一本综合| 亚洲国产精品女人久久久| 特级西西人体www高清大胆| 888奇米影视| 成人网18免费网站| 在线观看日韩国产| 日韩欧美一区二区视频在线播放| 一级成人黄色片| 亚洲bt欧美bt精品777| 午夜影视日本亚洲欧洲精品| www 成人av com| 超碰手机在线观看| 日韩激情精品| 亚洲午夜在线电影| 国产伦精品一区二区三区四区免费| 日本a级片视频| 人人爱人人干婷婷丁香亚洲| 欧美综合亚洲图片综合区| 国产精品久久久久久久久电影网| www日本高清视频| 日韩高清在线电影| 最近2019年日本中文免费字幕| 国产主播中文字幕| 色网站在线看| 国产乱码字幕精品高清av| 久久91精品国产| 国产成人精品综合久久久久99 | 国产美女撒尿一区二区| 亚洲va欧美va人人爽| 在线观看欧美一区| 性欧美18一19性猛交| 老司机午夜精品| 久久香蕉频线观| 成人一区二区三区仙踪林| a级片免费在线观看| 不卡高清视频专区| 国产精品大片wwwwww| 午夜激情视频在线播放| 91精品入口| 色婷婷国产精品综合在线观看| 先锋在线资源一区二区三区| 成人1区2区3区| 国产专区欧美精品| 555www成人网| 亚洲精品一区二区三区在线播放| 欧美日一区二区| 日韩一区二区三区视频| 欧美 国产 小说 另类| 亚洲搞黄视频| 中文字幕第一区二区| 懂色一区二区三区av片| 不卡av电影在线| 欧美激情日韩| 伊人青青综合网站| 亚洲乱妇老熟女爽到高潮的片 | 人妻精品久久久久中文字幕69| 亚洲爽爆av| 精品成人久久av| 亚洲欧美精品| 亚洲av成人无码网天堂| 理论电影国产精品| 亚洲综合中文字幕在线观看| 天码人妻一区二区三区在线看| 亚洲综合丁香| 欧美日韩国产999| 国产无遮挡又黄又爽| 欧美激情另类| 欧美二区在线播放| 日本免费www| 久久精品国产亚洲5555| 69堂国产成人免费视频| 天天色天天干天天色| 丝袜美腿一区| 午夜成人在线视频| 成人观看免费完整观看| 久久福利在线| 在线观看日韩毛片| 亚洲一区二区偷拍| 久久久免费人体| 欧美电视剧在线看免费| 爱豆国产剧免费观看大全剧苏畅| 美女网站视频一区| 婷婷夜色潮精品综合在线| 免费高清在线观看免费| 涩涩涩久久久成人精品| 在线观看中文字幕不卡| 97人人爽人人| 久久九九热re6这里有精品| 国产一区二区三区在线| 久久精品成人av| 欧美日韩直播| 亚洲黄色www网站| 99在线视频免费| 91成人噜噜噜在线播放| 国产亚洲欧美日韩一区二区| 欧美色图亚洲天堂| 免费人成精品欧美精品| 国产精品久久久久久久久| 精品国产伦一区二区三| 国产亚洲一区二区三区在线观看| 久久综合毛片| 日夜干在线视频| 久久这里只精品最新地址| 就去色蜜桃综合| 久久国产精品一区| 成人欧美一区二区三区1314| 制服诱惑一区| 六月婷婷综合| 在线免费观看视频一区| 色悠悠在线视频| 99久久婷婷| 久久在精品线影院精品国产| 最新中文字幕一区| 日本中文字幕一区二区视频 | 精品国产鲁一鲁****| 宅男噜噜噜66一区二区66| 国产美女喷水视频| 精品国精品国产自在久国产应用| 久久99国产精品久久久久久久久| 中文字幕 欧美激情| 麻豆成人91精品二区三区| 欧美成人一区二区在线| 999av小视频在线| 日韩欧美国产一区二区三区| 多男操一女视频| 久久精品理论片| 日韩视频在线播放| 欧美特黄aaaaaaaa大片| 日韩国产精品视频| 成年人看的免费视频| 美女网站久久| 国产一区二区在线免费视频| 性生活三级视频| 97se亚洲国产综合自在线 | 欧美日韩精品在线一区| 51精品国产黑色丝袜高跟鞋 | 在线看福利67194| 亚洲中文字幕无码爆乳av| 日本美女一区二区三区| 欧美日韩在线精品| 国内外激情在线| 欧美日韩国产123区| www中文在线| 精一区二区三区| 国产伦精品一区二区三区照片| 欧美hdxxx| 欧美影院精品一区| 日本少妇一级片| 欧美激情一级片一区二区| 45www国产精品网站| 色综合888| 在线观看视频91| 色哟哟一一国产精品| 国产精品一区二区免费不卡| 人人妻人人澡人人爽欧美一区| 日韩中文字幕无砖| 97av视频在线| 国产视频在线观看视频| 亚洲激情一二三区| www.99在线| 国产精品久久久久蜜臀| 99久久精品久久久久久ai换脸| 黄页网站在线观看免费| 欧美日韩日日骚| www.5588.com毛片| 奇米888四色在线精品| 中文字幕免费在线不卡| 亚洲天堂av资源在线观看| 欧洲成人在线视频| 欧美自拍偷拍一区二区| 欧美日韩国产区| 国产人妻精品午夜福利免费| 国产欧美在线| 国产欧美日韩伦理| dj大片免费在线观看| 欧美视频中文字幕| 青青草手机视频在线观看| 免费观看在线色综合| 超碰97在线看| 要久久电视剧全集免费| 成人妇女免费播放久久久| 久久电影中文字幕| 欧美色视频日本高清在线观看| 无码人妻一区二区三区免费n鬼沢| 亚洲视频www| 午夜在线视频免费观看| 日本国产亚洲| 97久久超碰福利国产精品…| 亚洲精品视频91| 日本丶国产丶欧美色综合| aaaaaav| 一区二区国产在线观看| av免费观看久久| 成人日韩在线| 国内自拍欧美激情| 亚洲国产精品久久久久久6q| 在线免费观看成人短视频| 国产精品suv一区二区69| 中文字幕欧美三区| 无套内谢大学处破女www小说| 国产毛片精品视频| 九九视频精品在线观看| 99精品国产在热久久| 美女在线免费视频| 97视频一区| 91福利视频在线观看| 高潮毛片在线观看| 在线观看精品自拍私拍| 天天综合在线视频| 欧美日韩亚洲精品一区二区三区| 国产福利视频网站| 欧美激情综合五月色丁香| 日本免费色视频| 自拍日韩欧美| 国产久一道中文一区| 二区三区精品| 国内伊人久久久久久网站视频| 免费a级在线播放| 欧美成人免费网站| 亚洲午夜18毛片在线看| 亚洲一区二区美女| 青青操视频在线播放| 自拍偷拍欧美精品| 天堂а√在线中文在线鲁大师| 狠狠色丁香婷婷综合| 少妇大叫太大太粗太爽了a片小说| 欧美高清视频手机在在线| 日本婷婷久久久久久久久一区二区| 日本精品另类| 久久久电影免费观看完整版| av播放在线观看| 日韩美女一区二区三区四区| 国产女人18毛片水18精| 在线电影院国产精品| 日韩av电影网址| 国产色产综合产在线视频 | 中文av一区二区| 熟女少妇内射日韩亚洲| 国内久久精品视频| 17c国产在线| 国产精品一区二区91| 97超碰免费在线观看| 国产寡妇亲子伦一区二区| 欧美 日韩 国产一区| 婷婷精品进入| 四虎永久免费网站| 欧美成人午夜| 999在线观看视频| 91青青国产在线观看精品| 这里只有精品66| 欧美精品日韩| 热99这里只有精品| 久久久久久久久久久妇女| 免费观看国产视频在线| 亚洲激情女人| 日本道在线视频| 激情综合激情| 手机成人av在线| 欧美三级视频| 免费看的黄色大片| 欧美人与禽猛交乱配视频| 国产成人在线小视频| 国产精品毛片在线看| 日本激情视频在线| 国产精品一区专区| 亚洲精品在线视频免费观看| 国产精品一品视频| 国产网站无遮挡| 国产精品情趣视频| 久久久久久久久久久国产精品| 欧美激情在线一区二区| av激情在线观看| 精品福利一区二区| 中文字幕av网站| 精品人伦一区二区色婷婷| 视频国产在线观看| 亚洲高清在线观看| 成人h动漫精品一区二区无码 | 日本精品在线| 国模吧一区二区三区| а√天堂资源国产精品| 日本道色综合久久影院| 色综合一区二区日本韩国亚洲| 国产精品国产精品| 首页国产精品| 九一国产精品视频| 精品一区二区三区在线观看国产| 污片免费在线观看| 91影院在线免费观看| 黄色录像一级片| 色综合一个色综合亚洲| 精品久久国产视频| 国产亚洲精品一区二区| 91破解版在线观看| 91精品免费视频| 精品一区91| 欧美中日韩免费视频| 国产一在线精品一区在线观看| 最新中文字幕久久| 麻豆久久婷婷| 久久久久成人精品无码中文字幕| 中文字幕一区免费在线观看| 懂色av粉嫩av浪潮av| 亚洲va在线va天堂| www日本高清| 久久久精品在线| 高清在线一区| 欧美在线日韩精品| 羞羞视频在线观看欧美| 欧亚乱熟女一区二区在线| 亚洲精品中文在线| 91香蕉在线视频| 一本大道综合伊人精品热热 | 亚洲精品日韩欧美| 黄色av免费在线看| 97人人爽人人喊人人模波多| 久久国产精品美女| 男人的天堂成人| 久久99热狠狠色一区二区| 欧美人妻一区二区三区 | 国产又粗又黄视频| 中文字幕精品www乱入免费视频| 日本中文字幕在线播放| 国产成人亚洲综合91| 香蕉成人在线| 色女人综合av| 秋霞午夜鲁丝一区二区老狼| 国产成人福利在线| 亚洲精品视频在线观看网站| 一级片一区二区三区| 日韩小视频在线| 爱啪啪综合导航| 国产精品乱子乱xxxx| 黄色亚洲免费| 逼特逼视频在线观看| 亚洲伊人伊色伊影伊综合网| 亚洲国产剧情在线观看| 色在人av网站天堂精品| julia中文字幕一区二区99在线| 欧美大黑帍在线播放| 成人av电影在线观看| 久久久久久久久久久影院| 亚洲三级免费看| 福利小视频在线| 国产原创精品| 亚洲一区二区三区免费在线观看| 三级男人添奶爽爽爽视频| 欧美日韩视频在线| 福利片在线观看| 欧美一级黄色网| 免费黄色成人| 久久99久久99精品| www.日本不卡| 男操女视频网站| 久热精品视频在线观看一区| 91精品导航| 国产精品免费观看久久| 国产精品乱子久久久久| 朝桐光av在线一区二区三区| 欧美一区二区三区免费观看 | 原创国产精品91| 国产95亚洲| 国产美女网站在线观看| 欧美国产视频在线| wwwav在线播放| 国产成人啪精品视频免费网| 久久精品久久久| 亚洲 欧美 日韩在线| 欧美在线|欧美| heyzo高清国产精品| 日韩欧美在线电影| 国产91丝袜在线播放九色| 久草手机视频在线观看| 欧美精品一区二| 欧美色图天堂| 欧美二区三区在线| 国产又黄又大久久| 国产欧美一区二区三区在线看蜜臂| 色琪琪综合男人的天堂aⅴ视频| 在线日韩成人| 国产一二三区av| 国产欧美一区二区三区鸳鸯浴| 97成人在线观看| 青青久久av北条麻妃海外网| 影音先锋日韩在线| 国产高清一区二区三区四区| 欧美成人video|