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

給Apache頂級(jí)項(xiàng)目提Bug,我有點(diǎn)飄...

運(yùn)維 數(shù)據(jù)庫運(yùn)維 開發(fā)工具
這篇文章記錄了給 Apache 頂級(jí)項(xiàng)目分庫分表中間件 ShardingSphere 提交 Bug 的歷程。

[[356276]] 

圖片來自 Pexels

說實(shí)話,這是一次比較曲折的 Bug 跟蹤之旅。10 月 28 日,我們?cè)?GitHub 上提交 issue,中途因?yàn)楣俜介_發(fā)者的主觀臆斷被 Close 了兩次,直到 11 月 20 日才被認(rèn)定成 Bug 并發(fā)出修復(fù)版本,歷時(shí) 20 多天。

本文將還原該 Bug 的分析過程,將有價(jià)值的經(jīng)驗(yàn)和技術(shù)點(diǎn)進(jìn)行提煉。通過本文,你將收獲到:

  • 疑難問題的排查思路
  • 數(shù)據(jù)庫中間件 Sharding Proxy 的原理
  • MySQL 預(yù)編譯的流程和交互協(xié)議
  • Wireshark 抓包分析 MySQL 的奇淫技巧

問題描述

這個(gè) Bug 來源于我的讀者,他替公司預(yù)研 ShardingProxy(屬于 ShardingSphere 的子產(chǎn)品,可用作分庫分表,后文會(huì)詳細(xì)介紹)。

他按照官方文檔寫了一個(gè)很簡單的 demo,但是運(yùn)行后無法查詢出數(shù)據(jù)。

下面是他遇到問題后發(fā)給我的信息,希望我能幫忙一起定位下原因:

 

截圖中的 doc 詳細(xì)記錄了 ShardingProxy 的配置、調(diào)試分析日志、以及問題的具體現(xiàn)象。

為了方便大家理解,我重新描述下這個(gè) Demo 的業(yè)務(wù)邏輯以及問題表象。

Demo 的業(yè)務(wù)邏輯說明

這個(gè) Demo 很簡單,主要為了跑通 ShardingProxy 的分庫分表功能。程序用 SpringBoot+MyBatis 實(shí)現(xiàn)了一個(gè)單表的查詢邏輯,然后用這張表的一個(gè) long 類型字段作為分區(qū)鍵,并通過 ShardingProxy 進(jìn)行了分表。

下面是那張數(shù)據(jù)表的詳細(xì)定義,共 16 個(gè)字段,大家關(guān)注前兩個(gè)字段即可,其他字段和本文提到的 Bug 無關(guān)。

 

前兩個(gè)字段的作用如下:

  • BIZ_DT:業(yè)務(wù)字段,date 類型,和 Bug 有關(guān)
  • ECIF_CUST_NO:bigint 類型,用做分區(qū)鍵

代碼就是 Controller 調(diào)用 Service,Service 調(diào)用 Dao,Dao 通過 MyBatis 實(shí)現(xiàn),這里就不粘貼了。

由于使用了 ShardingProxy 中間件,因此它跟直連數(shù)據(jù)庫的配置會(huì)有所不同,在定義 dataSource 時(shí),url 需要配置成這樣:

jdbc:mysql://127.0.0.1:3307/sharding_db?useServerPrepStmts=true&cachePrepStmts=true&serverTimezone=UTC

可以看到,jdbc 連接的是 ShardingProxy 的邏輯數(shù)據(jù)源 sharding_db,端口使用的是 3307,并非真正的底層數(shù)據(jù)庫以及 MySQL Server 的真實(shí)端口 3306,具體原理下文會(huì)介紹到。

其中,標(biāo)藍(lán)色的 useServerPrepStmts 和 cachePrepStmts 這兩個(gè)參數(shù),和本文說的 Bug 有關(guān),這里先提一下,后面會(huì)具體分析。

另外,ShardingProxy 的分表策略是:用 long 類型的 ecif_cust_no 字段對(duì) 2 進(jìn)行取模,分成了兩張表。

具體配置如下:

shardingColumn: ecif_cust_noalgorithmExpression: pscst_prdt_cvr${ecif_cust_no % 2}

問題描述

再說下遇到的問題。首先,往數(shù)據(jù)表中預(yù)先插入一條 ECIF_CUST_NO 等于 10000 的數(shù)據(jù):

然后啟動(dòng) demo 程序,使用 curl 發(fā)起 post 請(qǐng)求,查詢 ecifCustNo 等于 10000 的那條記錄,居然查詢不出數(shù)據(jù):

 

至此,背景基本交代清楚了,為什么數(shù)據(jù)庫中明明有數(shù)據(jù),但是程序卻查詢不出來呢?問題到底出現(xiàn)在 ShardingProxy,還是應(yīng)用程序本身?

ShardingProxy 原理簡介

在開啟這個(gè)問題的分析過程之前,我先快速普及下 ShardingProxy 的基本原理,以便大家能更好的理解我的分析思路。

開源的數(shù)據(jù)庫中間件大家一定接觸過,最流行的是 MyCat 和 ShardingSphere。

其中 MyCat 是阿里開源的;ShardingSphere 是由當(dāng)當(dāng)網(wǎng)開源,并在京東逐漸發(fā)展壯大,于 2020 年成為了 Apache 頂級(jí)項(xiàng)目。

ShardingSphere 的目標(biāo)是一個(gè)生態(tài)圈,它由非常著名的 ShardingJDBC、ShardingProxy、ShardingSidecar 3 款獨(dú)立的產(chǎn)品組成。本文重點(diǎn)普及下 ShardingProxy,另外兩個(gè)就不展開了。

什么是 ShardingProxy?

ShardingProxy 屬于和 MyCat 對(duì)標(biāo)的產(chǎn)品,定位為透明化的數(shù)據(jù)庫代理端,可以理解成:一個(gè)實(shí)現(xiàn)了 MySQL 協(xié)議的 Server(獨(dú)立進(jìn)程),可用于讀寫分離、分庫分表、柔性事務(wù)等場景。

對(duì)于應(yīng)用程序或者 DBA 來說,可以把 ShardingProxy 當(dāng)做數(shù)據(jù)庫代理,能用 MySQL 客戶端工具(Navicat)或者命令行和它直接交互。

而 ShardingProxy 內(nèi)部則通過 MySQL 原生協(xié)議與真實(shí)的 MySQL 服務(wù)器通信。

 

圖 1:ShardingProxy 的應(yīng)用架構(gòu)圖

從架構(gòu)圖來看,ShardingProxy 就相當(dāng)于 MySQL,它本身不存儲(chǔ)數(shù)據(jù),但是對(duì)外屏蔽了 Database 的存儲(chǔ)細(xì)節(jié)。

你可以用連接 MySQL 的方式去連接 ShardingProxy(除了端口不同),用你熟悉的 ORMapping 框架使用它。

ShardingProxy 的內(nèi)部架構(gòu)

再來看下 ShardingProxy 的內(nèi)部架構(gòu),后續(xù)源碼分析時(shí)會(huì)涉及到此部分。

 

圖 2:ShardingProxy 的內(nèi)部架構(gòu)圖

整個(gè)架構(gòu)分為前端、核心組件和后端:

  • 前端(Frontend):負(fù)責(zé)與客戶端進(jìn)行網(wǎng)絡(luò)通信,采用的是 NIO 框架,在通信的過程中完成對(duì)MySQL協(xié)議的編解碼。
  • 核心組件(Core-module):得到解碼的 MySQL 命令后,開始調(diào)用 Sharding-Core 對(duì) SQL 進(jìn)行解析、改寫、路由、歸并等核心功能。
  • 后端(Backend):與真實(shí)數(shù)據(jù)庫交互,采用 Hikari 連接池,同樣涉及到 MySQL 協(xié)議的編解碼。

ShardingProxy 的預(yù)編譯 SQL 功能

本文的 Bug 跟 ShardingProxy 的預(yù)編譯 SQL 有關(guān),這里單獨(dú)介紹下此功能以及與之相關(guān)的 MySQL 協(xié)議,這個(gè)是本文的關(guān)鍵,請(qǐng)耐心看完。

熟悉數(shù)據(jù)庫開發(fā)的同學(xué)一定了解:預(yù)編譯 SQL(PreparedStatement),在數(shù)據(jù)庫收到一條 SQL 到執(zhí)行完畢。

一般分為以下 3 步:

  • 詞法和語義解析
  • 優(yōu)化 SQL,制定執(zhí)行計(jì)劃
  • 執(zhí)行并返回結(jié)果

但是很多情況下,一條 SQL 語句可能會(huì)反復(fù)執(zhí)行,只是執(zhí)行時(shí)的參數(shù)值不同。

而預(yù)編譯功能將這些值用占位符代替,最終達(dá)到一次編譯、多次運(yùn)行的效果,省去了解析優(yōu)化等過程,能大大提高 SQL 的執(zhí)行效率。

假設(shè)我們要執(zhí)行下面這條 SQL 兩次:

SELECT * FROM t_user WHERE user_id = 10;

那 JDBC 和 MySQL 之間的協(xié)議消息如下:

通過上述流程可以看到:

  • 第 1 條消息是PreparedStatement,查詢語句中的參數(shù)值用問號(hào)代替了,它告訴 MySQL 對(duì)這個(gè)SQL 進(jìn)行預(yù)編譯。
  • 第 2 條消息 MySQL 告訴 JDBC 準(zhǔn)備成功了。
  • 第 3 條消息 JDBC 將參數(shù)設(shè)置為 1。
  • 第 4 條消息 MySQL 返回查詢結(jié)果。
  • 第 5 條和第 6 條消息表示第二次執(zhí)行同樣的 SQL,已經(jīng)無需再次預(yù)編譯了。

再回到 ShardingProxy,如果需要支持預(yù)編譯功能,交互流程肯定是需要變的,因?yàn)?Proxy 在收到 JDBC 的PreparedStatement 命令時(shí),SQL 里的分片鍵是問號(hào),它根本不知道該路由到哪個(gè)真實(shí)數(shù)據(jù)庫。

因此,流程變成了下面這樣:

 

可以看到,Proxy在收到 PreparedStatement 命令后,并不會(huì)把這條消息轉(zhuǎn)發(fā)給MySQL,只是緩存了這個(gè) SQL,在收到 ExecuteStatement 命令后,才根據(jù)分片鍵和傳過來的參數(shù)值確定真實(shí)的數(shù)據(jù)庫,并與 MySQL 交互。

問題分析

上一章節(jié)基本把這個(gè) Bug 相關(guān)的原理知識(shí)介紹清楚了,下面正式進(jìn)入問題的分析過程。

最開始拿到這個(gè)問題,我也是比較頭禿的,尤其看到讀者下面這段信息。

當(dāng)然,我的功力是達(dá)不到盲猜水平的,說下我的完整思路。

第 1 步:復(fù)現(xiàn)問題

我讓讀者給我打包發(fā)了 Demo 的源代碼、數(shù)據(jù)庫腳本以及 ShardingProxy 配置,然后本地安裝了 ShardingProxy 4.1.1 版本,再通過 Navicat 連接到 ShardingProxy 執(zhí)行數(shù)據(jù)庫腳本,環(huán)境基本就準(zhǔn)備完畢了。

啟動(dòng) Demo 程序后,通過 Postman 發(fā)送請(qǐng)求,問題穩(wěn)定復(fù)現(xiàn)了,確實(shí)查不出數(shù)據(jù)。

第 2 步:確認(rèn)應(yīng)用程序是否有 Bug

因?yàn)檎麄€(gè)代碼很簡單,代碼層面唯一有可能存在問題的是 Mybatis 這一層。

為了確認(rèn)這一點(diǎn),我修改了 SpringBoot 的配置,將 MyBatis 的 debug 日志也打印了出來。

再次發(fā)起請(qǐng)求后,能從控制臺(tái)中看到以下詳細(xì)日志:

 

日志中沒發(fā)現(xiàn)異常,而且 PreparedStatement 以及 ExecuteStatement 的參數(shù)設(shè)置都是正確的,查詢結(jié)果確實(shí)是空。

為了縮小排查范圍,我把 dataSource 的 配置改回了直連真實(shí)數(shù)據(jù)庫,這樣能將 ShardingProxy 這個(gè)干擾因素排除在外。

改完后的 url 如下:

jdbc:mysql://127.0.0.1:3306/db1?useServerPrepStmts=true&cachePrepStmts=true&serverTimezone=UTC

其中,db1 是真實(shí)數(shù)據(jù)庫,3306 也是MySQL 服務(wù)器的端口了。然后再次用 Postman 發(fā)送請(qǐng)求,可以看到:有正確數(shù)據(jù)返回了。

 

通過這一步,我將懷疑對(duì)象再次轉(zhuǎn)移到 ShardingProxy 上了,并將 dataSource 配置改回成原樣,繼續(xù)排查。

第 3 步:排查 ShardingProxy

首先,查看 ShardingProxy 的運(yùn)行日志,沒發(fā)現(xiàn)任何異常;其次,能看到日志中的 Actual SQL 是正確的,它已經(jīng)根據(jù)分區(qū)鍵正確路由到了 pcsct_prdt_cvr0 這張表:

  1. [INFO ] 17:25:48.804 [ShardingSphere-Command-15]  
  2. ShardingSphere-SQL - Actual SQL: ds_0 ::: SELECT  
  3. BIZ_DT,ECIF_CUST_NO,DEP_FLG ...  
  4. FROM pscst_prdt_cvr0  
  5. WHERE ECIF_CUST_NO = ? ::: [10000] 

因此可以推斷:ShardingProxy 的分庫分表配置應(yīng)該是沒有問題的。

我開始懷疑:是否跟 ShardingProxy 所使用的數(shù)據(jù)庫驅(qū)動(dòng)有關(guān)?因?yàn)檫@個(gè) Jar 包是應(yīng)用方選擇版本,手動(dòng)放到 ShardingProxy 安裝目錄中的。

因此,我將驅(qū)動(dòng)版本從 5.1.47 版本改成了 8.0.13 (和 Demo 使用了相同的版本),但是問題仍然存在。

另外,還能想到的是:是否是 ShardingProxy 的這個(gè)最新版本引入了 Bug?然后,我又另外安裝了它的上一個(gè)版本 4.1.0,重新測試了一遍,還是有問題。

這個(gè)時(shí)候,真感覺沒有其他可疑點(diǎn)了,所有能想到的點(diǎn)都排查了一遍。我再次回到了 Demo 程序本身,它和 ShardingProxy 唯一的結(jié)合點(diǎn)就在 DataSource 的 url 上。

  1. jdbc:mysql://127.0.0.1:3307/sharding_db?useServerPrepStmts=true&cachePrepStmts=true&serverTimezone=UTC 

庫名和端口號(hào)配置無誤,唯一可疑的是另外三個(gè)參數(shù):

  • useServerPrepStmts
  • cachePrepStmts
  • serverTimezone

其中,前兩個(gè)參數(shù)和預(yù)編譯 SQL 有關(guān),是一個(gè)組合。因此,我將這兩個(gè)參數(shù)從 url 中去掉,測試了一下。

這個(gè)時(shí)候奇跡出現(xiàn)了,居然返回了正確數(shù)據(jù)。至此,基本定位到了問題,但根本原因是什么呢?究竟是不是 ShardingProxy 的 Bug ?

第 4 步:Wireshark 抓包分析 MySQL 協(xié)議

找到這個(gè)問題的解決方案后,我同步給了讀者。與此同時(shí),他也在 ShardingProxy 的 GitHub 上提交了 issue,反饋了這個(gè)最新進(jìn)展。

由于工作原因,這個(gè)問題我就暫時(shí)放一邊了,準(zhǔn)備抽空再接著排查。

大概過了一周我想起了這個(gè)問題,然后打開 issue 想了解下調(diào)查進(jìn)度,讓我非常驚訝的是:官方開發(fā)者居然在復(fù)現(xiàn)此問題后,主觀臆斷地認(rèn)為是應(yīng)用程序的問題,然后莫名奇妙的把這個(gè) issue 關(guān)閉了。

他們的答復(fù)是這樣的:

 

意思就是:我們針對(duì)預(yù)編譯 SQL 功能做了大量的測試,這個(gè)是不可能存在問題的,建議你們更換下應(yīng)用程序的數(shù)據(jù)庫連接池,抓包繼續(xù)分析下。(這個(gè)說法真讓人非常無語,完全不是程序員嚴(yán)謹(jǐn)?shù)乃季S!)

第二天,我開始用 Wireshark 抓包分析 MySQL 的協(xié)議,想弄清楚根本原因到底是什么?同時(shí)聯(lián)系上了官方,讓他們 reopen 了這個(gè)問題。

Wireshark 如何抓取 MySQL 協(xié)議的數(shù)據(jù)包,這里就不展開了,大家可以網(wǎng)上查下資料。

注意將 Wireshark 的過濾條件設(shè)置成:

  1. mysql || tcp.port==3307 

其中:mysql 表示 ShardingProxy 和 MySQL Server 之間的數(shù)據(jù)包,tcp.port==3307 表示 Demo 程序和 ShardingProxy 之間的數(shù)據(jù)包。

啟動(dòng) Wireshark 抓包后,再次用 Postman 發(fā)起請(qǐng)求,觸發(fā)整個(gè)過程,然后就能順利抓到下面截圖的數(shù)據(jù)包了。

 

大家關(guān)注底色為 深藍(lán)色 的 8 個(gè)數(shù)據(jù)包即可。在本文第 2 章節(jié)的原理部分,我已經(jīng)詳細(xì)介紹過 ShardingProxy 的預(yù)編譯功能以及該流程的 MySQL 協(xié)議消息,這里的 8 個(gè)數(shù)據(jù)包和原理介紹是完成吻合的。

那接下來如何進(jìn)一步分析呢?結(jié)合 ShardingProxy 的架構(gòu)圖來思考下:Proxy 僅僅作為一個(gè)中間代理,介于應(yīng)用程序和 MySQL Server 之間。

它完全實(shí)現(xiàn)了 MySQL 協(xié)議,以便對(duì) MySQL 命令進(jìn)行解碼和編碼,然后加上自己的分庫分表邏輯。

如果 ShardingProxy 內(nèi)部存在 Bug,那一定是某個(gè)數(shù)據(jù)包出現(xiàn)了問題。

順著這個(gè)思路,很快就能發(fā)現(xiàn):執(zhí)行完 ExecuteStatement 后,MySQL Server 返回正確數(shù)據(jù)包給 Proxy 了,但是 Proxy 沒有返回正確的數(shù)據(jù)包給應(yīng)用程序。

下面截圖的是倒數(shù)第 2 個(gè) Response 數(shù)據(jù)包,由 MySQL Server 返回給 Proxy 的,Payload 中能看到那條記錄的數(shù)據(jù):

下面截圖的是最后 1 個(gè) Response 數(shù)據(jù)包,由 Proxy 返回給應(yīng)用程序的,Payload 中只能看到表字段的定義,那條記錄已經(jīng)不翼而飛了。

 

通過這一步分析,就已經(jīng)坐實(shí)了:ShardingProxy 是有 Bug 的。然后,我將這些依據(jù)發(fā)給了官方開發(fā)者,對(duì)方開始重視,并正式進(jìn)入源碼分析階段。

根本原因定位

當(dāng)天晚上,官方開發(fā)者就定位到了根本原因,發(fā)出了 Pull Request。我看了下代碼改動(dòng),僅僅修改了一行代碼。

 

改動(dòng)的這行代碼,就是在 ShardingProxy 再次組裝數(shù)據(jù)包返回給應(yīng)用程序時(shí)拋出來的。

由于我們的數(shù)據(jù)表中存在一個(gè) date 類型的字段,改動(dòng)的這行代碼卻強(qiáng)制將 date 類型轉(zhuǎn)換成了 Timestamp 類型,因此拋出了異常。還有幾個(gè)疑點(diǎn),我結(jié)合對(duì)源代碼的理解逐一解答下。

①為什么代碼拋異常了,但是 ShardingProxy 的控制臺(tái)沒打印呢?

 

上面截圖的是:拋出 ClassCastException 那個(gè)方法的整個(gè)調(diào)用鏈。由于 ShardingProxy 并沒有捕獲這個(gè) RuntimeException 以及打印日志,最終這個(gè)異常被 netty 吞掉了。

②為什么 ShardingProxy 需要做 date 到 Timestamp 的類型轉(zhuǎn)換呢?

可以從 ShardingProxy 的架構(gòu)來理解,因?yàn)?Proxy 只有對(duì) MySQL 協(xié)議進(jìn)行編解碼后,才能在中間插入它的分庫分表邏輯。

針對(duì) date 類型的字段,ShardingProxy 通過 JDBC 的 API 從查詢結(jié)果中拿到的仍然是 Date 類型,之所以要轉(zhuǎn)換成 Timestamp,這個(gè)又跟 MySQL 的協(xié)議有關(guān)了,下面是 MySQL 官方文檔的說明:

 

簡單理解就是:ShardingProxy 在代碼實(shí)現(xiàn)時(shí),用了一個(gè)范圍最大的 timestamp 存了三種可能的值 date,datetime 和 timestamp,然后再按照上面這個(gè)協(xié)議規(guī)范進(jìn)行二進(jìn)制的寫入。

③這個(gè) Bug 是只有在使用 SQL 預(yù)編譯功能時(shí)才會(huì)被觸發(fā)嗎?

是的,只有在處理 ExecuteStatement 命令時(shí),這個(gè)方法才會(huì)被調(diào)用到。那普通的 SQL 查詢場景為什么用不到呢?

這個(gè)又跟 MySQL 協(xié)議有關(guān)了,普通的 SQL 查詢場景,payload 不是二進(jìn)制協(xié)議的,而是普通的文本協(xié)議。這種情況下,無需調(diào)用這個(gè)類進(jìn)行轉(zhuǎn)換。

至此,整個(gè)分析過程就結(jié)束了。

寫在最后

本文詳細(xì)復(fù)盤了這個(gè) Bug 的分析過程,并對(duì)其中的原理知識(shí)和排查經(jīng)驗(yàn)進(jìn)行了總結(jié)。

對(duì)于 ShardingSphere 這種頂級(jí)開源項(xiàng)目來說,我個(gè)人覺得同樣值得做一次深度復(fù)盤。

我不認(rèn)同他們對(duì)于 issue 的處理方式,另外在核心功能的自動(dòng)化測試上,也一定是存在 case 不完善的,不然不可能連續(xù)多個(gè)版本都沒發(fā)現(xiàn)這個(gè)嚴(yán)重 Bug。

作者:駱俊武

簡介:前亞馬遜工程師,現(xiàn) 58 轉(zhuǎn)轉(zhuǎn)技術(shù)總監(jiān),持續(xù)分享個(gè)人的成長經(jīng)歷,希望為你的職場發(fā)展帶來些新思路。

編輯:陶家龍

出處:轉(zhuǎn)載自公眾號(hào)IT人的職場進(jìn)階(ID:BestITer)

 

責(zé)任編輯:武曉燕 來源: IT人的職場進(jìn)階
相關(guān)推薦

2017-10-31 08:09:54

ApacheRocketMQ項(xiàng)目

2009-06-22 13:29:00

Apache Open

2021-04-11 07:48:42

定時(shí)任務(wù)Linux jdk

2022-06-13 10:24:54

開源時(shí)序數(shù)據(jù)庫高校項(xiàng)目

2020-01-18 11:13:08

CPU程序存儲(chǔ)

2016-12-13 10:57:22

Bug程序員錯(cuò)誤報(bào)告

2020-06-12 09:07:03

技術(shù)總監(jiān)數(shù)據(jù)庫

2022-06-21 09:26:28

開源項(xiàng)目PR

2021-04-09 22:09:55

軟件基金會(huì)頂級(jí)項(xiàng)目

2020-12-09 12:52:45

分布式對(duì)象存儲(chǔ)

2025-08-11 04:00:00

開源項(xiàng)目PR

2024-08-26 09:36:06

2020-08-19 14:22:09

程序員測試互聯(lián)網(wǎng)

2021-08-04 09:33:22

Go 性能優(yōu)化

2012-12-25 14:16:43

華為分銷渠道

2022-01-18 11:22:58

Hadoop 管理工具Apache Amba

2017-04-24 13:51:50

華為

2021-03-09 08:00:13

設(shè)計(jì)秒殺TPS

2022-10-09 11:32:52

數(shù)據(jù)分析業(yè)務(wù)銷量

2019-05-13 09:01:13

程序員職責(zé)產(chǎn)品經(jīng)理
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

av在线不卡电影| 国语自产精品视频在线看8查询8| 在线视频欧美精品| 亚洲二区三区四区| 99久久久国产精品无码网爆| 亚洲天堂偷拍| 国产一区二区三区视频| 久久久福利影院| 国产网站在线| 最新中文字幕一区二区三区| 国产在线一区二区三区播放| 伊人22222| 亚洲高清在线| 神马久久桃色视频| 182在线视频| 国产精品伦一区二区| 亚洲一区二区三区在线播放| 色之综合天天综合色天天棕色| 午夜精品一二三区| 视频一区在线视频| 久久久久久久91| 超碰97av在线| 日韩在线影视| 日韩三级免费观看| 奇米影音第四色| 阿v视频在线观看| 国产精品不卡一区| 老牛影视免费一区二区| 亚洲av永久无码国产精品久久 | 亚洲区在线播放| 亚洲欧美日韩一二三区| 欧美三级精品| 偷窥少妇高潮呻吟av久久免费| 亚洲午夜精品一区二区| 日本一区视频| 成人aaaa免费全部观看| 91精品国产综合久久香蕉最新版 | 亚洲精品极品| 久久久久99精品久久久久| 欧美大波大乳巨大乳| 鲁大师精品99久久久| 五月天亚洲精品| 91传媒免费视频| 黄色精品免费看| 中文字幕一区日韩精品欧美| 日韩成人av电影在线| 亚洲av激情无码专区在线播放| 国产综合色视频| 国产精品一区二区三区毛片淫片| 亚洲欧美一二三区| 免费精品视频| 人妖精品videosex性欧美| 日韩熟女精品一区二区三区| 亚洲夜间福利| 久久久久久香蕉网| 九九九国产视频| 在线播放亚洲| 午夜精品久久久久久久99热浪潮 | 亚洲一区二区三区毛片| 艳妇乳肉豪妇荡乳av| 麻豆免费看一区二区三区| 国产精品久久久久福利| 国产成人精品亚洲| 蜜臀av一区二区三区| 国产女人精品视频| 91福利免费视频| 国产又黄又大久久| y111111国产精品久久婷婷| wwwav在线播放| 成人福利视频在线| 精品毛片久久久久久| 色鬼7777久久| 国产日韩精品视频一区| 午夜久久资源| 精品麻豆一区二区三区| 夜夜亚洲天天久久| 黄色一级在线视频| 欧美色网在线| 欧美二区乱c少妇| 免费黄视频在线观看| 成人动态视频| 亚洲人成电影网站色| 美国美女黄色片| 欧美激情91| 91国内免费在线视频| 日日夜夜操视频| 精品一区在线看| 国产99视频精品免费视频36| 日本电影一区二区在线观看| 国产精品三级视频| 黄网站色视频免费观看| 极品av在线| 欧美日韩专区在线| 国产精品99精品无码视亚| 亚洲自拍电影| 久久精品国产亚洲精品2020| 国产午夜精品无码一区二区| 日韩福利视频网| 99re在线观看视频| 国产中文在线观看| 亚洲综合激情网| 成人午夜激情av| 中文一区二区三区四区| 亚洲天堂av在线免费| 破处女黄色一级片| 久久午夜精品一区二区| 91gao视频| 二区在线观看| 亚洲成人激情av| 欧美日韩中文不卡| 色天下一区二区三区| 久久艳片www.17c.com| 毛片视频网站在线观看| 国产一区91精品张津瑜| 日韩精品久久一区二区三区| 青草在线视频在线观看| 欧美性猛交xxxx黑人交| 日本黄色免费观看| 欧美一区在线看| 国产精品高潮呻吟久久av无限| 成人精品在线播放| 综合欧美亚洲日本| 亚洲性生活网站| 视频小说一区二区| 欧美疯狂做受xxxx高潮| 国产尤物在线观看| 久久免费美女视频| 少妇av一区二区三区无码| 国产精品久久久久久av公交车| 一区二区欧美久久| 国产免费av一区| 不卡一区二区三区四区| 少妇一晚三次一区二区三区| 亚洲免费看片| 中文字幕亚洲色图| 亚洲大尺度在线观看| 久久这里只有精品首页| 欧美啪啪免费视频| 都市激情亚洲| 欧美激情视频一区二区三区不卡| 国产精品久久久久久久一区二区 | 国精品**一区二区三区在线蜜桃 | 精品福利一区二区| aaa黄色大片| 亚洲视频精品| 国产伦精品一区二区三毛| 欧美日韩色网| 欧美mv日韩mv| 久久这里只有精品国产| 国产不卡在线视频| 4444亚洲人成无码网在线观看| 国产美女视频一区二区| 久久激情视频免费观看| 国产精品无码久久久久成人app| 国产精品无遮挡| 一本色道久久亚洲综合精品蜜桃 | 国产一区二区三区在线免费观看| 青青青国产在线| 久久久久综合网| 粗暴91大变态调教| 成人毛片在线| 91精品免费视频| 牛牛电影国产一区二区| 精品国产91乱码一区二区三区| 国产午夜福利一区二区| 99久久国产综合精品色伊| 久久精品国产精品亚洲色婷婷| 亚洲素人在线| 国产精品电影一区| 毛片激情在线观看| 日韩午夜精品电影| 日韩成人免费在线视频| 91老师国产黑色丝袜在线| 热久久精品免费视频| 久久精品国产68国产精品亚洲| 91免费精品国偷自产在线| 青草影视电视剧免费播放在线观看| 精品国产91亚洲一区二区三区婷婷| www..com国产| 日本一区二区免费在线观看视频| 亚洲欧美手机在线| 伊人久久婷婷| 日本一区二区三区免费看| 亚洲欧洲二区| 97超碰色婷婷| 日本www在线观看视频| 日韩欧美色电影| 日本一区二区三区精品| 国产精品家庭影院| 中文字幕一区二区人妻电影丶| 日韩高清一级片| 国产精品视频二| 国产真实有声精品录音| 2022国产精品| 自拍偷自拍亚洲精品被多人伦好爽| 日韩在线一区二区三区免费视频| 高清乱码毛片入口| 在线观看一区二区视频| 久久久久久福利| 欧美激情在线一区二区三区| 中文字幕99页| 久久精品国产999大香线蕉| 亚洲人成无码网站久久99热国产 | av网站手机在线观看| 国产一区不卡| 国产成人av一区二区三区| 韩国成人在线| 性色av一区二区三区在线观看 | 丝袜久久网站| 91日本在线视频| 欧美aaa视频| 91av视频在线观看| 任你弄在线视频免费观看| 国产香蕉97碰碰久久人人| 亚洲精品国产一区二| 欧美日韩国产首页在线观看| 视频一区二区三区四区五区| 亚洲欧美aⅴ...| 美女100%露胸无遮挡| 2020日本不卡一区二区视频| 日本中文字幕有码| 久久丁香综合五月国产三级网站| 欧美视频第一区| 亚洲大胆在线| 欧美这里只有精品| 91精品精品| 亚洲欧美丝袜| 精品国产乱码| 麻豆成人在线播放| 久久精品色综合| 动漫一区二区在线| 亚洲电影一区| 91网站在线看| 999久久久国产999久久久| 国产精品免费在线免费| 影视一区二区三区| 国产成人短视频| 亚洲优女在线| 91chinesevideo永久地址| 91九色porn在线资源| 九九热精品视频| v天堂福利视频在线观看| 色婷婷综合成人| 自拍视频在线| 中文字幕在线精品| 91xxx在线观看| 综合久久五月天| 香蕉视频网站在线观看| 丝袜亚洲另类欧美重口| 色视频在线免费观看| 色偷偷av一区二区三区| 日本高清中文字幕在线| 久久精品视频在线播放| 好操啊在线观看免费视频| 久久精品在线视频| av中文字幕在线观看| 欧美多人乱p欧美4p久久| 影音先锋在线播放| 欧美极品少妇全裸体| √8天堂资源地址中文在线| 午夜精品视频在线| 日韩电影免费看| 国产成人精品久久二区二区91| 精品国模一区二区三区| 国产精品美女在线观看| 四虎视频在线精品免费网址| 亚洲aa在线观看| 国产精品99久久免费观看| 国产一区二区视频在线免费观看| 神马香蕉久久| 一区二区免费在线观看| 欧美成人日本| 国产精品无码av在线播放| 久久精品欧洲| 涩涩网站在线看| 国v精品久久久网| 一级性生活毛片| 国产精品久久久久久亚洲伦| 农村妇女精品一区二区| 婷婷中文字幕综合| 嫩草影院一区二区三区| 日韩一区二区在线观看| 欧美视频在线观看一区二区三区| 亚洲精品视频在线观看视频| 91精彩视频在线观看| 欧美激情亚洲精品| 欧美黄色三级| 成人综合av网| 免费欧美激情| 神马午夜伦理影院| 另类亚洲自拍| 亚洲一区二区三区三州| 91视视频在线观看入口直接观看www| 鲁丝一区二区三区| 一区二区三区不卡视频| 无码人妻aⅴ一区二区三区有奶水| 欧美日韩一级片在线观看| 二区三区在线视频| 尤物九九久久国产精品的分类| 青草av在线| 国产精品久久久久久久久久久久 | 亚洲国产精品网站| 欧美性猛交xxx乱大交3蜜桃| 91精品成人久久| 国产aⅴ精品一区二区四区| 久久久久一区二区| 一区二区日韩欧美| 亚洲男人天堂色| 99久久久国产精品| 欧美精品一级片| 欧美日韩成人在线| 久久精品国产亚洲a∨麻豆| 色综合五月天导航| 巨大黑人极品videos精品| 久久国产精品亚洲va麻豆| 91精品一区二区三区综合| 99草草国产熟女视频在线| www.成人网.com| 中文字幕在线有码| 欧美日韩视频专区在线播放| 天堂中文在线视频| 欧美多人乱p欧美4p久久| 一卡二卡三卡四卡五卡| 日本一区影院| 亚洲精品在线视频观看| 老司机一区二区三区| 中文字幕三级电影| 一区二区三区视频在线看| 亚洲视频在线观看一区二区| 亚洲图片在区色| 亚洲一区站长工具| 精品在线不卡| 亚洲激情黄色| 在线中文字日产幕| 一区二区三区自拍| 国产乱码久久久久| 久久精品国产一区二区三区| 欧美日韩伦理一区二区| 亚洲 国产 欧美一区| 日韩av不卡一区二区| 国产精品密蕾丝袜| 91黄色小视频| 免费播放片a高清在线观看| 2025国产精品视频| 日韩精品免费一区二区夜夜嗨| 日本人体一区二区| www.av精品| 圆产精品久久久久久久久久久| 亚洲成人a**站| 毛片在线网站| 欧美一区免费视频| 日韩影院精彩在线| 99国产精品免费| 欧美日韩一区高清| 免费黄色在线网站| 亚洲一区二区三区四区在线播放| 91精品一区二区三区综合在线爱| 日本r级电影在线观看| 一卡二卡欧美日韩| www.热久久| 久久久免费精品| 麻豆一区二区麻豆免费观看| 男人天堂1024| 日本一区免费视频| 国产欧美熟妇另类久久久| 欧美老女人性生活| 欧美一区自拍| 91视频免费版污| 亚洲视频你懂的| 男人天堂网在线视频| 欧美一区二区三区精品电影| av一区二区在线观看| 亚洲在线观看网站| 亚洲成人av福利| 高清性色生活片在线观看| 成人精品一区二区三区电影免费 | 欧美另类高清videos的特点| 自拍偷拍亚洲在线| jizz久久精品永久免费| 欧美牲交a欧美牲交aⅴ免费下载| 欧美国产日韩亚洲一区| aaa一区二区| 欧美一级大片在线观看| 久久一区91| 波多野结衣加勒比| 欧美影院一区二区三区| 污片在线免费观看| 欧美精品在线一区| 国产福利精品导航| 国产一级片免费在线观看| 久久精品国产一区二区三区| 欧美日韩导航| 日韩av片专区| 欧美日韩免费在线观看| 免费不卡视频| 欧美日韩精品中文字幕一区二区| 国内一区二区视频| 亚洲大片免费观看| 高清一区二区三区日本久| 久久一区91|