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

淺談訂單重構之 MySQL 分庫分表實戰篇

數據庫 MySQL
發布上篇文章淺談訂單重構之路之后,有很多小伙伴想知道,分庫分表具體是如何實現的。那么這篇文章具體介紹下,分庫分表實戰。

一、背景

發布上篇文章淺談訂單重構之路之后,有很多小伙伴想知道,分庫分表具體是如何實現的。那么這篇文章具體介紹下,分庫分表實戰。

二、目標

本文將完成如下目標:

* 分表數量: 256    分庫數量: 4

* 以用戶ID(user_id) 為數據庫分片Key

* 最后測試訂單創建,更新,刪除, 單訂單號查詢,根據user_id查詢列表操作。

架構圖:

表結構如下:

  1. CREATE TABLE `order_XXX` ( 
  2.   `order_id` bigint(20) unsigned NOT NULL, 
  3.   `user_id` int(11) DEFAULT '0' COMMENT '訂單id'
  4.   `status` int(11) DEFAULT '0' COMMENT '訂單狀態'
  5.   `booking_date` datetime DEFAULT NULL, 
  6.   `create_time` datetime DEFAULT NULL, 
  7.   `update_time` datetime DEFAULT NULL, 
  8.   PRIMARY KEY (`order_id`), 
  9.   KEY `idx_user_id` (`user_id`), 
  10.   KEY `idx_bdate` (`booking_date`), 
  11.   KEY `idx_ctime` (`create_time`), 
  12.   KEY `idx_utime` (`update_time`) 
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

注:  000<= XXX <= 255, 本文重點在于分庫分表實踐, 只保留具有代表性字段,其它場景可以在此基礎上做改進。

全局唯一ID設計

要求:1.全局唯一 2:粗略有序 3:可反解出庫編號

  • 1bit + 39bit時間差 + 8bit機器號 + 8bit用戶編號(庫號) + 8bit自增序列

訂單號組成項 保留字段 毫秒級時間差 機器數 用戶編號(表編號) 自增序列
所占字節(單位bit) 1 39 8 8 8

單機最大QPS: 256000 使用壽命: 17年

訂單號生成規則說明詳見 淺談分布式唯一Id生成器之最佳實踐

三、環境準備

1. 基本信息

2. 數據庫環境準備

溫馨提示:使用docker-compose快速搭建了4主4從數據庫集群,實現本地快速一鍵部署,生產環境一般由DBA同學搭建。

具體實現請移步查看: https://gitee.com/bytearch_admin/docker-app/tree/main/mysql-cluster

3. 建庫 & 導入分表

* 在mysql master實例分別建庫

172.30.1.21(   o rder_db_ 1) ,  172.30.1.22( order_db_2) ,

172.30.1.23( ord er_db_3) ,   172.30.1.24( order_db_4 )

*  依次導入建表SQL 命令為

  1. mysql -uroot -pbytearch -h172.30.1.21 order_db_1<fast-cloud-mysql-sharding/doc/sql/order_db_1.sql; 
  2. mysql -uroot -pbytearch -h172.30.1.22 order_db_2<fast-cloud-mysql-sharding/doc/sql/order_db_2.sql; 
  3. mysql -uroot -pbytearch -h172.30.1.23 order_db_3<fast-cloud-mysql-sharding/doc/sql/order_db_3.sql; 
  4. mysql -uroot -pbytearch -h172.30.1.24 order_db_4<fast-cloud-mysql-sharding/doc/sql/order_db_4.sql;   

四、配置&實踐

1. pom文件 

  1. <!-- mango 分庫分表中間件 -->  
  2.       <dependency> 
  3.           <groupId>org.jfaster</groupId> 
  4.           <artifactId>mango-spring-boot-starter</artifactId> 
  5.           <version>2.0.1</version> 
  6.       </dependency> 
  7.     
  8.        <!-- 分布式ID生成器 --> 
  9.       <dependency> 
  10.           <groupId>com.bytearch</groupId> 
  11.           <artifactId>fast-cloud-id-generator</artifactId> 
  12.           <version>${version}</version> 
  13.       </dependency> 
  14.  
  15.       <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> 
  16.       <dependency> 
  17.           <groupId>mysql</groupId> 
  18.           <artifactId>mysql-connector-java</artifactId> 
  19.           <version>6.0.6</version> 
  20.       </dependency> 

2. 常量配置

  1. package com.bytearch.fast.cloud.mysql.sharding.common; 
  2.  
  3. /** 
  4.  * 分庫分表策略常用常量 
  5.  */ 
  6. public class ShardingStrategyConstant { 
  7.     /** 
  8.      * database 邏輯名稱 ,真實庫名為 order_db_XXX 
  9.      */ 
  10.     public static final String LOGIC_ORDER_DATABASE_NAME = "order_db"
  11.     /** 
  12.      * 分表數 256,一旦確定不可更改 
  13.      */ 
  14.     public static final int SHARDING_TABLE_NUM = 256
  15.  
  16.     /** 
  17.      * 分庫數, 不建議更改, 可以更改,但是需要DBA遷移數據 
  18.      */ 
  19.     public static final int SHARDING_DATABASE_NODE_NUM = 4

3. yml 配置

4主4從數據庫配置, 這里僅測試默認使用root用戶密碼,生產環境不建議使用root用戶。

  1. mango: 
  2.   scan-package: com.bytearch.fast.cloud.mysql.sharding.dao 
  3.   datasources: 
  4.     - name: order_db_1 
  5.       master: 
  6.         driver-class-name: com.mysql.cj.jdbc.Driver 
  7.         jdbc-url: jdbc:mysql://172.30.1.21:3306/order_db_1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false 
  8.         user-name: root 
  9.         password: bytearch 
  10.         maximum-pool-size: 10 
  11.         connection-timeout: 3000 
  12.       slaves: 
  13.         - driver-class-name: com.mysql.cj.jdbc.Driver 
  14.           jdbc-url: jdbc:mysql://172.30.1.31:3306/order_db_1?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false 
  15.           user-name: root 
  16.           password: bytearch 
  17.           maximum-pool-size: 10 
  18.           connection-timeout: 3000 
  19.     - name: order_db_2 
  20.       master: 
  21.         driver-class-name: com.mysql.cj.jdbc.Driver 
  22.         jdbc-url: jdbc:mysql://172.30.1.22:3306/order_db_2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false 
  23.         user-name: root 
  24.         password: bytearch 
  25.         maximum-pool-size: 10 
  26.         connection-timeout: 3000 
  27.       slaves: 
  28.         - driver-class-name: com.mysql.cj.jdbc.Driver 
  29.           jdbc-url: jdbc:mysql://172.30.1.32:3306/order_db_2?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false 
  30.           user-name: root 
  31.           password: bytearch 
  32.           maximum-pool-size: 10 
  33.           connection-timeout: 3000 
  34.     - name: order_db_3 
  35.       master: 
  36.         driver-class-name: com.mysql.cj.jdbc.Driver 
  37.         jdbc-url: jdbc:mysql://172.30.1.23:3306/order_db_3?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false 
  38.         user-name: root 
  39.         password: bytearch 
  40.         maximum-pool-size: 10 
  41.         connection-timeout: 3000 
  42.       slaves: 
  43.         - driver-class-name: com.mysql.cj.jdbc.Driver 
  44.           jdbc-url: jdbc:mysql://172.30.1.33:3306/order_db_3?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false 
  45.           user-name: root 
  46.           password: bytearch 
  47.           maximum-pool-size: 10 
  48.           connection-timeout: 3000 
  49.     - name: order_db_4 
  50.       master: 
  51.         driver-class-name: com.mysql.cj.jdbc.Driver 
  52.         jdbc-url: jdbc:mysql://172.30.1.24:3306/order_db_4?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false 
  53.         user-name: root 
  54.         password: bytearch 
  55.         maximum-pool-size: 10 
  56.         connection-timeout: 3000 
  57.       slaves: 
  58.         - driver-class-name: com.mysql.cj.jdbc.Driver 
  59.           jdbc-url: jdbc:mysql://172.30.1.34:3306/order_db_4?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedState&connectTimeout=1000&socketTimeout=5000&useSSL=false 
  60.           user-name: root 
  61.           password: bytearch 
  62.           maximum-pool-size: 10 
  63.           connection-timeout: 300 

4. 分庫分表策略

1). 根據order_id為shardKey分庫分表策略

  1. package com.bytearch.fast.cloud.mysql.sharding.strategy; 
  2.  
  3. import com.bytearch.fast.cloud.mysql.sharding.common.ShardingStrategyConstant; 
  4. import com.bytearch.id.generator.IdEntity; 
  5. import com.bytearch.id.generator.SeqIdUtil; 
  6. import org.jfaster.mango.sharding.ShardingStrategy; 
  7.  
  8. /** 
  9.  * 訂單號分庫分表策略 
  10.  */ 
  11. public class OrderIdShardingStrategy implements ShardingStrategy<Long, Long> { 
  12.     @Override 
  13.     public String getDataSourceFactoryName(Long orderId) { 
  14.         if (orderId == null || orderId < 0L) { 
  15.             throw new IllegalArgumentException("order_id is invalid!"); 
  16.         } 
  17.         IdEntity idEntity = SeqIdUtil.decodeId(orderId); 
  18.         if (idEntity.getExtraId() >= ShardingStrategyConstant.SHARDING_TABLE_NUM) { 
  19.             throw new IllegalArgumentException("sharding table Num is invalid, tableNum:" + idEntity.getExtraId()); 
  20.         } 
  21.         //1. 計算步長 
  22.         int step = ShardingStrategyConstant.SHARDING_TABLE_NUM / ShardingStrategyConstant.SHARDING_DATABASE_NODE_NUM; 
  23.         //2. 計算出庫編號 
  24.         long dbNo = Math.floorDiv(idEntity.getExtraId(), step) + 1
  25.         //3. 返回數據源名 
  26.         return String.format("%s_%s", ShardingStrategyConstant.LOGIC_ORDER_DATABASE_NAME, dbNo); 
  27.     } 
  28.  
  29.     @Override 
  30.     public String getTargetTable(String logicTableName, Long orderId) { 
  31.         if (orderId == null || orderId < 0L) { 
  32.             throw new IllegalArgumentException("order_id is invalid!"); 
  33.         } 
  34.         IdEntity idEntity = SeqIdUtil.decodeId(orderId); 
  35.         if (idEntity.getExtraId() >= ShardingStrategyConstant.SHARDING_TABLE_NUM) { 
  36.             throw new IllegalArgumentException("sharding table Num is invalid, tableNum:" + idEntity.getExtraId()); 
  37.         } 
  38.         // 基于約定,真實表名為 logicTableName_XXX, XXX不足三位補0 
  39.         return String.format("%s_%03d", logicTableName, idEntity.getExtraId()); 
  40.     } 

2). 根據user_id 為shardKey分庫分表策略

  1. package com.bytearch.fast.cloud.mysql.sharding.strategy; 
  2.  
  3. import com.bytearch.fast.cloud.mysql.sharding.common.ShardingStrategyConstant; 
  4. import org.jfaster.mango.sharding.ShardingStrategy; 
  5.  
  6. /** 
  7.  * 指定分片KEY 分庫分表策略 
  8.  */ 
  9. public class UserIdShardingStrategy implements ShardingStrategy<Integer, Integer> { 
  10.  
  11.     @Override 
  12.     public String getDataSourceFactoryName(Integer userId) { 
  13.         //1. 計算步長 即單庫放得表數量 
  14.         int step = ShardingStrategyConstant.SHARDING_TABLE_NUM / ShardingStrategyConstant.SHARDING_DATABASE_NODE_NUM; 
  15.         //2. 計算出庫編號 
  16.         long dbNo = Math.floorDiv(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM, step) + 1
  17.         //3. 返回數據源名 
  18.         return String.format("%s_%s", ShardingStrategyConstant.LOGIC_ORDER_DATABASE_NAME, dbNo); 
  19.     } 
  20.  
  21.     @Override 
  22.     public String getTargetTable(String logicTableName, Integer userId) { 
  23.         // 基于約定,真實表名為 logicTableName_XXX, XXX不足三位補0 
  24.         return String.format("%s_%03d", logicTableName, userId % ShardingStrategyConstant.SHARDING_TABLE_NUM); 
  25.     } 

5. dao層編寫

1). OrderPartitionByIdDao

  1. package com.bytearch.fast.cloud.mysql.sharding.dao; 
  2.  
  3. import com.bytearch.fast.cloud.mysql.sharding.common.ShardingStrategyConstant; 
  4. import com.bytearch.fast.cloud.mysql.sharding.pojo.entity.OrderEntity; 
  5. import com.bytearch.fast.cloud.mysql.sharding.strategy.OrderIdShardingStrategy; 
  6. import org.jfaster.mango.annotation.*; 
  7.  
  8. @DB(name = ShardingStrategyConstant.LOGIC_ORDER_DATABASE_NAME, table = "order"
  9. @Sharding(shardingStrategy = OrderIdShardingStrategy.class
  10. public interface OrderPartitionByIdDao { 
  11.  
  12.     @SQL("INSERT INTO #table (order_id, user_id, status, booking_date, create_time, update_time) VALUES" + 
  13.             "(:orderId,:userId,:status,:bookingDate,:createTime,:updateTime)" 
  14.     ) 
  15.     int insertOrder(@TableShardingBy("orderId"@DatabaseShardingBy("orderId") OrderEntity orderEntity); 
  16.  
  17.     @SQL("UPDATE #table set update_time = now()" + 
  18.             "#if(:bookingDate != null),booking_date = :bookingDate #end " + 
  19.             "#if (:status != null), status = :status #end" + 
  20.             "WHERE order_id = :orderId" 
  21.     ) 
  22.     int updateOrderByOrderId(@TableShardingBy("orderId"@DatabaseShardingBy("orderId") OrderEntity orderEntity); 
  23.  
  24.  
  25.     @SQL("SELECT * FROM #table WHERE order_id = :1"
  26.     OrderEntity getOrderById(@TableShardingBy @DatabaseShardingBy Long orderId); 
  27.  
  28.     @SQL("SELECT * FROM #table WHERE order_id = :1"
  29.     @UseMaster 
  30.     OrderEntity getOrderByIdFromMaster(@TableShardingBy @DatabaseShardingBy Long orderId); 

6. 單元測試

  1. @SpringBootTest(classes = {Application.class}) 
  2. @RunWith(SpringJUnit4ClassRunner.class
  3. public class ShardingTest { 
  4.     @Autowired 
  5.     OrderPartitionByIdDao orderPartitionByIdDao; 
  6.  
  7.     @Autowired 
  8.     OrderPartitionByUserIdDao orderPartitionByUserIdDao; 
  9.  
  10.     @Test 
  11.     public void testCreateOrderRandom() { 
  12.         for (int i = 0; i < 20; i++) { 
  13.             int userId = ThreadLocalRandom.current().nextInt(1000,1000000); 
  14.             OrderEntity orderEntity = new OrderEntity(); 
  15.             orderEntity.setOrderId(SeqIdUtil.nextId(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM)); 
  16.             orderEntity.setStatus(1); 
  17.             orderEntity.setUserId(userId); 
  18.             orderEntity.setCreateTime(new Date()); 
  19.             orderEntity.setUpdateTime(new Date()); 
  20.             orderEntity.setBookingDate(new Date()); 
  21.             int ret = orderPartitionByIdDao.insertOrder(orderEntity); 
  22.             Assert.assertEquals(1, ret); 
  23.         } 
  24.     } 
  25.  
  26.     @Test 
  27.     public void testOrderAll() { 
  28.         //insert 
  29.         int userId = ThreadLocalRandom.current().nextInt(1000,1000000); 
  30.         OrderEntity orderEntity = new OrderEntity(); 
  31.         orderEntity.setOrderId(SeqIdUtil.nextId(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM)); 
  32.         orderEntity.setStatus(1); 
  33.         orderEntity.setUserId(userId); 
  34.         orderEntity.setCreateTime(new Date()); 
  35.         orderEntity.setUpdateTime(new Date()); 
  36.         orderEntity.setBookingDate(new Date()); 
  37.         int i = orderPartitionByIdDao.insertOrder(orderEntity); 
  38.         Assert.assertEquals(1, i); 
  39.  
  40.         //get from master 
  41.         OrderEntity orderInfo = orderPartitionByIdDao.getOrderByIdFromMaster(orderEntity.getOrderId()); 
  42.         Assert.assertNotNull(orderInfo); 
  43.         Assert.assertEquals(orderInfo.getOrderId(), orderEntity.getOrderId()); 
  44.  
  45.         //get from slave 
  46.         OrderEntity slaveOrderInfo = orderPartitionByIdDao.getOrderById(orderEntity.getOrderId()); 
  47.         Assert.assertNotNull(slaveOrderInfo); 
  48.         //update 
  49.         OrderEntity updateEntity = new OrderEntity(); 
  50.         updateEntity.setOrderId(orderInfo.getOrderId()); 
  51.         updateEntity.setStatus(2); 
  52.         updateEntity.setUpdateTime(new Date()); 
  53.         int affectRows = orderPartitionByIdDao.updateOrderByOrderId(updateEntity); 
  54.         Assert.assertTrue( affectRows > 0); 
  55.     } 
  56.  
  57.     @Test 
  58.     public void testGetListByUserId() { 
  59.         int userId = ThreadLocalRandom.current().nextInt(1000,1000000); 
  60.         for (int i = 0; i < 5; i++) { 
  61.             OrderEntity orderEntity = new OrderEntity(); 
  62.             orderEntity.setOrderId(SeqIdUtil.nextId(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM)); 
  63.             orderEntity.setStatus(1); 
  64.             orderEntity.setUserId(userId); 
  65.             orderEntity.setCreateTime(new Date()); 
  66.             orderEntity.setUpdateTime(new Date()); 
  67.             orderEntity.setBookingDate(new Date()); 
  68.             orderPartitionByIdDao.insertOrder(orderEntity); 
  69.         } 
  70.         try { 
  71.             //防止主從延遲引起的校驗錯誤 
  72.             Thread.sleep(1000); 
  73.         } catch (InterruptedException e) { 
  74.             e.printStackTrace(); 
  75.         } 
  76.         List<OrderEntity> orderListByUserId = orderPartitionByUserIdDao.getOrderListByUserId(userId); 
  77.         Assert.assertNotNull(orderListByUserId); 
  78.         Assert.assertTrue(orderListByUserId.size() == 5); 
  79.     } 

大功告成:

以上源碼已開源至: https://gitee.com/bytearch_admin/fast-cloud/tree/master/fast-cloud-mysql-sharding 歡迎點贊收藏。

五、總結

本篇主要介紹Java版使用Mango框架實現Mysql分庫分表實戰,分庫分表中間件也可以使用類似于ShardingJDBC,或者自研。

以上分庫分表數量僅供演示參考,實際工作中分表數量、分庫數量、是根據公司實際業務數據增長速度, 高峰期QPS,物理機器配置等等因素計算。

 

責任編輯:張燕妮 來源: 淺談架構
相關推薦

2022-10-10 17:37:59

分庫分表訂單業務

2022-06-30 07:34:46

分庫分表外賣訂單系統

2022-10-13 17:43:10

MySQL存放數據

2025-07-03 08:21:16

2022-11-30 07:58:10

支付業務系統分庫分表

2019-05-21 14:33:01

2022-10-09 18:14:31

訂單系統分庫分表

2022-06-22 07:32:53

Sharding分庫數據源

2020-11-18 09:39:02

MySQL數據庫SQL

2018-05-08 18:26:49

數據庫MySQL性能

2022-07-04 23:24:28

sql優化監控

2020-07-30 17:59:34

分庫分表SQL數據庫

2022-01-26 07:59:07

緩存分庫分表

2022-07-08 08:57:36

數據優化垂直拆分數據庫

2022-01-28 08:59:59

分庫分表數據

2019-07-31 09:27:23

數據庫MySQLSQL

2018-09-21 15:50:58

數據庫MySQL分庫分表

2019-11-12 09:54:20

分庫分表數據

2022-06-30 14:07:10

分庫分表系統

2022-01-27 08:14:54

數據優化讀寫分離
點贊
收藏

51CTO技術棧公眾號

成人国产在线激情| 精品国产拍在线观看| 国产精品久久中文字幕| 五月婷婷六月色| 视频在线观看一区| 美女av一区二区| 亚洲av无码一区二区三区观看| 经典三级一区二区| 亚洲制服丝袜一区| 日韩中文一区| 蜜臀久久99精品久久久| 日本vs亚洲vs韩国一区三区| 欧美大尺度激情区在线播放| japanese中文字幕| 亚洲精品国产九九九| 欧美亚洲国产怡红院影院| 欧妇女乱妇女乱视频| 风间由美一区| av动漫一区二区| 成人妇女淫片aaaa视频| 你懂的国产在线| 91国语精品自产拍| 一本久久综合亚洲鲁鲁| 中文字幕在线观看91| 欧美成人一二区| 色综合视频在线观看| 精品国产av无码一区二区三区| av中文天堂在线| 91污在线观看| 51精品国产人成在线观看| 91porny九色| 亚洲电影成人| 免费av一区二区| 国产主播av在线| 中文字幕av一区二区三区人| 日韩你懂的在线播放| 欧美成人三级在线播放| 亚洲一区站长工具| 亚洲国产精品一区二区尤物区| 特级黄色录像片| av电影在线观看网址| 久久毛片高清国产| 国内成+人亚洲| 欧美一区二区黄片| 国产成a人亚洲精品| 成人啪啪免费看| 一级黄色大片免费观看| 日日噜噜夜夜狠狠视频欧美人 | 欧美在线观看视频一区二区| 18禁免费观看网站| 高清精品在线| 午夜精品久久久久久久99樱桃| 黄色录像特级片| 黄色免费网站在线| 自拍偷拍亚洲欧美日韩| 亚洲午夜精品久久久中文影院av| 成人动漫在线播放| 国产精品婷婷午夜在线观看| 亚洲精品一卡二卡三卡四卡| 成人资源www网在线最新版| 国产视频一区二区三区在线观看 | 婷婷伊人综合中文字幕| 成人高清av在线| 福利视频一区二区三区| 风流少妇一区二区三区91| 成人动漫在线一区| 激情小说网站亚洲综合网| 午夜小视频免费| 久久久久久亚洲综合| 日韩一本精品| 色影视在线观看| 亚洲人成网站在线| 91精品国产毛片武则天| 美女91在线| 狠狠做深爱婷婷久久综合一区| 能在线观看的av| a屁视频一区二区三区四区| 欧美日韩日日夜夜| 欧美精品色视频| 国产精品网址| 亚洲欧美日韩中文视频| 日韩一区二区三区四区视频| 在线精品国产| 91精品国产91久久久久久| 四虎成人在线观看| 裸体一区二区三区| 粉嫩av一区二区三区免费观看| 亚洲av成人无码网天堂| 国产精品无人区| www.xxx麻豆| 欧美暴力调教| 日韩欧美一区在线观看| 中文字幕一区二区三区人妻| 天天做天天爱天天综合网| 欧美国产精品va在线观看| 久久国产视频精品| 精品一区二区三区免费播放| 国产精品久久波多野结衣| 国产中文在线视频| 一区二区三区毛片| 激情六月丁香婷婷| 视频一区日韩精品| 国产亚洲欧洲黄色| 激情五月婷婷在线| 日本 国产 欧美色综合| 国产高清一区二区三区| 1024国产在线| 精品露脸国产偷人在视频| 国产三级三级看三级| 六月丁香久久丫| 久久黄色av网站| 亚洲黄网在线观看| 成人免费视频app| 日日骚一区二区网站| 国产蜜臀一区二区打屁股调教| 日韩图片一区| 日本午夜人人精品| 午夜精品久久久久久久99老熟妇| 久久久亚洲高清| 日本福利视频网站| 免费成人高清在线视频| 日韩国产欧美精品在线| 麻豆chinese极品少妇| 蜜臀av一区二区在线免费观看| 国产精品区一区| 九七久久人人| 欧美日韩在线播放| 一本色道久久综合亚洲精品图片| 欧美精品激情| 成人情趣片在线观看免费| 电影在线一区| 一本大道av一区二区在线播放| 苍井空张开腿实干12次| 亚洲精品国产偷自在线观看| 国产精品久久久久久久7电影| 天天操天天干天天插| 亚洲一区在线观看网站| 国产高清av片| 久久亚洲成人| 国产精品色午夜在线观看| 牛牛热在线视频| 天涯成人国产亚洲精品一区av| 最好看的中文字幕| 91精品久久久久久久蜜月| 国产乱肥老妇国产一区二 | www欧美成人18+| 无码人妻精品一区二区三区在线| 91麻豆精品国产91久久久久推荐资源| 久久久99免费视频| 国产精品区在线观看| 国产精品久久久久天堂| www.com黄色片| 91亚洲国产成人久久精品| 国产精品欧美一区二区三区奶水| 精品无吗乱吗av国产爱色| 色国产综合视频| 色哟哟精品观看| 青椒成人免费视频| 中文字幕一区二区三区精彩视频| 欧美系列精品| 久久亚洲精品毛片| 精品人妻无码一区二区色欲产成人 | 蜜臀精品一区二区三区| 中文字幕欧美区| 国产成人在线综合| 欧美日韩1区2区3区| 国产日韩欧美亚洲一区| 色综合桃花网| 日韩精品视频免费在线观看| 综合网在线观看| 中文字幕高清不卡| 日本高清久久久| 欧美三区美女| 久久久久久久有限公司| 99欧美精品| 欧美不卡视频一区发布| 好吊色在线观看| 色综合中文字幕| 成人18视频免费69| 丁香六月久久综合狠狠色| 可以在线看的av网站| 久久91精品| 91九色视频导航| aa级大片免费在线观看| 亚洲午夜小视频| 精品人妻一区二区三区四区不卡 | 亚洲视频免费看| 污网站免费观看| 首页亚洲欧美制服丝腿| 正在播放国产精品| 国产精品中文字幕制服诱惑| 日韩av免费在线播放| av免费在线免费| 亚洲男人天堂九九视频| 一区二区三区精彩视频| 亚洲成人动漫一区| 日本黄区免费视频观看| 成人免费av在线| 我要看一级黄色大片| 影音先锋久久精品| 伊人久久大香线蕉成人综合网| 成人av影音| 国产有码在线一区二区视频| 欧产日产国产精品视频| 久久高清视频免费| 色视频免费在线观看| 欧美一二三区在线| 久久久蜜桃一区二区| 亚洲国产另类av| 久久久久久久麻豆| 久久精品一区二区三区四区 | 久久久亚洲欧洲日产国码αv| 污污的视频免费观看| 免费精品视频| 日韩日韩日韩日韩日韩| 亚洲xxx拳头交| 五月婷婷综合色| 亚洲素人在线| 韩国精品一区二区三区六区色诱| 99精品视频在线免费播放| 国产成人精品综合久久久| 男女免费观看在线爽爽爽视频| 中文字幕国产精品久久| 深夜影院在线观看| 日韩欧美aaaaaa| 国产夫绿帽单男3p精品视频| 欧美亚洲愉拍一区二区| 黄色污污网站在线观看| 精品国产乱码久久久久酒店| 激情综合网五月天| 亚洲免费观看高清在线观看| 成年人二级毛片| 中文字幕免费不卡| 日韩中文字幕有码| 久久久久久久精| 中文乱码人妻一区二区三区视频| 国产99久久久国产精品潘金网站| 91丝袜超薄交口足| 精品亚洲免费视频| 亚洲怡红院在线| 麻豆精品在线看| 亚洲精品午夜在线观看| 日韩和欧美一区二区三区| 一本久道中文无码字幕av| 亚洲黄网站黄| 国产毛片视频网站| 1024成人| 日韩在线视频在线观看| 99riav国产精品| 日韩av综合在线观看| 亚洲三级网站| 69堂免费视频| 久久精选视频| 国产精品拍拍拍| 美女免费视频一区| 亚洲欧美偷拍另类| 韩国av一区二区三区四区| aaa一级黄色片| 国产高清不卡一区二区| 无码国产精品一区二区免费式直播| 国产91在线看| 丰满少妇在线观看资源站| 久久免费偷拍视频| 99在线视频免费| 亚洲欧美自拍偷拍| 欧美激情国产精品免费| 偷拍一区二区三区四区| 黄色av一级片| 欧美日韩午夜在线视频| 国产美女免费视频| 亚洲精品美女久久久| 日本福利在线观看| 伊人久久久久久久久久| 黄网站在线免费看| 久久久久久12| 免费看av不卡| 91精品久久久久久久久久另类| 九色精品蝌蚪| 久久艹中文字幕| 91精品精品| 国产成人精品视频免费看| 蜜臀国产一区二区三区在线播放 | 那种视频在线观看| 日本麻豆一区二区三区视频| 激情图片中文字幕| 91麻豆免费看| 波多野结衣在线网址| 亚洲成人自拍偷拍| 夜夜爽8888| 亚洲成人aaa| 午夜免费视频在线国产| 午夜精品国产精品大乳美女| 成人自拍视频网| 国产chinese精品一区二区| 精品久久综合| 国产 日韩 欧美在线| 久久av老司机精品网站导航| 日韩Av无码精品| 国产精品国产三级国产aⅴ入口| 久久亚洲国产成人精品性色| 91久久精品午夜一区二区| 超碰人人人人人人| 在线播放精品一区二区三区| 草莓视频丝瓜在线观看丝瓜18| 国产精品三级久久久久久电影| 欧美理论电影在线精品| 亚洲自拍偷拍一区二区三区| 久热综合在线亚洲精品| 动漫美女无遮挡免费| 亚洲欧美一区二区三区久本道91| 国产又黄又粗又爽| 欧美v日韩v国产v| 嫩草香蕉在线91一二三区| 欧美在线视频免费播放| 2023国产精华国产精品| 伊人婷婷久久| 日本在线观看不卡视频| 色噜噜在线观看| 夜夜精品视频一区二区| 91九色蝌蚪91por成人| 国产亚洲精品久久久久久牛牛| 7777kkk亚洲综合欧美网站| 91久久久久久| 91日韩在线| 中文字幕视频在线免费观看| 91麻豆国产香蕉久久精品| 国产精品30p| 欧美大片拔萝卜| 91一区二区三区在线| 91精品视频在线| 国产精品麻豆久久| www.久久久久久久久久久| 欧美国产成人精品| 中文字幕人妻色偷偷久久| 国产亚洲视频在线| 日本美女一区| 日本免费一区二区三区| 欧美亚洲视频| 波多野结衣一本| 欧美午夜片欧美片在线观看| 五月天久久久久久| 4p变态网欧美系列| 丝袜连裤袜欧美激情日韩| 777精品久无码人妻蜜桃| 99精品一区二区| 国产一级淫片a视频免费观看| 精品夜色国产国偷在线| 成人美女视频| 午夜一区二区三区| 日韩av成人高清| 天堂av网手机版| 7777精品伊人久久久大香线蕉完整版 | 国内精品久久久| 97久久精品| 欧美一级片免费播放| 99久久婷婷国产综合精品电影| 欧美三级韩国三级日本三斤在线观看| 日韩av有码在线| 亚洲美女久久精品| 性欧美.com| 精品一区精品二区高清| 天天看片中文字幕| 精品国产一区a| 另类图片综合电影| 亚洲精品二区| 国产精品一级片在线观看| 欧美精品xxxxx| 日韩久久精品电影| 久久国内精品| 老子影院午夜伦不卡大全| 91麻豆精东视频| 91资源在线视频| 欧美精品18videosex性欧美| 久久久久久久久久久久久久久久久久久久 | 午夜小视频在线| **亚洲第一综合导航网站| 亚洲精品乱码| 欧美精品日韩在线| 精品免费一区二区三区| 日本成人三级电影| 真人做人试看60分钟免费| 97久久久精品综合88久久| 国产亚洲久一区二区| 欧美成在线视频| 国产精品嫩模av在线| 色婷婷综合在线观看| 一本大道久久a久久精二百| 成人黄视频在线观看| 久久久久网址| 国产乱一区二区| 婷婷激情五月综合| 九九久久久久久久久激情| 亚洲婷婷伊人| 18深夜在线观看免费视频| 色综合中文综合网| 丝袜美腿av在线| 五月天色一区| 久久亚洲欧美国产精品乐播| 国产美女裸体无遮挡免费视频| 欧美中文字幕视频在线观看|