日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.Net 下高性能分表分库组件-连ShardingCore接模式原理

發布時間:2023/12/4 asp.net 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .Net 下高性能分表分库组件-连ShardingCore接模式原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

ShardingCore?一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵。


Github Source Code?助力dotnet 生態?Gitee Source Code


介紹

在分表分庫領域java有著很多的解決方案,尤其是客戶端解決方案(ShardingSphere),因為客戶端解決方案有著極高的性能,但是缺點也很明顯數據庫鏈接的消耗相對較高,使用語言的限制讓我們.Net望而卻步,但是哪怕是有著這些缺點其實也不足以掩蓋客戶端分表分庫帶來的便捷與高效。
目前本人所開發的ShardingCore?是.Net下基于efcore2+的所有版本的分表分庫很多都是借鑒了ShardingSphere,并且對其很多缺點進行了彌補。這邊可能有人就要說了,你為什么做個efcore的不做個ado.net的呢,說實話我這邊確實有一個ado.net版本的分表分庫,你可以理解為ShardingSphere的.Net復刻版本sharding-conector?最最最初版本的分表聚合已經實現底層原理和ShardingSphere一致使用的Antlr4的分詞。為什么不對這個版本進行推進轉而對efcore的sharding-core版本進行升級維護呢,這邊主要有兩點,第一點如果我是在ado.net上進行的推進那么勢必可以支持更多的orm框架,但是orm框架下的很多特性將可能無法使用,并且需要維護各個數據庫版本之間的差異。比如efcore下的批量操作等一些列優化語法是很難被支持的。第二點針對某個orm的擴展性能和使用體驗上遠遠可以大于通用性組件。這就是我為什么針對ShardingCore進行有段優化和升級的原因。

性能

其實性能一直是大家關注的一個點,我用了ShardingCore那么針對特定的查詢他的損耗是多少是一個比較令人關注的話題。接下來我放出之前做的兩次性能比較,當然這兩次比較并不是特意準備的,是我邊開發邊跑的一個是sqlserver 一個是mysql

性能測試

以下所有數據均在開啟了表達式編譯緩存的情況下測試,并且電腦處于長時間未關機并且開著很多vs和idea的情況下僅供參考,所有測試都是基于ShardingCore x.3.1.63+ version

以下所有數據均在源碼中有案例

efcore版本均為6.0 表結構為string型id的訂單取模分成5張表

N代表執行次數

sql server 2012,data rows 7734363 =773w

// * Summary *

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.18363.1500 (1909/November2019Update/19H2)
AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores
.NET SDK=6.0.100
[Host] : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT

MethodNMeanErrorStdDevMedian
NoShardingIndexFirstOrDefaultAsync102.154 ms0.1532 ms0.4443 ms1.978 ms
ShardingIndexFirstOrDefaultAsync104.293 ms0.1521 ms0.4485 ms4.077 ms
NoShardingNoIndexFirstOrDefaultAsync10823.382 ms16.0849 ms18.5233 ms821.221 ms
ShardingNoIndexFirstOrDefaultAsync10892.276 ms17.8131 ms16.6623 ms894.880 ms
NoShardingNoIndexCountAsync10830.754 ms16.5309 ms38.6405 ms821.736 ms
ShardingNoIndexCountAsync10915.630 ms8.8511 ms7.3911 ms914.107 ms
NoShardingNoIndexLikeToListAsync107,008.918 ms139.4664 ms166.0248 ms6,955.674 ms
ShardingNoIndexLikeToListAsync107,044.168 ms135.3814 ms132.9626 ms7,008.057 ms
NoShardingNoIndexToListAsync10787.129 ms10.5812 ms8.8357 ms785.798 ms
ShardingNoIndexToListAsync10935.880 ms16.3354 ms15.2801 ms940.369 ms

mysql 5.7,data rows 7553790=755w innerdb_buffer_size=3G

// * Summary *

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.18363.1500 (1909/November2019Update/19H2)
AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores
.NET SDK=6.0.100
[Host] : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT

MethodNMeanErrorStdDevMedian
NoShardingIndexFirstOrDefaultAsync105.020 ms0.1245 ms0.3672 ms4.855 ms
ShardingIndexFirstOrDefaultAsync107.960 ms0.1585 ms0.2514 ms7.974 ms
NoShardingNoIndexFirstOrDefaultAsync1011,336.083 ms623.8044 ms1,829.5103 ms11,185.590 ms
ShardingNoIndexFirstOrDefaultAsync105,422.259 ms77.5386 ms72.5296 ms5,390.019 ms
NoShardingNoIndexCountAsync1014,229.819 ms82.8929 ms77.5381 ms14,219.773 ms
ShardingNoIndexCountAsync103,085.268 ms55.5942 ms49.2828 ms3,087.704 ms
NoShardingNoIndexLikeToListAsync1027,046.390 ms71.2034 ms59.4580 ms27,052.316 ms
ShardingNoIndexLikeToListAsync105,707.009 ms106.8713 ms99.9675 ms5,672.453 ms
NoShardingNoIndexToListAsync1026,001.850 ms89.2787 ms69.7030 ms25,998.407 ms
ShardingNoIndexToListAsync105,490.659 ms71.8199 ms67.1804 ms5,477.891 ms

具體可以通過first前兩次結果來計算得出結論單次查詢的的損耗為0.2-0.3毫秒之間,通過數據聚合和數據路由的損耗單次在0.3ms-0.4ms,其中創建dbcontext為0.1毫秒目前沒有好的優化方案,0.013毫秒左右是路由表達式解析和編譯,復雜表達式可能更加耗時,剩下的0.2毫秒為數據源和表后綴的解析等操作包括實例的反射創建和數據的聚合,
sqlserver的各項數據在分表和未分表的情況下都幾乎差不多可以得出在770w數據集情況下數據庫還并未是數據瓶頸的關鍵,但是mysql可以看到在分表和未分表的情況下如果涉及到沒有索引的全表掃描那么性能的差距將是分表后的表數目之多,測試中為5-6倍,也就是分表數目

如果你可以接受單次查詢的損耗在0.2ms-0.3ms的那相信這款框架將會是efcore下非常完美的一款分表分庫組件


鏈接模式

說了這么多這邊需要針對ShardingCore在查詢下面涉及到N表查詢后帶來的鏈接消耗是一個不容小覷的客觀因素。所以這邊參考ShardingSphere進行了類似原理的實現。就是如果查詢涉及不同庫那么直接并發,如果是同庫的將根據用戶配置的單次最大鏈接進行串行查詢,并且動態選擇使用流式聚合和內存聚合。

首先我們看下ShardingSphere的鏈接模式在限制鏈接數的情況下是如何進行處理的

針對不同的數據庫采用并行執行,針對同一個數據庫根據用戶配置的最大連接數進行分庫串行執行,并且因為需要控制鏈接數所以會將結果集保存在內存中,最后通過合并返回給客戶端數據。
之后我們會講這個模式的缺點并且ShardingCore是如何進行優化的

你可能已經蒙了這么多名稱完全沒有一個概念。接下來我將一一進行講解,首先我們來看下鏈接模式下有哪些參數

MaxQueryConnectionsLimit

最大并發鏈接數,就是表示單次查詢sharding-core允許使用的dbconnection,默認會加上1就是說如果你配置了MaxQueryConnectionsLimit=10那么實際sharding-core會在同一次查詢中開啟11條鏈接最多,為什么是11不是10因為sharding-core會默認開啟一個鏈接用來進行空dbconnection的使用。如果不設置本參數那么默認是cpu線程數Environment.ProcessorCount

ConnectionMode

鏈接模式,可以由用戶自行指定,使用內存限制,和連接數限制或者系統自行選擇最優

鏈接模式,有三個可選項,分別是:

MEMORY_STRICTLY

內存限制模式最小化內存聚合 流式聚合 同時會有多個鏈接

MEMORY_STRICTLY的意思是最小化內存使用率,就是非一次性獲取所有數據然后采用流式聚合

CONNECTION_STRICTLY

連接數限制模式最小化并發連接數 內存聚合 連接數會有限制

CONNECTION_STRICTLY的意思是最小化連接并發數,就是單次查詢并發連接數為設置的連接數MaxQueryConnectionsLimit。因為有限制,所以無法一直掛起多個連接,數據的合并為內存聚合采用最小化內存方式進行優化,而不是無腦使用內存聚合

SYSTEM_AUTO

系統自動選擇內存還是流式聚合

系統自行選擇會根據用戶的配置采取最小化連接數,但是如果遇到分頁則會根據分頁策略采取內存限制,因為skip過大會導致內存爆炸

解釋

MEMORY_STRICTLY

MEMORY_STRICTLY內存嚴格模式,用戶使用本屬性后將會嚴格控制查詢的聚合方式,將會采用流式聚合的迭代器模式,而不是一次性全部去除相關數據在內存中排序獲取,通過用戶配置的MaxQueryConnectionsLimit連接數來進行限制,比如MaxQueryConnectionsLimit=2,并且本次查詢涉及到一個庫3張表,因為程序只允許單次查詢能并發2個鏈接,所以本次查詢會被分成2組每組兩個,其中第二組只有一個,在這種情況下第一次并發查詢2條語句因為采用內存嚴格所以不會將數據獲取到內存,第二次在進行一次查詢并將迭代器返回一共組合成3個迭代器后續通過流式聚合+優先級隊列進行返回所要的數據,在這種情況下程序的內存是最少的但是消耗的鏈接也是最大的。當用戶手動選擇MEMORY_STRICTLY后MaxQueryConnectionsLimit將變成并行數目. 該模式下ShardingCore和ShardingSphere的處理方式類似基本一致

CONNECTION_STRICTLY

CONNECTION_STRICTLY連接數嚴格模式,用戶使用本屬性后將會嚴格控制查詢后的同一個數據庫下的同時查詢的鏈接數,不會因為使用流式內存而導致迭代器一致開著,因為一個迭代器查詢開著就意味著需要一個鏈接,如果查詢需要聚合3張表那么就需要同時開著三個鏈接來迭代保證流式聚合。通過用戶配置的MaxQueryConnectionsLimit連接數來進行限制,比如MaxQueryConnectionsLimit=2,并且本次查詢涉及到一個庫3張表,因為程序只允許單次查詢能并發2個鏈接,所以本次查詢會被分成2組每組兩個,其中第二組只有一個,在這種情況下第一次并發查詢2條語句因為采用連接數嚴格所以不會一直持有鏈接,會將鏈接結果進行每組進行合并然后將連接放回,合并時還是采用的流式聚合,會首先將第一組的兩個鏈接進行查詢之后將需要的結果通過流式聚合取到內存,然后第二組會自行獨立查詢并且從第二次開始后會將上一次迭代的內存聚合數據進行和本次查詢的流式聚合分別一起聚合,保證在分頁情況下內存數據量最少。因為如果每組都是用獨立的內存聚合那么你有n組就會有n*(skip+take)的數目,而ShardingSphere采用的是更加簡單的做法,就是將每組下面的各自節點都自行進行內存聚合,那么如果在skip(10).take(10)的情況下sql會被改寫成各組的各個節點分別進行skip(0).take(20)的操作那么2組執行器的第一組將會有40條數據第二組將會有20條數據一共會有60條數據遠遠操作了我們所需要的20條。所以在這個情況下ShardingCore第一組內存流式聚合會返回20條數據,第二組會將第一組的20條數據和第二組的進行流式聚合內存中還是只有20條數據,雖然是連接數嚴格但是也做到了最小化內存單元。當用戶手動選擇CONNECTION_STRICTLY后MaxQueryConnectionsLimit將是正則的最小化鏈接數限制

SYSTEM_AUTO

SYSTEM_AUTO系統自行選擇,這是一個非常幫的選擇,因為在這個選擇下系統會自動根據用戶配置的MaxQueryConnectionsLimit來自行控制是采用流式聚合還是內存聚合,并且因為我們采用的是同數據庫下面最小化內存相比其他的解決方案可以更加有效和高性能的來應對各種查詢。僅僅只需要配置一個最大連接數限制既可以適配好連接模式。

這邊極力推薦大家在不清楚應該用什么模式的時候使用SYSTEM_AUTO并且手動配置MaxQueryConnectionsLimit來確定各個環境下的配置一直而不是采用默認的cpu線程數。

首先我們通過每個數據庫被路由到了多少張表進行計算期望用戶在配置了xx后應該的并行數來進行分組,sqlCount :表示這個數據庫被路由到的表數目,exceptCount :表示計算出來的應該的單次查詢并行數

//代碼本質就是向上取整int exceptCount =Math.Max(0 == sqlCount % maxQueryConnectionsLimit? sqlCount / maxQueryConnectionsLimit: sqlCount / maxQueryConnectionsLimit + 1, 1);

第二次我們通過判斷sqlCount和maxQueryConnectionsLimit的大小來確定鏈接模式的選擇

private ConnectionModeEnum CalcConnectionMode(int sqlCount){switch (_shardingConfigOption.ConnectionMode){case ConnectionModeEnum.MEMORY_STRICTLY:case ConnectionModeEnum.CONNECTION_STRICTLY: return _shardingConfigOption.ConnectionMode;default:{return _shardingConfigOption.MaxQueryConnectionsLimit < sqlCount? ConnectionModeEnum.CONNECTION_STRICTLY: ConnectionModeEnum.MEMORY_STRICTLY; ;}}}

比較

針對ShardingSphere的流程圖我們可以看到在獲取普通數據的時候是沒有什么問題的,但是如果遇到分頁也就是

select * from order limit 10,10

這種情況下會被改寫成

select * from order limit 0,20

我們可以看到如果是ShardingSphere的流程模式那么在各個節點處雖然已經將連接數控制好了但是對于每個節點而言都有著20條數據,這種情況下其實是一種非常危險的,因為一旦節點過多并且limit的跳過頁數過多每個節點儲存的數據將會非常恐怖。

所以針對這種情況ShardingCore將同庫下的各個節點組的查詢使用StreamMerge而不是MemoryMerge,并且會對各個節點間建立聯系進行聚合保證在同一個數據庫下只會有20條數據被加載到內存中,大大降低了內存的使用,提高了內存使用率。

當然具體情況應該還需要再次進行優化并不是簡單的一次優化就搞定的比如當跳過的頁數過多之后其實在內存中的一部分數據也會再次進行迭代和新的迭代器比較,這個中間的性能差距可能需要不斷地嘗試才可以獲取一個比較可靠的值

總結

目前已經有很多小伙伴已經在使用SharidingCore了并且在使用的時候也是相對比較簡單的配置既可以“完美”目前她在使用的各種框架譬如:AbpVNext....基本上在繼承和使用方面可以說是目前efcore生態下最最最完美的了真正做到了三零的框架:零依賴,零學習成本,零業務代碼入侵

最后放一張圖

是我這邊給ShardingSphere提的建議,也證實了我對該聚合模型的優化是可以有效解決在分頁下面聚合各數據庫節點下的內存使用情況

分表分庫組件求贊求star

您的支持是開源作者能堅持下去的最大動力

  • Github?ShardingCore

  • Gitee?ShardingCore

ShardingCore?一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵。


Github Source Code?助力dotnet 生態?Gitee Source Code


介紹

在分表分庫領域java有著很多的解決方案,尤其是客戶端解決方案(ShardingSphere),因為客戶端解決方案有著極高的性能,但是缺點也很明顯數據庫鏈接的消耗相對較高,使用語言的限制讓我們.Net望而卻步,但是哪怕是有著這些缺點其實也不足以掩蓋客戶端分表分庫帶來的便捷與高效。
目前本人所開發的ShardingCore?是.Net下基于efcore2+的所有版本的分表分庫很多都是借鑒了ShardingSphere,并且對其很多缺點進行了彌補。這邊可能有人就要說了,你為什么做個efcore的不做個ado.net的呢,說實話我這邊確實有一個ado.net版本的分表分庫,你可以理解為ShardingSphere的.Net復刻版本sharding-conector?最最最初版本的分表聚合已經實現底層原理和ShardingSphere一致使用的Antlr4的分詞。為什么不對這個版本進行推進轉而對efcore的sharding-core版本進行升級維護呢,這邊主要有兩點,第一點如果我是在ado.net上進行的推進那么勢必可以支持更多的orm框架,但是orm框架下的很多特性將可能無法使用,并且需要維護各個數據庫版本之間的差異。比如efcore下的批量操作等一些列優化語法是很難被支持的。第二點針對某個orm的擴展性能和使用體驗上遠遠可以大于通用性組件。這就是我為什么針對ShardingCore進行有段優化和升級的原因。

性能

其實性能一直是大家關注的一個點,我用了ShardingCore那么針對特定的查詢他的損耗是多少是一個比較令人關注的話題。接下來我放出之前做的兩次性能比較,當然這兩次比較并不是特意準備的,是我邊開發邊跑的一個是sqlserver 一個是mysql

性能測試

以下所有數據均在開啟了表達式編譯緩存的情況下測試,并且電腦處于長時間未關機并且開著很多vs和idea的情況下僅供參考,所有測試都是基于ShardingCore x.3.1.63+ version

以下所有數據均在源碼中有案例

efcore版本均為6.0 表結構為string型id的訂單取模分成5張表

N代表執行次數

sql server 2012,data rows 7734363 =773w

// * Summary *

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.18363.1500 (1909/November2019Update/19H2)
AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores
.NET SDK=6.0.100
[Host] : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT

MethodNMeanErrorStdDevMedian
NoShardingIndexFirstOrDefaultAsync102.154 ms0.1532 ms0.4443 ms1.978 ms
ShardingIndexFirstOrDefaultAsync104.293 ms0.1521 ms0.4485 ms4.077 ms
NoShardingNoIndexFirstOrDefaultAsync10823.382 ms16.0849 ms18.5233 ms821.221 ms
ShardingNoIndexFirstOrDefaultAsync10892.276 ms17.8131 ms16.6623 ms894.880 ms
NoShardingNoIndexCountAsync10830.754 ms16.5309 ms38.6405 ms821.736 ms
ShardingNoIndexCountAsync10915.630 ms8.8511 ms7.3911 ms914.107 ms
NoShardingNoIndexLikeToListAsync107,008.918 ms139.4664 ms166.0248 ms6,955.674 ms
ShardingNoIndexLikeToListAsync107,044.168 ms135.3814 ms132.9626 ms7,008.057 ms
NoShardingNoIndexToListAsync10787.129 ms10.5812 ms8.8357 ms785.798 ms
ShardingNoIndexToListAsync10935.880 ms16.3354 ms15.2801 ms940.369 ms

mysql 5.7,data rows 7553790=755w innerdb_buffer_size=3G

// * Summary *

BenchmarkDotNet=v0.13.1, OS=Windows 10.0.18363.1500 (1909/November2019Update/19H2)
AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores
.NET SDK=6.0.100
[Host] : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT
DefaultJob : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT

MethodNMeanErrorStdDevMedian
NoShardingIndexFirstOrDefaultAsync105.020 ms0.1245 ms0.3672 ms4.855 ms
ShardingIndexFirstOrDefaultAsync107.960 ms0.1585 ms0.2514 ms7.974 ms
NoShardingNoIndexFirstOrDefaultAsync1011,336.083 ms623.8044 ms1,829.5103 ms11,185.590 ms
ShardingNoIndexFirstOrDefaultAsync105,422.259 ms77.5386 ms72.5296 ms5,390.019 ms
NoShardingNoIndexCountAsync1014,229.819 ms82.8929 ms77.5381 ms14,219.773 ms
ShardingNoIndexCountAsync103,085.268 ms55.5942 ms49.2828 ms3,087.704 ms
NoShardingNoIndexLikeToListAsync1027,046.390 ms71.2034 ms59.4580 ms27,052.316 ms
ShardingNoIndexLikeToListAsync105,707.009 ms106.8713 ms99.9675 ms5,672.453 ms
NoShardingNoIndexToListAsync1026,001.850 ms89.2787 ms69.7030 ms25,998.407 ms
ShardingNoIndexToListAsync105,490.659 ms71.8199 ms67.1804 ms5,477.891 ms

具體可以通過first前兩次結果來計算得出結論單次查詢的的損耗為0.2-0.3毫秒之間,通過數據聚合和數據路由的損耗單次在0.3ms-0.4ms,其中創建dbcontext為0.1毫秒目前沒有好的優化方案,0.013毫秒左右是路由表達式解析和編譯,復雜表達式可能更加耗時,剩下的0.2毫秒為數據源和表后綴的解析等操作包括實例的反射創建和數據的聚合,
sqlserver的各項數據在分表和未分表的情況下都幾乎差不多可以得出在770w數據集情況下數據庫還并未是數據瓶頸的關鍵,但是mysql可以看到在分表和未分表的情況下如果涉及到沒有索引的全表掃描那么性能的差距將是分表后的表數目之多,測試中為5-6倍,也就是分表數目

如果你可以接受單次查詢的損耗在0.2ms-0.3ms的那相信這款框架將會是efcore下非常完美的一款分表分庫組件


鏈接模式

說了這么多這邊需要針對ShardingCore在查詢下面涉及到N表查詢后帶來的鏈接消耗是一個不容小覷的客觀因素。所以這邊參考ShardingSphere進行了類似原理的實現。就是如果查詢涉及不同庫那么直接并發,如果是同庫的將根據用戶配置的單次最大鏈接進行串行查詢,并且動態選擇使用流式聚合和內存聚合。

首先我們看下ShardingSphere的鏈接模式在限制鏈接數的情況下是如何進行處理的

針對不同的數據庫采用并行執行,針對同一個數據庫根據用戶配置的最大連接數進行分庫串行執行,并且因為需要控制鏈接數所以會將結果集保存在內存中,最后通過合并返回給客戶端數據。
之后我們會講這個模式的缺點并且ShardingCore是如何進行優化的

你可能已經蒙了這么多名稱完全沒有一個概念。接下來我將一一進行講解,首先我們來看下鏈接模式下有哪些參數

MaxQueryConnectionsLimit

最大并發鏈接數,就是表示單次查詢sharding-core允許使用的dbconnection,默認會加上1就是說如果你配置了MaxQueryConnectionsLimit=10那么實際sharding-core會在同一次查詢中開啟11條鏈接最多,為什么是11不是10因為sharding-core會默認開啟一個鏈接用來進行空dbconnection的使用。如果不設置本參數那么默認是cpu線程數Environment.ProcessorCount

ConnectionMode

鏈接模式,可以由用戶自行指定,使用內存限制,和連接數限制或者系統自行選擇最優

鏈接模式,有三個可選項,分別是:

MEMORY_STRICTLY

內存限制模式最小化內存聚合 流式聚合 同時會有多個鏈接

MEMORY_STRICTLY的意思是最小化內存使用率,就是非一次性獲取所有數據然后采用流式聚合

CONNECTION_STRICTLY

連接數限制模式最小化并發連接數 內存聚合 連接數會有限制

CONNECTION_STRICTLY的意思是最小化連接并發數,就是單次查詢并發連接數為設置的連接數MaxQueryConnectionsLimit。因為有限制,所以無法一直掛起多個連接,數據的合并為內存聚合采用最小化內存方式進行優化,而不是無腦使用內存聚合

SYSTEM_AUTO

系統自動選擇內存還是流式聚合

系統自行選擇會根據用戶的配置采取最小化連接數,但是如果遇到分頁則會根據分頁策略采取內存限制,因為skip過大會導致內存爆炸

解釋

MEMORY_STRICTLY

MEMORY_STRICTLY內存嚴格模式,用戶使用本屬性后將會嚴格控制查詢的聚合方式,將會采用流式聚合的迭代器模式,而不是一次性全部去除相關數據在內存中排序獲取,通過用戶配置的MaxQueryConnectionsLimit連接數來進行限制,比如MaxQueryConnectionsLimit=2,并且本次查詢涉及到一個庫3張表,因為程序只允許單次查詢能并發2個鏈接,所以本次查詢會被分成2組每組兩個,其中第二組只有一個,在這種情況下第一次并發查詢2條語句因為采用內存嚴格所以不會將數據獲取到內存,第二次在進行一次查詢并將迭代器返回一共組合成3個迭代器后續通過流式聚合+優先級隊列進行返回所要的數據,在這種情況下程序的內存是最少的但是消耗的鏈接也是最大的。當用戶手動選擇MEMORY_STRICTLY后MaxQueryConnectionsLimit將變成并行數目. 該模式下ShardingCore和ShardingSphere的處理方式類似基本一致

CONNECTION_STRICTLY

CONNECTION_STRICTLY連接數嚴格模式,用戶使用本屬性后將會嚴格控制查詢后的同一個數據庫下的同時查詢的鏈接數,不會因為使用流式內存而導致迭代器一致開著,因為一個迭代器查詢開著就意味著需要一個鏈接,如果查詢需要聚合3張表那么就需要同時開著三個鏈接來迭代保證流式聚合。通過用戶配置的MaxQueryConnectionsLimit連接數來進行限制,比如MaxQueryConnectionsLimit=2,并且本次查詢涉及到一個庫3張表,因為程序只允許單次查詢能并發2個鏈接,所以本次查詢會被分成2組每組兩個,其中第二組只有一個,在這種情況下第一次并發查詢2條語句因為采用連接數嚴格所以不會一直持有鏈接,會將鏈接結果進行每組進行合并然后將連接放回,合并時還是采用的流式聚合,會首先將第一組的兩個鏈接進行查詢之后將需要的結果通過流式聚合取到內存,然后第二組會自行獨立查詢并且從第二次開始后會將上一次迭代的內存聚合數據進行和本次查詢的流式聚合分別一起聚合,保證在分頁情況下內存數據量最少。因為如果每組都是用獨立的內存聚合那么你有n組就會有n*(skip+take)的數目,而ShardingSphere采用的是更加簡單的做法,就是將每組下面的各自節點都自行進行內存聚合,那么如果在skip(10).take(10)的情況下sql會被改寫成各組的各個節點分別進行skip(0).take(20)的操作那么2組執行器的第一組將會有40條數據第二組將會有20條數據一共會有60條數據遠遠操作了我們所需要的20條。所以在這個情況下ShardingCore第一組內存流式聚合會返回20條數據,第二組會將第一組的20條數據和第二組的進行流式聚合內存中還是只有20條數據,雖然是連接數嚴格但是也做到了最小化內存單元。當用戶手動選擇CONNECTION_STRICTLY后MaxQueryConnectionsLimit將是正則的最小化鏈接數限制

SYSTEM_AUTO

SYSTEM_AUTO系統自行選擇,這是一個非常幫的選擇,因為在這個選擇下系統會自動根據用戶配置的MaxQueryConnectionsLimit來自行控制是采用流式聚合還是內存聚合,并且因為我們采用的是同數據庫下面最小化內存相比其他的解決方案可以更加有效和高性能的來應對各種查詢。僅僅只需要配置一個最大連接數限制既可以適配好連接模式。

這邊極力推薦大家在不清楚應該用什么模式的時候使用SYSTEM_AUTO并且手動配置MaxQueryConnectionsLimit來確定各個環境下的配置一直而不是采用默認的cpu線程數。

首先我們通過每個數據庫被路由到了多少張表進行計算期望用戶在配置了xx后應該的并行數來進行分組,sqlCount :表示這個數據庫被路由到的表數目,exceptCount :表示計算出來的應該的單次查詢并行數

//代碼本質就是向上取整int exceptCount =Math.Max(0 == sqlCount % maxQueryConnectionsLimit? sqlCount / maxQueryConnectionsLimit: sqlCount / maxQueryConnectionsLimit + 1, 1);

第二次我們通過判斷sqlCount和maxQueryConnectionsLimit的大小來確定鏈接模式的選擇

private ConnectionModeEnum CalcConnectionMode(int sqlCount){switch (_shardingConfigOption.ConnectionMode){case ConnectionModeEnum.MEMORY_STRICTLY:case ConnectionModeEnum.CONNECTION_STRICTLY: return _shardingConfigOption.ConnectionMode;default:{return _shardingConfigOption.MaxQueryConnectionsLimit < sqlCount? ConnectionModeEnum.CONNECTION_STRICTLY: ConnectionModeEnum.MEMORY_STRICTLY; ;}}}

比較

針對ShardingSphere的流程圖我們可以看到在獲取普通數據的時候是沒有什么問題的,但是如果遇到分頁也就是

select * from order limit 10,10

這種情況下會被改寫成

select * from order limit 0,20

我們可以看到如果是ShardingSphere的流程模式那么在各個節點處雖然已經將連接數控制好了但是對于每個節點而言都有著20條數據,這種情況下其實是一種非常危險的,因為一旦節點過多并且limit的跳過頁數過多每個節點儲存的數據將會非常恐怖。

所以針對這種情況ShardingCore將同庫下的各個節點組的查詢使用StreamMerge而不是MemoryMerge,并且會對各個節點間建立聯系進行聚合保證在同一個數據庫下只會有20條數據被加載到內存中,大大降低了內存的使用,提高了內存使用率。

當然具體情況應該還需要再次進行優化并不是簡單的一次優化就搞定的比如當跳過的頁數過多之后其實在內存中的一部分數據也會再次進行迭代和新的迭代器比較,這個中間的性能差距可能需要不斷地嘗試才可以獲取一個比較可靠的值

總結

目前已經有很多小伙伴已經在使用SharidingCore了并且在使用的時候也是相對比較簡單的配置既可以“完美”目前她在使用的各種框架譬如:AbpVNext....基本上在繼承和使用方面可以說是目前efcore生態下最最最完美的了真正做到了三零的框架:零依賴,零學習成本,零業務代碼入侵

最后放一張圖

是我這邊給ShardingSphere提的建議,也證實了我對該聚合模型的優化是可以有效解決在分頁下面聚合各數據庫節點下的內存使用情況

分表分庫組件求贊求star

您的支持是開源作者能堅持下去的最大動力

  • Github?ShardingCore

  • Gitee?ShardingCoreShardingCore?一款ef-core下高性能、輕量級針對分表分庫讀寫分離的解決方案,具有零依賴、零學習成本、零業務代碼入侵。


    Github Source Code?助力dotnet 生態?Gitee Source Code


    介紹

    在分表分庫領域java有著很多的解決方案,尤其是客戶端解決方案(ShardingSphere),因為客戶端解決方案有著極高的性能,但是缺點也很明顯數據庫鏈接的消耗相對較高,使用語言的限制讓我們.Net望而卻步,但是哪怕是有著這些缺點其實也不足以掩蓋客戶端分表分庫帶來的便捷與高效。
    目前本人所開發的ShardingCore?是.Net下基于efcore2+的所有版本的分表分庫很多都是借鑒了ShardingSphere,并且對其很多缺點進行了彌補。這邊可能有人就要說了,你為什么做個efcore的不做個ado.net的呢,說實話我這邊確實有一個ado.net版本的分表分庫,你可以理解為ShardingSphere的.Net復刻版本sharding-conector?最最最初版本的分表聚合已經實現底層原理和ShardingSphere一致使用的Antlr4的分詞。為什么不對這個版本進行推進轉而對efcore的sharding-core版本進行升級維護呢,這邊主要有兩點,第一點如果我是在ado.net上進行的推進那么勢必可以支持更多的orm框架,但是orm框架下的很多特性將可能無法使用,并且需要維護各個數據庫版本之間的差異。比如efcore下的批量操作等一些列優化語法是很難被支持的。第二點針對某個orm的擴展性能和使用體驗上遠遠可以大于通用性組件。這就是我為什么針對ShardingCore進行有段優化和升級的原因。

    性能

    其實性能一直是大家關注的一個點,我用了ShardingCore那么針對特定的查詢他的損耗是多少是一個比較令人關注的話題。接下來我放出之前做的兩次性能比較,當然這兩次比較并不是特意準備的,是我邊開發邊跑的一個是sqlserver 一個是mysql

    性能測試

    以下所有數據均在開啟了表達式編譯緩存的情況下測試,并且電腦處于長時間未關機并且開著很多vs和idea的情況下僅供參考,所有測試都是基于ShardingCore x.3.1.63+ version

    以下所有數據均在源碼中有案例

    efcore版本均為6.0 表結構為string型id的訂單取模分成5張表

    N代表執行次數

    sql server 2012,data rows 7734363 =773w

    // * Summary *

    BenchmarkDotNet=v0.13.1, OS=Windows 10.0.18363.1500 (1909/November2019Update/19H2)
    AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores
    .NET SDK=6.0.100
    [Host] : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT
    DefaultJob : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT

    MethodNMeanErrorStdDevMedian
    NoShardingIndexFirstOrDefaultAsync102.154 ms0.1532 ms0.4443 ms1.978 ms
    ShardingIndexFirstOrDefaultAsync104.293 ms0.1521 ms0.4485 ms4.077 ms
    NoShardingNoIndexFirstOrDefaultAsync10823.382 ms16.0849 ms18.5233 ms821.221 ms
    ShardingNoIndexFirstOrDefaultAsync10892.276 ms17.8131 ms16.6623 ms894.880 ms
    NoShardingNoIndexCountAsync10830.754 ms16.5309 ms38.6405 ms821.736 ms
    ShardingNoIndexCountAsync10915.630 ms8.8511 ms7.3911 ms914.107 ms
    NoShardingNoIndexLikeToListAsync107,008.918 ms139.4664 ms166.0248 ms6,955.674 ms
    ShardingNoIndexLikeToListAsync107,044.168 ms135.3814 ms132.9626 ms7,008.057 ms
    NoShardingNoIndexToListAsync10787.129 ms10.5812 ms8.8357 ms785.798 ms
    ShardingNoIndexToListAsync10935.880 ms16.3354 ms15.2801 ms940.369 ms

    mysql 5.7,data rows 7553790=755w innerdb_buffer_size=3G

    // * Summary *

    BenchmarkDotNet=v0.13.1, OS=Windows 10.0.18363.1500 (1909/November2019Update/19H2)
    AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores
    .NET SDK=6.0.100
    [Host] : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT
    DefaultJob : .NET 6.0.0 (6.0.21.52210), X64 RyuJIT

    MethodNMeanErrorStdDevMedian
    NoShardingIndexFirstOrDefaultAsync105.020 ms0.1245 ms0.3672 ms4.855 ms
    ShardingIndexFirstOrDefaultAsync107.960 ms0.1585 ms0.2514 ms7.974 ms
    NoShardingNoIndexFirstOrDefaultAsync1011,336.083 ms623.8044 ms1,829.5103 ms11,185.590 ms
    ShardingNoIndexFirstOrDefaultAsync105,422.259 ms77.5386 ms72.5296 ms5,390.019 ms
    NoShardingNoIndexCountAsync1014,229.819 ms82.8929 ms77.5381 ms14,219.773 ms
    ShardingNoIndexCountAsync103,085.268 ms55.5942 ms49.2828 ms3,087.704 ms
    NoShardingNoIndexLikeToListAsync1027,046.390 ms71.2034 ms59.4580 ms27,052.316 ms
    ShardingNoIndexLikeToListAsync105,707.009 ms106.8713 ms99.9675 ms5,672.453 ms
    NoShardingNoIndexToListAsync1026,001.850 ms89.2787 ms69.7030 ms25,998.407 ms
    ShardingNoIndexToListAsync105,490.659 ms71.8199 ms67.1804 ms5,477.891 ms

    具體可以通過first前兩次結果來計算得出結論單次查詢的的損耗為0.2-0.3毫秒之間,通過數據聚合和數據路由的損耗單次在0.3ms-0.4ms,其中創建dbcontext為0.1毫秒目前沒有好的優化方案,0.013毫秒左右是路由表達式解析和編譯,復雜表達式可能更加耗時,剩下的0.2毫秒為數據源和表后綴的解析等操作包括實例的反射創建和數據的聚合,
    sqlserver的各項數據在分表和未分表的情況下都幾乎差不多可以得出在770w數據集情況下數據庫還并未是數據瓶頸的關鍵,但是mysql可以看到在分表和未分表的情況下如果涉及到沒有索引的全表掃描那么性能的差距將是分表后的表數目之多,測試中為5-6倍,也就是分表數目

    如果你可以接受單次查詢的損耗在0.2ms-0.3ms的那相信這款框架將會是efcore下非常完美的一款分表分庫組件


    鏈接模式

    說了這么多這邊需要針對ShardingCore在查詢下面涉及到N表查詢后帶來的鏈接消耗是一個不容小覷的客觀因素。所以這邊參考ShardingSphere進行了類似原理的實現。就是如果查詢涉及不同庫那么直接并發,如果是同庫的將根據用戶配置的單次最大鏈接進行串行查詢,并且動態選擇使用流式聚合和內存聚合。

    首先我們看下ShardingSphere的鏈接模式在限制鏈接數的情況下是如何進行處理的

    針對不同的數據庫采用并行執行,針對同一個數據庫根據用戶配置的最大連接數進行分庫串行執行,并且因為需要控制鏈接數所以會將結果集保存在內存中,最后通過合并返回給客戶端數據。
    之后我們會講這個模式的缺點并且ShardingCore是如何進行優化的

    你可能已經蒙了這么多名稱完全沒有一個概念。接下來我將一一進行講解,首先我們來看下鏈接模式下有哪些參數

    MaxQueryConnectionsLimit

    最大并發鏈接數,就是表示單次查詢sharding-core允許使用的dbconnection,默認會加上1就是說如果你配置了MaxQueryConnectionsLimit=10那么實際sharding-core會在同一次查詢中開啟11條鏈接最多,為什么是11不是10因為sharding-core會默認開啟一個鏈接用來進行空dbconnection的使用。如果不設置本參數那么默認是cpu線程數Environment.ProcessorCount

    ConnectionMode

    鏈接模式,可以由用戶自行指定,使用內存限制,和連接數限制或者系統自行選擇最優

    鏈接模式,有三個可選項,分別是:

    MEMORY_STRICTLY

    內存限制模式最小化內存聚合 流式聚合 同時會有多個鏈接

    MEMORY_STRICTLY的意思是最小化內存使用率,就是非一次性獲取所有數據然后采用流式聚合

    CONNECTION_STRICTLY

    連接數限制模式最小化并發連接數 內存聚合 連接數會有限制

    CONNECTION_STRICTLY的意思是最小化連接并發數,就是單次查詢并發連接數為設置的連接數MaxQueryConnectionsLimit。因為有限制,所以無法一直掛起多個連接,數據的合并為內存聚合采用最小化內存方式進行優化,而不是無腦使用內存聚合

    SYSTEM_AUTO

    系統自動選擇內存還是流式聚合

    系統自行選擇會根據用戶的配置采取最小化連接數,但是如果遇到分頁則會根據分頁策略采取內存限制,因為skip過大會導致內存爆炸

    解釋

    MEMORY_STRICTLY

    MEMORY_STRICTLY內存嚴格模式,用戶使用本屬性后將會嚴格控制查詢的聚合方式,將會采用流式聚合的迭代器模式,而不是一次性全部去除相關數據在內存中排序獲取,通過用戶配置的MaxQueryConnectionsLimit連接數來進行限制,比如MaxQueryConnectionsLimit=2,并且本次查詢涉及到一個庫3張表,因為程序只允許單次查詢能并發2個鏈接,所以本次查詢會被分成2組每組兩個,其中第二組只有一個,在這種情況下第一次并發查詢2條語句因為采用內存嚴格所以不會將數據獲取到內存,第二次在進行一次查詢并將迭代器返回一共組合成3個迭代器后續通過流式聚合+優先級隊列進行返回所要的數據,在這種情況下程序的內存是最少的但是消耗的鏈接也是最大的。當用戶手動選擇MEMORY_STRICTLY后MaxQueryConnectionsLimit將變成并行數目. 該模式下ShardingCore和ShardingSphere的處理方式類似基本一致

    CONNECTION_STRICTLY

    CONNECTION_STRICTLY連接數嚴格模式,用戶使用本屬性后將會嚴格控制查詢后的同一個數據庫下的同時查詢的鏈接數,不會因為使用流式內存而導致迭代器一致開著,因為一個迭代器查詢開著就意味著需要一個鏈接,如果查詢需要聚合3張表那么就需要同時開著三個鏈接來迭代保證流式聚合。通過用戶配置的MaxQueryConnectionsLimit連接數來進行限制,比如MaxQueryConnectionsLimit=2,并且本次查詢涉及到一個庫3張表,因為程序只允許單次查詢能并發2個鏈接,所以本次查詢會被分成2組每組兩個,其中第二組只有一個,在這種情況下第一次并發查詢2條語句因為采用連接數嚴格所以不會一直持有鏈接,會將鏈接結果進行每組進行合并然后將連接放回,合并時還是采用的流式聚合,會首先將第一組的兩個鏈接進行查詢之后將需要的結果通過流式聚合取到內存,然后第二組會自行獨立查詢并且從第二次開始后會將上一次迭代的內存聚合數據進行和本次查詢的流式聚合分別一起聚合,保證在分頁情況下內存數據量最少。因為如果每組都是用獨立的內存聚合那么你有n組就會有n*(skip+take)的數目,而ShardingSphere采用的是更加簡單的做法,就是將每組下面的各自節點都自行進行內存聚合,那么如果在skip(10).take(10)的情況下sql會被改寫成各組的各個節點分別進行skip(0).take(20)的操作那么2組執行器的第一組將會有40條數據第二組將會有20條數據一共會有60條數據遠遠操作了我們所需要的20條。所以在這個情況下ShardingCore第一組內存流式聚合會返回20條數據,第二組會將第一組的20條數據和第二組的進行流式聚合內存中還是只有20條數據,雖然是連接數嚴格但是也做到了最小化內存單元。當用戶手動選擇CONNECTION_STRICTLY后MaxQueryConnectionsLimit將是正則的最小化鏈接數限制

    SYSTEM_AUTO

    SYSTEM_AUTO系統自行選擇,這是一個非常幫的選擇,因為在這個選擇下系統會自動根據用戶配置的MaxQueryConnectionsLimit來自行控制是采用流式聚合還是內存聚合,并且因為我們采用的是同數據庫下面最小化內存相比其他的解決方案可以更加有效和高性能的來應對各種查詢。僅僅只需要配置一個最大連接數限制既可以適配好連接模式。

    這邊極力推薦大家在不清楚應該用什么模式的時候使用SYSTEM_AUTO并且手動配置MaxQueryConnectionsLimit來確定各個環境下的配置一直而不是采用默認的cpu線程數。

    首先我們通過每個數據庫被路由到了多少張表進行計算期望用戶在配置了xx后應該的并行數來進行分組,sqlCount :表示這個數據庫被路由到的表數目,exceptCount :表示計算出來的應該的單次查詢并行數

    //代碼本質就是向上取整int exceptCount =Math.Max(0 == sqlCount % maxQueryConnectionsLimit? sqlCount / maxQueryConnectionsLimit: sqlCount / maxQueryConnectionsLimit + 1, 1);

    第二次我們通過判斷sqlCount和maxQueryConnectionsLimit的大小來確定鏈接模式的選擇

    private ConnectionModeEnum CalcConnectionMode(int sqlCount){switch (_shardingConfigOption.ConnectionMode){case ConnectionModeEnum.MEMORY_STRICTLY:case ConnectionModeEnum.CONNECTION_STRICTLY: return _shardingConfigOption.ConnectionMode;default:{return _shardingConfigOption.MaxQueryConnectionsLimit < sqlCount? ConnectionModeEnum.CONNECTION_STRICTLY: ConnectionModeEnum.MEMORY_STRICTLY; ;}}}

    比較

    針對ShardingSphere的流程圖我們可以看到在獲取普通數據的時候是沒有什么問題的,但是如果遇到分頁也就是

    select * from order limit 10,10

    這種情況下會被改寫成

    select * from order limit 0,20

    我們可以看到如果是ShardingSphere的流程模式那么在各個節點處雖然已經將連接數控制好了但是對于每個節點而言都有著20條數據,這種情況下其實是一種非常危險的,因為一旦節點過多并且limit的跳過頁數過多每個節點儲存的數據將會非常恐怖。

    所以針對這種情況ShardingCore將同庫下的各個節點組的查詢使用StreamMerge而不是MemoryMerge,并且會對各個節點間建立聯系進行聚合保證在同一個數據庫下只會有20條數據被加載到內存中,大大降低了內存的使用,提高了內存使用率。

    當然具體情況應該還需要再次進行優化并不是簡單的一次優化就搞定的比如當跳過的頁數過多之后其實在內存中的一部分數據也會再次進行迭代和新的迭代器比較,這個中間的性能差距可能需要不斷地嘗試才可以獲取一個比較可靠的值

    總結

    目前已經有很多小伙伴已經在使用SharidingCore了并且在使用的時候也是相對比較簡單的配置既可以“完美”目前她在使用的各種框架譬如:AbpVNext....基本上在繼承和使用方面可以說是目前efcore生態下最最最完美的了真正做到了三零的框架:零依賴,零學習成本,零業務代碼入侵

    最后放一張圖

    是我這邊給ShardingSphere提的建議,也證實了我對該聚合模型的優化是可以有效解決在分頁下面聚合各數據庫節點下的內存使用情況

    分表分庫組件求贊求star

    您的支持是開源作者能堅持下去的最大動力

    • Github?ShardingCore:?https://github.com/xuejmnet/sharding-core

    • Gitee?ShardingCore:?https://gitee.com/dotnetchina/sharding-core?

總結

以上是生活随笔為你收集整理的.Net 下高性能分表分库组件-连ShardingCore接模式原理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产精品亚洲人在线观看 | 国产精品 久久 | 91丨九色丨蝌蚪丨对白 | 亚洲精品在线一区二区 | 99精品免费视频 | www.com.黄| 91视频网址入口 | www色av| 久色婷婷 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 国产免费久久av | 国产日韩精品一区二区 | 99久久超碰中文字幕伊人 | 国产一二三四在线观看视频 | 91桃色国产在线播放 | 欧美色图亚洲图片 | 天天综合网在线观看 | 久久中文欧美 | 日韩欧美视频一区二区 | 99国产情侣在线播放 | 国产精品二区在线 | 一区二区三区视频网站 | 婷婷五情天综123 | 精品国内自产拍在线观看视频 | 免费大片av| 福利电影一区二区 | 中文亚洲欧美日韩 | 一二三区视频在线 | av一区在线播放 | av天天澡天天爽天天av | 欧美色婷 | 欧美日韩在线观看一区二区 | 欧美日韩中文在线 | 欧美日韩三级 | 欧美另类xxxxx | 中文字幕欧美激情 | 日韩激情免费视频 | 亚洲精品视频在线播放 | 国产精品一区二区在线免费观看 | 精品久久一区二区三区 | 91精品国 | 高清av影院 | 亚洲天堂网在线观看视频 | 亚洲最快最全在线视频 | 国产成人精品一区二区在线观看 | 国产精品毛片一区视频播 | 欧美成人精品欧美一级乱黄 | 四虎影视精品成人 | 亚洲黄色在线观看 | 国产精品久久亚洲 | 美女福利视频一区二区 | 色偷偷97| 日本夜夜草视频网站 | 国产美女精品人人做人人爽 | 91成人精品一区在线播放69 | 国产婷婷色 | 伊人热 | 日本在线观看中文字幕 | 九九免费精品视频 | 亚洲午夜精品电影 | 五月婷婷另类国产 | av高清一区二区三区 | 免费一区在线 | 亚洲国产精品电影 | 97视频在线| 色婷婷成人网 | 亚洲欧洲xxxx | 免费av网站在线看 | 99久久精品免费看国产一区二区三区 | 丁香视频 | 久久综合精品国产一区二区三区 | 四虎影视成人精品国库在线观看 | 天天综合网入口 | 国产免费午夜 | 一区二区三区在线观看免费 | 欧美老女人xx | 亚洲天堂va | 久久精品一二区 | 国产美女免费视频 | 国产精品成人自产拍在线观看 | 久久99久久99精品免观看软件 | 免费www视频 | 精品国产一区二区三区久久久蜜臀 | 三级av免费看 | 中文在线中文a | 日韩av影视在线观看 | www.com操| 亚洲精品在线视频网站 | 91成人免费| 久久精品中文字幕少妇 | 国产黑丝一区二区 | 久久9视频 | 又黄又爽又无遮挡的视频 | 久久综合网色—综合色88 | 亚洲男男gⅴgay双龙 | 色综合狠狠干 | 天天操天天操天天操天天操 | 91视频高清免费 | 日韩二区在线 | 亚洲高清在线精品 | 亚洲精品99 | 亚洲三级在线免费观看 | 欧美亚洲精品一区 | 日批视频在线观看免费 | 亚洲a资源| 国产精品久久久久久久久久99 | 成年人免费看的视频 | 欧美日韩视频在线播放 | 国产又粗又猛又色又黄网站 | 国产精品九九九 | 欧美精品一区二区在线观看 | 在线精品亚洲一区二区 | 国产天天爽| 国产网红在线观看 | 天天干天天操 | 99精品视频一区二区 | 尤物九九久久国产精品的分类 | 99视频在线观看免费 | 麻豆影视在线播放 | 免费色视频网址 | 狠狠狠狠狠狠狠狠干 | 久久久国产精品电影 | 99r在线播放 | 国产一线天在线观看 | 精品久久久免费视频 | 婷婷国产精品 | 探花国产在线 | 色天堂在线视频 | 四虎影视成人永久免费观看亚洲欧美 | 亚洲精选久久 | 天天干天天操 | 免费三级黄色 | 国产香蕉在线 | 久久人视频 | 久久久精品 | 欧美日韩另类在线观看 | 美女网站一区 | 国产日韩av在线 | 激情综合中文娱乐网 | 成年免费在线视频 | 深夜视频久久 | 91完整版在线观看 | 999超碰| 久久avav| 麻豆va一区二区三区久久浪 | 欧美日韩国产亚洲乱码字幕 | 在线观看国产高清视频 | 99免费精品| 91在线视频免费观看 | caobi视频| 亚洲理论电影 | 中文字幕999 | 国产aa精品 | 国产99久久久国产精品 | 99色精品视频 | 亚洲一级二级 | 麻豆成人网 | 女人18毛片90分钟 | 狠狠干狠狠色 | 91中文字幕永久在线 | 五月天综合色激情 | 久久免费在线观看 | 亚洲精品九九 | 99re亚洲国产精品 | 国产免费不卡av | 久久精品成人 | 精品久久久久久久久久 | 国产精品久久久久久高潮 | www.人人草| 99亚洲视频 | 久久有精品| 成人av免费在线观看 | 国产精品1区2区在线观看 | www.久久久.com | 国内久久精品视频 | 久久久久久美女 | 精品美女国产在线 | 天天做天天爱天天综合网 | 丁香激情五月 | 91精品人成在线观看 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 五月天久久婷婷 | 欧美精品久久久久久 | 国产一级片免费视频 | 激情综合国产 | 日韩在线视频免费看 | 国产97色 | 亚洲成人欧美 | 四虎在线永久免费观看 | 亚州欧美视频 | 在线观看日本韩国电影 | 六月丁香综合网 | 国产精品久久久久一区二区 | 久久激情电影 | 国产aa精品 | 亚洲精品网站在线 | 中文字幕91视频 | 亚洲激情 欧美激情 | 在线观看mv的中文字幕网站 | 911久久香蕉国产线看观看 | 在线视频免费观看 | 四虎www| www国产亚洲精品久久麻豆 | 国产欧美精品一区aⅴ影院 99视频国产精品免费观看 | 中文字幕在线观看免费观看 | 97成人精品| 天天操狠狠干 | 日韩成人免费在线 | 99热手机在线 | 中文字幕人成不卡一区 | 国产精品一区在线 | 久久久久久美女 | 国产一区二区三区免费在线观看 | 国产69精品久久久久99尤 | 欧美一区二区在线 | 日韩欧美在线观看一区二区三区 | 在线观看完整版免费 | 免费在线色视频 | 亚洲成人999 | 尤物一区二区三区 | 国产精品激情在线观看 | 久久午夜电影网 | 国产精品日韩久久久久 | 国产亚洲综合在线 | 日韩久久久久 | 狠狠色丁香 | 激情五月婷婷 | 久久综合九色99 | 久久这里精品视频 | 日韩毛片在线播放 | 久久看片网站 | 97成人在线观看视频 | jizz18欧美18 | 四虎免费在线观看 | 久久久99精品免费观看app | 久草免费在线观看 | 久久福利小视频 | 久久久www | 欧美亚洲精品在线观看 | 成人资源在线 | 天天做天天爱夜夜爽 | 国产精品久久久久一区二区 | 免费在线激情电影 | 久草免费电影 | 黄色免费av | 天天色视频 | 男女免费视频观看 | 久久电影日韩 | 国产夫妻性生活自拍 | 日韩视频欧美视频 | 99综合电影在线视频 | www四虎影院 | 成人免费视频在线观看 | 极品久久久久 | 日韩亚洲欧美中文字幕 | 夜夜爽www | 国产精品手机在线 | 国产网红在线观看 | 1000部18岁以下禁看视频 | 国产精品影音先锋 | 欧美精品在线一区二区 | 中文字幕999 | 视频在线亚洲 | 国产精久久久久久妇女av | 亚洲欧美国产日韩在线观看 | 99精品视频免费观看视频 | 在线v| 久久国内免费视频 | 免费日韩av片 | 美女在线免费视频 | 久久久久女人精品毛片九一 | 欧美性一级观看 | 国产高清精 | 久久久性 | 亚洲国产日韩一区 | 色婷婷久久久综合中文字幕 | 最新av在线网站 | 四虎国产精品成人免费影视 | 国产黄色一级片在线 | 91精彩在线视频 | 成人免费中文字幕 | 久久免费看a级毛毛片 | 久草视频播放 | 97精品国自产拍在线观看 | 黄色成人av | 美女国产免费 | 91香蕉视频在线下载 | 久草在线精品观看 | 最近更新中文字幕 | 欧美日韩一区二区视频在线观看 | 黄色特一级 | 欧美综合在线视频 | 在线观看久草 | 欧亚久久 | 91麻豆免费看 | 成人av视屏| 精品成人在线 | 美女福利视频在线 | 国产女做a爱免费视频 | 国内精品久久久久影院日本资源 | 天天干天天操天天做 | 亚洲黄色在线免费观看 | 国产精品亚洲a | 精品一二三四在线 | 亚洲在线免费视频 | 亚洲精品国产麻豆 | 亚洲综合色婷婷 | 亚洲成av人片在线观看www | 久久亚洲视频 | 成年人在线免费看视频 | 欧美一区二区在线 | 精品国产综合区久久久久久 | 日韩中文字幕在线观看 | 日韩欧美精品一区二区三区经典 | 91免费在线看片 | 日韩毛片在线免费观看 | 天天操狠狠操 | 91在线精品秘密一区二区 | 中文字幕在线看视频 | 99r在线| 欧美亚洲久久 | 日韩精品在线免费播放 | 久久论理 | 天天操网| 毛片网在线观看 | 在线亚洲观看 | 精品自拍网 | 天天超碰 | 欧美日韩一区久久 | 日韩高清无线码2023 | 亚洲欧美怡红院 | 色姑娘综合天天 | 欧美久久久久久久久久久久 | 在线超碰av | 五月天堂色 | 激情五月五月婷婷 | 久久99中文字幕 | 黄色片毛片 | 中文日韩在线 | 97在线观看视频 | www.com.日本一级 | 六月婷色| 日韩va欧美va亚洲va久久 | 久久久久久蜜av免费网站 | 青青河边草免费 | 久久一级电影 | 国产91在线观看 | 天海翼一区二区三区免费 | 51久久成人国产精品麻豆 | 在线国产小视频 | 伊人五月 | 夜夜看av| 天天色天天操天天爽 | 亚洲国内在线 | 西西4444www大胆艺术 | 成人国产精品一区 | 成年人视频在线免费观看 | 超碰在线色 | 麻豆传媒视频在线播放 | 中文字幕av免费在线观看 | 国产精品视频最多的网站 | 午夜在线免费视频 | 精品日韩在线 | 免费在线播放黄色 | 国产精品久久久久久久久久白浆 | 免费看日韩| 婷婷六月色 | 97成人精品视频在线播放 | 久久久久久在线观看 | 久久69精品 | 国产精品淫片 | 亚洲国产精品成人综合 | 中文伊人 | 久久综合偷偷噜噜噜色 | 国产亚洲精品久久久久久无几年桃 | 五月天久久狠狠 | 亚洲成人在线免费 | 国产69久久久 | 人人看人人爱 | 免费观看全黄做爰大片国产 | 亚洲九九九在线观看 | 成人av在线网址 | 国产精品黄色在线观看 | 国产精品久久久久久吹潮天美传媒 | 日日干网址 | 日韩理论视频 | 国产一区二区电影在线观看 | 在线国产日韩 | 亚洲高清在线观看视频 | 国产精品密入口果冻 | 国产69精品久久久久99尤 | 久久成人国产精品一区二区 | 亚洲国产精品小视频 | 99国产在线观看 | 久在线| 亚洲伊人成综合网 | 日日爽| 91视视频在线直接观看在线看网页在线看 | 午夜影院日本 | 日本公妇色中文字幕 | 国产精品九色 | 91在线精品秘密一区二区 | 国产97色| 久久精品9| 在线免费看黄色 | 国产尤物视频在线 | 国产成人在线网站 | 69国产精品成人在线播放 | 青青河边草免费观看 | 久久看片网站 | 久久草精品 | 五月婷网站 | 成人中文字幕av | 久久xxxx | 五月激情丁香图片 | 久久99久久99免费视频 | 久av电影| 中文字幕在线一区观看 | 免费观看版 | 免费网站v| 日韩视频一二三区 | 日本99干网 | 99在线观看精品 | 91成人破解版 | 日韩在线观看视频免费 | 国产精品24小时在线观看 | 欧美乱码精品一区 | 丰满少妇久久久 | 99久久久久久国产精品 | 欧美性免费 | 午夜精品99久久免费 | 999成人国产 | 国产一卡久久电影永久 | 少妇精品久久久一区二区免费 | 成人黄色电影在线观看 | 免费看的黄色网 | 国产日韩欧美在线 | 久久这里只精品 | 麻豆精品传媒视频 | 精品久久久一区二区 | 中文字幕 第二区 | 97超碰影视 | 91自拍视频在线观看 | 五月婷婷一区 | 天天视频亚洲 | 国产91大片 | 500部大龄熟乱视频使用方法 | 91精品欧美一区二区三区 | 91网免费观看 | 高清日韩一区二区 | 久久综合久久综合久久综合 | 国产又粗又猛又黄又爽 | 久久天天操 | 国产高清在线免费观看 | 人人干干人人 | 色福利网| 亚洲码国产日韩欧美高潮在线播放 | 91视频大全 | 国产午夜精品福利视频 | 成人在线视频观看 | 最近2019好看的中文字幕免费 | 亚洲精品视频免费观看 | 久久久国产精品一区二区三区 | 欧美日韩一区二区视频在线观看 | 五月婷婷开心中文字幕 | 国产亚洲精品久久久久久久久久 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 91污污| 日韩中文字幕视频在线 | 亚洲国产人午在线一二区 | 亚洲精品视频在线播放 | 日韩视频在线观看免费 | 天堂av免费 | 国产破处视频在线播放 | a黄色片在线观看 | 久久综合欧美精品亚洲一区 | 五月婷婷中文字幕 | 在线观看免费成人av | 成人在线视频免费观看 | 天天射天天色天天干 | 亚洲一级片免费观看 | 成人h视频在线播放 | 免费看的国产视频网站 | 亚洲精品色视频 | 激情伊人| 日韩免费在线观看 | 2019天天干天天色 | 蜜臀久久99静品久久久久久 | www.伊人色.com | 91自拍视频在线观看 | 中文字幕亚洲国产 | 在线观看成人 | av在线免费网站 | 国内精品久久久久影院日本资源 | 四虎影视成人永久免费观看视频 | 日韩最新理论电影 | 国产精品私人影院 | 成人理论电影 | 日韩在线第一 | 久久免费黄色 | 免费福利在线观看 | 免费色视频网站 | 免费看毛片网站 | 免费黄色激情视频 | 国产麻豆精品一区二区 | 亚洲,国产成人av | 激情综合五月 | 77国产精品 | 久久综合国产伦精品免费 | 精品国产激情 | 久久这里只有精品视频99 | 国产在线国偷精品产拍免费yy | 91麻豆精品久久久久久 | 91成版人在线观看入口 | 少妇视频在线播放 | 亚洲国产偷 | 日韩a级免费视频 | 久久国产精品视频 | 日韩色在线观看 | 成人免费网视频 | 97视频网站 | 成人毛片100免费观看 | 免费在线看v | 久久这里只有精品视频99 | 六月丁香激情网 | 永久av免费在线观看 | 国产xxxx做受性欧美88 | 天天躁天天躁天天躁婷 | 免费成人av在线 | 久久久久女教师免费一区 | 亚洲精品小视频 | 91av视屏| 欧美一级性| 91精品1区2区 | 激情五月综合网 | 日本精品视频在线观看 | 亚洲va男人天堂 | 亚洲精品免费在线播放 | 亚洲欧美日韩精品久久奇米一区 | 国产真实在线 | 九九热国产视频 | 日韩在线观看a | av大全免费在线观看 | 波多野结衣视频一区二区三区 | 国内外成人在线 | 日韩精品不卡 | 狠狠干天天操 | 在线观看国产福利片 | 人人模人人爽 | 亚洲精品日韩一区二区电影 | 成人黄色毛片 | 中文字幕乱码亚洲精品一区 | 精品久久网 | 日韩av伦理片 | 4438全国亚洲精品在线观看视频 | 成人羞羞免费 | 日韩av进入 | 狠狠色狠狠色综合系列 | 国产一区在线看 | 欧美色伊人| 韩国精品福利一区二区三区 | 国产亚洲免费的视频看 | 天天干天天玩天天操 | 一区二区三区四区精品视频 | 国产免费影院 | 青草视频在线播放 | 91在线免费观看国产 | www.97视频 | 午夜一级免费电影 | 亚洲精色| 色婷婷综合久久久中文字幕 | 天天操天天射天天舔 | 国产精品久久久网站 | 免费激情在线电影 | 国产一级精品在线观看 | 人人添人人澡 | www免费看片com | 欧美一级日韩三级 | 国产精品一区免费在线观看 | 久久综合色婷婷 | 午夜久草 | 久久嗨| 天天操天天添天天吹 | 91精品国自产在线偷拍蜜桃 | 中文字幕色综合网 | 国产日韩精品一区二区 | 在线视频免费观看 | 激情视频在线高清看 | 欧美日韩一区二区三区免费视频 | 欧美成人手机版 | 国产美女精品视频免费观看 | 亚洲精品久久久久999中文字幕 | 美女网站在线看 | www蜜桃视频 | 欧美日韩国产伦理 | 中文字幕第 | 欧美日韩精品国产 | 国产黄色免费在线观看 | 97视频在线免费播放 | 成人黄色小说在线观看 | 久久精品成人欧美大片古装 | 日韩大片在线看 | 久久久精品一区二区 | 日韩婷婷 | 一区二区 不卡 | 欧美一区二区三区免费看 | 成人影视片| 日韩网站免费观看 | 超碰在线94| 亚洲午夜av | 国产男女爽爽爽免费视频 | 中文在线亚洲 | 在线观看黄网 | 91激情小视频 | 日日夜夜操av | 久操中文字幕在线观看 | 中文字幕在线乱 | 久久社区视频 | 91久久久国产精品 | 欧美精品亚洲精品日韩精品 | 久久免费观看少妇a级毛片 久久久久成人免费 | 中文在线a在线 | 国产亚洲精品久久久久久大师 | 国产精品99久久久久久宅男 | 久久开心激情 | 国产精品99精品 | 日本久久电影网 | 亚洲va男人天堂 | 久久国产精品视频免费看 | 国产精品对白一区二区三区 | 一级a性色生活片久久毛片波多野 | 一级精品视频在线观看宜春院 | 黄色中文字幕 | 色综合久久88色综合天天人守婷 | 天天色天天操综合网 | 天堂黄色片 | 色多多在线观看 | 国产欧美日韩视频 | 国产69精品久久久久9999apgf | 国产精品久久婷婷六月丁香 | 欧日韩在线视频 | 91免费的视频在线播放 | 国产伦理一区二区 | 久久在线播放 | 色网av| 国产日产精品一区二区三区四区的观看方式 | 欧美先锋影音 | 91在线产啪| bbw av| 天天插天天操天天干 | 天天操天天操天天操天天操 | 国产精品久久久久久久久久久不卡 | 中文字幕在线看视频国产中文版 | 国产精品久久久久久久久久新婚 | 久久艹在线观看 | 深夜视频久久 | 日本黄区免费视频观看 | 日韩在线视频网 | av在线短片| 日本特黄一级片 | 色综合天天 | 久久狠狠一本精品综合网 | 综合色站| 日韩欧美在线视频一区二区三区 | 91精品网站 | 99免费在线观看视频 | 永久免费的啪啪网站免费观看浪潮 | 毛片美女网站 | 欧美成人va| 美女视频黄免费 | 在线免费看片 | 国产日产在线观看 | 少妇高潮流白浆在线观看 | 免费亚洲视频在线观看 | 狠狠色丁香| 色噜噜在线观看 | 亚洲一区二区黄色 | 国产成人久久久久 | 色吧av色av | 午夜精品久久久久久久99 | 欧美在线观看视频一区二区 | 日韩精品一区二区三区在线播放 | 91亚洲国产成人久久精品网站 | 色偷偷88888欧美精品久久久 | 成年人视频在线免费 | 欧美日韩不卡一区二区三区 | 亚洲免费国产 | 中文字幕在线免费观看 | 婷婷色综合色 | 亚洲精品国内 | 天天天天天天天天操 | 激情网五月天 | 国产一区免费看 | 精品在线免费视频 | 亚洲国内精品在线 | 亚洲国产精品一区二区久久,亚洲午夜 | 九九视频在线 | 黄色片网站 | 97超碰人人看 | 国产成人福利在线观看 | 免费国产在线精品 | 9ⅰ精品久久久久久久久中文字幕 | 91视频免费播放 | 国产裸体bbb视频 | 欧美精彩视频 | 中文字幕在线看人 | 六月激情网| 日韩免费福利 | 国产精品成人国产乱 | 亚洲综合成人专区片 | 天天干天天操天天爱 | 五月婷婷激情综合 | 日本久久精品视频 | 亚洲国产视频a | 久久久久久久久综合 | 国产人成一区二区三区影院 | 日日碰狠狠躁久久躁综合网 | 在线观看av中文字幕 | 国产一级片网站 | 精品一区二区视频 | 日韩视频一 | 国产一级免费在线观看 | 久久99日韩 | 欧美一区二区三区特黄 | 婷婷综合激情 | 在线国产欧美 | 日韩精品免费一区二区三区 | 日本久久久精品视频 | 久久国产精品免费一区 | 天堂v中文 | 日韩精品亚洲专区在线观看 | 国产成人一区二区三区免费看 | 狠狠色噜噜狠狠狠狠2021天天 | 69国产成人综合久久精品欧美 | 国产99久久精品一区二区永久免费 | 五月激情久久久 | 久久久久久高潮国产精品视 | 五月婷婷激情五月 | 国产va在线 | 成年人黄色免费看 | 超碰国产在线播放 | 亚洲日本欧美在线 | 激情图片久久 | 99久热在线精品视频成人一区 | 日韩欧美精选 | 欧美日在线 | 欧美一区二区日韩一区二区 | 亚洲精品动漫成人3d无尽在线 | 亚洲国产精品电影在线观看 | 欧美片一区二区三区 | 玖玖在线视频观看 | 91九色蝌蚪视频网站 | 久久精品网站视频 | 日韩欧美视频一区 | 国产精品门事件 | 天天操天天色天天 | 国产精品久久久久久一区二区三区 | 国产少妇在线观看 | 麻豆免费视频观看 | 午夜电影av| 91成年人网站 | 丰满少妇高潮在线观看 | 欧美日韩大片在线观看 | 日韩视频欧美视频 | 午夜视频在线观看一区二区 | 四虎成人精品永久免费av | 精品一区二区在线免费观看 | 国产麻豆精品久久一二三 | 99久久精品免费看国产麻豆 | 不卡av电影在线观看 | 国产一区视频导航 | 不卡的av电影 | 99国产精品视频免费观看一公开 | 中文字幕在线一区二区三区 | av免费网页 | 日本三级不卡 | 在线免费黄网站 | av网址aaa | 久久五月天婷婷 | 成人免费视频观看 | a级国产乱理论片在线观看 特级毛片在线观看 | 干干日日 | 久久五月激情 | 狠狠色狠狠色 | 久久高清视频免费 | 色综合久久久久综合99 | 亚洲区另类春色综合小说 | 国产精品婷婷 | 中文在线 | 亚洲无人区小视频 | 一区二区不卡 | 免费网站黄色 | 欧美日韩国产精品一区二区 | 在线观看国产www | 在线观看日韩 | 日韩精品中文字幕av | 国产中文字幕大全 | 久久久久久久国产精品视频 | 亚洲精品一区二区三区在线观看 | 91在线91拍拍在线91 | 日本h视频在线观看 | www最近高清中文国语在线观看 | 成人午夜黄色 | 日日天天狠狠 | 色狠狠综合天天综合综合 | 午夜av免费观看 | 黄色av一区二区三区 | 二区视频在线观看 | 97视频在线免费播放 | 99亚洲精品在线 | 色综合久久88色综合天天免费 | 婷婷精品视频 | 伊人色综合久久天天 | 欧美日韩性 | 精品久久福利 | 九九免费在线观看视频 | 少妇bbbb搡bbbb搡bbbb | 国产99久久久国产精品免费看 | 久久99网站 | 四虎在线影视 | 精品亚洲一区二区三区 | 国产一级在线视频 | 欧美激情在线网站 | 日韩最新在线 | 91在线看黄 | 久久久免费高清视频 | 久久久久亚洲精品 | 毛片精品免费在线观看 | 日日操日日插 | 91成人免费看 | 国产成人一区二区三区在线观看 | 天天操天天是 | 久av电影 | 精品视频123区在线观看 | 国产一区二区久久久久 | 久久免费视频在线观看6 | 99久久精 | 韩国av在线| 久久久久久高潮国产精品视 | 月丁香婷婷 | 国产精品久久久久毛片大屁完整版 | 亚洲国产操 | 91网站在线视频 | 成人毛片100免费观看 | 亚洲午夜久久久久久久久电影网 | 网站在线观看你们懂的 | 亚洲精品一区二区三区四区高清 | 免费在线成人 | 久久久精品一区二区 | 欧美福利视频 | 视频一区二区精品 | 香蕉影院在线 | 久久中文字幕导航 | 99在线视频观看 | 国产在线理论片 | 中文字幕人成乱码在线观看 | 国产网站在线免费观看 | 日韩在线视频网站 | 久久久99精品免费观看 | 国产精品久久久久久久久久尿 | 日韩久久久久 | 五月开心色 | 99免费看片 | 91精品中文字幕 | 超碰97国产在线 | 久久精品一区二区 | 久久视频网 | 日韩av中文 | 91爱爱视频 | 97成人超碰 | 69xxxx欧美 | 国产成人99久久亚洲综合精品 | 夜色成人网 | 91自拍成人 | www.亚洲精品在线 | 国产五月婷婷 | 免费福利视频网站 | 成人免费毛片aaaaaa片 | 99精品视频播放 | 久久69精品| 最新av网站在线观看 | 亚洲免费婷婷 | 亚洲色图激情文学 | 亚洲永久精品在线 | 免费欧美高清视频 | 综合视频在线 | 久久第四色| 午夜精品麻豆 | 欧美日韩视频网站 | a在线观看国产 | 久久久久久综合网天天 | 精品超碰| 成人9ⅰ免费影视网站 | 国产精品久久久久久久av电影 | 91香蕉国产在线观看软件 | 国产在线色站 | 国产一区免费在线观看 | 伊在线视频| 欧美 日韩 国产 中文字幕 | 久久国产精品影片 | 日日爽天天操 | 精品免费观看视频 | 在线免费观看国产视频 | 天天干,狠狠干 | 综合久久久久久久 | 亚洲精品一区二区三区高潮 | 狠狠色丁香婷婷综合久久片 | 国产精品永久久久久久久久久 | 久久精品首页 | 免费合欢视频成人app | 亚州欧美精品 | 91亚洲国产成人久久精品网站 | 999久久久 | japanesexxxhd奶水| 97涩涩视频 | 亚洲国产精品一区二区久久hs | 精品国产一区二区三区四区vr | 97超碰国产精品 | 欧美日韩伦理在线 | 天堂激情网 | 综合成人在线 | 91在线精品观看 | 婷婷伊人综合亚洲综合网 | 中文在线字幕观看电影 | 91精品国产入口 | 免费黄色激情视频 | 中文字幕日韩在线播放 | 国产精品国产自产拍高清av | 97超碰影视 | 在线免费观看成人 | 五月天久久综合 | 国产精品欧美 | 国产尤物在线视频 | 99精品视频观看 | 天天插天天爱 | 久久成人免费视频 | 国内精品久久久久 | 久久资源总站 | 91免费网站在线观看 | 欧美日韩综合在线 | 特级西西444www高清大视频 | 欧美一级电影在线观看 | 久久久久综合视频 | 日韩视频在线不卡 | 日日骑| 久久久久久久久久久综合 | 亚洲国产操 | 国产视频精品视频 | 又黄又刺激又爽的视频 | 久久久www成人免费精品张筱雨 | 欧美精品一区在线 | 天天曰天天射 | 日韩高清激情 | 成人午夜性影院 | 国产精品午夜在线 | 免费碰碰 | 久久久久激情视频 | 免费看久久| 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 中国一区二区视频 | 99在线免费观看视频 | 波多野结衣视频在线 | 天天干,天天射,天天操,天天摸 | 欧美天天综合网 | 4p变态网欧美系列 | 久久激情五月丁香伊人 | 五月综合激情婷婷 | 亚州精品成人 | 视频一区在线播放 | 97在线免费 | 国产大陆亚洲精品国产 | 91黄色小网站 | 手机看片国产 | 午夜精品一区二区三区免费视频 | 日韩av在线网站 | 成人久久久精品国产乱码一区二区 | 精品国产免费一区二区三区五区 | 福利av影院 | 国产色婷婷精品综合在线手机播放 | 在线成人观看 | 天堂网中文在线 | 狠狠艹夜夜干 | 亚洲精品在线观看免费 | 国产精品一区二区果冻传媒 | 亚洲欧美日韩精品久久奇米一区 | 欧美日在线观看 | 久久综合久久88 | 91超碰在线播放 | 国产在线久草 | 黄色毛片观看 | 二区三区av | 青青草在久久免费久久免费 | 91色亚洲| 91色在线观看视频 | 91在线91拍拍在线91 | 亚洲一区精品二人人爽久久 | 激情婷婷色 | 久草资源在线 |