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

HBase性能優化方法總結

數據庫 其他數據庫
本文主要是從HBase應用程序設計與開發的角度,總結幾種常用的性能優化方法。有關HBase系統配置級別的優化,這里涉及的不多,這部分可以參考:淘寶Ken Wu同學的博客。

 1. 表的設計

1.1 Pre-Creating Regions

默認情況下,在創建HBase表的時候會自動創建一個region分區,當導入數據的時候,所有的HBase客戶端都向這一個region寫數據,直到這個region足夠大了才進行切分。一種可以加快批量寫入速度的方法是通過預先創建一些空的regions,這樣當數據寫入HBase時,會按照region分區情況,在集群內做數據的負載均衡。

有關預分區,詳情參見:Table Creation: Pre-Creating Regions,下面是一個例子:

  1. public static boolean createTable(HBaseAdmin admin, HTableDescriptor table, byte[][] splits) 
  2. throws IOException { 
  3.   try { 
  4.     admin.createTable(table, splits); 
  5.     return true
  6.   } catch (TableExistsException e) { 
  7.     logger.info("table " + table.getNameAsString() + " already exists"); 
  8.     // the table already exists... 
  9.     return false
  10.   } 
  11.   
  12. public static byte[][] getHexSplits(String startKey, String endKey, int numRegions) { 
  13.   byte[][] splits = new byte[numRegions-1][]; 
  14.   BigInteger lowestKey = new BigInteger(startKey, 16); 
  15.   BigInteger highestKey = new BigInteger(endKey, 16); 
  16.   BigInteger range = highestKey.subtract(lowestKey); 
  17.   BigInteger regionIncrement = range.divide(BigInteger.valueOf(numRegions)); 
  18.   lowestKey = lowestKey.add(regionIncrement); 
  19.   for(int i=0; i < numRegions-1;i++) { 
  20.     BigInteger key = lowestKey.add(regionIncrement.multiply(BigInteger.valueOf(i))); 
  21.     byte[] b = String.format("%016x", key).getBytes(); 
  22.     splits[i] = b; 
  23.   } 
  24.   return splits; 

1.2 Row Key

HBase中row key用來檢索表中的記錄,支持以下三種方式:

  • 通過單個row key訪問:即按照某個row key鍵值進行get操作;
  • 通過row key的range進行scan:即通過設置startRowKey和endRowKey,在這個范圍內進行掃描;
  • 全表掃描:即直接掃描整張表中所有行記錄。

在HBase中,row key可以是任意字符串,***長度64KB,實際應用中一般為10~100bytes,存為byte[]字節數組,一般設計成定長的。

row key是按照字典序存儲,因此,設計row key時,要充分利用這個排序特點,將經常一起讀取的數據存儲到一塊,將最近可能會被訪問的數據放在一塊。

舉個例子:如果最近寫入HBase表中的數據是最可能被訪問的,可以考慮將時間戳作為row key的一部分,由于是字典序排序,所以可以使用Long.MAX_VALUE – timestamp作為row key,這樣能保證新寫入的數據在讀取時可以被快速命中。

1.3 Column Family

不要在一張表里定義太多的column family。目前Hbase并不能很好的處理超過2~3個column family的表。因為某個column family在flush的時候,它鄰近的column family也會因關聯效應被觸發flush,最終導致系統產生更多的I/O。感興趣的同學可以對自己的HBase集群進行實際測試,從得到的測試結果數據驗證一下。

1.4 In Memory

創建表的時候,可以通過HColumnDescriptor.setInMemory(true)將表放到RegionServer的緩存中,保證在讀取的時候被cache命中。

1.5 Max Version

創建表的時候,可以通過HColumnDescriptor.setMaxVersions(int maxVersions)設置表中數據的***版本,如果只需要保存***版本的數據,那么可以設置setMaxVersions(1)。

1.6 Time To Live

創建表的時候,可以通過HColumnDescriptor.setTimeToLive(int timeToLive)設置表中數據的存儲生命期,過期數據將自動被刪除,例如如果只需要存儲最近兩天的數據,那么可以設置setTimeToLive(2 * 24 * 60 * 60)。

1.7 Compact & Split

在HBase中,數據在更新時首先寫入WAL 日志(HLog)和內存(MemStore)中,MemStore中的數據是排序的,當MemStore累計到一定閾值時,就會創建一個新的MemStore,并且將老的MemStore添加到flush隊列,由單獨的線程flush到磁盤上,成為一個StoreFile。于此同時, 系統會在zookeeper中記錄一個redo point,表示這個時刻之前的變更已經持久化了(minor compact)。

StoreFile是只讀的,一旦創建后就不可以再修改。因此Hbase的更新其實是不斷追加的操作。當一個Store中的StoreFile達到一定的閾值后,就會進行一次合并(major compact),將對同一個key的修改合并到一起,形成一個大的StoreFile,當StoreFile的大小達到一定閾值后,又會對 StoreFile進行分割(split),等分為兩個StoreFile。

由于對表的更新是不斷追加的,處理讀請求時,需要訪問Store中全部的StoreFile和MemStore,將它們按照row key進行合并,由于StoreFile和MemStore都是經過排序的,并且StoreFile帶有內存中索引,通常合并過程還是比較快的。

實際應用中,可以考慮必要時手動進行major compact,將同一個row key的修改進行合并形成一個大的StoreFile。同時,可以將StoreFile設置大些,減少split的發生。

2. 寫表操作

2.1 多HTable并發寫

創建多個HTable客戶端用于寫操作,提高寫數據的吞吐量,一個例子:

  1. static final Configuration conf = HBaseConfiguration.create(); 
  2. static final String table_log_name = “user_log”; 
  3. wTableLog = new HTable[tableN]; 
  4. for (int i = 0; i < tableN; i++) { 
  5.     wTableLog[i] = new HTable(conf, table_log_name); 
  6.     wTableLog[i].setWriteBufferSize(5 * 1024 * 1024); //5MB 
  7.     wTableLog[i].setAutoFlush(false); 

2.2 HTable參數設置

2.2.1 Auto Flush

通過調用HTable.setAutoFlush(false)方法可以將HTable寫客戶端的自動flush關閉,這樣可以批量寫入數據到HBase,而不是有一條put就執行一次更新,只有當put填滿客戶端寫緩存時,才實際向HBase服務端發起寫請求。默認情況下auto flush是開啟的。

2.2.2 Write Buffer

通過調用HTable.setWriteBufferSize(writeBufferSize)方法可以設置HTable客戶端的寫buffer大小,如果新設置的buffer小于當前寫buffer中的數據時,buffer將會被flush到服務端。其中,writeBufferSize的單位是byte字節數,可以根據實際寫入數據量的多少來設置該值。

2.2.3 WAL Flag

在HBae中,客戶端向集群中的RegionServer提交數據時(Put/Delete操作),首先會先寫WAL(Write Ahead Log)日志(即HLog,一個RegionServer上的所有Region共享一個HLog),只有當WAL日志寫成功后,再接著寫MemStore,然后客戶端被通知提交數據成功;如果寫WAL日志失敗,客戶端則被通知提交失敗。這樣做的好處是可以做到RegionServer宕機后的數據恢復。

因此,對于相對不太重要的數據,可以在Put/Delete操作時,通過調用Put.setWriteToWAL(false)或Delete.setWriteToWAL(false)函數,放棄寫WAL日志,從而提高數據寫入的性能。

值得注意的是:謹慎選擇關閉WAL日志,因為這樣的話,一旦RegionServer宕機,Put/Delete的數據將會無法根據WAL日志進行恢復。

2.3 批量寫

通過調用HTable.put(Put)方法可以將一個指定的row key記錄寫入HBase,同樣HBase提供了另一個方法:通過調用HTable.put(List<Put>)方法可以將指定的row key列表,批量寫入多行記錄,這樣做的好處是批量執行,只需要一次網絡I/O開銷,這對于對數據實時性要求高,網絡傳輸RTT高的情景下可能帶來明顯的性能提升。

2.4 多線程并發寫

在客戶端開啟多個HTable寫線程,每個寫線程負責一個HTable對象的flush操作,這樣結合定時flush和寫buffer(writeBufferSize),可以既保證在數據量小的時候,數據可以在較短時間內被flush(如1秒內),同時又保證在數據量大的時候,寫buffer一滿就及時進行flush。下面給個具體的例子:

  1. for (int i = 0; i < threadN; i++) { 
  2.     Thread th = new Thread() { 
  3.         public void run() { 
  4.             while (true) { 
  5.                 try { 
  6.                     sleep(1000); //1 second 
  7.                 } catch (InterruptedException e) { 
  8.                     e.printStackTrace(); 
  9.                 } 
  10.                                 synchronized (wTableLog[i]) { 
  11.                     try { 
  12.                         wTableLog[i].flushCommits(); 
  13.                     } catch (IOException e) { 
  14.                         e.printStackTrace(); 
  15.                     } 
  16.                 } 
  17.             } 
  18.                 } 
  19.     }; 
  20.     th.setDaemon(true); 
  21.     th.start(); 

3. 讀表操作

3.1 多HTable并發讀

創建多個HTable客戶端用于讀操作,提高讀數據的吞吐量,一個例子:

  1. static final Configuration conf = HBaseConfiguration.create(); 
  2. static final String table_log_name = “user_log”; 
  3. rTableLog = new HTable[tableN]; 
  4. for (int i = 0; i < tableN; i++) { 
  5.     rTableLog[i] = new HTable(conf, table_log_name); 
  6.     rTableLog[i].setScannerCaching(50); 

3.2 HTable參數設置

3.2.1 Scanner Caching

通過調用HTable.setScannerCaching(int scannerCaching)可以設置HBase scanner一次從服務端抓取的數據條數,默認情況下一次一條。通過將此值設置成一個合理的值,可以減少scan過程中next()的時間開銷,代價是scanner需要通過客戶端的內存來維持這些被cache的行記錄。

3.2.2 Scan Attribute Selection

scan時指定需要的Column Family,可以減少網絡傳輸數據量,否則默認scan操作會返回整行所有Column Family的數據。

3.2.3 Close ResultScanner

通過scan取完數據后,記得要關閉ResultScanner,否則RegionServer可能會出現問題(對應的Server資源無法釋放)。

3.3 批量讀

通過調用HTable.get(Get)方法可以根據一個指定的row key獲取一行記錄,同樣HBase提供了另一個方法:通過調用HTable.get(List)方法可以根據一個指定的row key列表,批量獲取多行記錄,這樣做的好處是批量執行,只需要一次網絡I/O開銷,這對于對數據實時性要求高而且網絡傳輸RTT高的情景下可能帶來明顯的性能提升。

3.4 多線程并發讀

在客戶端開啟多個HTable讀線程,每個讀線程負責通過HTable對象進行get操作。下面是一個多線程并發讀取HBase,獲取店鋪一天內各分鐘PV值的例子:

  1. public class DataReaderServer { 
  2.      //獲取店鋪一天內各分鐘PV值的入口函數 
  3.      public static ConcurrentHashMap getUnitMinutePV(long uid, long startStamp, long endStamp){ 
  4.          long min = startStamp; 
  5.          int count = (int)((endStamp - startStamp) / (60*1000)); 
  6.          List lst = new ArrayList(); 
  7.          for (int i = 0; i <= count; i++) { 
  8.             min = startStamp + i * 60 * 1000; 
  9.             lst.add(uid + "_" + min); 
  10.          } 
  11.          return parallelBatchMinutePV(lst); 
  12.      } 
  13.       //多線程并發查詢,獲取分鐘PV值 
  14. private static ConcurrentHashMap parallelBatchMinutePV(List lstKeys){ 
  15.         ConcurrentHashMap hashRet = new ConcurrentHashMap(); 
  16.         int parallel = 3; 
  17.         List<List<String>> lstBatchKeys  = null
  18.         if (lstKeys.size() < parallel ){ 
  19.             lstBatchKeys  = new ArrayList<List<String>>(1); 
  20.             lstBatchKeys.add(lstKeys); 
  21.         } 
  22.         else
  23.             lstBatchKeys  = new ArrayList<List<String>>(parallel); 
  24.             for(int i = 0; i < parallel; i++  ){ 
  25.                 List lst = new ArrayList(); 
  26.                 lstBatchKeys.add(lst); 
  27.             } 
  28.   
  29.             for(int i = 0 ; i < lstKeys.size() ; i ++ ){ 
  30.                 lstBatchKeys.get(i%parallel).add(lstKeys.get(i)); 
  31.             } 
  32.         } 
  33.   
  34.         List >> futures = new ArrayList >>(5); 
  35.   
  36.         ThreadFactoryBuilder builder = new ThreadFactoryBuilder(); 
  37.         builder.setNameFormat("ParallelBatchQuery"); 
  38.         ThreadFactory factory = builder.build(); 
  39.         ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(lstBatchKeys.size(), factory); 
  40.   
  41.         for(List keys : lstBatchKeys){ 
  42.             Callable< ConcurrentHashMap > callable = new BatchMinutePVCallable(keys); 
  43.             FutureTask< ConcurrentHashMap > future = (FutureTask< ConcurrentHashMap >) executor.submit(callable); 
  44.             futures.add(future); 
  45.         } 
  46.         executor.shutdown(); 
  47.   
  48.         // Wait for all the tasks to finish 
  49.         try { 
  50.           boolean stillRunning = !executor.awaitTermination( 
  51.               5000000, TimeUnit.MILLISECONDS); 
  52.           if (stillRunning) { 
  53.             try { 
  54.                 executor.shutdownNow(); 
  55.             } catch (Exception e) { 
  56.                 // TODO Auto-generated catch block 
  57.                 e.printStackTrace(); 
  58.             } 
  59.           } 
  60.         } catch (InterruptedException e) { 
  61.           try { 
  62.               Thread.currentThread().interrupt(); 
  63.           } catch (Exception e1) { 
  64.             // TODO Auto-generated catch block 
  65.             e1.printStackTrace(); 
  66.           } 
  67.         } 
  68.   
  69.         // Look for any exception 
  70.         for (Future f : futures) { 
  71.           try { 
  72.               if(f.get() != null
  73.               { 
  74.                   hashRet.putAll((ConcurrentHashMap)f.get()); 
  75.               } 
  76.           } catch (InterruptedException e) { 
  77.             try { 
  78.                  Thread.currentThread().interrupt(); 
  79.             } catch (Exception e1) { 
  80.                 // TODO Auto-generated catch block 
  81.                 e1.printStackTrace(); 
  82.             } 
  83.           } catch (ExecutionException e) { 
  84.             e.printStackTrace(); 
  85.           } 
  86.         } 
  87.   
  88.         return hashRet; 
  89.     } 
  90.      //一個線程批量查詢,獲取分鐘PV值 
  91.     protected static ConcurrentHashMap getBatchMinutePV(List lstKeys){ 
  92.         ConcurrentHashMap hashRet = null
  93.         List lstGet = new ArrayList(); 
  94.         String[] splitValue = null
  95.         for (String s : lstKeys) { 
  96.             splitValue = s.split("_"); 
  97.             long uid = Long.parseLong(splitValue[0]); 
  98.             long min = Long.parseLong(splitValue[1]); 
  99.             byte[] key = new byte[16]; 
  100.             Bytes.putLong(key, 0, uid); 
  101.             Bytes.putLong(key, 8, min); 
  102.             Get g = new Get(key); 
  103.             g.addFamily(fp); 
  104.             lstGet.add(g); 
  105.         } 
  106.         Result[] res = null
  107.         try { 
  108.             res = tableMinutePV[rand.nextInt(tableN)].get(lstGet); 
  109.         } catch (IOException e1) { 
  110.             logger.error("tableMinutePV exception, e=" + e1.getStackTrace()); 
  111.         } 
  112.   
  113.         if (res != null && res.length > 0) { 
  114.             hashRet = new ConcurrentHashMap(res.length); 
  115.             for (Result re : res) { 
  116.                 if (re != null && !re.isEmpty()) { 
  117.                     try { 
  118.                         byte[] key = re.getRow(); 
  119.                         byte[] value = re.getValue(fp, cp); 
  120.                         if (key != null && value != null) { 
  121.                             hashRet.put(String.valueOf(Bytes.toLong(key, 
  122.                                     Bytes.SIZEOF_LONG)), String.valueOf(Bytes 
  123.                                     .toLong(value))); 
  124.                         } 
  125.                     } catch (Exception e2) { 
  126.                         logger.error(e2.getStackTrace()); 
  127.                     } 
  128.                 } 
  129.             } 
  130.         } 
  131.   
  132.         return hashRet; 
  133.     } 
  134. //調用接口類,實現Callable接口 
  135. class BatchMinutePVCallable implements Callable>{ 
  136.      private List keys; 
  137.   
  138.      public BatchMinutePVCallable(List lstKeys ) { 
  139.          this.keys = lstKeys; 
  140.      } 
  141.   
  142.      public ConcurrentHashMap call() throws Exception { 
  143.          return DataReadServer.getBatchMinutePV(keys); 
  144.      } 

3.5 緩存查詢結果

對于頻繁查詢HBase的應用場景,可以考慮在應用程序中做緩存,當有新的查詢請求時,首先在緩存中查找,如果存在則直接返回,不再查詢HBase;否則對HBase發起讀請求查詢,然后在應用程序中將查詢結果緩存起來。至于緩存的替換策略,可以考慮LRU等常用的策略。

3.6 Blockcache

HBase上Regionserver的內存分為兩個部分,一部分作為Memstore,主要用來寫;另外一部分作為BlockCache,主要用于讀。

寫請求會先寫入Memstore,Regionserver會給每個region提供一個Memstore,當Memstore滿64MB以后,會啟動 flush刷新到磁盤。當Memstore的總大小超過限制時(heapsize * hbase.regionserver.global.memstore.upperLimit * 0.9),會強行啟動flush進程,從***的Memstore開始flush直到低于限制。

讀請求先到Memstore中查數據,查不到就到BlockCache中查,再查不到就會到磁盤上讀,并把讀的結果放入BlockCache。由于BlockCache采用的是LRU策略,因此BlockCache達到上限(heapsize * hfile.block.cache.size * 0.85)后,會啟動淘汰機制,淘汰掉最老的一批數據。

一個Regionserver上有一個BlockCache和N個Memstore,它們的大小之和不能大于等于heapsize * 0.8,否則HBase不能啟動。默認BlockCache為0.2,而Memstore為0.4。對于注重讀響應時間的系統,可以將 BlockCache設大些,比如設置BlockCache=0.4,Memstore=0.39,以加大緩存的命中率。

有關BlockCache機制,請參考這里:HBase的Block cache,HBase的blockcache機制,hbase中的緩存的計算與使用。

4.數據計算

4.1 服務端計算

Coprocessor運行于HBase RegionServer服務端,各個Regions保持對與其相關的coprocessor實現類的引用,coprocessor類可以通過RegionServer上classpath中的本地jar或HDFS的classloader進行加載。

目前,已提供有幾種coprocessor:

Coprocessor:提供對于region管理的鉤子,例如region的open/close/split/flush/compact等;
RegionObserver:提供用于從客戶端監控表相關操作的鉤子,例如表的get/put/scan/delete等;
Endpoint:提供可以在region上執行任意函數的命令觸發器。一個使用例子是RegionServer端的列聚合,這里有代碼示例。
以上只是有關coprocessor的一些基本介紹,本人沒有對其實際使用的經驗,對它的可用性和性能數據不得而知。感興趣的同學可以嘗試一下,歡迎討論。

4.2 寫端計算

4.2.1 計數

HBase本身可以看作是一個可以水平擴展的Key-Value存儲系統,但是其本身的計算能力有限(Coprocessor可以提供一定的服務端計算),因此,使用HBase時,往往需要從寫端或者讀端進行計算,然后將最終的計算結果返回給調用者。舉兩個簡單的例子:

PV計算:通過在HBase寫端內存中,累加計數,維護PV值的更新,同時為了做到持久化,定期(如1秒)將PV計算結果同步到HBase中,這樣查詢端最多會有1秒鐘的延遲,能看到秒級延遲的PV結果。
分鐘PV計算:與上面提到的PV計算方法相結合,每分鐘將當前的累計PV值,按照rowkey + minute作為新的rowkey寫入HBase中,然后在查詢端通過scan得到當天各個分鐘以前的累計PV值,然后順次將前后兩分鐘的累計PV值相減,就得到了當前一分鐘內的PV值,從而最終也就得到當天各個分鐘內的PV值。

4.2.2 去重

對于UV的計算,就是個去重計算的例子。分兩種情況:

如果內存可以容納,那么可以在Hash表中維護所有已經存在的UV標識,每當新來一個標識時,通過快速查找Hash確定是否是一個新的UV,若是則UV值加1,否則UV值不變。另外,為了做到持久化或提供給查詢接口使用,可以定期(如1秒)將UV計算結果同步到HBase中。
如果內存不能容納,可以考慮采用Bloom Filter來實現,從而盡可能的減少內存的占用情況。除了UV的計算外,判斷URL是否存在也是個典型的應用場景。

4.3 讀端計算

如果對于響應時間要求比較苛刻的情況(如單次http請求要在毫秒級時間內返回),個人覺得讀端不宜做過多復雜的計算邏輯,盡量做到讀端功能單一化:即從HBase RegionServer讀到數據(scan或get方式)后,按照數據格式進行簡單的拼接,直接返回給前端使用。當然,如果對于響應時間要求一般,或者業務特點需要,也可以在讀端進行一些計算邏輯。

5.總結

作為一個Key-Value存儲系統,HBase并不是***的,它有自己獨特的地方。因此,基于它來做應用時,我們往往需要從多方面進行優化改進(表設計、讀表操作、寫表操作、數據計算等),有時甚至還需要從系統級對HBase進行配置調優,更甚至可以對HBase本身進行優化。這屬于不同的層次范疇。

總之,概括來講,對系統進行優化時,首先定位到影響你的程序運行性能的瓶頸之處,然后有的放矢進行針對行的優化。如果優化后滿足你的期望,那么就可以停止優化;否則繼續尋找新的瓶頸之處,開始新的優化,直到滿足性能要求。

以上就是從項目開發中總結的一點經驗,如有不對之處,歡迎大家不吝賜教。

原文鏈接:http://blog.linezing.com/2012/03/hbase-performance-optimization

【編輯推薦】

  1. 讓數據庫變快的10個建議
  2. 利用Java進行MySql數據庫的導入和導出
  3. 20個數據庫設計***實踐
  4. 超越MySQL 對流行數據庫進行分支
  5. 迎接大數據時代,高手較量數據庫遷移實戰方案

責任編輯:彭凡 來源: 量子恒道官方博客
相關推薦

2021-08-27 14:26:06

開發技能React

2022-05-23 13:44:53

前端開發優化

2019-02-25 07:07:38

技巧React 優化

2013-09-16 15:16:20

Android性能優化

2016-11-17 09:00:46

HBase優化策略

2017-03-01 20:53:56

HBase實踐

2009-12-24 16:46:03

WPF性能優化

2016-12-19 10:00:00

React性能優化

2013-01-10 09:47:09

HBase性能優化

2019-12-10 08:10:35

LinuxCPU性能優化

2022-09-13 12:56:28

前端優化

2015-11-05 09:02:05

Java代碼性能優化

2017-12-04 12:29:15

前端JavaScript性能優化

2015-07-09 13:19:17

Ceph分布式存儲性能調優

2021-07-16 23:01:03

SQL索引性能

2011-06-20 14:22:58

外鏈

2014-04-04 10:16:51

Nginx配置Nginx性能優化

2015-07-02 11:17:30

MySQLSlave延遲優化

2010-12-10 10:17:21

關系型數據庫

2021-07-26 18:23:23

SQL策略優化
點贊
收藏

51CTO技術棧公眾號

xxxxx性欧美特大| 999免费视频| 成人精品视频| 91精品福利在线一区二区三区| 蜜臀av性久久久久蜜臀av| 六月婷婷综合网| 视频一区二区三区在线| 久久久极品av| 污污污www精品国产网站| **在线精品| 亚洲欧美一区二区三区孕妇| 精品午夜一区二区三区| 亚洲香蕉在线视频| 亚洲精品欧洲| 丝袜情趣国产精品| 在线观看国产免费视频| 免费视频成人| 狠狠躁夜夜躁人人爽天天天天97| 亚洲视频在线观看日本a| 国产18精品乱码免费看| 蜜桃av噜噜一区二区三区小说| 欧美极品少妇xxxxⅹ喷水| 最近中文字幕免费| 97久久综合精品久久久综合| 欧美午夜精品久久久久久人妖| dy888午夜| 加勒比一区二区三区在线| 国产电影一区二区三区| 国产精品网站入口| 国产成人无码精品| 亚洲乱码精品| 在线国产精品播放| 国产精品九九视频| 日本精品视频| 欧美揉bbbbb揉bbbbb| 欧美日韩性生活片| 欧洲中文在线| 亚洲欧美另类久久久精品| 日本不卡一二三区| 无码国产精品96久久久久| 国产成人综合视频| 91久久久久久| 91国偷自产中文字幕久久| 久久久久久自在自线| 久久久亚洲精品视频| 侵犯稚嫩小箩莉h文系列小说| 国产一区二区三区日韩精品| 亚洲精品美女在线观看| 美女露出粉嫩尿囗让男人桶| 石原莉奈一区二区三区在线观看| 欧美日韩国产精品成人| 国产xxxxx在线观看| 黄色大片在线| 一区二区三区影院| 日本xxxxx18| 黄色av电影在线观看| 国产精品欧美精品| 视频一区二区三区免费观看| 久草视频视频在线播放| 久久久青草青青国产亚洲免观| 精品伦理一区二区三区| 天堂网在线播放| 成人99免费视频| 国产精品区一区二区三含羞草| 精品人妻一区二区三区含羞草 | 国产高清不卡无码视频| 国产精品扒开做爽爽爽的视频| 国产精品美女久久久久久久久| 日韩精品无码一区二区三区| 成人性爱视频在线观看| 日本一区二区三区四区| 日韩免费电影一区二区| 1024国产在线| 亚洲精品美国一| www.欧美黄色| 国产天堂在线播放视频| 欧美日韩国产综合视频在线观看中文| 欧美成人xxxxx| 欧美一级二级视频| 欧美精品丝袜久久久中文字幕| 中文字幕一区久久| 一区二区三区高清在线观看| 亚洲国产欧美一区二区丝袜黑人 | 亚洲精品国产一区二| 成人综合在线观看| 欧美国产二区| 欧美成人三区| 午夜久久电影网| 无码无遮挡又大又爽又黄的视频| 粉嫩av一区二区三区四区五区 | 五十路在线观看| 国产亚洲欧美在线| 午夜探花在线观看| а√在线天堂官网| 欧美亚洲一区二区在线观看| 日本一本在线视频| 日韩精品免费一区二区夜夜嗨 | 欧美高清视频在线高清观看mv色露露十八| 午夜视频在线观| 国产欧美自拍一区| 这里只有精品在线播放| 中文字幕影音先锋| 久久av一区二区三区| 91精品久久久久久久久不口人| www.桃色av嫩草.com| 久久网站最新地址| 亚洲免费视频播放| 神马电影网我不卡| 日韩亚洲欧美一区| 亚洲欧洲久久久| 欧美二区视频| 国产精品电影网| 欧美特黄一级视频| 国产精品不卡在线| 日韩av片在线看| 日韩成人在线看| 亚洲天堂av高清| 国产精品成人免费一区二区视频| 蜜臀av一区二区在线免费观看| 国产91精品入口17c| 1769视频在线播放免费观看| 欧美日韩亚洲激情| 亚洲区 欧美区| 精品国产乱码| 97久久久久久| 精品国产一级片| 国产精品久久久久久久裸模| 国产免费毛卡片| 亚洲一区二区免费在线观看| 日韩一区av在线| 狠狠人妻久久久久久综合| 成人综合在线视频| 国产女人18毛片| 天堂久久一区| 亚洲网在线观看| 日韩欧美一区二区一幕| 国产剧情一区二区| 亚洲一区二区三区精品视频| 唐人社导航福利精品| 亚洲国产天堂网精品网站| 黄色一级大片在线免费观看| 免费成人在线影院| 午夜老司机精品| 黄色亚洲网站| 日韩精品中文字幕久久臀| 国产极品美女高潮无套嗷嗷叫酒店 | 第四色在线一区二区| 超碰91人人草人人干| 91精品国产色综合久久不8| 国产午夜精品美女毛片视频| 青青在线视频观看| 五月激激激综合网色播| 欧美一级在线播放| 日本亚洲欧美| 日韩欧美国产骚| 亚洲自拍偷拍一区二区| 首页亚洲欧美制服丝腿| 奇米影视首页 狠狠色丁香婷婷久久综合 | 黄色三级网站在线观看| 亚洲一卡二卡三卡四卡| 91超薄肉色丝袜交足高跟凉鞋| 影音先锋国产精品| 精品人伦一区二区三区| 深夜成人在线| 伊人伊人伊人久久| 一区二区视频播放| 亚洲免费在线看| 欧美极品jizzhd欧美仙踪林| 亚洲国产1区| 欧美激情专区| 电影在线观看一区二区| 久久好看免费视频| 国产综合无码一区二区色蜜蜜| 亚洲成人激情自拍| 久久精品国产亚洲av久| 蓝色福利精品导航| 狠狠精品干练久久久无码中文字幕 | 亚洲a v网站| 久久精品国产久精国产| www.一区二区.com| 一区二区三区日本久久久| 国产精品丝袜视频| 美洲精品一卡2卡三卡4卡四卡| 亚洲精品99999| 五月婷婷激情视频| www.久久精品| 欧美图片激情小说| 宅男在线一区| 成人免费在线视频网站| 超免费在线视频| 国产一区二区三区在线播放免费观看 | 国产99精品| 国产精品久久久久久av福利| 日本免费中文字幕在线| 精品少妇一区二区三区在线播放| 国产在线一卡二卡| 97精品久久久久中文字幕| 免费日韩视频在线观看| 婷婷亚洲五月色综合| 国产69精品久久久久9999apgf| av在线不卡精品| 久久99精品国产99久久6尤物| 婷婷在线观看视频| 欧美日韩亚洲另类| 日本一区二区三区免费视频| 久久精品在线观看| 亚洲a级黄色片| 国模吧视频一区| 亚洲一二三区在线| 久久精品亚洲成在人线av网址| 日韩av三级在线观看| 国产在线激情视频| 精品国产乱子伦一区| 中文字幕乱码人妻二区三区| 一区二区三区加勒比av| 伊人网伊人影院| 久久97超碰色| 免费国产成人av| 黄色日韩精品| 杨幂一区欧美专区| 成人h动漫免费观看网站 | 精品中文在线| 日本一欧美一欧美一亚洲视频 | 国产三级欧美三级日产三级99 | 国产精品999久久久| 成人免费一区二区三区在线观看| 成人性生活免费看| 国产伦精品一区二区三区免费迷| 免费观看美女裸体网站| 欧美女激情福利| 伊人av成人| 蜜桃精品噜噜噜成人av| 成人两性免费视频| 电影一区二区| 日韩av第一页| 97超碰免费在线| 久久艳片www.17c.com| 亚乱亚乱亚洲乱妇| 亚洲人午夜精品| 日韩美女一级视频| 日韩精品极品在线观看播放免费视频| 99久久久久成人国产免费| 在线观看亚洲a| 日本少妇性生活| 午夜欧美一区二区三区在线播放| 久久中文免费视频| 亚洲视频 欧洲视频| xxxxx99| 国产精品乱码一区二三区小蝌蚪| 精品国产无码在线观看| www欧美成人18+| 国产激情视频网站| a美女胸又www黄视频久久| 国产成人精品综合久久久久99| 国产综合久久久久久鬼色| 校园春色 亚洲色图| 日产国产高清一区二区三区| 黄页网站大全在线观看| 激情欧美一区| 69sex久久精品国产麻豆| 欧美欧美天天天天操| 男女猛烈激情xx00免费视频| 韩日精品在线| 丁香六月激情婷婷| 欧美精品一卡| 久久视频这里有精品| 欧美亚洲不卡| 黄色片网址在线观看| 午夜综合激情| 色婷婷综合久久久久中文字幕| 久久动漫亚洲| 欧美污视频网站| 看电视剧不卡顿的网站| 在线观看免费视频高清游戏推荐| 蜜臀国产一区二区三区在线播放 | 国产精品自产自拍| 精品人妻一区二区三| 国产成人三级在线观看| 性xxxxxxxxx| 99久久精品国产一区| 精品人妻无码一区二区三区| 国产情人综合久久777777| 成人免费精品动漫网站| 亚洲国产欧美日韩另类综合| 日韩特黄一级片| 精品欧美国产一区二区三区| a片在线免费观看| 91精品国产品国语在线不卡| 午夜精品久久久久久久爽 | 国内综合精品午夜久久资源| 欧美成人高潮一二区在线看| 免费视频久久| 一区二区三区国产免费| 国产精品白丝jk黑袜喷水| 久久人妻少妇嫩草av蜜桃| 99久久免费国产| 欧美自拍偷拍网| 亚洲国产人成综合网站| 天天操夜夜操视频| 色婷婷亚洲综合| 国产成人精品亚洲精品色欲| 日韩国产精品一区| 1769视频在线播放免费观看| 97在线观看视频国产| 日本一区免费网站| 亚洲xxx大片| 天海翼亚洲一区二区三区| 欧美与动交zoz0z| 久久激情婷婷| 在线成人精品视频| 国产精品午夜在线观看| 久久这里只有精品国产| 色天使久久综合网天天| 亚洲国产日韩在线观看| 亚洲欧美日韩直播| av软件在线观看| 国产精品h片在线播放| 激情小说亚洲色图| 伊人久久大香线蕉精品| 中文欧美日韩| 国产免费a级片| 国产精品乱码久久久久久| 亚洲天堂日韩av| 欧美一区二区性放荡片| 日韩av高清在线| 欧美另类xxx| 91精品店在线| 色一情一乱一伦一区二区三区| 亚洲视屏一区| 亚洲一区精品视频在线观看| 久久久久99精品国产片| 国产精品9191| 日韩精品一区二区三区蜜臀| 国产cdts系列另类在线观看| 国产精品2018| 亚洲伊人春色| 国产精品秘入口18禁麻豆免会员| 国产91富婆露脸刺激对白| 国产精品18在线| 婷婷国产v国产偷v亚洲高清| 亚洲欧美激情国产综合久久久| 久久精品国产一区二区电影| 91精品美女| 夜夜春亚洲嫩草影视日日摸夜夜添夜| 欧美专区18| 深爱五月激情网| 色狠狠色噜噜噜综合网| 无套内谢的新婚少妇国语播放| 国内精品久久久久久| 精品伊人久久久| 男人添女人荫蒂免费视频| 国产一区二区三区综合| 日本黄色小视频在线观看| 日韩欧美一区二区三区| 亚洲av毛片成人精品| 欧美老少配视频| 99久热这里只有精品视频免费观看| 欧美一级黄色录像片| 国产一级精品在线| 久久久久成人网站| 亚洲精品在线免费观看视频| 青草在线视频| 激情视频一区二区| 国产色综合网| 在线精品视频播放| 精品福利樱桃av导航| 亚洲欧美日韩综合在线| 韩国v欧美v日本v亚洲| 欧洲vs亚洲vs国产| 国产一区二区视频免费在线观看| 26uuu国产电影一区二区| 国产免费a视频| 中文字幕免费精品一区高清| 99热播精品免费| 男人的天堂视频在线| 成人在线综合网| 国产无套内射又大又猛又粗又爽| 亚洲精品suv精品一区二区| 黄色在线观看www| 日韩av一区二区三区在线| 免费看欧美女人艹b| 日本高清不卡免费| 欧美videofree性高清杂交| av福利在线导航| 欧美精品尤物在线| 久久精品国产亚洲高清剧情介绍| 国产又粗又硬又长又爽| 欧美精品一区二区在线观看| 亚洲欧洲自拍| 宅男一区二区三区| 成人黄色在线网站| 无码人妻精品一区二区三区不卡| 最新国产精品亚洲| 欧美激情99| 午夜免费看毛片| 亚洲欧美激情小说另类| 天堂中文在线8| 国产精品一区二区性色av| 欧美一区影院| 一级黄色性视频|