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

分布式程序員必讀:你與分布式和事務真的很熟嗎?

云計算 分布式 分布式
本文略長,讀者需要有一定耐心,如果你是高級碼農或者架構師級別,你可以跳過。本文注重實戰或者實現,不涉及CAP,略提ACID。本文適合基礎分布式程序員。由于分布式這個話題太大,事務這個話題也太大,讓我們從一個集群的一個小小節點開始談起。

微吐槽

hello,world.

不想了,我等碼農,還是看看怎么來處理分布式系統中的事務這個老大難吧!

  • 本文略長,讀者需要有一定耐心,如果你是高級碼農或者架構師級別,你可以跳過。
  • 本文注重實戰或者實現,不涉及CAP,略提ACID。
  • 本文適合基礎分布式程序員:
  1. 本文會涉及集群中節點的failover和recover問題.
  2. 本文會涉及事務及不透明事務的問題.
  3. 本文會提到微博和tweeter,并引出一個大數據問題.

由于分布式這個話題太大,事務這個話題也太大,我們從一個集群的一個小小節點開始談起。

集群中存活的節點與同步

分布式系統中,如何判斷一個節點(node)是否存活?

kafka這樣認為:

  1. 此節點和zookeeper能喊話.(Keep sessions with zookeeper through heartbeats.)
  2. 此節點如果是個從節點,必須能夠盡可能忠實地反映主節點的數據變化。

也就是說,必須能夠在主節點寫了新數據后,及時復制這些變化的數據,所謂及時,不能拉下太多哦.

那么,符合上面兩個條件的節點就可以認為是存活的,也可以認為是同步的(in-sync).

關于第1點,大家對心跳都很熟悉,那么我們可以這樣認為某個節點不能和zookeeper喊話了:

 

  1. zookeeper-node: 
  2. var timer =  
  3. new timer() 
  4. .setInterval(10sec) 
  5. .onTime(slave-nodes,function(slave-nodes){ 
  6.     slave-nodes.forEach( node -> { 
  7.         boolean isAlive = node.heartbeatACK(15sec); 
  8.         if(!isAlive) { 
  9.             node.numNotAlive += 1
  10.             if(node.numNotAlive >= 3) { 
  11.                 node.declareDeadOrFailed(); 
  12.                 slave-nodes.remove(node); 
  13.                  
  14.                 //回調也可 leader-node-app.notifyNodeDeadOrFailed(node) 
  15.                  
  16.             } 
  17.         }else  
  18.         node.numNotAlive = 0
  19.     }); 
  20. }); 
  21.  
  22. timer.run(); 
  23.  
  24. //你可以回調也可以像下面這樣簡單的計時判斷 
  25. leader-node-app: 
  26. var timer =  
  27. new timer() 
  28. .setInterval(10sec) 
  29. .onTime(slave-nodes,function(slave-nodes){ 
  30.     slave-nodes.forEach(node -> { 
  31.         if(node.isDeadOrFailed) { 
  32.  
  33.         //node不能和zookeeper喊話了 
  34.              
  35.         } 
  36.     }); 
  37. }); 
  38.  
  39. timer.run(); 

 

關于第二點,要稍微復雜點了,怎么搞呢?

來這么分析:

  • 數據 messages.
  • 操作 op-log.
  • 偏移 position/offset.

 

  1. // 1. 先考慮messages 
  2. // 2. 再考慮log的postion或者offset 
  3. // 3. 考慮msg和off都記錄在同源數據庫或者存儲設備上.(database or storage-device.) 
  4. var timer =  
  5. new timer() 
  6. .setInterval(10sec) 
  7. .onTime(slave-nodes,function(nodes){ 
  8.     var core-of-cpu = 8
  9.     //嫌慢就并發唄 mod hash go! 
  10.     nodes.groupParallel(core-of-cpu) 
  11.     .forEach(node -> { 
  12.         boolean nodeSucked = false
  13.  
  14.         if(node.ackTimeDiff > 30sec) { 
  15.             //30秒內沒有回復,node卡住了 
  16.             nodeSucked = true
  17.         } 
  18.         if(node.logOffsetDiff > 100) { 
  19.             //node復制跟不上了,差距超過100條數據 
  20.             nodeSucked = true
  21.         } 
  22.  
  23.         if(nodeSucked) { 
  24.             //總之node“死”掉了,其實到底死沒死,誰知道呢?network-error在分布式系統中或者節點失敗這個事情是正常現象. 
  25.             node.declareDeadOrFailed(); 
  26.             //不和你玩啦,集群不要你了 
  27.             nodes.remove(node); 
  28.             //該怎么處理呢,拋個事件吧. 
  29.             fire-event-NodeDeadOrFailed(node); 
  30.         } 
  31.     }); 
  32. }); 
  33.  
  34. timer.run(); 

 

上面的節點的狀態管理一般由zookeeper來做,leader或者master節點也會維護那么點狀態。

那么應用中的leader或者master節點,只需要從zookeeper拉狀態就可以,同時,上面的實現是不是一定最佳呢?不是的,而且多數操作可以合起來,但為了描述節點是否存活這個事兒,咱們這么寫沒啥問題。

#p#

節點死掉、失敗、不同步了,咋處理呢?

好嘛,終于說到failover和recover了,那failover比較簡單,因為還有其它的slave節點在,不影響數據讀取。

  1. 同時多個slave節點失敗了?沒有100%的可用性.數據中心和機房癱瘓、網絡電纜切斷、hacker入侵刪了你的根,總之你rp爆表了.
  2. 如果主節點失敗了,那master-master不行嘛?keep-alived或者LVS或者你自己寫failover吧.高可用架構(HA)又是個大件兒了,此文不展開了。

我們來關注下recover方面的東西,這里把視野打開點,不僅關注slave節點重啟后追log來同步數據,我們看下在實際應用中,數據請求(包括讀、寫、更新)失敗怎么辦?

大家可能都會說,重試(retry)唄、重放(replay)唄或者干脆不管了唄!

行,都行,這些都是策略,但具體怎么個搞法,你真的清楚了?

一個bigdata問題

我們先擺個探討的背景:

問題:消息流,比如微博的微博(真繞),源源不斷地流進我們的應用中,要處理這些消息,有個需求是這樣的:

Reach is the number of unique people exposed to a URL on Twitter.

那么,統計一下3小時內的本條微博(url)的reach總數。

怎么解決呢?

  把某時間段內轉發過某條微博(url)的人拉出來,把這些人的粉絲拉出來,去掉重復的人,然后求總數,就是要求的reach.

為了簡單,我們忽略掉日期,先看看這個方法行不行:

 

  1. /** --------------------------------- 
  2. * 1. 求出轉發微博(url)的大V.  
  3. * __________________________________*/ 
  4.  
  5. 方法 :getUrlToTweetersMap(String url_id) 
  6.  
  7. SQL : /* 數據庫A,表url_user存儲了轉發某url的user */ 
  8. SELECT url_user.user_id as tweeter_id 
  9. FROM url_user 
  10. WHERE url_user.url_id = ${url_id} 
  11.  
  12. 返回 :[user_1,...,user_m] 

 

 

  1. /** --------------------------------- 
  2. * 2. 求出大V的粉絲  
  3. * __________________________________*/ 
  4.  
  5. 方法 : getFollowers(String tweeter_id); 
  6.  
  7. SQL :   /* 數據庫B */ 
  8. SELECT users.id as user_id 
  9. FROM users 
  10. WHERE users.followee_id = ${tweeter_id} 
  11.  
  12. 返回:tweeter的粉絲 

 

 

  1. /** --------------------------------- 
  2. * 3. 求出Reach 
  3. * __________________________________*/ 
  4.  
  5. var url = queryArgs.getUrl(); 
  6. var tweeters = getUrlToTweetersMap(); 
  7. var result = new HashMap<String,Integer>(); 
  8. tweeters.forEach(t -> { 
  9.     // 你可以批量in + 并發讀來優化下面方法的性能 
  10.     var followers = getFollowers(t.tweeter_id); 
  11.  
  12.     followers.forEach(f -> { 
  13.         //hash去重 
  14.         result.put(f.user_id,1); 
  15.     }); 
  16. }); 
  17.  
  18. //Reach 
  19. return result.size(); 

 

頂呱呱,無論如何,求出了Reach啊!

#p#

其實這又引出了一個很重要的問題,也是很多大談框架、設計、模式卻往往忽視的問題:性能和數據庫建模的關系。

1.數據量有多大?

不知道讀者有木有對這個問題的數據庫I/O有點想法,或者虎軀一震呢?

Computing reach is too intense for a single machine – it can require thousands of database calls and tens of millions of tuples.

在上面的數據庫設計中避免了JOIN,為了提高求大V粉絲的性能,可以將一批大V作為batch/bulk,然后多個batch并發讀,誓死搞死數據庫。

這里將微博到轉發者表所在的庫,與粉絲庫分離,如果數據更大怎么辦?

庫再分表...

OK,假設你已經非常熟悉傳統關系型數據庫的分庫分表及數據路由(讀路徑的聚合、寫路徑的分發)、或者你對于sharding技術也很熟悉、或者你良好的結合了HBase的橫向擴展能力并有一致性策略來解決其二級索引問題.

總之,存儲和讀取的問題假設你已經解決了,那么分布式計算呢?

2.微博這種應用,人與人之間的關系成圖狀(網),你怎么建模存儲?而不僅僅對應這個問題,比如:

某人的好友的好友可能和某人有幾分相熟?

看看用storm怎么來解決分布式計算,并提供流式計算的能力:

 

  1. // url到大V -> 數據庫1 
  2. TridentState urlToTweeters = 
  3.     topology.newStaticState(getUrlToTweetersState()); 
  4. // 大V到粉絲 -> 數據庫2 
  5. TridentState tweetersToFollowers = 
  6.     topology.newStaticState(getTweeterToFollowersState()); 
  7.  
  8. topology.newDRPCStream("reach"
  9.     .stateQuery(urlToTweeters, new Fields("args"), new MapGet(), new Fields("tweeters")) 
  10.     .each(new Fields("tweeters"), new ExpandList(), new Fields("tweeter")) 
  11.     .shuffle() /* 大V的粉絲很多,所以需要分布式處理*/ 
  12.     .stateQuery(tweetersToFollowers, new Fields("tweeter"), new MapGet(), new Fields("followers")) 
  13.     .parallelismHint(200/* 粉絲很多,所以需要高并發 */  
  14.     .each(new Fields("followers"), new ExpandList(), new Fields("follower")) 
  15.     .groupBy(new Fields("follower")) 
  16.     .aggregate(new One(), new Fields("one")) /* 去重 */ 
  17.     .parallelismHint(20
  18.     .aggregate(new Count(), new Fields("reach")); /* 計算reach數 */ 

 

最多處理一次(At most once)

回到主題,引出上面的例子,一是為了引出一個有關分布式(存儲+計算)的問題,二是透漏這么點意思:

碼農,就應該關注設計和實現的東西,比如Jay Kreps是如何發明Kafka這個輪子的 : ]

如果你還是碼農級別,咱來務點實吧,前面我們說到recover,節點恢復的問題,那么我們恢復幾個東西?

基本的:

  • 節點狀態
  • 節點數據

本篇從數據上來討論下這個問題,為使問題再簡單點,我們考慮寫數據的場景,如果我們用write-ahead-log的方式來保證數據復制和一致性,那么我們會怎么處理一致性問題呢?

主節點有新數據寫入.

從節點追log,準備復制這批新數據。從節點做兩件事:

(1). 把數據的id偏移寫入log;

(2). 正要處理數據本身,從節點掛了。

那么根據上文的節點存活條件,這個從節點掛了這件事被探測到了,從節點由維護人員手動或者其自己恢復了,那么在加入集群和小伙伴們繼續玩耍之前,它要同步自己的狀態和數據。

問題來了:

如果根據log內的數據偏移來同步數據,那么,因為這個節點在處理數據之前就把偏移寫好了,可是那批數據lost-datas沒有得到處理,如果追log之后的數據來同步,那么那批數據lost-datas就丟了。

在這種情況下,就叫作數據最多處理一次,也就是說數據會丟失。

最少處理一次(At least once)

好吧,丟失數據不能容忍,那么我們換種方式來處理:

1.主節點有新數據寫入.

2.從節點追log,準備復制這批新數據。從節點做兩件事:

(1). 先處理數據;

(2). 正要把數據的id偏移寫入log,從節點掛了。

問題又來了:

如果從節點追log來同步數據,那么因為那批數據duplicated-datas被處理過了,而數據偏移沒有反映到log中,如果這樣追,會導致這批數據重復。

這種場景,從語義上來講,就是數據最少處理一次,意味著數據處理會重復。

#p#

僅處理一次(Exactly once)

Transaction

好吧,數據重復也不能容忍?要求挺高啊。

大家都追求的強一致性保證(這里是最終一致性),怎么來搞呢?

換句話說,在更新數據的時候,事務能力如何保障呢?

假設一批數據如下:

// 新到數據 { 	transactionId:4 	urlId:99 	reach:5 }

現在要更新這批數據到庫里或者log里,那么原來的情況是:

 

// 老數據
{
	transactionId:3
	urlId:99
	reach:3
}

 

如果說可以保證如下三點:

事務ID的生成是強有序的.(隔離性,串行)

同一個事務ID對應的一批數據相同.(冪等性,多次操作一個結果)

單條數據會且僅會出現在某批數據中.(一致性,無遺漏無重復)

那么,放心大膽的更新好了:

 

// 更新后數據
{
	transactionId:4
	urlId:99
	//3 + 5 = 8
	reach:8
}

 

注意到這個更新是ID偏移和數據一起更新的,那么這個操作靠什么來保證:原子性
你的數據庫不提供原子性?后文略有提及。

這里是更新成功了。如果更新的時候,節點掛了,那么庫里或者log里的id偏移不寫,數據也不處理,等節點恢復,就可以放心去同步,然后加入集群玩耍了。

所以說,要保證數據僅處理一次,還是挺困難的吧?

上面的保障“僅處理一次”這個語義的實現有什么問題呢?

性能問題。

這里已經使用了batch策略來減少到庫或磁盤的Round-Trip Time,那么這里的性能問題是什么呢?

考慮一下,采用master-master架構來保證主節點的可用性,但是一個主節點失敗了,到另一個主節點主持工作,是需要時間的。

假設從節點正在同步,啪!主節點掛了!因為要保證僅處理一次的語義,所以原子性發揮作用,失敗,回滾,然后從主節點拉失敗的數據(你不能就近更新,因為這批數據可能已經變化了,或者你根本沒緩存本批數據),結果是什么呢?

老主節點掛了, 新的主節點還沒啟動,所以這次事務就卡在這里,直到數據同步的源——主節點可以響應請求。

如果不考慮性能,就此作罷,這也不是什么大事。

你似乎意猶未盡?來吧,看看“銀彈”是什么?

Opaque-Transaction

現在,我們來追求這樣一種效果:

某條數據在一批數據中(這批數據對應著一個事務),很可能會失敗,但是它會在另一批數據中成功。

換句話說,一批數據的事務ID一定相同。

來看看例子吧,老數據不變,只是多了個字段:prevReach。

 

// 老數據
{
	transactionId:3
	urlId:99
	//注意這里多了個字段,表示之前的reach的值
	prevReach:2
	reach:3
}


// 新到數據
{
	transactionId:4
	urlId:99
	reach:5
}

 

這種情況,新事務的ID更大、更靠后,表明新事務可以執行,還等什么,直接更新,更新后數據如下:

 

// 新到數據
{
	transactionId:4
	urlId:99
	//注意這里更新為之前的值
	prevReach:3
	//3 + 5 = 8
	reach:8
}

 

現在來看下另外的情況:

 

// 老數據
{
	transactionId:3
	urlId:99
	prevReach:2
	reach:3
}

// 新到數據
{
	//注意事務ID為3,和老數據中的事務ID相同
	transactionId:3
	urlId:99
	reach:5
}

 

這種情況怎么處理?是跳過嗎?因為新數據的事務ID和庫里或者log里的事務ID相同,按事務要求這次數據應該已經處理過了,跳過?

#p#

不,這種事不能靠猜的,想想我們有的幾個性質,其中關鍵一點就是:

給定一批數據,它們所屬的事務ID相同。

仔細體會下,上面那句話和下面這句話的差別:

給定一個事務ID,任何時候,其所關聯的那批數據相同。

我們應該這么做,考慮到新到數據的事務ID和存儲中的事務ID一致,所以這批數據可能被分別或者異步處理了,但是,這批數據對應的事務ID永遠是同一個,那么,即使這批數據中的A部分先處理了,由于大家都是一個事務ID,那么A部分的前值是可靠的。

所以,我們將依靠prevReach而不是Reach的值來更新:

 

// 更新后數據
{
	transactionId:3
	urlId:99
	//這個值不變
	prevReach:2
	//2 + 5 = 7
	reach:7
}

 

你發現了什么呢?

不同的事務ID,導致了不同的值:

當事務ID為4,大于存儲中的事務ID3,Reach更新為3+5 = 8.

當事務ID為3,等于存儲中的事務ID3,Reach更新為2+5 = 7.

這就是Opaque Transaction.

這種事務能力是最強的了,可以保證事務異步提交。所以不用擔心被卡住了,如果說集群中:

Transaction:

  • 數據是分批處理的,每個事務ID對應一批確定、相同的數據.
  • 保證事務ID的產生是強有序的.
  • 保證分批的數據不重復、不遺漏.
  • 如果事務失敗,數據源丟失,那么后續事務就卡住直到數據源恢復.

Opaque-Transaction:

  1. 數據是分批處理的,每批數據有確定而唯一的事務ID.
  2. 保證事務ID的產生是強有序的.
  3. 保證分批的數據不重復、不遺漏.
  4. 如果事務失敗,數據源丟失,不影響后續事務,除非后續事務的數據源也丟了.

其實這個全局ID的設計也是門藝術:

  • 冗余關聯表的ID,以減少join,做到O(1)取ID.
  • 冗余日期(long型)字段,以避免order by.
  • 冗余過濾字段,以避免無二級索引(HBase)的尷尬.
  • 存儲mod-hash的值,以方便分庫、分表后,應用層的數據路由書寫.

這個內容也太多,話題也太大,就不在此展開了。

你現在知道twitter的snowflake生成全局唯一且有序的ID的重要性了。

兩階段提交

現在用zookeeper來做兩階段提交已經是入門級技術,所以也不展開了。

如果你的數據庫不支持原子操作,那么考慮兩階段提交吧。

To be continued.

博文出處:http://www.cnblogs.com/foreach-break/p/distributed_system_and_transaction.html
 

責任編輯:Ophira 來源: 博客園
相關推薦

2016-11-02 12:06:27

分布式系統大數據

2022-06-21 08:27:22

Seata分布式事務

2020-04-20 19:00:30

程序員分布式事務架構

2022-06-27 08:21:05

Seata分布式事務微服務

2019-10-10 09:16:34

Zookeeper架構分布式

2017-07-26 15:08:05

大數據分布式事務

2022-01-26 13:46:40

分布式事務集合,這

2021-03-03 08:13:23

程序員分布式網絡

2021-03-02 08:31:18

分布式web 應用數據存儲

2009-06-19 15:28:31

JDBC分布式事務

2021-09-29 09:07:37

分布式架構系統

2009-09-18 15:10:13

分布式事務LINQ TO SQL

2018-05-24 08:37:30

2024-01-05 07:28:50

分布式事務框架

2019-11-19 08:47:45

Zookeeper分布式事務

2019-06-19 15:40:06

分布式鎖RedisJava

2023-05-29 14:07:00

Zuul網關系統

2017-09-01 05:35:58

分布式計算存儲

2019-06-26 09:41:44

分布式事務微服務

2022-03-24 07:51:27

seata分布式事務Java
點贊
收藏

51CTO技術棧公眾號

久久99九九99精品| 手机在线一区二区三区| 狠狠做深爱婷婷久久综合一区| 精品国产乱码久久久久久丨区2区 精品国产乱码久久久久久蜜柚 | 亚洲精品555| 亚洲精品久久久久久国产精华液| 狠狠色噜噜狠狠色综合久| 成年人视频免费| 亚洲美女视频| 精品亚洲男同gayvideo网站| 亚洲综合av在线播放| 女囚岛在线观看| 久久综合色综合88| 亚洲japanese制服美女| www.com国产| 一二三区不卡| 国产亚洲精品久久久久久| 特黄特黄一级片| 深夜视频一区二区| 亚洲国产另类精品专区| 亚洲一区二区三区精品动漫| 人妻无码中文字幕免费视频蜜桃| 日韩二区三区在线观看| 久久久久久久久91| 波兰性xxxxx极品hd| 亚洲v天堂v手机在线| 欧美一级免费大片| 五月婷婷激情久久| 婷婷电影在线观看| 一区二区三区四区五区视频在线观看| 欧美一进一出视频| 色欲av永久无码精品无码蜜桃| 极品少妇xxxx偷拍精品少妇| 国产成人亚洲精品| 国产精品suv一区二区三区| 欧美激情第10页| 日韩在线欧美在线国产在线| 亚洲一区二区自偷自拍| 欧美aaaaaaaa牛牛影院| 日韩欧美国产一二三区| 亚洲色图偷拍视频| 欧美日韩五区| 色国产精品一区在线观看| www.日本少妇| 伊人在我在线看导航| 日本一区二区成人| 你懂的视频在线一区二区| 日韩一卡二卡在线| 国产成人精品一区二| 成人羞羞国产免费| 亚洲最大成人在线视频| 蜜臀av一区二区在线观看| 国产成人午夜视频网址| 天天操天天干天天摸| 久久精品麻豆| 日本a级片电影一区二区| 日韩av大片在线观看| 国产欧美在线| 欧美一级片久久久久久久| 国产情侣在线视频| 99国产精品| 91成人福利在线| 中文字幕在线观看视频网站| 国产精品久久久久久久免费软件 | 性高爱久久久久久久久| 色一情一乱一乱一91av| 日韩毛片在线免费看| 成人免费看黄| 在线亚洲一区二区| 午夜国产一区二区三区| 亚洲成a人片777777久久| 欧美裸体一区二区三区| 日韩av一卡二卡三卡| 国产美女精品视频免费播放软件| 日韩午夜激情视频| av在线天堂网| 青青一区二区| 亚洲深夜福利在线| 日韩免费av一区| 国内自拍视频一区二区三区| 992tv成人免费影院| 国产免费av一区| 久久综合网络一区二区| 国产在线拍揄自揄视频不卡99 | 91在线亚洲| 欧美日韩一区成人| 日本网站在线看| 久久中文字幕导航| 一本大道亚洲视频| 丁香花五月激情| 一本色道88久久加勒比精品| 国产精品成人播放| av加勒比在线| 久久久精品影视| 中国成人亚色综合网站| av手机在线观看| 欧美专区在线观看一区| 欧美熟妇另类久久久久久多毛| 欧美久久香蕉| 欧美 另类 交| 欧美一级特黄高清视频| 天天操综合网| 91po在线观看91精品国产性色| 91午夜精品亚洲一区二区三区| 久久精品99国产国产精| 国产精品乱码一区二区三区| 久草在现在线| 亚洲精品乱码久久久久久久久 | eeuss影院www在线观看| 亚洲人成网站色在线观看| 无码人妻丰满熟妇区96| 免费成人黄色网| 亚洲精品福利资源站| 开心激情五月网| 久久麻豆精品| 日韩在线一区二区三区| 国产精品久久久久久久久| 国产特级黄色片| 久久久久久综合| 久久久国内精品| 666av成人影院在线观看| 日韩精品资源二区在线| 奇米网一区二区| 亚洲免费网站| 国产精品视频在线免费观看| 日本高清视频在线观看| 色域天天综合网| 国产又粗又长又爽| 欧美激情第10页| 国产乱人伦真实精品视频| 亚洲日本在线播放| 亚洲一区在线免费观看| 国产aⅴ爽av久久久久| 丝袜久久网站| 久久免费视频这里只有精品| 国产人妻精品一区二区三区| 欧美国产精品一区二区| www.玖玖玖| 猫咪成人在线观看| 久久久久免费精品国产| 精品人妻一区二区三区四区不卡 | 这里只有精品免费| 色噜噜日韩精品欧美一区二区| 精品91在线| 97久草视频| 欧洲性视频在线播放| 欧美一区二区三区四区高清| 永久免费看片直接| 久久精品国产精品青草| 日韩av图片| 写真福利精品福利在线观看| 国产一区二区三区欧美| 亚洲午夜无码久久久久| 亚洲国产精品精华液2区45| 色诱视频在线观看| 综合亚洲色图| 国产成人鲁鲁免费视频a| 都市激情在线视频| 欧美午夜精品一区| 熟女av一区二区| 国内精品写真在线观看| 欧美性受xxxx黑人猛交88| 国产亚洲观看| 欧美激情小视频| 午夜视频福利在线| 自拍视频在线免费观看| 欧美三级免费观看| www.狠狠爱| 免费在线观看成人| 最新欧美日韩亚洲| 亚洲**毛片| 69精品小视频| 成年人视频在线看| 在线播放亚洲一区| 免费在线视频一区二区| 99久久99久久精品国产片果冻| 男女av免费观看| 日本女优一区| 91免费看网站| 亚洲性色av| 日韩一区二区av| 欧美特黄一级视频| 色视频成人在线观看免| 中国美女黄色一级片| 国产老女人精品毛片久久| 性欧美大战久久久久久久| 国产一区二区三区探花| 亚洲精品免费在线视频| 人成在线免费网站| 色噜噜国产精品视频一区二区| www.综合色| 福利精品视频在线| 青青草华人在线视频| 国产xxx精品视频大全| 精品人妻一区二区三区四区在线| 日韩欧美在线中字| 国产免费一区二区| 日本不卡一二三| 欧美猛交免费看| 第一视频专区在线| 精品国产露脸精彩对白| 波多野结衣午夜| 亚洲丰满少妇videoshd| 怡红院一区二区三区| 丁香激情综合五月| 99热这里只有精品在线播放| 亚洲人体偷拍| 免费观看中文字幕| 精品国产乱码| 精品日产一区2区三区黄免费 | 国产一区自拍视频| 国产成人毛片| 2019中文字幕全在线观看| 国产1区在线| 色偷偷偷综合中文字幕;dd| 亚洲人妻一区二区三区| 日韩一级完整毛片| 一级黄色片免费| 欧美性xxxx极品hd满灌| 久久久久久久久久99| 国产精品久久久久一区二区三区| 韩国无码一区二区三区精品| 国产成人精品www牛牛影视| www.色欧美| 蜜桃av一区二区三区电影| 欧美在线观看www| 黄色亚洲大片免费在线观看| 99热都是精品| 99久久精品费精品国产风间由美| 日韩电影天堂视频一区二区| 日韩av三区| 国产精品一区二区三区免费| 999国产精品一区| 亚洲a∨日韩av高清在线观看| 福利一区二区| 国产精品精品久久久久久| 亚洲精品永久免费视频| 91sa在线看| 午夜伦理福利在线| 97国产精品人人爽人人做| 色爱综合区网| 欧美日韩国产999| av网址在线| 大胆欧美人体视频| 成人在线观看亚洲| 欧美成人激情在线| 亚洲精品天堂| 欧美激情一区二区三区久久久| 羞羞网站在线看| 欧美精品在线观看| 欧美xxxx少妇| 97免费视频在线播放| 成年男女免费视频网站不卡| 88国产精品欧美一区二区三区| av资源新版天堂在线| 97超级碰碰碰| 天天免费亚洲黑人免费| 国产91精品最新在线播放| 朝桐光一区二区| 国产精品视频免费观看www| 日韩成人精品一区二区三区| 91精品久久久久久久久久 | 欧美日韩一区在线观看| 伊人精品在线视频| 91精品国产麻豆国产自产在线| 性一交一乱一乱一视频| 亚洲国产毛片完整版| 外国精品视频在线观看 | 日韩亚洲欧美成人一区| 国产黄色av片| 日韩av在线免费播放| 黄色软件在线观看| 久久香蕉频线观| heyzo高清在线| 国产91在线播放九色快色| 97色婷婷成人综合在线观看| 国产69精品久久久久9999apgf| 台湾色综合娱乐中文网| 亚洲精品久久区二区三区蜜桃臀 | 男人透女人免费视频| 紧缚奴在线一区二区三区| 四虎永久免费观看| 久久久精品影视| 人妻久久一区二区| 黑人极品videos精品欧美裸| 中文字幕第三页| 欧美大片免费久久精品三p | 国产三级精品在线| 精品国产视频一区二区三区| 欧美日韩精品在线视频| 中文字幕久久熟女蜜桃| 精品国产一区二区三区av性色| 美女毛片在线看| 免费99精品国产自在在线| 色戒汤唯在线观看| 国产日韩欧美一二三区| 另类在线视频| 午夜啪啪免费视频| 国产亚洲在线观看| 99视频在线观看视频| 久久综合国产精品| 麻豆国产尤物av尤物在线观看| 91久久人澡人人添人人爽欧美| 亚洲精品一区二区三区区别| 一区二区三区高清国产| 成人影院在线视频| 成人做爰www免费看视频网站| 夜色77av精品影院| 黄色一级大片免费| 麻豆成人免费电影| 无码h肉动漫在线观看| 夜夜精品视频一区二区 | wwwav国产| 在线一区二区观看| 日本又骚又刺激的视频在线观看| 久久国产精品99国产精| 国产精品亚洲d| 久久精品日韩| 黄色日韩在线| 国产精品19p| √…a在线天堂一区| 欧美一级黄视频| 国产丝袜一区视频在线观看| 欧美videos另类精品| 国产精品综合网站| 国产99久久| 日韩欧美国产免费| 成人av综合一区| 免费一级肉体全黄毛片| 欧美一区二区在线视频| 色欧美激情视频在线| 国产精品高潮粉嫩av| 欧美男男gaytwinkfreevideos| 777久久久精品一区二区三区| av中文字幕不卡| 国产在线视频第一页| 日韩免费成人网| 污片视频在线免费观看| 91福利视频导航| 亚洲欧洲日韩| 色婷婷激情视频| 亚洲色图丝袜美腿| 国产精品无码AV| 久久久av亚洲男天堂| 成人在线日韩| 欧美交换配乱吟粗大25p| 国产精品一区二区久久不卡| 久久中文免费视频| 欧美一级黄色录像| 亚洲羞羞网站| 精品免费国产| 天堂资源在线中文精品| 久久久久无码精品国产sm果冻 | 亚洲精品免费在线播放| 一区二区三区精| 麻豆乱码国产一区二区三区| 精品中文字幕一区二区三区四区| 精品一区二区成人免费视频| 国产一区二区三区免费看| 久久久91视频| 亚洲精品久久久久久久久久久久| 新版的欧美在线视频| 日本一区二区三区精品视频| 蜜桃久久久久久| 日韩黄色免费观看| 亚洲精品98久久久久久中文字幕| 色在线免费观看| 日韩aⅴ视频一区二区三区| 欧美aa在线视频| 日本青青草视频| 日韩精品中文字幕在线| 日韩电影免费观看高清完整版| 亚洲国产成人不卡| 国产精品一区在线| 天天操天天射天天爽| 亚洲欧美另类人妖| 色8久久久久| 精品丰满人妻无套内射| 久久久久久影视| av网站在线免费看| 欧美亚洲成人免费| 欧美3p在线观看| 91精品国产高清91久久久久久| 懂色aⅴ精品一区二区三区蜜月| 国产精品秘入口| 97超碰人人模人人爽人人看| 久久午夜激情| 国产一区二区三区在线视频观看| 日韩h在线观看| av一级久久| 亚洲熟女乱色一区二区三区| 一区精品在线播放| 天堂在线资源8| 成人av资源在线播放| 一本一本久久| www.超碰在线观看| 亚洲欧美自拍一区| 成功精品影院| 亚洲免费成人在线视频| 色综合久久中文综合久久牛|