校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 淺談訂單重構之 MySQL 分庫分表實戰篇

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

熱門標簽:拉卡拉外呼系統 云南電商智能外呼系統價格 大眾點評星級酒店地圖標注 話務外呼系統怎么樣 臨清電話機器人 高清地圖標注道路 外東北地圖標注 400電話可以辦理嗎 智能外呼系統復位

一、目標

本文將完成如下目標:

  • 分表數量: 256    分庫數量: 4
  • 以用戶ID(user_id) 為數據庫分片Key
  • 最后測試訂單創建,更新,刪除, 單訂單號查詢,根據user_id查詢列表操作。

架構圖:

表結構如下:

CREATE TABLE `order_XXX` (
  `order_id` bigint(20) unsigned NOT NULL,
  `user_id` int(11) DEFAULT '0' COMMENT '訂單id',
  `status` int(11) DEFAULT '0' COMMENT '訂單狀態',
  `booking_date` datetime DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `update_time` datetime DEFAULT NULL,
  PRIMARY KEY (`order_id`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_bdate` (`booking_date`),
  KEY `idx_ctime` (`create_time`),
  KEY `idx_utime` (`update_time`)
) 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年

二、環境準備

1、基本信息

版本 備注
SpringBoot 2.1.10.RELEASE
Mango 1.6.16 wiki地址:https://github.com/jfaster/mango
HikariCP 3.2.0
Mysql 5.7 測試使用docker一鍵搭建

2、數據庫環境準備

進入mysql:

#主庫
 mysql -h 172.30.1.21 -uroot -pbytearch

#從庫
 mysql -h 172.30.1.31 -uroot -pbytearch


進入容器

#主
docker exec -it db_1_master /bin/bash

#從
docker exec -it db_1_slave /bin/bash


查看運行狀態

#主
docker exec db_1_master sh -c 'mysql -u root -pbytearch -e "SHOW MASTER STATUS \G"'
#從
docker exec db_1_slave sh -c 'mysql -u root -pbytearch -e "SHOW SLAVE STATUS \G"' 

3、建庫 導入分表

(1)在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 )

(2)依次導入建表SQL 命令為

mysql -uroot -pbytearch -h172.30.1.21 order_db_1fast-cloud-mysql-sharding/doc/sql/order_db_1.sql;
mysql -uroot -pbytearch -h172.30.1.22 order_db_2fast-cloud-mysql-sharding/doc/sql/order_db_2.sql;
mysql -uroot -pbytearch -h172.30.1.23 order_db_3fast-cloud-mysql-sharding/doc/sql/order_db_3.sql;
mysql -uroot -pbytearch -h172.30.1.24 order_db_4fast-cloud-mysql-sharding/doc/sql/order_db_4.sql;  

三、配置實踐

1、pom文件  

     !-- mango 分庫分表中間件 --> 
            dependency>
                groupId>org.jfaster/groupId>
                artifactId>mango-spring-boot-starter/artifactId>
                version>2.0.1/version>
            /dependency>
         
             !-- 分布式ID生成器 -->
            dependency>
                groupId>com.bytearch/groupId>
                artifactId>fast-cloud-id-generator/artifactId>
                version>${version}/version>
            /dependency>

            !-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
            dependency>
                groupId>mysql/groupId>
                artifactId>mysql-connector-java/artifactId>
                version>6.0.6/version>
            /dependency>

2、常量配置

package com.bytearch.fast.cloud.mysql.sharding.common;

/**
 * 分庫分表策略常用常量
 */
public class ShardingStrategyConstant {
    /**
     * database 邏輯名稱 ,真實庫名為 order_db_XXX
     */
    public static final String LOGIC_ORDER_DATABASE_NAME = "order_db";
    /**
     * 分表數 256,一旦確定不可更改
     */
    public static final int SHARDING_TABLE_NUM = 256;

    /**
     * 分庫數, 不建議更改, 可以更改,但是需要DBA遷移數據
     */
    public static final int SHARDING_DATABASE_NODE_NUM = 4;
}

3、yml 配置

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

mango:
  scan-package: com.bytearch.fast.cloud.mysql.sharding.dao
  datasources:
    - name: order_db_1
      master:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://172.30.1.21:3306/order_db_1?useUnicode=truecharacterEncoding=utf8autoReconnect=truerewriteBatchedStateconnectTimeout=1000socketTimeout=5000useSSL=false
        user-name: root
        password: bytearch
        maximum-pool-size: 10
        connection-timeout: 3000
      slaves:
        - driver-class-name: com.mysql.cj.jdbc.Driver
          jdbc-url: jdbc:mysql://172.30.1.31:3306/order_db_1?useUnicode=truecharacterEncoding=utf8autoReconnect=truerewriteBatchedStateconnectTimeout=1000socketTimeout=5000useSSL=false
          user-name: root
          password: bytearch
          maximum-pool-size: 10
          connection-timeout: 3000
    - name: order_db_2
      master:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://172.30.1.22:3306/order_db_2?useUnicode=truecharacterEncoding=utf8autoReconnect=truerewriteBatchedStateconnectTimeout=1000socketTimeout=5000useSSL=false
        user-name: root
        password: bytearch
        maximum-pool-size: 10
        connection-timeout: 3000
      slaves:
        - driver-class-name: com.mysql.cj.jdbc.Driver
          jdbc-url: jdbc:mysql://172.30.1.32:3306/order_db_2?useUnicode=truecharacterEncoding=utf8autoReconnect=truerewriteBatchedStateconnectTimeout=1000socketTimeout=5000useSSL=false
          user-name: root
          password: bytearch
          maximum-pool-size: 10
          connection-timeout: 3000
    - name: order_db_3
      master:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://172.30.1.23:3306/order_db_3?useUnicode=truecharacterEncoding=utf8autoReconnect=truerewriteBatchedStateconnectTimeout=1000socketTimeout=5000useSSL=false
        user-name: root
        password: bytearch
        maximum-pool-size: 10
        connection-timeout: 3000
      slaves:
        - driver-class-name: com.mysql.cj.jdbc.Driver
          jdbc-url: jdbc:mysql://172.30.1.33:3306/order_db_3?useUnicode=truecharacterEncoding=utf8autoReconnect=truerewriteBatchedStateconnectTimeout=1000socketTimeout=5000useSSL=false
          user-name: root
          password: bytearch
          maximum-pool-size: 10
          connection-timeout: 3000
    - name: order_db_4
      master:
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://172.30.1.24:3306/order_db_4?useUnicode=truecharacterEncoding=utf8autoReconnect=truerewriteBatchedStateconnectTimeout=1000socketTimeout=5000useSSL=false
        user-name: root
        password: bytearch
        maximum-pool-size: 10
        connection-timeout: 3000
      slaves:
        - driver-class-name: com.mysql.cj.jdbc.Driver
          jdbc-url: jdbc:mysql://172.30.1.34:3306/order_db_4?useUnicode=truecharacterEncoding=utf8autoReconnect=truerewriteBatchedStateconnectTimeout=1000socketTimeout=5000useSSL=false
          user-name: root
          password: bytearch
          maximum-pool-size: 10
          connection-timeout: 300

4、分庫分表策略

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

package com.bytearch.fast.cloud.mysql.sharding.strategy;

import com.bytearch.fast.cloud.mysql.sharding.common.ShardingStrategyConstant;
import com.bytearch.id.generator.IdEntity;
import com.bytearch.id.generator.SeqIdUtil;
import org.jfaster.mango.sharding.ShardingStrategy;

/**
 * 訂單號分庫分表策略
 */
public class OrderIdShardingStrategy implements ShardingStrategyLong, Long> {
    @Override
    public String getDataSourceFactoryName(Long orderId) {
        if (orderId == null || orderId  0L) {
            throw new IllegalArgumentException("order_id is invalid!");
        }
        IdEntity idEntity = SeqIdUtil.decodeId(orderId);
        if (idEntity.getExtraId() >= ShardingStrategyConstant.SHARDING_TABLE_NUM) {
            throw new IllegalArgumentException("sharding table Num is invalid, tableNum:" + idEntity.getExtraId());
        }
        //1. 計算步長
        int step = ShardingStrategyConstant.SHARDING_TABLE_NUM / ShardingStrategyConstant.SHARDING_DATABASE_NODE_NUM;
        //2. 計算出庫編號
        long dbNo = Math.floorDiv(idEntity.getExtraId(), step) + 1;
        //3. 返回數據源名
        return String.format("%s_%s", ShardingStrategyConstant.LOGIC_ORDER_DATABASE_NAME, dbNo);
    }

    @Override
    public String getTargetTable(String logicTableName, Long orderId) {
        if (orderId == null || orderId  0L) {
            throw new IllegalArgumentException("order_id is invalid!");
        }
        IdEntity idEntity = SeqIdUtil.decodeId(orderId);
        if (idEntity.getExtraId() >= ShardingStrategyConstant.SHARDING_TABLE_NUM) {
            throw new IllegalArgumentException("sharding table Num is invalid, tableNum:" + idEntity.getExtraId());
        }
        // 基于約定,真實表名為 logicTableName_XXX, XXX不足三位補0
        return String.format("%s_%03d", logicTableName, idEntity.getExtraId());
    }
}

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

package com.bytearch.fast.cloud.mysql.sharding.strategy;

import com.bytearch.fast.cloud.mysql.sharding.common.ShardingStrategyConstant;
import org.jfaster.mango.sharding.ShardingStrategy;

/**
 * 指定分片KEY 分庫分表策略
 */
public class UserIdShardingStrategy implements ShardingStrategyInteger, Integer> {

    @Override
    public String getDataSourceFactoryName(Integer userId) {
        //1. 計算步長 即單庫放得表數量
        int step = ShardingStrategyConstant.SHARDING_TABLE_NUM / ShardingStrategyConstant.SHARDING_DATABASE_NODE_NUM;
        //2. 計算出庫編號
        long dbNo = Math.floorDiv(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM, step) + 1;
        //3. 返回數據源名
        return String.format("%s_%s", ShardingStrategyConstant.LOGIC_ORDER_DATABASE_NAME, dbNo);
    }

    @Override
    public String getTargetTable(String logicTableName, Integer userId) {
        // 基于約定,真實表名為 logicTableName_XXX, XXX不足三位補0
        return String.format("%s_%03d", logicTableName, userId % ShardingStrategyConstant.SHARDING_TABLE_NUM);
    }
}

5、dao層編寫

1). OrderPartitionByIdDao

package com.bytearch.fast.cloud.mysql.sharding.dao;

import com.bytearch.fast.cloud.mysql.sharding.common.ShardingStrategyConstant;
import com.bytearch.fast.cloud.mysql.sharding.pojo.entity.OrderEntity;
import com.bytearch.fast.cloud.mysql.sharding.strategy.OrderIdShardingStrategy;
import org.jfaster.mango.annotation.*;

@DB(name = ShardingStrategyConstant.LOGIC_ORDER_DATABASE_NAME, table = "order")
@Sharding(shardingStrategy = OrderIdShardingStrategy.class)
public interface OrderPartitionByIdDao {

    @SQL("INSERT INTO #table (order_id, user_id, status, booking_date, create_time, update_time) VALUES" +
            "(:orderId,:userId,:status,:bookingDate,:createTime,:updateTime)"
    )
    int insertOrder(@TableShardingBy("orderId") @DatabaseShardingBy("orderId") OrderEntity orderEntity);

    @SQL("UPDATE #table set update_time = now()" +
            "#if(:bookingDate != null),booking_date = :bookingDate #end " +
            "#if (:status != null), status = :status #end" +
            "WHERE order_id = :orderId"
    )
    int updateOrderByOrderId(@TableShardingBy("orderId") @DatabaseShardingBy("orderId") OrderEntity orderEntity);


    @SQL("SELECT * FROM #table WHERE order_id = :1")
    OrderEntity getOrderById(@TableShardingBy @DatabaseShardingBy Long orderId);

    @SQL("SELECT * FROM #table WHERE order_id = :1")
    @UseMaster
    OrderEntity getOrderByIdFromMaster(@TableShardingBy @DatabaseShardingBy Long orderId);

6、單元測試

@SpringBootTest(classes = {Application.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class ShardingTest {
    @Autowired
    OrderPartitionByIdDao orderPartitionByIdDao;

    @Autowired
    OrderPartitionByUserIdDao orderPartitionByUserIdDao;

    @Test
    public void testCreateOrderRandom() {
        for (int i = 0; i  20; i++) {
            int userId = ThreadLocalRandom.current().nextInt(1000,1000000);
            OrderEntity orderEntity = new OrderEntity();
            orderEntity.setOrderId(SeqIdUtil.nextId(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM));
            orderEntity.setStatus(1);
            orderEntity.setUserId(userId);
            orderEntity.setCreateTime(new Date());
            orderEntity.setUpdateTime(new Date());
            orderEntity.setBookingDate(new Date());
            int ret = orderPartitionByIdDao.insertOrder(orderEntity);
            Assert.assertEquals(1, ret);
        }
    }

    @Test
    public void testOrderAll() {
        //insert
        int userId = ThreadLocalRandom.current().nextInt(1000,1000000);
        OrderEntity orderEntity = new OrderEntity();
        orderEntity.setOrderId(SeqIdUtil.nextId(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM));
        orderEntity.setStatus(1);
        orderEntity.setUserId(userId);
        orderEntity.setCreateTime(new Date());
        orderEntity.setUpdateTime(new Date());
        orderEntity.setBookingDate(new Date());
        int i = orderPartitionByIdDao.insertOrder(orderEntity);
        Assert.assertEquals(1, i);

        //get from master
        OrderEntity orderInfo = orderPartitionByIdDao.getOrderByIdFromMaster(orderEntity.getOrderId());
        Assert.assertNotNull(orderInfo);
        Assert.assertEquals(orderInfo.getOrderId(), orderEntity.getOrderId());

        //get from slave
        OrderEntity slaveOrderInfo = orderPartitionByIdDao.getOrderById(orderEntity.getOrderId());
        Assert.assertNotNull(slaveOrderInfo);
        //update
        OrderEntity updateEntity = new OrderEntity();
        updateEntity.setOrderId(orderInfo.getOrderId());
        updateEntity.setStatus(2);
        updateEntity.setUpdateTime(new Date());
        int affectRows = orderPartitionByIdDao.updateOrderByOrderId(updateEntity);
        Assert.assertTrue( affectRows > 0);
    }

    @Test
    public void testGetListByUserId() {
        int userId = ThreadLocalRandom.current().nextInt(1000,1000000);
        for (int i = 0; i  5; i++) {
            OrderEntity orderEntity = new OrderEntity();
            orderEntity.setOrderId(SeqIdUtil.nextId(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM));
            orderEntity.setStatus(1);
            orderEntity.setUserId(userId);
            orderEntity.setCreateTime(new Date());
            orderEntity.setUpdateTime(new Date());
            orderEntity.setBookingDate(new Date());
            orderPartitionByIdDao.insertOrder(orderEntity);
        }
        try {
            //防止主從延遲引起的校驗錯誤
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ListOrderEntity> orderListByUserId = orderPartitionByUserIdDao.getOrderListByUserId(userId);
        Assert.assertNotNull(orderListByUserId);
        Assert.assertTrue(orderListByUserId.size() == 5);
    }
}

大功告成:

四、總結

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

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

到此這篇關于淺談訂單重構之 MySQL 分庫分表實戰篇的文章就介紹到這了,更多相關MySQL 分庫分表內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL分庫分表與分區的入門指南
  • mysql死鎖和分庫分表問題詳解
  • MySQL 分表分庫怎么進行數據切分
  • MySql分表、分庫、分片和分區知識深入詳解
  • MySql分表、分庫、分片和分區知識點介紹
  • MySQL分庫分表總結講解
  • mysql分表分庫的應用場景和設計方式
  • mysql數據庫分表分庫的策略
  • MyBatis實現Mysql數據庫分庫分表操作和總結(推薦)
  • MYSQL數據庫數據拆分之分庫分表總結
  • Mysql數據庫分庫和分表方式(常用)
  • MYSQL性能優化分享(分庫分表)
  • MySQL分庫分表詳情

標簽:福州 溫州 揚州 無錫 阿里 定西 山西 三明

巨人網絡通訊聲明:本文標題《淺談訂單重構之 MySQL 分庫分表實戰篇》,本文關鍵詞  淺談,訂單,重構,之,MySQL,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《淺談訂單重構之 MySQL 分庫分表實戰篇》相關的同類信息!
  • 本頁收集關于淺談訂單重構之 MySQL 分庫分表實戰篇的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    911精品产国品一二三产区| 日韩欧美一级二级三级| 蜜桃在线一区二区三区| 国产精品入口麻豆原神| 7777精品伊人久久久大香线蕉完整版| 国产一区视频在线看| 亚洲成人激情社区| 国产精品女同互慰在线看| 777a∨成人精品桃花网| 91麻豆精品在线观看| 韩国视频一区二区| 亚洲1区2区3区视频| 欧美高清在线一区| 日韩一级完整毛片| 欧美色倩网站大全免费| 成人高清免费观看| 国内国产精品久久| 视频在线观看91| 亚洲欧美乱综合| 久久久久国色av免费看影院| 91精品国产aⅴ一区二区| 色吧成人激情小说| 99在线精品免费| 国产酒店精品激情| 九一九一国产精品| 日本欧美一区二区三区| 午夜久久久久久久久| 亚洲美女免费在线| 亚洲视频在线观看一区| 中文一区在线播放| 欧美激情在线看| 久久久久国产精品麻豆| 日韩亚洲欧美成人一区| 欧美日韩在线观看一区二区 | 成人性生交大片免费看中文| 久久国产夜色精品鲁鲁99| 日韩电影一二三区| 午夜婷婷国产麻豆精品| 一区二区三区91| 亚洲精品中文字幕在线观看| 国产精品福利av| 中文字幕一区二区三区在线不卡| 中文字幕乱码亚洲精品一区| 久久久久久影视| 国产欧美综合在线| 国产精品乱人伦中文| 国产精品久久久久久户外露出| 国产女主播一区| 中文字幕亚洲成人| 最新欧美精品一区二区三区| 成人免费在线视频| 亚洲欧美日韩精品久久久久| 亚洲精品国久久99热| 一级日本不卡的影视| 亚洲午夜精品网| 三级亚洲高清视频| 免费高清不卡av| 国内精品在线播放| 国产成都精品91一区二区三| 成人av动漫网站| 91国产丝袜在线播放| 欧美性xxxxxxxx| 日韩免费成人网| 国产亚洲欧美色| 亚洲三级电影网站| 婷婷一区二区三区| 国产资源精品在线观看| www.亚洲在线| 欧美日韩激情一区二区三区| 91精品国产一区二区三区香蕉| 欧美成人a∨高清免费观看| 久久精品视频一区二区| 亚洲三级在线免费| 日本亚洲欧美天堂免费| 国产老女人精品毛片久久| 91丝袜呻吟高潮美腿白嫩在线观看| 欧美天天综合网| 欧美mv日韩mv亚洲| 国产精品美女久久久久久久久久久 | 中文字幕一区二区三区四区| 亚洲成av人影院在线观看网| 久久国产麻豆精品| 97久久超碰国产精品| 在线播放一区二区三区| 国产网站一区二区三区| 亚洲一区在线播放| 精品一区二区三区av| 99国产一区二区三精品乱码| 欧美精品久久久久久久久老牛影院| 久久综合色综合88| 一区二区三区免费看视频| 精品一区二区三区免费毛片爱| k8久久久一区二区三区| 91精品国产综合久久小美女| 国产精品卡一卡二| 日本在线观看不卡视频| 99精品久久只有精品| 欧美成人精品高清在线播放| 一区二区三区在线影院| 国产精品18久久久久久vr| 欧美色网站导航| 国产欧美视频一区二区三区| 丝袜国产日韩另类美女| 99久久亚洲一区二区三区青草| 日韩免费电影网站| 午夜欧美视频在线观看 | 91精品国产91久久久久久一区二区| 国产色产综合色产在线视频| 日韩电影免费一区| 色婷婷精品大在线视频| 中文字幕国产一区二区| 蜜臀av一区二区在线免费观看| 91搞黄在线观看| 国产精品美女久久久久高潮| 久久狠狠亚洲综合| 欧美精品黑人性xxxx| 亚洲已满18点击进入久久| 99综合影院在线| 欧美国产国产综合| 国产盗摄一区二区三区| 日韩视频免费直播| 日日骚欧美日韩| 欧美日韩国产中文| 亚洲国产你懂的| 一本色道久久综合亚洲aⅴ蜜桃 | 亚洲综合一区二区三区| 成人免费高清在线观看| 久久久久久毛片| 免费不卡在线观看| 91精品国产91久久久久久一区二区 | 国产精品久久久久久久久免费桃花 | 午夜久久久久久久久| 91老司机福利 在线| 国产精品久久久久影院| 成人免费毛片a| 国产精品色婷婷久久58| 国产精品白丝jk白祙喷水网站| 日韩三级av在线播放| 免费在线观看一区| 日韩精品专区在线影院重磅| 日本成人在线不卡视频| 日韩一区二区免费视频| 蜜乳av一区二区三区| 欧美刺激脚交jootjob| 麻豆精品久久精品色综合| 日韩午夜三级在线| 精品一区二区三区免费观看 | 精品免费视频一区二区| 亚洲成人一区二区| 欧美日韩电影一区| 首页国产欧美日韩丝袜| 日韩欧美高清dvd碟片| 韩国v欧美v日本v亚洲v| 久久久久久亚洲综合影院红桃 | 成人avav影音| 亚洲欧美日韩成人高清在线一区| 色综合久久天天| 亚洲成人一区在线| 精品国免费一区二区三区| 国产永久精品大片wwwapp| 日本一区二区三级电影在线观看| 国产91精品免费| 亚洲欧洲国产日本综合| 欧美在线看片a免费观看| 日本美女视频一区二区| 欧美xxxxxxxx| 不卡视频在线观看| 亚洲一二三四在线观看| 日韩一区二区视频| 丁香一区二区三区| 一区二区三区丝袜| 日韩区在线观看| 成人午夜视频在线| 亚洲最大成人综合| 欧美va日韩va| 91丨porny丨国产入口| 亚洲成人av一区二区三区| 欧美精品一区二区三区一线天视频| 成人国产视频在线观看| 午夜私人影院久久久久| 久久久影院官网| 欧美性感一类影片在线播放| 激情深爱一区二区| 中文字幕日韩一区| 日韩欧美在线不卡| 成a人片亚洲日本久久| 日韩高清一区二区| 国产精品久久久久影院老司| 欧美高清视频在线高清观看mv色露露十八 | 欧美日韩和欧美的一区二区| 国产精品自拍三区| 亚洲高清在线精品| 国产精品久久久久久亚洲毛片 | 成人激情午夜影院| 亚洲大型综合色站| 欧美激情一区在线观看| 777a∨成人精品桃花网| 99久久精品免费看国产免费软件| 奇米色一区二区三区四区| 亚洲精品亚洲人成人网 |