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

国产一区二区高清视频| 亚洲精品久久在线| 91精品国产吴梦梦| 亚洲av色香蕉一区二区三区| 亚洲精品视频啊美女在线直播| 日韩精品免费一线在线观看| 国产野外作爱视频播放| 亚洲欧美成人影院| www成人在线观看| 国产美女久久精品香蕉69| 久久久久久久久久一区二区三区| 亚洲第一福利专区| 欧美一区二区三区四区高清| 成人在线免费在线观看| 免费在线看黄色| 99re这里都是精品| 成人免费看吃奶视频网站| 亚洲欧美综合另类| 伊人情人综合网| 亚洲女人被黑人巨大进入| 精品五月天久久| 国产女主播自拍| 瑟瑟视频在线| 久久美女高清视频| av噜噜色噜噜久久| 91成品人影院| 久久一日本道色综合久久| 欧美国产精品va在线观看| 欧美激情 一区| 天天躁日日躁成人字幕aⅴ| 欧美一二三四区在线| www黄色在线| 好看的中文字幕在线播放| 国产精品久久久久影院| 久久国产精品99久久久久久丝袜 | 亚洲精品网址| 国产亚洲人成a一在线v站| 91玉足脚交白嫩脚丫| 日本一区二区三区视频在线看| 欧美午夜精品一区二区三区| 熟女性饥渴一区二区三区| 丁香高清在线观看完整电影视频| 亚洲欧美日韩国产另类专区| 亚洲欧美日韩综合一区| 国产专区在线播放| 91理论电影在线观看| 国产尤物99| 狠狠躁日日躁夜夜躁av| 国产精品2024| 亚洲aa中文字幕| 国产精品国产三级国产aⅴ| 蜜桃精品视频在线| 国产精品人人做人人爽| 波多野结衣高清视频| 三级亚洲高清视频| 国产精品扒开腿做爽爽爽男男| 国产精品100| 日韩一级免费| 2018日韩中文字幕| 国产精品美女久久久久av爽| 亚洲精品日本| 日本欧美一级片| 天天综合网久久综合网| 丝袜亚洲另类欧美综合| 国产精品极品美女粉嫩高清在线| 久久久久久久久久一级| 日本不卡在线视频| 国产一区视频在线| 精品区在线观看| 成人av在线影院| 久久国产主播精品| 经典三级在线| 国产精品美女久久久久av爽李琼 | 今天的高清视频免费播放成人| 欧美黑人视频一区| 国产无人区码熟妇毛片多| 午夜亚洲伦理| 国产精品视频自在线| 国产精品自产拍| 成人综合激情网| 欧美一区二区三区在线免费观看| 国产福利在线| 一区二区三区四区中文字幕| 激情深爱综合网| 电影久久久久久| 3751色影院一区二区三区| 精人妻一区二区三区| 人体久久天天| 日韩视频中文字幕| 国产在线拍揄自揄拍| 久久激情网站| 96pao国产成视频永久免费| 全国男人的天堂网| 久久久久久久国产精品影院| 国产又黄又爽免费视频| 僵尸再翻生在线观看| 在线观看视频一区二区欧美日韩| 日本一二三四区视频| 北条麻妃在线| 久久婷婷丁香| 国产欧美婷婷中文| 亚洲经典一区二区三区| 男男gaygays亚洲| 狠狠色香婷婷久久亚洲精品| 日本精品一区在线| 日韩大胆成人| 久久国产精彩视频| 中文在线第一页| 国产精品1区二区.| 日韩美女一区| 136福利第一导航国产在线| 欧美在线啊v一区| 亚洲一区和二区| 日韩电影免费网址| 97在线视频免费看| 国产婷婷在线视频| 欧美激情中文不卡| 亚洲 高清 成人 动漫| 国产精品麻豆| 最近2019中文字幕大全第二页| 日韩精品一卡二卡| 国产米奇在线777精品观看| 日韩久久久久久久| 麻豆免费版在线观看| 日韩精品一区二区三区老鸭窝| 亚洲色图第四色| 免费视频一区二区三区在线观看| 成人动漫在线观看视频| 麻豆网站在线观看| 欧美在线播放高清精品| 伊人网伊人影院| 日韩一级免费| 精品国产一区二区三| 在线不卡日本v二区707| 欧美蜜桃一区二区三区| 欧美亚洲色综久久精品国产| 香蕉久久夜色精品| 久久99精品久久久久久久久久| 欧美人体视频xxxxx| 91精品久久久久久蜜臀| 潘金莲一级黄色片| 久久aⅴ国产欧美74aaa| 深夜福利成人| 日本成人伦理电影| 亚洲午夜女主播在线直播| 亚洲 欧美 成人| 久久人人97超碰com| 六月丁香婷婷在线| 亚洲动漫在线观看| 日本91av在线播放| 黄色毛片在线观看| 欧美视频自拍偷拍| 91禁男男在线观看| 国产又粗又猛又爽又黄91精品| 一本色道久久综合亚洲二区三区| 国产亚洲精彩久久| 日韩有码在线视频| 99热这里只有精品1| 亚洲精品成人悠悠色影视| 一级片免费在线观看视频| 欧美激情亚洲| 国内一区二区在线视频观看| 24小时免费看片在线观看| 亚洲精品小视频在线观看| 日韩熟女一区二区| 中文字幕制服丝袜一区二区三区| 超碰人人草人人| 国产一区日韩欧美| 精品国产乱码久久久久久88av| 成人片免费看| 色偷偷噜噜噜亚洲男人的天堂| 国产丝袜视频在线观看| 亚洲成人免费视| 中文字幕一区二区三区人妻不卡| 久久亚洲综合| 在线播放 亚洲| 亚洲精品一二三**| 欧美一区二区三区…… | 高清成人在线观看| 国产日产欧美视频| 98精品视频| 国产精品乱码| 写真福利精品福利在线观看| 日韩亚洲第一页| 丰满大乳国产精品| 91成人国产精品| 国产大片免费看| 久久蜜桃香蕉精品一区二区三区| 国产无色aaa| 亚洲看片一区| 一区二区三区免费看| 第四色在线一区二区| 国产精品久久久久一区二区| 影音先锋男人资源在线| 精品一区二区三区四区在线| 国产又粗又大又爽视频| 亚洲成av人综合在线观看| 欧美波霸videosex极品| 福利一区二区在线| 黄色三级视频片| 欧美久久综合| 四虎永久国产精品| 国产精品chinese在线观看| 国产精品久久久久久久久久久久 | 天天色天天操综合| 中文字幕无码日韩专区免费| 久久婷婷国产综合精品青草| 可以看的av网址| 免费一级片91| 中文字幕无码精品亚洲35| 一区二区三区毛片免费| 日韩欧美第二区在线观看| 香蕉成人av| 国产成人99久久亚洲综合精品| 男女猛烈激情xx00免费视频| 国产草草影院ccyycom| 欧美午夜无遮挡| 久草视频手机在线| 国产欧美日韩精品一区| 9.1在线观看免费| 久久99精品国产.久久久久久| 免费av观看网址| 国产精品hd| 经典三级在线视频| 日本一区二区三区视频| 久久伊人一区| 福利欧美精品在线| 国产日韩欧美视频在线| 成人看片网站| 国产suv精品一区二区| 成人bbav| 欧美激情videoshd| 50度灰在线| 久久亚洲精品中文字幕冲田杏梨| caoporn国产精品免费视频| 亚洲欧美日韩国产成人| 午夜影院在线视频| 亚洲国产精品字幕| 丰满人妻妇伦又伦精品国产| 日韩欧美国产wwwww| a网站在线观看| 欧美一二三区精品| 性生交生活影碟片| 欧美电影免费提供在线观看| www.好吊色| 日韩精品一区二区三区在线播放| www日本在线| 欧美v亚洲v综合ⅴ国产v| 午夜精品久久久久久久99热黄桃| 日韩一区二区视频| 亚洲成人av综合| 精品国产伦一区二区三区观看方式| www久久久com| 亚洲精品电影网| 美州a亚洲一视本频v色道| 亚洲欧洲综合在线| 欧美日韩一区不卡| 中文字幕精品一区二| 精品视频123区在线观看| 国产精品久久久久久久久久99| 日本免费中文字幕在线| 中文字幕国内精品| 在线免费观看黄| 久久久国产视频| 欧美精品videossex少妇| 欧美激情在线视频二区| 成入视频在线观看| 日本成人精品在线| 精品美女一区| 3d精品h动漫啪啪一区二区| 亚洲精品a区| 久久精品日韩| 欧美码中文字幕在线| 一区二区在线中文字幕电影视频| 亚洲女同一区| 男人添女荫道口图片| 天堂av在线一区| 精品国产午夜福利在线观看| 99国产精品久久| 少妇太紧太爽又黄又硬又爽小说| 亚洲日本va在线观看| 日韩av无码中文字幕| 色婷婷亚洲一区二区三区| 国产精品久久久久毛片| 精品999久久久| 137大胆人体在线观看| 欧美乱人伦中文字幕在线| 亚洲国产成人二区| 成人激情电影一区二区| swag国产精品一区二区| 日产国产精品精品a∨| 久久久久久久久久久久久久| 波多野结衣综合网| 免费观看在线色综合| 久久发布国产伦子伦精品| 久久亚洲精品小早川怜子| 亚洲女人久久久| 欧美性高潮床叫视频| 国产后入清纯学生妹| 亚洲欧美综合区自拍另类| av片在线观看免费| 日韩av电影国产| 欧美视频二区欧美影视| 色吧亚洲视频| 亚洲视频观看| 天天影视色综合| 久久婷婷色综合| 日韩激情在线播放| 欧美一区午夜精品| 国产露出视频在线观看| 高清欧美性猛交xxxx| 亚洲美女色播| 日本不卡一区二区三区视频| 亚洲视频精品| 亚洲制服中文字幕| 中文在线一区二区| 国产性猛交╳xxx乱大交| 精品国产麻豆免费人成网站| 超碰在线免费公开| 国产精品永久免费在线| www.美色吧.com| www.欧美日本| 亚洲91精品| 能看的毛片网站| 99re这里只有精品6| 精品处破女学生| 日韩一区二区三区在线视频| 尤物网在线观看| av一区二区不卡| 黄色片网站在线播放| 色噜噜狠狠成人中文综合| 天堂av中文字幕| 欧美激情一级二级| 亚洲第一二区| 91麻豆天美传媒在线| 久久精品99久久久| 免费黄色在线网址| 欧美体内she精视频| 77导航福利在线| 国产欧美日韩免费| 久久免费精品视频在这里| 天天爽天天爽夜夜爽| 国产午夜精品久久| 丁香社区五月天| 欧美一级xxx| 性欧美video高清bbw| 成人亚洲综合色就1024| 希岛爱理一区二区三区| 亚洲色图 在线视频| 国产精品网站在线播放| 国产精品51麻豆cm传媒| 在线视频欧美日韩| 四虎4545www精品视频| 国内外成人免费视频| 亚洲激情自拍| 日本天堂在线播放| 午夜激情综合网| 亚洲毛片在线播放| 久久免费精品视频| 精品久久ai| 日本免费a视频| 成人污污视频在线观看| 国产亚洲精品码| 日韩国产精品一区| jizz内谢中国亚洲jizz| 日韩一二三区不卡在线视频| 日精品一区二区| www.com.av| 欧美一区二区三区四区五区| 91精选在线| 欧美国产一区二区在线| 水蜜桃久久夜色精品一区的特点| 人妻互换一区二区激情偷拍| 在线综合+亚洲+欧美中文字幕| 日本性爱视频在线观看| 成人片在线免费看| 国产视频一区欧美| 日韩视频在线观看免费视频| 欧美剧情电影在线观看完整版免费励志电影 | 欧美视频免费在线观看| 毛片在线播放网站| 国产精品爽黄69| 在线成人亚洲| 3d动漫精品啪啪一区二区下载 | 欧美激情自拍偷拍| www.av黄色| 日本亚洲欧美成人| 亚洲精品中文字幕乱码| 亚洲天堂2024| 亚洲一区二区三区中文字幕| 亚洲最大福利视频| 精品中文一区| 亚洲天堂av一区二区| 亚洲精选免费视频| 精品国产一级片| 一本色道久久88精品综合| 看片网址国产福利av中文字幕| 亚洲精品一区二区网址| free欧美| 国产一区二区动漫|