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

Spark灰度發布在十萬級節點上的實踐

大數據 Spark
本文介紹了頂級互聯網公司數萬節點下 Spark 的 CI 與 CD & CD 灰度發布實踐。包含如何維護源代碼,如何維護 Release 多版本,開發版與正式版,以及如何實現灰度發布,如何進行 hotfix 等。為了提高本文內容的可借鑒性,隱去了公司特有內容,只保留通用部分。

本文介紹了頂級互聯網公司數萬節點下 Spark 的 CI 與 CD & CD 灰度發布實踐。包含如何維護源代碼,如何維護 Release 多版本,開發版與正式版,以及如何實現灰度發布,如何進行 hotfix 等。為了提高本文內容的可借鑒性,隱去了公司特有內容,只保留通用部分。

CI 介紹

持續集成是指,及時地將最新開發的且經過測試的代碼集成到主干分支中。

Spark灰度發布在十萬級節點上的實踐

Continuous Integration

 

持續集成的優點

  • 快速發現錯誤 每次更新都及時集成到主干分支中,并進行測試,可以快速發現錯誤,方便定位錯誤。
  • 避免子分支大幅偏離主干分支 主干在不斷更新,如果不經常集成,會產生后期集成難度變大,甚至難以集成,并造成不同開發人員間不必要的重復開發。
  • 為快速迭代提供保障 持續集成為后文介紹的持續發布與持續部署提供了保證。

Spark CI 實踐

目前主流的代碼管理工具有,Github、Gitlab等。本文所介紹的內容中,所有代碼均托管于私有的 Gitlab 中。

鑒于 Jenkins 幾乎是 CI 事實上的標準,本文介紹的 Spark CI CD & CD 實踐均基于 Jenkins 與 Gitlab。

Spark 源碼保存在 spark-src.git 庫中。

由于已有部署系統支持 Git,因此可將集成后的 distribution 保存到 Gitlab 的發布庫(spark-bin.git)中。

每次開發人員提交代碼后,均通過 Gitlab 發起一個 Merge Requet (相當于 Gitlab 的 Pull Request)

每當有 MR 被創建,或者被更新,Gitlab 通過 Webhook 通知 Jenkins 基于該 MR 最新代碼進行 build。該 build 過程包含了

  • 編譯 Spark 所有 module
  • 執行 Spark 所有單元測試
  • 執行性能測試
  • 檢查測試結果。如果有任意測試用例失敗,或者性能測試結果明顯差于上一次測試,則 Jenkins 構建失敗

Jenkins 將 build 結果通知 Gitlab,只有 Jenkins 構建成功,Gitlab 的 MR 頁面才允許 Merge。否則 Gitlab 不允許 Merge

另外,還需人工進行 Code Review。只有兩個以上的 Reviewer 通過,才能進行最終 Merge

所有測試與 Reivew 通過后,通過 Gitlab Merge 功能自動將代碼 Fast forward Merge 到目標分支中

該流程保證了

  • 所有合并進目標分支中的代碼都經過了單元測試(白盒測試)與性能測試(黑盒測試)
  • 每次發起 MR 后都會及時自動發起測試,方便及時發現問題
  • 所有代碼更新都能及時合并進目標分支

Spark CD 持續交付

CD 持續交付介紹

持續交付是指,及時地將軟件的新版本,交付給質量保障團隊或者用戶,以供評審。持續交付可看作是持續集成的下一步。它強調的是,不管怎么更新,軟件都是可隨時交付的。

這一階段的評審,一般是將上文集成后的軟件部署到盡可能貼近生產環境的 Staging 環境中,并使用貼近真實場景的用法(或者流量)進行測試。 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery

持續發布的優點

  • 快速發布 有了持續集成與持續發布,可快速將最新功能發布出來,也可快速修復已知 bug
  • 快速迭代 由于發布及時,可以快速判斷產品是否符合產品經理的預期或者是否能滿足用戶的需求

Spark CD 持續發布實踐

這里有提供三種方案,供讀者參考。推薦方案三。

方案一:單分支

正常流程

如下圖所示,基于單分支的 Spark 持續交付方案如下:

  • 所有開發都在 spark-src.git/dev(即 spark-src.git 的 dev branch) 上進行
  • 每周一將當前最新代碼打包,放進 spark-bin.git/dev 的 spark-${ build # }(如圖中第 2 周的 spark-72)文件夾內
  • spark-prod 指向當前 spark-dev 指向的文件夾(如圖中的 spark-71 )
  • spark-dev 指向 spark-${ build # }(如圖中的 spark-72)
  • 自動將 spark-bin.git 最新內容上線到 Staging 環境,并使用 spark-dev 進行測試
  • spark-prod 比 spark-dev 晚一周(一個 release 周期),這一周用于 Staging 環境中測試 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 1

 

注:

  • 藍色圓形是正常 commit
  • 垂直虛線是發布時間點,week 1、week 2、week 3、week 4
  • 最上方黑色粗橫線是源碼時間線
  • 下方黃色粗橫線是 release 時間線
  • 綠色方框是每周生成的 release,帶 build #
  • 藍色方框是開發版本的 symbolic
  • 橘色方框是線上版本的 symbolic

bug fix

在 Staging 環境中發現 spark-dev 的 bug 時,修復及集成和交付方案如下:

  • 如果在 Staging 環境中發現了 spark-dev 的 bug,且必須要修復(如不修復,會帶到下次的 spark-prod 的 release 中),則提交一個 commit,并且 commit message 包含 bugfix 字樣(如圖中黑色圓形 commit 9 所示)
  • 該 bugfix 被 Merge 后,Jenkins 得到通知
  • Jenkins 發現該 commit 是 bugfix,立即啟動構建,生成spark-${ build # }(如圖中的 spark-73)
  • spark-dev 指向 spark-${ build # } (如圖中的 spark-73 ) 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 1 bug fix

 

hot fix

生產環境中發現 bug 時修復及交付方案如下:

  • 如果發現線上版本(即 spark-prod)有問題,須及時修復,則提交一個 commit,并且 commit message 包含 hotfix 字樣 (如圖中紅色圓形 commit 9 所示)
  • 該 hotfix 被 Merge 后,Jenkins 得到通知
  • Jenkins 發現該 commit 是 hotfix,立即啟動構建,生成 spark-${ build # }(如圖中的 spark-73)
  • spark-dev 與 spark-prod 均指向 spark-${ build # } (如圖中的 spark-73 ) 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 1 hotfix

 

Pros.

  • spark-src.git 與 spark-bin.git 都只有一個分支,維護方便
  • spark-prod 落后于 spark-dev 一周(一個 release),意味著 spark-prod 都成功通過了一周的 Staging 環境測試

Cons.

  • 使用 spark-prod 與 spark-dev 兩個 symbolic,如果要做灰度發布,需要用戶修改相應路徑,成本較高
  • hotfix 時,引入了過去一周多(最多兩周)未經 Staging 環境中通過 spark-dev 測試的 commit,增加了不確定性,也違背了所有非 hotfix commit 都經過了一個發布周期測試的原則

方案二:兩分支

正常流程

如下圖所示,基于兩分支的 Spark 持續交付方案如下:

  • spark-src.git 與 spark-bin.git 均包含兩個分支,即 dev branch 與 prod branch
  • 所有正常開發都在 spark-src.git/dev 上進行
  • 每周一(如果是 weekly release)從 spark-src.git/dev 打包出一個 release 放進 spark-bin.git/dev 的 spark-${ build # } 文件夾內(如圖中第 2 周上方的的 spark-2 )。它包含了之前所有的提交(commit 1、2、3、4)
  • spark-bin.git/dev 的 spark 作為 symbolic 指向 spark-${ build # } 文件夾內(如圖中第 2 周上方的的 spark-2)
  • spark-src.git/prod 通過 fast-forward merge 將 spark-src.git/dev 一周前最后一個 commit 及之前的所有 commit 都 merge 過來(如圖中第 2 周需將 commit 1 merge 過來)
  • 將 spark-src.git/prod 打包出一個 release 放進 spark-bin.git/prod 的 spark-${ build # } 文件夾內(如圖中第 2 周下方的的 spark-1 )
  • spark-bin.git/prod 的 spark 作為 symbolic 指向 spark-${ build # } 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 2

 

bug fix

在 Staging 環境中發現了 dev 版本的 bug 時,修復及集成和交付方案如下

  • 在 spark-src.git/dev上提交一個 commit (如圖中黑色的 commit 9),且 commit message 包含 bugfix 字樣
  • Jenkins 發現該 commit 為 bugfix 后,立即構建,從 spark-src.git/dev 打包生成一個 release 并放進 spark-bin.git/dev 的 spark-${ build # } 文件夾內(如圖中第二周與第三周之間上方的的 spark-3 )
  • spark-bin.git/dev 中的 spark 作為 symbolic 指向 spark-${ build # } 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 2 bugfix

 

hot fix

在生產環境中發現了 prod 版本的 bug 時,修復及集成和交付方案如下:

  • 在 spark-src.git/dev 上提交一個 commit(如圖中紅色的 commit 9),且 commit message 包含 hotfix 字樣
  • Jenkins 發現該 commit 為 hotfix 后,立即將 spark-src.git/dev 打包生成 release 并 commit 到 spark-bin.git/dev 的 spark-${ build # } (如圖中上方的 spark-3 )文件夾內。 spark 作為 symbolic 指向該 spark-${ build # }
  • 通過 cherry-pick 將 commit 9 double commit 到 spark-src.git/prod(如無沖突,則該流程全自動完成,無需人工參與。如發生沖突,通過告警系統通知開發人員手工解決沖突后提交)
  • 將 spark-src.git/prod 打包生成 release 并 commit 到 spark-bin.git/prod 的 spark-${ build # } (如圖中下方的 spark-3 )文件夾內。spark作為 symbolic 指向該spark-${ build # } 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 2 hotfix

 

Pros.

  • 無論是 dev 版還是 prod 版,路徑都是 spark。切換版對用戶透明,無遷移成本
  • 方便灰度發布
  • hotfix 不會引入未經測試的 commit,穩定性更有保障
  • prod 版落后于 dev 版一周(一個 release 周期),即 prod 經過了一個 release 周期的測試,穩定性強

Cons.

  • hot fix 時,使用 cherry-pick,但 spark-src.git/dev(包含 commit 1、2、3、4、5) 與 spark-src.git/prod(包含 commit 1) 的 base 不一樣,有發生沖突的風險。一旦發生沖突,便需人工介入
  • hot fix 后再從 spark-src.git/dev 合并 commit 到 spark-src.git/prod 時需要使用 rebase 而不能直接 fast-forward merge。而該 rebase 可能再次發生沖突
  • bug fix 修復的是當前 spark-bin.git/dev的 bug,即圖中的 commit 1、2、3、4 后的 bug,而 bug fix commit 即 commit 9 的 base 是 commit 5,存在一定程度的不一致
  • bug fix 后,第 3 周時,最新的 spark-bin.git/dev 包含了 bug fix,而最新的 spark-bin.git/prod 未包含該 bugfix (它只包含了 commit 2、3、4 而不包含 commit 5、9)。只有到第 4 周,spark-bin.git/prod 才包含該 bugfix。也即 Staging 環境中發現的 bug,需要在一周多(最多兩周)才能在 prod 環境中被修復。換言之,Staging 環境中檢測出的 bug,仍然會繼續出現在下一個生產環境的 release 中
  • spark-src.git/dev 與 spark-src.git/prod 中包含的 commit 數一致(因為只允許 fast-forward merge),內容也最終一致。但是 commit 順序不一致,且各 commit 內容也可能不一致。如果維護不當,容易造成兩個分支差別越來越大,不易合并

方案三:多分支

正常流程

如下圖所示,基于多分支的 Spark 持續交付方案如下

  • 正常開發在 spark-src.git/master 上進行
  • 每周一通過 fast-forward merge 將 spark-src.git/master 最新代碼合并到 spark-src.git/dev。如下圖中,第 2 周將 commit 4 及之前所有 commit 合并到 spark-src.git/dev
  • 將 spark-src.git/dev 打包生成 release 并提交到 spark-bin.git/dev 的 spark-${ build # }(如下圖中第 2 周的 spark-2) 文件夾內。spark 作為 symbolic,指向該 spark-${ build # }
  • 每周一通過 fast-forward merge 將 spark-src.git/master 一周前最后一個 commit 合并到 spark-src.git/prod。如第 3 周合并 commit 4 及之前的 commit
  • 上一步中,如果 commit 4 后緊臨有一個或多個 bugfix commit,均需合并到 spark-src.git/prod 中,因為它們是對 commit 4 進行的 bug fix。后文介紹的 bug fix 流程保證,如果對 commit 4 后發布版本有多個 bug fix,那這多個 bug fix commit 緊密相連,中間不會被正常 commit 分開
  • 將 spark-src.git/prod 打包生成 release 并提交到 spark-bin.git/prod 的 spark-${ build # }(如下圖中第 2 周的 spark-2) 文件夾內。spark 作為 symbolic,指向該 spark-${ build # } 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 3

 

bug fix

在 Staging 環境中發現了 dev 版本的 bug 時,修復及集成和交付方案如下:

  • 如下圖中,第 2 周與第 3 周之間在 Staging 環境中發現 dev 版本的 bug,在 spark-src.git/dev(包含 commit 1、2、3、4) 上提交一個 commit(如圖中黑色的 commit 9),且 commit message 中包含 bugfix 字樣
  • Jenkins 發現該 bugfix 的 commit 后立即執行構建,將 spark-src.git/dev 打包生成 release 并提交到 spark-bin.git/dev 的 spark-${ build # }(如圖中的 spark-3) 文件夾內,spark 作為 symbolic,指向該 spark-${ build # }
  • 通過 git checkout master 切換到 spark-src.git/master ,再通過 git rebase dev 將 bugfix 的 commit rebase 到 spark-src.git/master,如果 rebase 發生沖突,通過告警通知開發人員人工介入處理沖突
  • 在一個 release 周期內,如發現多個 dev 版本的 bug,都可按上述方式進行 bug fix,且這幾個 bug fix 的 commit 在 spark-src.git/dev上順序相連。因此它們被 rebase 到 spark-src.git/master 后仍然順序相連 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 3 bugfix

 

hot fix

在生產環境中發現了 prod 版本的 bug 時,修復及集成和交付方案如下

  • 在 spark-src.git/prod 中提交一個 commit,且其 commit message 中包含 hotfix 字樣
  • Jenkins 發現該 commit 為 hotfix,立即執行構建,將 spark-src.git/prod 打包生成 release 并提交到 spark-bin.git/prod 的 spark-${ build # }(如圖中的 spark-3) 文件夾內,spark 作為 symbolic,指向該 spark-${ build # }
  • 通過 git checkout master 切換到 spark-src.git/master,再通過 git rebase prod 將 hotfix rebase 到 spark-src.git/master
  • 在一個 release 周期內,如發現多個 prod 版本的 bug,都可按上述方式進行 hot fix 

Spark灰度發布在十萬級節點上的實踐

Continuous Delivery Solution 3 hotfix

 

灰度發布

本文介紹的實踐中,不考慮多個版本(經實踐檢驗,多個版本維護成本太高,且一般無必要),只考慮一個 prod 版本,一個 dev 版本

上文介紹的持續發布中,可將 spark-bin.git/dev 部署至需要使用最新版的環境中(不一定是 Staging 環境,可以是部分生產環境)從而實現 dev 版的部署。將 spark-bin.git/prod部署至需要使用穩定版的 prod 環境中

回滾機制

本文介紹的方法中,所有 release 都放到 spark-${ build \# } 中,由 spark 這一 symbolic 選擇指向具體哪個 release。因此回滾方式比較直觀

  • 對于同一個大版本(dev 或者 prod)的回滾,只需將 spark 指向 build # 較小的 release 即可
  • 如果是將部分環境中的 prod 版遷至 dev 版(或者 dev 版改為 prod 版)后,需要回滾,只需將 dev 改回 prod 版(或者將 prod 版改回 dev 版)即可

Pros.

  • 正常開發在 spark-src.git/master 上進行,Staging 環境的 bug fix 在 spark-src.git/dev 上進行,生產環境的 hot fix 在 spark-src.git/prod 上進行,清晰明了
  • bug fix 提交時的 code base 與 Staging 環境使用版本的 code 完全一致,從而可保證 bug fix 的正確性
  • bug fix 合并回 spark-src.git/master 時使用 rebase,從而保證了 spark-src.git/dev 與 spark-src.git/master 所有 commit 的順序與內容的一致性,進而保證了這兩個 branch 的一致性
  • hot fix 提交時的 code base 與 生產環境使用版本的 code 完全一致,從而可保證 hot fix 的正確性
  • hot fix 合并回 spark-src.git/master 時使用 rebase,從而保證了 spark-src.git/dev 與 spark-src.git/master 所有 commit 的順序性及內容的一致性,進而保證了這兩個 branch 的一致性
  • 開發人員只需要專注于新 feature 的開發,bug fix 的提交,與 hot fix 的提交。所有的版本維護工作全部自動完成。只有當 bug fix 或 hot fix rebase 回 spark-src.git/master 發生沖突時才需人工介入
  • spark-bin.git/dev 與 spark-bin.git/prod 將開發版本與生產版本分開,方便獨立部署。而其路徑統一,方便版本切換與灰度發布

Cons.

  • 在本地 spark-src.git/master 提交時,須先 rebase 遠程分支,而不應直接使用 merge。在本方案中,這不僅是最佳實踐,還是硬性要求
  • 雖然 bug fix 與 hot fix commit 都通過 rebase 進入 spark-src.git/master。但發生沖突時,需要相應修改 spark-src.git/master上后續 commit。如上圖中,提交紅色 commit 9 這一 hot fix 后,在 rebase 回 spark-src.git/master 時,如有沖突,可能需要修改 commit 2 或者 commit 3、4、5。該修改會造成本地解決完沖突后的版本與遠程版本沖突,需要強制 push 回遠程分支。該操作存在一定風險

Spark CD 持續部署

持續部署是指,軟件通過評審后,自動部署到生產環境中。 

Spark灰度發布在十萬級節點上的實踐
Continuous Deploy

上述 Spark 持續發布實踐的介紹都只到 "將 *** 提交到 spark-bin.git" 結束。可使用基于 git 的部署(為了性能和擴展性,一般不直接在待部署機器上使用 git pull --rebase,而是使用自研的上線方案,此處不展開)將該 release 上線到 Staging 環境或生產環境

該自動上線過程即是 Spark 持續部署的最后一環。

責任編輯:未麗燕 來源: 郭俊 Jason Guo
相關推薦

2022-06-23 11:19:14

抖音春節發券

2025-03-04 08:53:10

2018-07-23 08:32:49

分布式鏡像倉庫

2018-10-31 14:31:56

UCloud虛擬網絡灰度發布

2020-11-26 18:30:33

機器學習Kubernetes開發

2014-07-01 09:53:21

DockerHadoop集群

2022-10-14 14:47:11

Spark字節跳動優化

2021-06-05 06:52:16

Kubernetes

2021-08-09 10:21:42

云原生Dubbo3.0 服務治理

2016-12-23 09:09:54

TensorFlowKubernetes框架

2022-04-21 08:09:18

Spark字段血緣Spark SQL

2022-01-19 18:31:54

前端灰度代碼

2021-12-27 15:01:21

KubernetesLinux命令

2024-01-02 07:37:52

FlaggerKubernetesIstio

2020-09-28 10:05:57

數據工具技術

2023-11-02 07:53:22

AndroidiOSKMM

2019-05-23 10:55:22

Istio灰度發布ServiceMesh

2024-01-05 00:29:36

全鏈路灰度發布云原生

2022-12-01 11:41:24

2022-12-12 11:47:34

WindowsPySpark服務器
點贊
收藏

51CTO技術棧公眾號

四虎国产精品成人免费影视| 五月激情婷婷综合| 91成人超碰| 亚洲电影天堂av| 霍思燕三级露全乳照| 免费在线视频一级不卡| 美女一区二区视频| 欧美国产高跟鞋裸体秀xxxhd| 国产激情视频网站| 免费成人高清在线视频| 亚洲韩国精品一区| 亚洲欧美成人一区| 日韩一级片免费| 麻豆精品一区二区av白丝在线| 欧美极品少妇xxxxⅹ裸体艺术| 97人妻精品一区二区免费| 国产精品xnxxcom| 欧美日韩亚洲视频| 日韩一级特黄毛片| 日本在线免费| 91丨porny丨国产入口| 成人激情黄色网| 日韩免费av网站| 伊人久久成人| 另类图片亚洲另类| 成人黄色a级片| 婷婷亚洲成人| 欧美精品一区二区三区蜜桃| www.se五月| 91av亚洲| 婷婷丁香久久五月婷婷| 国产又粗又长又爽视频| 日本a在线播放| 91视频国产观看| 激情欧美一区二区三区中文字幕| av网站在线免费看| 狠狠色丁香婷婷综合| 国产精品96久久久久久| 国产69精品久久久久久久久久| 亚洲高清影视| 久久久www成人免费精品张筱雨| 亚洲精品成人无码| 国产成人精品999在线观看| 亚洲黄色有码视频| 小毛片在线观看| www国产精品| 精品久久久久久久久久久院品网| 欧美体内she精高潮| 伊人久久大香| 在线不卡中文字幕播放| 亚洲欧美日韩精品一区| 国产精品无码久久久久| 欧美视频三区在线播放| 亚洲视频在线观看一区二区三区| 老司机2019福利精品视频导航| 午夜国产不卡在线观看视频| 亚洲 欧美 日韩 国产综合 在线| heyzo一区| 亚洲国产欧美在线| 亚洲精品无码国产| 亚洲性受xxx喷奶水| 欧美特级www| 精品久久久久久久无码| 99久久亚洲国产日韩美女| 欧美视频一区二区三区四区| www.99r| 激情小说亚洲| 日韩欧美成人午夜| 制服丝袜第二页| 精品视频99| 久久久国产精品一区| 91成人福利视频| 欧美日韩一区二区三区四区在线观看| 久久久久久亚洲精品| 91蜜桃视频在线观看| 免费视频一区二区三区在线观看| 国产精品99导航| 国产欧美第一页| 成人午夜视频福利| 欧洲成人一区二区| av免费网站在线| 无吗不卡中文字幕| 国产又猛又黄的视频| 欧美特黄不卡| 日韩精品在线播放| 永久av免费网站| 亚洲人人精品| 国产精品视频免费在线| 午夜精品久久久久久久爽| 91丨porny丨中文| 三年中文高清在线观看第6集| av2020不卡| 欧美视频精品在线| 日韩综合第一页| 日韩电影免费网址| 久久久亚洲天堂| 中文字幕乱码在线观看| 成人福利视频在线看| 日韩hmxxxx| 黄色成人在线网| 欧美色视频一区| 日本一级大毛片a一| 欧洲grand老妇人| 久久久视频在线| 亚洲天堂视频在线| 99久久国产综合精品色伊| 宅男av一区二区三区| 黄在线观看免费网站ktv| 欧美挠脚心视频网站| 中文在线一区二区三区| 中文字幕午夜精品一区二区三区| 午夜精品福利在线观看| 国产成人精品白浆久久69| 久久精品免费在线观看| 91专区在线观看| 日韩高清二区| 精品久久久av| 亚洲精品久久久久久久蜜桃| 99久久精品国产网站| 国产女主播av| 99精品美女视频在线观看热舞| 亚洲女人天堂网| 日本中文字幕在线免费观看| 国产又粗又猛又爽又黄91精品| 久久影院理伦片| 国产不卡123| 精品少妇一区二区三区| 91麻豆免费视频网站| 蜜臀av性久久久久蜜臀aⅴ| 欧美不卡在线一区二区三区| 国产福利在线免费观看| 日韩欧美国产系列| www欧美com| 国产乱码精品一区二区三区忘忧草 | 福利一区二区在线| 日韩精品一区二区三区电影| 99九九久久| 色老头一区二区三区在线观看| 国产美女激情视频| 久久综合狠狠综合久久综合88| 成年人午夜免费视频| 精品亚洲免a| 久久久久久久一区二区三区| 亚洲女同志亚洲女同女播放| 亚洲综合另类小说| 日本性生活一级片| 99在线|亚洲一区二区| 国产私拍一区| 在线免费三级电影网站| 日韩精品欧美国产精品忘忧草 | 3d动漫精品啪啪| 美国一级片在线观看| 久久99在线观看| 综合色婷婷一区二区亚洲欧美国产| 黄页免费欧美| 美日韩丰满少妇在线观看| 99久久久久久久| 亚洲午夜在线视频| av网站有哪些| 奇米影视在线99精品| 亚洲综合五月天| 欧州一区二区三区| 久久久久亚洲精品国产| 亚洲人视频在线观看| 欧美日韩亚洲系列| 极品人妻videosss人妻| 老司机一区二区| 日韩a级黄色片| 亚洲精品3区| 国产欧美韩国高清| 手机电影在线观看| 日韩国产中文字幕| 艳妇乳肉豪妇荡乳av| 亚洲精品视频观看| 一起草在线视频| 日本免费在线视频不卡一不卡二| mm131午夜| 欧美有码在线| 成人av色在线观看| 成人福利电影| 在线视频亚洲欧美| www.97av| 在线观看一区日韩| 国模无码国产精品视频| 91啪九色porn原创视频在线观看| 爱情岛论坛vip永久入口| 一区二区三区毛片免费| 鲁鲁狠狠狠7777一区二区| 久久精品xxxxx| 国模视频一区二区三区| av电影在线播放高清免费观看| 日韩精品最新网址| 亚洲国产精品无码久久久| 亚洲日本一区二区三区| 亚洲欧美色图视频| 国产一区二区三区在线观看免费| 亚洲 高清 成人 动漫| 91欧美在线| 欧美日本韩国一区二区三区| 99久久99九九99九九九| 秋霞午夜一区二区| 免费网站在线观看人| 一区二区三区四区精品| 日本韩国在线观看| 6080日韩午夜伦伦午夜伦| 黄色在线免费观看| 亚洲国产一区二区a毛片| 日本视频在线免费| 久久亚洲二区三区| 91人妻一区二区| 久久99精品久久只有精品| 青青草视频在线免费播放| 久久精品亚洲人成影院| 日韩欧美三级电影| 欧美亚洲色图校园春色| 99re在线视频观看| 日韩免费在线电影| 国产精品久久久久久久久久| 国产理论在线| 欧美激情xxxxx| 国产精品久久久久久福利| 亚洲视频精品在线| 涩爱av在线播放一区二区| 精品噜噜噜噜久久久久久久久试看| 一级黄色片在线看| 欧美日韩一区二区三区在线 | 欧美韩日亚洲| 大量国产精品视频| 久cao在线| 日韩亚洲欧美成人| 在线视频1区2区| 伊是香蕉大人久久| jizz在线免费观看| 中文字幕亚洲天堂| av网站在线免费观看| 国产午夜精品全部视频播放| 色吊丝在线永久观看最新版本| 亚洲精品动漫100p| 熟妇人妻中文av无码| 亚洲成人黄色在线| 秋霞视频一区二区| 亚洲黄色在线观看| 日本私人网站在线观看| 日韩经典中文字幕在线观看| 外国精品视频在线观看 | 正在播放国产对白害羞| 亚洲国产精品激情在线观看| 国产熟女一区二区| 久久亚洲综合色| 怡红院一区二区三区| 国产欧美日韩三级| 一本一本久久a久久| 亚洲婷婷在线视频| 欧美成人三级在线观看| 亚洲一区二区三区视频在线播放 | 在线国产电影不卡| 亚洲最新av网站| 欧美不卡视频一区| 天天色综合久久| 亚洲欧美日韩精品久久亚洲区| 国产免费a∨片在线观看不卡| 一本色道久久88综合日韩精品| 在线观看黄色av| 欧美日韩福利在线观看| 2021中文字幕在线| 国产aaa精品| 中文字幕日韩亚洲| 韩国一区二区三区美女美女秀 | 久久久久久久久久久久久久久99| 欧美成人国产精品一区二区| 国产精品视频线看| 黄色一级片在线| 疯狂蹂躏欧美一区二区精品| 黄色一区二区视频| 日韩午夜三级在线| 三级视频在线| 日韩在线一区二区三区免费视频| 18视频在线观看| 日韩免费高清在线观看| 996久久国产精品线观看| 国产一区再线| 久久精品国产大片免费观看| 免费网站在线观看视频 | 五月婷婷色综合| 在线视频播放大全| 精品成人一区二区三区四区| 国产在线电影| 欧美激情一区二区久久久| 日韩电影免费观看高清完整版| 亚洲一区二区三区久久| 亚洲涩涩av| 800av在线免费观看| 日韩不卡在线观看日韩不卡视频| 自拍一级黄色片| 国产天堂亚洲国产碰碰| 久久成人国产精品入口| 欧洲激情一区二区| 欧美视频久久久| 久久精品视频播放| xx欧美视频| 国产高清自拍一区| 久久社区一区| 国产l精品国产亚洲区久久| 国产乱理伦片在线观看夜一区 | 国产欧美一区| 精品无码国模私拍视频| 国产剧情一区二区| 国产一区二区三区四区在线| 婷婷成人综合网| 亚洲精品国产av| 久久影院免费观看| 美女色狠狠久久| 欧美人xxxxx| 亚洲精品黄色| 国产亚洲精品成人a| 亚洲色图丝袜美腿| 一级aaaa毛片| 一区二区三区四区精品| 国产高清不卡| 国产日产精品一区二区三区四区| 久久精品国内一区二区三区水蜜桃| 爱情岛论坛成人| 国产丝袜欧美中文另类| 日韩免费视频一区二区视频在线观看| 日韩欧美高清dvd碟片| 国产黄色小视频在线| 国产精品偷伦免费视频观看的| 色综合综合色| 日本精品久久久久中文字幕| 99久久精品国产一区| 久草国产精品视频| 亚洲国产精品久久久久秋霞不卡| 性国产高清在线观看| 91手机在线播放| 女生裸体视频一区二区三区| 亚洲怡红院在线| 亚洲色图视频网站| 国产情侣在线播放| 久久精品中文字幕电影| av日韩久久| 亚洲五码在线观看视频| 国产传媒欧美日韩成人| 在线免费日韩av| 欧美第一区第二区| av中文字幕在线观看第一页 | 日韩中文欧美| 97人人爽人人| 一区二区三区在线看| 性一交一乱一乱一视频| 欧美福利视频在线| 8x国产一区二区三区精品推荐| 久久手机在线视频| 成人av网址在线| 少妇太紧太爽又黄又硬又爽| 亚洲欧美一区二区三区久久 | 国产一二三四区在线| 欧美三级电影网| a篇片在线观看网站| 亚洲一区亚洲二区| 亚洲承认在线| 久久精品成人av| 欧美日韩一区二区三区四区| 九七久久人人| 91亚洲国产成人精品性色| 欧美1区免费| 久久人人爽人人人人片| 91久久一区二区| 看女生喷水的网站在线观看| 97神马电影| 性久久久久久| 亚洲欧洲综合网| 精品国内二区三区| 人人视频精品| 国产经典久久久| 91丨porny丨中文| 97人妻人人澡人人爽人人精品 | a级网站在线观看| av中文字幕亚洲| 中文字幕在线观看欧美| 色中色综合影院手机版在线观看| 日韩mv欧美mv国产网站| 91看片在线免费观看| 亚洲在线一区二区三区| 黄色美女网站在线观看| 亚洲a级在线播放观看| 国产一区白浆| 免费成人深夜夜行网站| 亚洲精品久久久久国产| 国产精品久久久久77777丨| 奇米777四色影视在线看| 久久婷婷久久一区二区三区| 国产视频手机在线观看| 欧美一级淫片aaaaaaa视频| 91亚洲一区| 久久精品国产亚洲av麻豆| 91精品国产色综合久久ai换脸| 在线观看爽视频| 99国产精品白浆在线观看免费| 中文字幕电影一区| 无码国产精品96久久久久|