在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網(wǎng)>源碼下載>數(shù)值算法/人工智能>

Mesos高可用集群解決方案

大小:0.7 MB 人氣: 2017-10-10 需要積分:1
 作者:王勇橋,80后的IT攻城獅,供職于IBM多年,Mesos和Swarm社區(qū)的貢獻者。
  責編:魏偉,歡迎投稿和咨詢報道,詳情聯(lián)系[email protected]
  本文節(jié)選自 《程序員》,謝絕轉載,更多精彩,請 訂閱《程序員》
  CSDN Docker專家群已經(jīng)建立,還等什么,加入我們吧:微信搜索“ k15751091376”
  本文系作者根據(jù)自己對Mesos的高可用(High-Availability)設計方案的了解以及在Mesos社區(qū)貢獻的經(jīng)驗,深度剖析了Mesos集群高可用的解決方案,以及對未來的展望。
  Mesos高可用架構概述
  首先,我們來參考Mesos官方的設計架構,如圖1所示。
  Mesos高可用集群解決方案
  圖1 Mesos設計架構(官方)
  Mesos采用的也是現(xiàn)在分布式集群中比較流行的Master/Slave主從集群管理架構,Mesos master節(jié)點是整個集群的中樞,它責管理和分配整個Mesos集群的計算資源,調度上層Framework提交的任務,管理和分發(fā)所有任務的狀態(tài)。這種主從架構設計簡單,能夠滿足大多數(shù)正常情況下的集群運作需求,目前仍然存在于很多分布式的系統(tǒng)中,比如Hadoop、MySQL集群等。但是這種簡單的設計存在一個致命缺陷,就是Mesos master必須做為一個服務程序持續(xù)存在于集群中,它雖然孤立,但是地位舉足輕重,不容有失。
  在單個Mesos master節(jié)點的集群中,如果Mesos master節(jié)點故障,或者服務不可用,雖然在每一個Slave節(jié)點上的任務可以繼續(xù)運行,但是集群中新的資源將無法再分配給上層Framework,上層Framework將無法再利用已經(jīng)收到的offer提交新任務,并且無法收到正在運行任務的狀態(tài)更新。為了解決這個問題,提高Mesos集群的高可用性,減少Mesos master節(jié)點故障所帶來的影響,Mesos集群采用了傳統(tǒng)的主備冗余模式(Active-Standby)來支持一個Mesos集群中部署多個Mesos master節(jié)點,借助于ZooKeeper進行Leader的選舉。選舉出的Leader負責將集群的資源以契約(offer)的形式發(fā)送給上層的每一個Framework,并處理集群管理員與上層Framework的請求,另外幾個Mesos master節(jié)點將作為Follower一直處于備用狀態(tài),并監(jiān)控當前的狀態(tài),當Mesos master節(jié)點宕機,或服務中斷之后,新Leader將會很快從Follower中選出來接管所有的服務,減少了Mesos集群服務的宕機時間,大大提高集群可用性。
  Mesos高可用集群部署
  在Mesos高可用設計中,引入了ZooKeeper集群來輔助Leader的選舉,這在當前的分布式集群中比較流行,比如Docker Swarm高可用集群同時支持利用consul、etcd、ZooKeeper進行Leader的選舉,Kubernetes也采用了etcd等實現(xiàn)了自身的高可用。這種設計可以理解為大集群+小集群,小集群也就是ZooKeeper/etcd/consul集群,它們?yōu)榇蠹悍眨热缣峁㎜eader的選舉,為大集群提供配置數(shù)據(jù)的存儲和服務發(fā)現(xiàn)等功能。在一個復雜的系統(tǒng)中,這個小集群可以為系統(tǒng)的多個服務組件同時提供服務。因此在部署高可用Mesos集群時,必須首先部署好一個ZooKeeper集群。
  本文主要介紹Mesos的高可用,不會詳細介紹ZooKeeper的相關知識你可以參考官方文檔(https://ZooKeeper.apache.org/)來部署。為了使讀者可以快速搭建它們自己的Mesos高可用集群,我們將使用Docker的方式在zhost1.wyq.com(9.111.255.10),zhost2.wyq.com(9.111.254.41)和zhost3.wyq.com(9.111.255.50)機器上快速的搭建起一個具有三個節(jié)點的演示ZooKeeper集群,它們的服務端口都是默認的2181。
  登錄zhost1.wyq.com機器,執(zhí)行如下命令啟動第一個server:
  # docker run -d \
  -e MYID=1 \
  -e SERVERS=9.111.255.10,9.111.254.41,9.111.255.50 \
  --name=zookeeper \
  --net=host \
  --restart=always \
  mesoscloud/zookeeper
  登錄zhost2.wyq.com機器,執(zhí)行如下命令啟動第二個server:
  # docker run -d \
  -e MYID=2 \
  -e SERVERS=9.111.255.10,9.111.254.41,9.111.255.50 \
  --name=zookeeper \
  --net=host \
  --restart=always \
  mesoscloud/zookeeper
  登錄zhost3.wyq.com機器,執(zhí)行如下命令啟動第三個server:
  # docker run -d \
  -e MYID=3 \
  -e SERVERS=9.111.255.10,9.111.254.41,9.111.255.50 \
  --name=zookeeper \
  --net=host \
  --restart=always \
  mesoscloud/zookeeper
  ZooKeeper集群搭建好之后,執(zhí)行以下命令,通過指定一個不存在的znode的路徑/mesos來啟動所有的Mesos master,Mesos slave和Framework。
  登陸每一個Mesos master機器,執(zhí)行以下命令,在Docker中啟動所有的Mesos master:
  # docker run -d \
  --name mesos-master \
  --net host mesosphere/mesos-master \
  --quorum=2 \
  --work_dir=/var/log/mesos \
  --zk= zk://zhost1.wyq.com:2181,zhost2.wyq.com:2181,zhost3.wyq.com:2181/mesos
  登陸每一個Mesos Agent機器,執(zhí)行以下命令,在Docker中啟動所有的Mesos agent:
  # docker run -d \
  --privileged \
  -v /var/run/docker.sock:/var/run/docker.sock \
  --name mesos-agent \
  --net host gradywang/mesos-agent \
  --work_dir=/var/log/mesos \
  --containerizers=mesos,docker \
  --master= zk://zhost1.wyq.com:2181,zhost2.wyq.com:2181,zhost3.wyq.com:2181/mesos
  注意:Mesosphere官方所提供的Mesos Agent鏡像mesosphere/mesos-agent不支持Docker的容器化,所以作者在官方鏡像的基礎至上創(chuàng)建了一個新的鏡像gradywang/mesos-agent來同時支持Mesos和Docker的虛擬化技術。
  使用相同的znode路徑來啟動framework,例如我們利用Docker的方式來啟動Docker Swarm,讓它運行在Mesos之上:
  $ docker run -d \
  --net=host gradywang/swarm-mesos \
  --debug manage \
  -c mesos-experimental \
  --cluster-opt mesos.address=9.111.255.10 \
  --cluster-opt mesos.tasktimeout=10m \
  --cluster-opt mesos.user=root \
  --cluster-opt mesos.offertimeout=1m \
  --cluster-opt mesos.port=3375 \
  --host=0.0.0.0:4375 zk://zhost1.wyq.com:2181,zhost2.wyq.com:2181,zhost3.wyq.com:2181/mesos
  注:mesos.address和mesos.port是Mesos scheduler的監(jiān)聽的服務地址和端口,也就是你啟動Swarm的機器的IP地址和一個可用的端口。個人感覺這個變量的命名不是很好,不能見名知意。
  用上邊的啟動配置方式,所有的Mesos master節(jié)點會通過ZooKeeper進行Leader的選舉,所有的Mesos slave節(jié)點和Framework都會和ZooKeeper進行通信,獲取當前的Mesos master Leader,并且會一直檢測Master節(jié)點的變化。當Leader故障時,ZooKeeper會第一時間選出新Leader,然后所有的Slave節(jié)點和Framework都會獲取到新Leader進行重新注冊。
  ZooKeeper Leader的選舉機制
  根據(jù)ZooKeeper官方推薦的Leader選舉機制:首先指定一個Znode,如上例中的/mesos(強烈建議指定一個不存在的Znode路徑),然后使用SEQUENCE和EPHEMERAL標志為每一個要競選的client創(chuàng)建一個Znode,例如/mesos/guid_n來代表這個client。
  當為某個Znode節(jié)點設置SEQUENCE標志時,ZooKeeper會在其名稱后追加一個自增序號,這個序列號要比最近一次在同一個目錄下加入的znode的序列號大。具體做法首先需要在ZooKeeper中創(chuàng)建一個父Znode,比如上節(jié)中指定的/mesos,然后指定SEQUENCE|EPHEMERAL標志為每一個Mesos master節(jié)點創(chuàng)建一個子的Znode,比如/mesos/znode-index,并在名稱之后追加自增的序列號。
  當為某個Znode節(jié)點設置EPHEMERAL標志時,當這個節(jié)點所屬的客戶端和ZooKeeper之間的seesion斷開之后,這個節(jié)點將會被ZooKeeper自動刪除。
  ZooKeeper的選舉機制就是在父Znode(比如/mesos)下的子Znode中選出序列號最小的作為Leader。同時,ZooKeeper提供了監(jiān)視(watch)的機制,其他的非master節(jié)點會不斷監(jiān)視當前的Leader所對應的Znode,如果它被刪除,則觸發(fā)新一輪的選舉。有兩種做法:
  所有的非Leader client監(jiān)視當前Leader對應的Znode(也就是序列號最小的Znode),當它被ZooKeeper刪除的時候,所有監(jiān)視它的客戶端會立即收到通知,然后調用API查詢所有在父目錄(/mesos)下的子節(jié)點,如果它對應的序列號是最小的,則這個client會成為新的Leader對外提供服務,然后其他客戶端繼續(xù)監(jiān)視這個新Leader對應的Znode。這種方式會觸發(fā)“羊群效應”,特別是在選舉集群比較大的時候,在新一輪選舉開始時,所有的客戶端都會調用ZooKeeper的API查詢所有的子Znode來決定誰是下一個Leader,這個時候情況就更為明顯。
  為了避免“羊群效應”,ZooKeeper建議每一個非Leader的client監(jiān)視集群中對應的比自己節(jié)點序小一號的節(jié)點(也就是所有序號比自己小的節(jié)點中的序號最大的節(jié)點)。只有當某個client所設置的watch被觸發(fā)時,它才進行Leader選舉操作:查詢所有的子節(jié)點,看自己是不是序號最小的,如果是,那么它將成為新的Leader。如果不是,繼續(xù)監(jiān)視。此 Leader選舉操作的速度是很快的。因為每一次選舉幾乎只涉及單個client的操作。
  Mesos高可用實現(xiàn)細節(jié)
  Mesos主要通過contender和detector兩個模塊來實現(xiàn)高可用,架構如圖2所示。
  Mesos高可用集群解決方案
  圖2 Mesos的contender和detector模塊架構圖
  Contender模塊用來進行Leader選舉,它負責把每個Master節(jié)點加入到選舉的Group中(作為/mesos目錄下的一個子節(jié)點),組中每個節(jié)點都會有一個序列號,根據(jù)上文對ZooKeeper選舉機制的介紹,組中序列號最小的節(jié)點將被選舉為Leader。
  以上文例子為例(假設作者部署了三個節(jié)點的Mesos master),可以查看ZooKeeper的存儲來加以驗證。
  登錄到ZooKeeper集群中的某一個節(jié)點,執(zhí)行如下命令鏈接到集群中的某個節(jié)點,查看這個Group:
  # docker ps
  CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  a6fab50e2689 mesoscloud/zookeeper “/entrypoint.sh zkSer” 50 minutes ago Up 49 minutes zookeeper
  # docker exec -it a6fab50e2689 /bin/bash
  # cd /opt/zookeeper/bin/
  # 。/zkCli.sh -server 9.111.255.10:2181
  [zk: 9.111.255.10:2181(CONNECTED) 0] ls /mesos
  [json.info_0000000003, json.info_0000000004, json.info_0000000002, log_replicas]
  我們可以看到在/mesos目錄下有三個帶有后綴序號的子節(jié)點,序號值最小的節(jié)點將作為master節(jié)點,查看序號最小的節(jié)點json.info_0000000002的內容如下:
  [zk: 9.111.255.10:2181(CONNECTED) 1] get /mesos/json.info_0000000002
  {“address”:{“hostname”:“gradyhost1.eng.platformlab.ibm.com”,“ip”:“9.111.255.10”,“port”:5050},“hostname”:“gradyhost1.eng.platformlab.ibm.com”,“id”:“93519a55-4089-436c-bc07-f7154ec87c79”,“ip”:184512265,“pid”:“[email protected]:5050”,“port”:5050,“version”:“0.28.0”}
  cZxid = 0x100000018
  ctime = Sun May 22 08:42:10 UTC 2016
  mZxid = 0x100000018
  mtime = Sun May 22 08:42:10 UTC 2016
  pZxid = 0x100000018
  cversion = 0
  dataVersion = 0
  aclVersion = 0
  ephemeralOwner = 0x254d789b5c20003
  dataLength = 264
  numChildren = 0
  根據(jù)查詢結果,當前的Mesos master節(jié)點是
  gradyhost1.eng.platformlab.ibm.com。
  Detector模塊用來感知當前的master是誰,它主要利用ZooKeeper中的watcher的機制來監(jiān)控選舉的Group(/mesos目錄下的子節(jié)點)的變化。ZooKeeper提供了getChildren()應用程序接口,此接口可以用來監(jiān)控一個目錄下子節(jié)點的變化,如果一個新子節(jié)點加入或者原來的節(jié)點被刪除,那么這個函數(shù)調用會立即返回當前目錄下的所有節(jié)點,然后Detector模塊可以挑選序號最小的作為master節(jié)點。
  每一個Mesos master會同時使用Contender和Detector模塊,用Contender進行master競選。在master節(jié)點上使用Detector模塊的原因是在Mesos的高可用集群中,你可以使用任意一個master節(jié)點的地址和端口來訪問Mesos的WebUI,當訪問一個Replica節(jié)點時,Mesos會把這個瀏覽器的鏈接請求自動轉發(fā)到通過Detector模塊探測到的master節(jié)點上。
  其他的Mesos組件,例如Mesos Agent,F(xiàn)ramework scheduler driver會使用Detector模塊來獲取當前的Mesos master,然后向它注冊,當master發(fā)送變化時,Detecor模塊會第一時間通知,它們會重新注冊(re-register)。
  由于IBM在Mesos社區(qū)的推動,在MESOS-4610項目中,Mesos Contender和Detector已經(jīng)可以支持以插件的方式進行加載。現(xiàn)在Mesos社區(qū)官方僅支持用Zookeeper集群進行Leader選舉,在支持了插件的方式加載后,用戶可以實現(xiàn)自己的插件,用另外的方式比如選擇用etcd(MESOS-1806)、consule(MESOS-3797)等集群進行Leader選舉。
  注意:現(xiàn)在Mesos僅用ZooKeeper進行Leader的選舉,并沒有用它進行數(shù)據(jù)的共享。在Mesos中有一個Replicated Log模塊,負責進行多個master之間的數(shù)據(jù)共享、同步等。可以參考Mesos官方文檔獲取詳細設計(http://mesos.apache.org/documentation/latest/replicated-log-internals/)。同時為了使Mesos的高可用不依賴與一個第三方的集群,現(xiàn)在社區(qū)正在考慮用Replicated log替代第三方集群進行Leader選舉,具體進度可以參考MESOS-3574項目。
  Mesos master recovery
  在Mesos設計中,master除了要在Replicated log中持久化一些集群配置信息(例如Weights、Quota等),0集群maintenance的狀態(tài)和已經(jīng)注冊的Agent的信息外,基本上被設計為無狀態(tài)的。master發(fā)生failover,新的master選舉出來之后:
  它會首先從Replicated log中恢復之前的狀態(tài),目前Mesos master會從Replicated log中recover以下信息。
  Mesos集群的配置信息,例如weights,quota等。這些配置信息是Mesos集群的管理員通過HTTP endpoints來配置的。
  集群的Maintenance信息。
  之前注冊的所有的Agent信息(SlaveInfo)。
  同時master會為Agents 的重新注冊(re-register)設置一個超時時間(這個參數(shù)通過master的slave_reregister_timeout flag進行配置,默認值為10分鐘),如果某些Agents在這個時間內沒有向新master重新注冊,將會從Replicated log中刪除,這些Agents將不能以原來的身份(相同的SlaveId)重新注冊到新的Mesos master,其之前運行的任務將全部丟失。如果這個Agent想再次注冊,必須以新的身份。同時為了對生產(chǎn)環(huán)境提供安全保證,避免在failover之后,大量的Agents從Replicated log中刪除進而導致丟失重要的運行任務,Mesos master提供了另外一個重要的flag配置recovery_slave_removal_limit,用來設置一個百分比的限制,默認值為100%,避免過多的Agents在failover之后被刪除,如果將要刪除的Agents超過了這個百分比,那么這個Mesos master將會自殺(一般的,在一個生產(chǎn)環(huán)境中,Mesos的進程將會被Systemd或者其他進程管理程序進行監(jiān)管,如果Mesos服務進程退出,那么這個監(jiān)管程序會自動再次啟動Mesos服務)。而不是把那些Agents從Replicated log中刪除,這會觸發(fā)下一次的failover,多次failover不成功,就需要人為干預。
  另外,新的Mesos master選舉出來之后,所有之前注冊的Mesos agents會通過detector模塊獲取新的master信息,進而重新注冊,同時上報它們的checkpointed資源,運行的executors和tasks信息,以及所有tasks完成的Framework信息,幫助新master恢復之前的運行時內存狀態(tài)。同樣的原理,之前注冊的Framework也會通過detector模塊獲取到新的Master信息,向新master重新注冊,成功之后,會獲取之前運行任務的狀態(tài)更新以及新的offers。
  注意:如果在failover之后,之前注冊并且運行了任務的Frameworks沒有重新注冊,那么它之前運行的任務將會變成孤兒任務,特別對于哪些永久運行的任務,將會一直運行下去,Mesos目前沒有提供一種自動化的機制來處理這些孤兒任務,比如在等待一段時間之后,如果Framework沒有重新注冊,則把這些孤兒任務殺掉。現(xiàn)在社區(qū)向通過類似Mesos Agents的邏輯,來持久化Framework info,同時設置一個超時的配置,來清除這些孤兒任務。具體可以參見MESOS-1719。
  Mesos Agent健康檢查
  Mesos master現(xiàn)在通過兩種機制來監(jiān)控已經(jīng)注冊的Mesos Agents健康狀況和可用性:
  Mesos master會持久化和每個Agent之間的TCP的鏈接,如果某個Agent服務宕機,那么master會第一時間感知到,然后:
  1-1. 把這個Agent設為休眠狀態(tài),Agent上的資源將不會再offer給上層Framework。
  1-2. 觸發(fā)rescind offer,把這個Agent已經(jīng)offer給上層Framework的offer撤銷。
  1-3. 觸發(fā)rescind inverse offer,把inverse offer撤銷。
  同時,Mesos master會不斷的向每一個Mesos Agent發(fā)送ping消息,如果在設定時間內(由flag.slave_ping_timeout配置,默認值為15s)沒有收到對應Agent的回復,并且達到了一定的次數(shù)(由flag. max_slave_ping_timeouts 配置,默認值為5),那么Mesos master會:
  2-1. 把這個Agent從master中刪除,這時資源將不會再offer給上層的Framework。
  2-2. 遍歷這個Agent上運行的所有的任務,向對應的Framework發(fā)送TASK_LOST狀態(tài)更新,同時把這些任務從master刪除。
  2-3. 遍歷Agent上的所有executor,把這些executor刪除。
  2-4. 觸發(fā)rescind offer,把這個Agent上已經(jīng)offer給上層Framework的offer撤銷。
  2-5. 觸發(fā)rescind inverse offer,把inverse offer撤銷。
  2-6. 把這個Agent從master的Replicated log中刪除。
  Mesos Framework健康檢查
  同樣的原理,Mesos master仍然會持久化和每一個Mesos Framework scheculer之間的TCP的連接,如果某一個Mesos Framework服務宕機,那么master會第一時間感知,然后:
  把這個Framework設置為休眠狀態(tài),這時Mesos master將不會在把資源offer給這個Framework 。
  觸發(fā)rescind offer,把這個Framework上已經(jīng)收到的offer撤銷。
  觸發(fā)rescind inverse offer,把這個Framework上已經(jīng)收到的inverse offer撤銷。
  獲取這個Framework注冊的時候設置自己的failover時間(通過Framework info中的failover_timeout參數(shù)設置),創(chuàng)建一個定時器。如果在這個超時時間之內,F(xiàn)ramework沒有重新注冊,則Mesos master會把Framework刪除:
  4-1. 向所有注冊的Slave發(fā)送刪除此Framework的消息。
  4-2. 清除Framework上還沒有執(zhí)行的task請求。
  4-3. 遍歷Framework提交的并且正在運行的任務,發(fā)送TASK_KILLED消息,并且把task從Mesos master和對應的Agent上刪除。
  4-4. 觸發(fā)rescind offer,把這個Framework上已經(jīng)收到的offer撤銷。
  4-5. 觸發(fā)rescind inverse offer,把Framework上已經(jīng)收到的inverse offer撤銷。
  4-6. 清除Framework對應的role。
  4-7. 把Framework從Mesos master中刪除。
  未來展望
  從我個人的角度看,Mesos高可用這個功能應該做如下增強。
  現(xiàn)在的設計中,Mesos的高可用必須依賴一個外部的ZooKeeper集群,增加了部署和維護的復雜度,并且目前這個集群只是用來做Leader選舉,并沒有幫助Mesos master節(jié)點之間存儲和共享配置信息,例如Weights、Quota等。社區(qū)現(xiàn)在已經(jīng)發(fā)起了一個新項目MESOS-3574,將研究和實現(xiàn)用Replicated log來替代ZooKeeper,幫助Mesos master選舉和發(fā)現(xiàn)Leader。個人認為價值比較大,它實現(xiàn)之后,可以大大簡化Mesos高可用架構的復雜度。
  現(xiàn)在ZooKeeper作為搭建Mesos高可用集群的唯一選擇,可能在比較大的集成系統(tǒng)中不合時宜,在IBM工程師的推動下,社區(qū)已經(jīng)將和Mesos高可用的兩個模塊Contender和Detector插件化,用戶可以實現(xiàn)自己的插件來進行Mesos master的選舉和發(fā)現(xiàn),已經(jīng)實現(xiàn)了對etcd的支持。感興趣的同學可以參考MESOS-1806項目。
  另外,Mesos現(xiàn)在這個高可用的設計采用了最簡單的Active-standby模式,也就是說只有當前的Mesos master在工作,其他的candidate將不會做任何事情,這會導致資源的浪費。另外在特別大的Mesos集群中,master candidates并不能提供負載均衡。未來是不是可以考慮將Mesos高可用修改為Active-Active模式,比如讓master candidates可以幫助處理一些查詢的請求,同時可以幫助轉發(fā)一些寫請求到當前的master上,來提高整個集群的性能和資源利用率。
?

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

Mesos高可用集群解決方案下載

相關電子資料下載

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關規(guī)定!

      ?
      主站蜘蛛池模板: 视频在线观看免费网站 | 色wwwww | 婷婷亚洲综合五月天小说在线 | 欧美视频亚洲色图 | 亚洲精品美女在线观看 | 国产精品igao在线观看樱花日本 | 免费一区二区视频 | 国产综合色在线视频区色吧图片 | 色吧在线观看 | 一级一片免费播放 | 天堂网在线最新版www | 最新久久免费视频 | 亚洲第一区精品日韩在线播放 | 成人午夜性a一级毛片美女 成人午夜性视频欧美成人 成人小视频在线 | 日韩a级毛片 | 欧美日韩精品一区二区另类 | 日本国产在线 | 日本成人免费 | 在线电影亚洲 | 宅男在线看片 | 亚洲黄网站wwwwww | 在线资源天堂 | 亚洲成av人影片在线观看 | 日本黄色网页 | tv电影天堂| 91网站免费在线观看 | 色视频大全 | 老师受不了了好硬好大 | 日韩porn| 天天拍夜夜添久久精品免费 | 国产人成精品香港三级古代 | 韩国最新三级网站在线播放 | 亚洲成人免费看 | 亚洲天堂视频一区 | 天天干天天操天天添 | 天天爽天天干天天操 | 午夜影院在线视频 | 国产伦精品一区二区三区高清 | 黄网站在线观看永久免费 | 综合激情网五月 | 色骚综合 |