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

如何做到不停機分庫分表遷移?

運維 數(shù)據(jù)庫運維
隨著業(yè)務(wù)的發(fā)展,單表容量超過千萬甚至達(dá)到億級別以上,這時候就需要考慮分庫分表這個問題了,而不停機分庫分表遷移,這應(yīng)該是分庫分表最基本的需求,畢竟互聯(lián)網(wǎng)項目不可能掛個廣告牌"今晚10:00~次日10:00系統(tǒng)停機維護",這得多l(xiāng)ow呀,以后跳槽面試,你跟面試官說這個遷移方案,面試官怎么想呀?

[[222412]]

需求說明

類似訂單表,用戶表這種未來規(guī)模上億甚至上十億百億的海量數(shù)據(jù)表,在項目初期為了快速上線,一般只是單表設(shè)計,不需要考慮分庫分表。隨著業(yè)務(wù)的發(fā)展,單表容量超過千萬甚至達(dá)到億級別以上,這時候就需要考慮分庫分表這個問題了,而不停機分庫分表遷移,這應(yīng)該是分庫分表最基本的需求,畢竟互聯(lián)網(wǎng)項目不可能掛個廣告牌"今晚10:00~次日10:00系統(tǒng)停機維護",這得多l(xiāng)ow呀,以后跳槽面試,你跟面試官說這個遷移方案,面試官怎么想呀?

借鑒codis

筆者正好曾經(jīng)碰到過這個問題,并借鑒了codis一些思想實現(xiàn)了不停機分庫分表遷移方案;codis不是這篇文章的重點,這里只提及借鑒codis的地方--rebalance:

當(dāng)遷移過程中發(fā)生數(shù)據(jù)訪問時,Proxy會發(fā)送“SLOTSMGRTTAGSLOT”遷移命令給Redis,強制將客戶端要訪問的Key立刻遷移,然后再處理客戶端的請求。( SLOTSMGRTTAGSLOT 是codis基于redis定制的)

分庫分表

明白這個方案后,了解不停機分庫分表遷移就比較容易了,接下來詳細(xì)介紹筆者當(dāng)初對installed_app表的實施方案;即用戶已安裝的APP信息表;

1. 確定sharding column

確定sharding column絕對是分庫分表最最最重要的環(huán)節(jié),沒有之一。sharding column直接決定整個分庫分表方案最終是否能成功落地;一個合適的sharding column的選取,基本上能讓與這個表相關(guān)的絕大部分流量接口都能通過這個sharding column訪問分庫分表后的單表,而不需要跨庫跨表,最常見的sharding column就是user_id,筆記這里選取的也是user_id;

2. 分庫分表方案

根據(jù)自身的業(yè)務(wù)選取最合適的sharding column后,就要確定分庫分表方案了。筆者采用主動遷移與被動遷移相結(jié)合的方案:

  1. 主動遷移就是一個獨立程序,遍歷需要分庫分表的installed_app表,將數(shù)據(jù)遷移到分庫分表后的目標(biāo)表中。
  2. 被動遷移就是與installed_app表相關(guān)的業(yè)務(wù)代碼自身將數(shù)據(jù)遷移到分庫分表后對應(yīng)的表中。

接下來詳細(xì)介紹這兩個方案;

2.1 主動遷移

主動遷移就是一個獨立的外掛遷移程序,其作用是遍歷需要分庫分表的installed_app表,將這里的數(shù)據(jù)復(fù)制到分庫分表后的目標(biāo)表中,由于主動遷移和被動遷移會一起運行,所以需要處理主動遷移和被動遷移碰撞的問題,筆者的主動遷移偽代碼如下:

 

  1. public void migrate(){  
  2.     // 查詢出當(dāng)前表的***ID, 用于判斷是否遷移完成  
  3.     long maxId = execute("select max(id) from installed_app");  
  4.     long tempMinId = 0L;  
  5.     long stepSize = 1000;  
  6.     long tempMaxId = 0L;  
  7.     do{  
  8.         try {  
  9.             tempMaxId = tempMinId + stepSize;  
  10.             // 根據(jù)InnoDB索引特性, where id>=? and id<?這種SQL性能***  
  11.             String scanSql = "select * from installed_app where id>=#{tempMinId} and id<#{tempMaxId}" 
  12.             List<InstalledApp> installedApps = executeSql(scanSql);  
  13.             Iterator<InstalledApp> iterator = installedApps.iterator();  
  14.             while (iterator.hasNext()) {  
  15.                 InstalledApp installedApp = iterator.next();  
  16.                 // help GC  
  17.                 iterator.remove();  
  18.                 long userId = installedApp.getUserId();  
  19.                 String status = executeRedis("get MigrateStatus:${userId}");  
  20.                 if ("COMPLETED".equals(status)) {  
  21.                     // migration finish, nothing to do  
  22.                     continue 
  23.                 }  
  24.                 if ("MIGRATING".equals(status)) {  
  25.                     // "被動遷移" migrating, nothing to do  
  26.                     continue 
  27.                 }  
  28.                 // 遷移前先獲取鎖: set MigrateStatus:18 MIGRATING ex 3600 nx  
  29.                 String result = executeRedis("set MigrateStatus:${userId} MIGRATING ex 86400 nx");  
  30.                 if ("OK".equals(result)) {  
  31.                     // 成功獲取鎖后, 先將這個用戶所有已安裝的app查詢出來[即遷移過程以用戶ID維度進(jìn)行遷移]  
  32.                     String sql = "select * from installed_app where user_id=#{user_id}" 
  33.                     List<InstalledApp> userInstalledApps = executeSql(sql);  
  34.                     // 將這個用戶所有已安裝的app遷移到分庫分表后的表中(有user_id就能得到分庫分表后的具體的表)  
  35.                     shardingInsertSql(userInstalledApps);  
  36.                     // 遷移完成后, 修改緩存狀態(tài)  
  37.                     executeRedis("setex MigrateStatus:${userId} 864000 COMPLETED");  
  38.                 } else {  
  39.                     // 如果沒有獲取到鎖, 說明被動遷移已經(jīng)拿到了鎖, 那么遷移交給被動遷移即可[這種概率很低]  
  40.                     // 也可以加強這里的邏輯, "被動遷移"過程不可能持續(xù)很長時間, 可以嘗試循環(huán)幾次獲取狀態(tài)判斷是否遷移完  
  41.                     logger.info("Migration conflict. userId = {}", userId);  
  42.                 }  
  43.             }  
  44.             if (tempMaxId >= maxId) {  
  45.                 // 更新max(id),最終確認(rèn)是否遍歷完成  
  46.                 maxId = execute("select max(id) from installed_app");  
  47.             }  
  48.             logger.info("Migration process id = {}", tempMaxId);  
  49.         }catch (Throwable e){  
  50.             // 如果執(zhí)行過程中有任何異常(這種異常只可能是redis和mysql拋出來的), 那么退出, 修復(fù)問題后再遷移  
  51.             // 并且將tempMinId的值置為logger.info("Migration process id="+tempMaxId);日志***一次記錄的id, 防止重復(fù)遷移 
  52.             System.exit(0);  
  53.         }  
  54.         tempMinId += stepSize;  
  55.     }while (tempMaxId < maxId);  

 

這里有幾點需要注意:

  1. ***步查詢出max(id)是為了盡量減少max(id)的查詢次數(shù),假如***次查詢max(id)為10000000,那么直到遍歷的id到10000000以前,都不需要再次查詢max(id);
  2. 根據(jù)id>=? and id<?遍歷,而不要根據(jù)id>=? limit n或者limit m, n進(jìn)行遍歷,因為limit性能一般,且會隨著遍歷越往后,性能越差。而id>=? and id<?這種遍歷方式即使會有一些踩空,也沒有任何影響,且整個性能曲線非常平順,不會有任何抖動;遷移程序畢竟是輔助程序,不能對業(yè)務(wù)程序有過多的影響;
  3. 根據(jù)id區(qū)間范圍查詢出來的List<InstalledApp>要轉(zhuǎn)換為Iterator<InstalledApp>,每迭代處理完一個userId,要remove掉,否則可能導(dǎo)致GC異常,甚至OOM;

2.2 被動遷移

被動遷移就是在正常與installed_app表相關(guān)的業(yè)務(wù)邏輯前插入了遷移邏輯,以新增用戶已安裝APP為例,其偽代碼如下:

 

  1. // 被動遷移方法是公用邏輯,所以與`installed_app`表相關(guān)的業(yè)務(wù)邏輯前都需要調(diào)用這個方法;  
  2. public void migratePassive(long userId)throws Exception{  
  3.     String status = executeRedis("get MigrateStatus:${userId}");  
  4.     if ("COMPLETED".equals(status)) {  
  5.         // 該用戶數(shù)據(jù)已經(jīng)遷移完成, nothing to do  
  6.         logger.info("user's installed app migration completed. user_id = {}", userId);  
  7.     }else if ("MIGRATING".equals(status)) {  
  8.         // "被動遷移" migrating, 等待直到遷移完成; 為了防止死循環(huán), 可以增加***等待時間邏輯  
  9.         do{  
  10.             Thread.sleep(10);  
  11.             status = executeRedis("get MigrateStatus:${userId}");  
  12.         }while ("COMPLETED".equals(status)); 
  13.     }else {  
  14.         // 準(zhǔn)備遷移  
  15.         String result = executeRedis("set MigrateStatus:${userId} MIGRATING ex 86400 nx");  
  16.         if ("OK".equals(result)) {  
  17.             // 成功獲取鎖后, 先將這個用戶所有已安裝的app查詢出來[即遷移過程以用戶ID維度進(jìn)行遷移]  
  18.             String sql = "select * from installed_app where user_id=#{user_id}" 
  19.             List<InstalledApp> userInstalledApps = executeSql(sql);  
  20.             // 將這個用戶所有已安裝的app遷移到分庫分表后的表中(有user_id就能得到分庫分表后的具體的表)  
  21.             shardingInsertSql(userInstalledApps);  
  22.             // 遷移完成后, 修改緩存狀態(tài)  
  23.             executeRedis("setex MigrateStatus:${userId} 864000 COMPLETED");  
  24.         }else {  
  25.             // 如果沒有獲取到鎖, 應(yīng)該是其他地方先獲取到了鎖并正在遷移, 可以嘗試等待, 直到遷移完成  
  26.         }  
  27.     }  
  28.  
  29. // 與`installed_app`表相關(guān)的業(yè)務(wù)--新增用戶已安裝的APP  
  30. public void addInstalledApp(InstalledApp installedApp) throws Exception{  
  31.     // 先嘗試被動遷移  
  32.     migratePassive(installedApp.getUserId());  
  33.     // 將用戶已安裝app信息(installedApp)插入到分庫分表后的目標(biāo)表中  
  34.     shardingInsertSql(installedApp);  

 

無論是CRUD中哪種操作,先根據(jù)緩存中MigrateStatus:${userId}的值進(jìn)行判斷:

  1. 如果值為COMPLETED,表示已經(jīng)遷移完成,那么將請求轉(zhuǎn)移到分庫分表后的表中進(jìn)行處理即可;
  2. 如果值為MIGRATING,表示正在遷移中,可以循環(huán)等待直到值為COMPLETED即遷移完成后,再將請求轉(zhuǎn)移到分庫分表后的表中進(jìn)行處理處理;
  3. 否則值為空,那么嘗試獲取鎖再進(jìn)行數(shù)據(jù)遷移。遷移完成后,將緩存值更新為COMPLETED,***再將請求轉(zhuǎn)移到分庫分表后的表中進(jìn)行處理處理;

3.方案完善

當(dāng)所有數(shù)據(jù)遷移完成后,CRUD操作還是會先根據(jù)緩存中MigrateStatus:${userId}的值進(jìn)行判斷,數(shù)據(jù)遷移完成后這一步已經(jīng)是多余的。可以加個總開關(guān),當(dāng)所有數(shù)據(jù)遷移完成后,將這個開關(guān)的值通過類似TOPIC的方式發(fā)送,所有服務(wù)接收到TOPIC后將開關(guān)local cache化。那么接下來服務(wù)的CRUD都不需要先根據(jù)緩存中MigrateStatus:${userId}的值進(jìn)行判斷;

4.遺留工作

遷移完成后,將主動遷移程序下線,并將被動遷移程序中對migratePassive()的調(diào)用全部去掉,并可以集成一些第三方分庫分表中間件,例如sharding-jdbc,可以參考sharding-jdbc集成實戰(zhàn)

回顧總結(jié)

回顧這個方案,***的缺點就是如果碰到sharding column(例如userId)的總記錄數(shù)比較多,且主動遷移正在進(jìn)行中,被動遷移與主動遷移碰撞,那么被動遷移可能需要等待較長時間。

不過根據(jù)DB性能,一般批量插入1000條數(shù)據(jù)都是10ms級別,并且同一sharding column的記錄分庫分表后只屬于一張表,不涉及跨表。所以,只要在遷移前先通過sql統(tǒng)計待遷移表中沒有這類異常sharding column即可放心遷移;

筆者當(dāng)初遷移installed_app表時,用戶最多也只擁有不超過200個APP,所以不需要過多考慮碰撞帶來的性能問題;沒有***的方案,但是有適合自己的方案;

 

如果有那種上萬條記錄的sharding column,可以把這些sharding column先緩存起來,遷移程序在夜間上線,優(yōu)先遷移這些緩存的sharding column的數(shù)據(jù),就可以盡可能的降低遷移程序?qū)@些用戶的體驗。當(dāng)然你也可以使用你想出來的更好的方案。 

責(zé)任編輯:龐桂玉 來源: 數(shù)據(jù)庫開發(fā)
相關(guān)推薦

2020-05-06 13:47:42

ZooKeeperKubernetes遷移

2019-04-25 10:40:02

分庫分表MySQL數(shù)據(jù)庫

2025-07-03 08:21:16

2018-01-12 15:17:40

數(shù)據(jù)庫水平分庫數(shù)據(jù)遷移

2024-10-25 10:00:00

云服務(wù)計算

2021-06-26 08:09:21

MySQL不停機不鎖表

2021-03-01 10:10:39

數(shù)據(jù)遷移擴容

2019-01-02 16:40:13

MongoDBPostgres數(shù)據(jù)庫

2020-04-13 15:45:46

MySQL數(shù)據(jù)庫備份

2020-07-28 09:04:09

NewSQL分庫分表

2011-11-09 15:49:52

API

2020-07-30 17:59:34

分庫分表SQL數(shù)據(jù)庫

2022-02-23 08:55:06

數(shù)據(jù)遷移分庫分表數(shù)據(jù)庫

2024-06-06 11:26:03

2022-07-11 08:16:47

NewSQL關(guān)系數(shù)據(jù)庫系統(tǒng)

2024-11-22 15:32:19

2022-10-08 09:33:00

平臺中間件

2019-11-12 09:54:20

分庫分表數(shù)據(jù)

2009-11-20 11:37:11

Oracle完全卸載

2023-08-18 12:17:03

Linode實時遷移云計算
點贊
收藏

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

91.麻豆视频| 久久免费国产精品| 色综合久久88| 国产在线不卡av| 免费一二一二在线视频| 久久蜜桃一区二区| 国产在线不卡精品| 久久久久久天堂| 亚洲欧美tv| 欧美三片在线视频观看 | 国产主播性色av福利精品一区| 天天色综合成人网| 亚洲高清视频一区| 亚洲精品综合网| 久久99伊人| 欧美成年人网站| 久久亚洲AV成人无码国产野外| 国产欧美在线观看免费| 午夜精品久久久久久久99水蜜桃 | 麻豆精品久久| 欧美小视频在线观看| 91香蕉视频网址| 三级av在线播放| 加勒比av一区二区| 欧洲亚洲在线视频| 青青草激情视频| 国产乱码精品一区二区三区四区| 欧美一区二区三区四区高清 | 国产综合精品久久久久成人av| 亚洲一区二区免费在线观看| 91黄色免费网站| 免费超爽大片黄| 精品孕妇一区二区三区| 91免费看片在线观看| 亚洲伊人久久大香线蕉av| 黄色污污网站在线观看| 亚洲人www| 欧美成人网在线| 青青草自拍偷拍| 天海翼精品一区二区三区| 日韩欧美高清一区| www.激情小说.com| 91精品产国品一二三产区| 一区二区三区四区蜜桃| 亚洲精品久久久久久一区二区| 五月婷婷狠狠干| 国产成+人+日韩+欧美+亚洲| 成人两性免费视频| 曰批又黄又爽免费视频| 午夜在线播放视频欧美| 欧美日韩国产成人在线| 伊人在线视频观看| 欧美黄色录像片| 在线日韩av观看| 魔女鞋交玉足榨精调教| 日韩成人av在线资源| 亚洲国产精品女人久久久| 久久黄色一级视频| 免费精品一区| 日韩三级视频在线看| 色噜噜狠狠一区二区三区狼国成人| 姬川优奈av一区二区在线电影| 欧美午夜女人视频在线| 国产又黄又大又粗视频| 色综合桃花网| 欧美性色视频在线| 免费日韩视频在线观看| 2022成人影院| 欧美在线视频不卡| 亚洲美女爱爱视频| 999精品视频在线观看| 欧美精品aⅴ在线视频| 亚洲涩涩在线观看| 欧美不卡在线观看| 精品剧情在线观看| 欧美在线一级片| 日韩av中文字幕一区| 日韩精品中文字幕久久臀| 欧美成人午夜精品免费| 国产欧美日韩精品一区二区免费| 国产亚洲精品美女久久久| 国产精品美女高潮无套| 色婷婷综合网| 欧美成人免费全部观看天天性色| 国产一国产二国产三| 一本色道88久久加勒比精品| 欧美一区二区三区精品电影| 91青青草视频| 久久99精品一区二区三区| 91色在线观看| 天天射天天色天天干| 91亚洲精品乱码久久久久久蜜桃| 欧美一区二区影视| 日日夜夜精品一区| 亚洲一区二区视频在线| 成年人视频网站免费观看| 成人看片网页| 666欧美在线视频| 95视频在线观看| 欧美精美视频| 欧美第一淫aaasss性| 日本熟女毛茸茸| 久久97超碰国产精品超碰| av在线不卡一区| 久久久久久久久亚洲精品| 国产精品久久久久久久久动漫| 高清无码一区二区在线观看吞精| 亚洲女色av| 欧美日韩国产一级| 一区二区免费在线观看视频| 成人免费电影网址| 欧美精品videossex88| 999视频在线| 国产91丝袜在线播放0| 日本一区二区三区www| 青草在线视频在线观看| 欧美伊人久久大香线蕉综合69| 国产精品19p| 精品欧美久久| 韩国三级电影久久久久久| 亚洲综合精品国产一区二区三区 | 久久精品a一级国产免视看成人 | 国产亚洲精品久久久久久打不开 | 超碰成人97| 色视频www在线播放国产成人| 国产精彩视频在线| 韩国av一区二区三区在线观看| 久久一区免费| 岛国片av在线| 欧美一区二区在线视频| 国产一区二区三区精品在线| 在线欧美亚洲| 91观看网站| 免费网站免费进入在线| 色婷婷综合五月| 国产精品久久久久久久无码| 亚洲人metart人体| 国产精品视频公开费视频| 日本高清中文字幕二区在线| 亚洲成a人片在线不卡一二三区| 在线观看岛国av| 欧美一区电影| 国产精品久久9| 欧美大片aaa| 精品福利免费观看| 国产十八熟妇av成人一区| 欧美精品97| 91中文字幕在线| 免费网站看v片在线a| 欧美日韩中字一区| 国产无遮挡在线观看| 免费在线成人| 免费不卡亚洲欧美| 91av亚洲| 国产亚洲a∨片在线观看| 东京热一区二区三区四区| 97超碰欧美中文字幕| 久久久久久久久久久99| 国产精品极品国产中出| 国模私拍一区二区三区| 国精品人妻无码一区二区三区喝尿| 亚洲精品va在线观看| 中文字幕第10页| 欧美色图首页| 国产亚洲欧美一区二区三区| 性感女国产在线| 亚洲人成网站免费播放| 国产精品成人无码| 中文字幕一区二区三区在线观看 | 欧美影视资讯| 国产一区二区三区久久精品| 中文字幕码精品视频网站| 国产精品初高中害羞小美女文| 伊人影院综合在线| 小小影院久久| 超碰在线观看97| 1234区中文字幕在线观看| 日韩av影视在线| 夜夜爽妓女8888视频免费观看| 中文字幕不卡的av| 国产乱叫456| 亚洲第一伊人| 日本一区二区三区四区在线观看 | 你懂的视频在线| 在线观看国产日韩| 欧美做爰啪啪xxxⅹ性| 从欧美一区二区三区| 国产精品秘入口18禁麻豆免会员| 加勒比久久综合| 成人免费看黄网站| 18aaaa精品欧美大片h| 亚洲美女喷白浆| 97人妻精品一区二区三区软件 | 日韩精品视频播放| 国产亚洲精品福利| 国内自拍第二页| 国产日韩亚洲欧美精品| 亚洲乱码一区二区三区三上悠亚| 欧美专区视频| 浅井舞香一区二区| 大地资源网3页在线观看| 亚洲国产欧美一区二区三区同亚洲| 日韩在线播放中文字幕| 亚洲少妇30p| www.自拍偷拍| 国产美女精品一区二区三区| 久久成人免费观看| 国产精品成久久久久| 国产一区免费观看| 成人短视频软件网站大全app| 97国产在线视频| 毛片在线看网站| 日韩精品久久久久久福利| 国产一区二区三区成人| 高跟丝袜一区二区三区| av成人免费网站| 国产三级精品在线| 秘密基地免费观看完整版中文 | hs视频在线观看| 色av综合在线| 日本在线观看中文字幕| 亚洲欧洲av另类| 亚洲国产日韩一区无码精品久久久| 国产高清成人在线| mm131国产精品| 亚洲自拍另类| 久草视频国产在线| 亚洲成人国产| 四虎一区二区| 亚洲图片久久| 国产另类第一区| 久久av网站| 国产精品一区二区久久| 欧美性suv| 97成人精品区在线播放| 国精一区二区三区| 欧美精品在线视频观看| 免费在线观看av片| 最近的2019中文字幕免费一页| 男男激情在线| 国产丝袜一区二区| 午夜视频在线免费播放| 欧美mv日韩mv国产| 精品久久久无码中文字幕| 欧美日韩不卡一区二区| 亚洲国产无线乱码在线观看| 色婷婷综合久久| 国产三级av片| 精品成人av一区| 中文字幕日韩一级| 五月天亚洲精品| 日韩精品久久久久久久酒店| 亚洲成人一区二区| 国产精品美女毛片真酒店| 亚洲国产一区二区三区青草影视| 久久国产精品二区| 亚洲图片有声小说| 日韩免费视频网站| 精品久久久久久久久久久久久久| 日韩三级一区二区三区| 偷拍一区二区三区四区| 日韩成年人视频| 精品日韩美女的视频高清| 国产区在线观看视频| 亚洲午夜免费视频| 日韩xxxxxxxxx| 欧美性xxxx| 国产一级片免费视频| 欧美色网站导航| 亚洲天堂视频网| 91精品国产综合久久久久久漫画| av中文字幕观看| 精品国产免费视频| 免费a在线观看| 国产一区二区av| 麻豆视频在线免费观看| 美女av一区二区三区 | 亚洲婷婷伊人| 亚洲国产日韩综合一区| 91成人精品视频| 亚洲一区二区三区av无码| 国产精品亚洲综合久久| 国产小视频精品| 蜜臀91精品一区二区三区| 伊人精品视频在线观看| 99免费精品视频| 微拍福利一区二区| 一区二区三区不卡视频| 国产精品一区二区三区四| 欧美在线影院一区二区| 国内精品久久久久久久久久久| 亚洲国产高清自拍| www免费网站在线观看| 欧美日本精品在线| av高清不卡| 亚洲xxxx18| 亚洲免费福利一区| 欧美日韩午夜爽爽| 另类国产ts人妖高潮视频| 超碰在线资源站| 91在线一区二区三区| 日本黄色录像视频| 欧美日韩性生活视频| 97视频免费在线| 亚洲精品美女在线| 好吊日视频在线观看| 青草青草久热精品视频在线网站 | a级片在线观看视频| 日本一区二区三区四区在线视频 | 久久久久久久久爱| 成人在线视频免费| 国内一区在线| 一区二区在线影院| 男人天堂成人在线| 成人h动漫精品一区二区| 波多野结衣家庭教师在线观看| 亚洲国产精品久久不卡毛片| 成人黄色免费网| 亚洲精品www久久久| 超鹏97在线| 国产精品美女免费看| 日韩成人动漫在线观看| 在线观看污视频| 奇米精品一区二区三区在线观看| 久久久久国产精品无码免费看| 综合激情成人伊人| 一级片在线免费播放| 日韩精品极品在线观看| 国产在线xxx| 99国产视频在线| 97精品视频| 日本a√在线观看| www国产成人| 国产精品第9页| 精品美女在线播放| a毛片在线看免费观看| 国产精品影院在线观看| 成久久久网站| 热久久精品国产| 久久老女人爱爱| 欧美激情黑白配| 日韩电影网在线| free性护士videos欧美| 不卡视频一区| 欧美99久久| 久久精品无码一区二区三区毛片| 国产精品入口麻豆原神| 中文字幕免费高清在线观看| 亚洲视频网站在线观看| 久久r热视频| 欧美午夜精品久久久久免费视| 亚洲欧美日本日韩| 粉嫩av蜜桃av蜜臀av| 色婷婷av一区二区| 国产黄色在线播放| 国产精品久久久久久久久久免费 | 精品一区二区av| 国产精品麻豆一区| 欧美丰满少妇xxxxx高潮对白| 日本在线免费| 91中文字幕在线| 欧美片第1页综合| 天天躁日日躁狠狠躁av| 香蕉乱码成人久久天堂爱免费| 午夜小视频免费| 国产成人91久久精品| 久久国产中文字幕| 中文字幕一区二区在线观看视频 | 黄页在线观看免费| 国产精品伊人日日| 午夜一级在线看亚洲| 中文字幕av久久爽一区| 5566中文字幕一区二区电影 | 日韩福利视频一区| 黄色一级大片在线观看| 国产精品色哟哟| 国产不卡精品视频| 久久久久久久久久久网站| 日韩欧美美女在线观看| 国内自拍视频一区| 亚洲女同女同女同女同女同69| 性生交大片免费看女人按摩| 羞羞色国产精品| 精品国产不卡| 999热精品视频| 午夜精品久久久久久久| 波多野结衣在线影院| 国产中文字幕亚洲| 激情自拍一区| 国产精品国产三级国产专业不| 欧美精品在线观看一区二区| 免费av不卡在线观看| 欧美日韩精品免费观看| 国产曰批免费观看久久久| 日本特黄特色aaa大片免费| 亚洲人成自拍网站| 一区二区三区国产好| 免费观看成人在线视频| 亚洲女人小视频在线观看| 亚洲欧美日本在线观看|