亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁(yè) > 知識(shí)庫(kù) > 淺談?dòng)唵沃貥?gòu)之 MySQL 分庫(kù)分表實(shí)戰(zhàn)篇

淺談?dòng)唵沃貥?gòu)之 MySQL 分庫(kù)分表實(shí)戰(zhàn)篇

熱門(mén)標(biāo)簽:拉卡拉外呼系統(tǒng) 云南電商智能外呼系統(tǒng)價(jià)格 大眾點(diǎn)評(píng)星級(jí)酒店地圖標(biāo)注 話務(wù)外呼系統(tǒng)怎么樣 臨清電話機(jī)器人 高清地圖標(biāo)注道路 外東北地圖標(biāo)注 400電話可以辦理嗎 智能外呼系統(tǒng)復(fù)位

一、目標(biāo)

本文將完成如下目標(biāo):

  • 分表數(shù)量: 256    分庫(kù)數(shù)量: 4
  • 以用戶ID(user_id) 為數(shù)據(jù)庫(kù)分片Key
  • 最后測(cè)試訂單創(chuàng)建,更新,刪除, 單訂單號(hào)查詢(xún),根據(jù)user_id查詢(xún)列表操作。

架構(gòu)圖:

表結(jié)構(gòu)如下:

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 '訂單狀態(tài)',
  `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, 本文重點(diǎn)在于分庫(kù)分表實(shí)踐, 只保留具有代表性字段,其它場(chǎng)景可以在此基礎(chǔ)上做改進(jìn)。

全局唯一ID設(shè)計(jì)

要求:1.全局唯一 2:粗略有序 3:可反解出庫(kù)編號(hào)

  • 1bit + 39bit時(shí)間差 + 8bit機(jī)器號(hào) + 8bit用戶編號(hào)(庫(kù)號(hào)) + 8bit自增序列

訂單號(hào)組成項(xiàng) 保留字段 毫秒級(jí)時(shí)間差 機(jī)器數(shù) 用戶編號(hào)(表編號(hào)) 自增序列
所占字節(jié)(單位bit) 1 39 8 8 8

單機(jī)最大QPS: 256000 使用壽命: 17年

二、環(huán)境準(zhǔn)備

1、基本信息

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

2、數(shù)據(jù)庫(kù)環(huán)境準(zhǔn)備

進(jìn)入mysql:

#主庫(kù)
 mysql -h 172.30.1.21 -uroot -pbytearch

#從庫(kù)
 mysql -h 172.30.1.31 -uroot -pbytearch


進(jìn)入容器

#主
docker exec -it db_1_master /bin/bash

#從
docker exec -it db_1_slave /bin/bash


查看運(yùn)行狀態(tài)

#主
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、建庫(kù) 導(dǎo)入分表

(1)在mysql master實(shí)例分別建庫(kù)

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)依次導(dǎo)入建表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;  

三、配置實(shí)踐

1、pom文件  

     !-- mango 分庫(kù)分表中間件 --> 
            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;

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

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

3、yml 配置

4主4從數(shù)據(jù)庫(kù)配置, 這里僅測(cè)試默認(rèn)使用root用戶密碼,生產(chǎn)環(huán)境不建議使用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、分庫(kù)分表策略

1). 根據(jù)order_id為shardKey分庫(kù)分表策略

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;

/**
 * 訂單號(hào)分庫(kù)分表策略
 */
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. 計(jì)算步長(zhǎng)
        int step = ShardingStrategyConstant.SHARDING_TABLE_NUM / ShardingStrategyConstant.SHARDING_DATABASE_NODE_NUM;
        //2. 計(jì)算出庫(kù)編號(hào)
        long dbNo = Math.floorDiv(idEntity.getExtraId(), step) + 1;
        //3. 返回?cái)?shù)據(jù)源名
        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());
        }
        // 基于約定,真實(shí)表名為 logicTableName_XXX, XXX不足三位補(bǔ)0
        return String.format("%s_%03d", logicTableName, idEntity.getExtraId());
    }
}

2). 根據(jù)user_id 為shardKey分庫(kù)分表策略

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

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

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

    @Override
    public String getDataSourceFactoryName(Integer userId) {
        //1. 計(jì)算步長(zhǎng) 即單庫(kù)放得表數(shù)量
        int step = ShardingStrategyConstant.SHARDING_TABLE_NUM / ShardingStrategyConstant.SHARDING_DATABASE_NODE_NUM;
        //2. 計(jì)算出庫(kù)編號(hào)
        long dbNo = Math.floorDiv(userId % ShardingStrategyConstant.SHARDING_TABLE_NUM, step) + 1;
        //3. 返回?cái)?shù)據(jù)源名
        return String.format("%s_%s", ShardingStrategyConstant.LOGIC_ORDER_DATABASE_NAME, dbNo);
    }

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

5、dao層編寫(xiě)

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、單元測(cè)試

@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 {
            //防止主從延遲引起的校驗(yàn)錯(cuò)誤
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        ListOrderEntity> orderListByUserId = orderPartitionByUserIdDao.getOrderListByUserId(userId);
        Assert.assertNotNull(orderListByUserId);
        Assert.assertTrue(orderListByUserId.size() == 5);
    }
}

大功告成:

四、總結(jié)

本篇主要介紹Java版使用Mango框架實(shí)現(xiàn)Mysql分庫(kù)分表實(shí)戰(zhàn),分庫(kù)分表中間件也可以使用類(lèi)似于ShardingJDBC,或者自研。

以上分庫(kù)分表數(shù)量?jī)H供演示參考,實(shí)際工作中分表數(shù)量、分庫(kù)數(shù)量、是根據(jù)公司實(shí)際業(yè)務(wù)數(shù)據(jù)增長(zhǎng)速度, 高峰期QPS,物理機(jī)器配置等等因素計(jì)算。

到此這篇關(guān)于淺談?dòng)唵沃貥?gòu)之 MySQL 分庫(kù)分表實(shí)戰(zhàn)篇的文章就介紹到這了,更多相關(guān)MySQL 分庫(kù)分表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL分庫(kù)分表與分區(qū)的入門(mén)指南
  • mysql死鎖和分庫(kù)分表問(wèn)題詳解
  • MySQL 分表分庫(kù)怎么進(jìn)行數(shù)據(jù)切分
  • MySql分表、分庫(kù)、分片和分區(qū)知識(shí)深入詳解
  • MySql分表、分庫(kù)、分片和分區(qū)知識(shí)點(diǎn)介紹
  • MySQL分庫(kù)分表總結(jié)講解
  • mysql分表分庫(kù)的應(yīng)用場(chǎng)景和設(shè)計(jì)方式
  • mysql數(shù)據(jù)庫(kù)分表分庫(kù)的策略
  • MyBatis實(shí)現(xiàn)Mysql數(shù)據(jù)庫(kù)分庫(kù)分表操作和總結(jié)(推薦)
  • MYSQL數(shù)據(jù)庫(kù)數(shù)據(jù)拆分之分庫(kù)分表總結(jié)
  • Mysql數(shù)據(jù)庫(kù)分庫(kù)和分表方式(常用)
  • MYSQL性能優(yōu)化分享(分庫(kù)分表)
  • MySQL分庫(kù)分表詳情

標(biāo)簽:福州 溫州 揚(yáng)州 無(wú)錫 阿里 定西 山西 三明

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《淺談?dòng)唵沃貥?gòu)之 MySQL 分庫(kù)分表實(shí)戰(zhàn)篇》,本文關(guān)鍵詞  淺談,訂單,重構(gòu),之,MySQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《淺談?dòng)唵沃貥?gòu)之 MySQL 分庫(kù)分表實(shí)戰(zhàn)篇》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于淺談?dòng)唵沃貥?gòu)之 MySQL 分庫(kù)分表實(shí)戰(zhàn)篇的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    青青久久精品国产免费看| 91麻豆tv| 可以免费看污视频的网站| 香蕉视频三级| 99色精品| 国产成人精品一区二区视频| 91麻豆tv| 午夜在线观看视频免费 成人| 日韩在线观看视频网站| 美女免费毛片| 免费毛片播放| 久久成人性色生活片| 欧美1卡一卡二卡三新区| 日韩专区亚洲综合久久| 欧美激情在线精品video| 美女免费精品视频在线观看| 国产网站麻豆精品视频| 免费一级生活片| 成人a大片在线观看| 国产国产人免费视频成69堂| 国产成人精品综合在线| 精品国产三级a| 四虎论坛| 青青久久精品| 免费一级片在线观看| 麻豆系列 在线视频| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 台湾毛片| 四虎影视久久久免费| 久久久久久久网| 日韩专区亚洲综合久久| 精品国产一区二区三区久久久狼 | 99久久精品国产高清一区二区| 在线观看导航| 可以免费看毛片的网站| 中文字幕Aⅴ资源网| 日本在线www| 精品国产三级a| 久久久久久久免费视频| 国产韩国精品一区二区三区| 国产成人啪精品| 国产不卡福利| 欧美激情一区二区三区中文字幕| 夜夜操网| 99热精品在线| 久久国产一久久高清| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 尤物视频网站在线| 国产一区二区高清视频| 欧美另类videosbestsex久久| 国产综合91天堂亚洲国产| 午夜欧美成人久久久久久| 精品久久久久久影院免费| 精品国产一区二区三区久久久蜜臀 | 精品国产一区二区三区精东影业| 欧美激情影院| 亚洲 欧美 91| 亚洲精品中文字幕久久久久久| 国产成人精品在线| 色综合久久天天综合| 99热精品在线| 日日夜人人澡人人澡人人看免| 精品视频在线看| 亚洲天堂免费观看| 国产不卡在线播放| 欧美激情一区二区三区在线播放| 你懂的日韩| 韩国三级视频网站| 国产精品1024永久免费视频 | 四虎影视库| 成人av在线播放| 韩国三级视频网站| 91麻豆精品国产综合久久久| 色综合久久天天综合绕观看| 久久国产精品自由自在| 天天色成人| 国产高清视频免费| 日韩免费在线视频| 麻豆网站在线免费观看| 你懂的在线观看视频| 日本免费看视频| 精品在线观看一区| 亚洲第一页乱| 欧美激情影院| 日本免费乱理伦片在线观看2018| 国产精品免费久久| 国产不卡在线观看| 九九精品在线播放| 日日夜人人澡人人澡人人看免| 国产91精品系列在线观看| 欧美激情在线精品video| 亚洲女人国产香蕉久久精品 | 国产91丝袜在线播放0| 欧美激情一区二区三区中文字幕| 四虎久久精品国产| 国产麻豆精品| 国产伦久视频免费观看 视频| 日日夜人人澡人人澡人人看免| 天天色成人| 天天色成人| 999久久66久6只有精品| 国产伦精品一区二区三区无广告| 麻豆网站在线免费观看| 免费国产在线观看| 香蕉视频亚洲一级| 日韩欧美一及在线播放| 国产不卡在线播放| 亚洲 欧美 91| 四虎论坛| 免费的黄视频| 国产成a人片在线观看视频| 亚洲爆爽| 国产麻豆精品免费视频| 尤物视频网站在线| 国产一级强片在线观看| 国产成a人片在线观看视频| 国产网站免费视频| 成人免费福利片在线观看| 日韩专区一区| 毛片的网站| 欧美日本韩国| 台湾美女古装一级毛片| 天天做人人爱夜夜爽2020毛片| 成人高清视频免费观看| 久久国产影视免费精品| 午夜在线亚洲| 日韩中文字幕在线亚洲一区| 九九免费高清在线观看视频| 欧美电影免费| 欧美激情在线精品video| 国产成人精品影视| 中文字幕一区二区三区 精品| 国产一区二区精品| 你懂的日韩| 国产91精品一区二区| 四虎论坛| 国产网站免费视频| 欧美激情伊人| 欧美1卡一卡二卡三新区| 欧美a级成人淫片免费看| 999精品在线| 久久国产精品永久免费网站| 欧美激情一区二区三区视频| 国产成a人片在线观看视频| 日日夜夜婷婷| 成人免费高清视频| 亚洲精品中文字幕久久久久久| 九九久久国产精品| 国产网站免费| 你懂的福利视频| 青草国产在线观看| 日韩一级黄色| 日韩av成人| 日日日夜夜操| 天天做日日爱夜夜爽| 午夜激情视频在线播放| 天天色色网| 国产精品自拍在线观看| 成人免费观看男女羞羞视频| 国产成人精品影视| 久久久久久久男人的天堂| 欧美激情影院| 国产激情视频在线观看| 可以免费看污视频的网站| 欧美另类videosbestsex高清| 美女免费毛片| 韩国三级视频在线观看| 韩国三级香港三级日本三级| 韩国毛片 免费| 黄色免费三级| 日本伦理片网站| 夜夜操网| 午夜在线亚洲| 九九九国产| 亚洲女初尝黑人巨高清在线观看| 国产不卡在线观看| 九九九在线视频| 国产视频网站在线观看| 九九久久99| 日本在线不卡免费视频一区| 亚洲天堂免费观看| 精品视频一区二区三区免费| 国产麻豆精品高清在线播放| 国产高清在线精品一区二区 | 亚洲精品中文字幕久久久久久| 久久久久久久久综合影视网| 午夜在线影院| 日韩中文字幕在线播放| 午夜欧美成人久久久久久| 欧美a免费| 日韩女人做爰大片| 国产一区二区精品| 成人免费观看视频| 日本伦理片网站| 欧美a级片视频| 亚洲不卡一区二区三区在线| 色综合久久手机在线| 国产极品精频在线观看| 欧美18性精品| 国产极品精频在线观看|