国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > PHP > 正文

ceph管理平臺Calamari的擴(kuò)展開發(fā)_PHP教程

2020-03-24 18:12:08
字體:
供稿:網(wǎng)友
ceph管理平臺Calamari的擴(kuò)展開發(fā)
接近大半年沒有寫日志了,也許是自己越來越懶惰吧。但有時(shí)候?qū)憣憱|西能夠讓自己沉淀,還是回來記錄一下吧。入職大半年了,熟悉了一些相關(guān)的工作,目前主要從事分布式系統(tǒng)的研究和開發(fā),目前的開發(fā)主要是停留在管理層面的開發(fā),還未到達(dá)修改代碼。這半年的時(shí)間熟悉了兩款非常不錯(cuò)的分布式系統(tǒng)glusterfs和Ceph。兩款分布式存儲產(chǎn)品各有優(yōu)勢,其中Glusterfs提供的文件服務(wù)是Ceph系統(tǒng)無法提供的。而Ceph的塊設(shè)備、對象存儲、文件系統(tǒng)統(tǒng)一的架構(gòu)也是GlusterFs無法滿足的。因此各有優(yōu)勢。

從代碼層面來說,GlusterFs的代碼比較簡單,層次比較明顯,堆棧式的處理流程非常清晰。非常容易實(shí)現(xiàn)文件系統(tǒng)的功能擴(kuò)展(在客戶端服務(wù)器端添加處理模塊即可),雖然服務(wù)器端、客戶端代碼是一份代碼,但整體而言代碼比較清晰,代碼量較少。

而Ceph采用C++開發(fā),而且系統(tǒng)本身存在多個(gè)進(jìn)程,多個(gè)進(jìn)程構(gòu)成一個(gè)大的集群,而集群內(nèi)部也存在小的集群,相對Glusterfs而言,代碼要復(fù)雜的多,同時(shí)Ceph自身實(shí)現(xiàn)了自我調(diào)整和自我修復(fù)。支持軟件系統(tǒng)的定制,通過Crush算法查找到對象的存儲位置。

就目前的熱度而言Ceph比較火,但是文件系統(tǒng)的提供,Glusterfs還是不錯(cuò)的選擇。

最近在從事Ceph的相關(guān)管理平臺開發(fā)工作,熟悉了官方提供的Calamari平臺,該平臺目前主要提供了Ceph分布式存儲系統(tǒng)的管理工作,整體上主要是提供了頁面管理Ceph的手段。從目前的實(shí)現(xiàn)角度來看,該平臺還存在一定的局限性,不能完成強(qiáng)大的功能,或者說目前提供的版本只能提供一些基本的功能。但是Calamari的框架確實(shí)非常不錯(cuò)的。Ceph屬于開源軟件,Calamari也是開源軟件,而且Calamari是由一系列的開源軟件組合而言,這些開源軟件都只完成了其特定的功能。雖然是拼湊,但整體而言,該管理平臺的框架是值得借鑒的。
以下部分參考http://www.openstack.cn/?p=2708。
Calamari的架構(gòu)圖

其中紅框部分為Calamari代碼實(shí)現(xiàn)的部分,非紅框部分為非Calamari實(shí)現(xiàn)的開源框架。

在Cephserver node安裝的組件有Diamond和Salt-minion。Diamond負(fù)責(zé)收集監(jiān)控?cái)?shù)據(jù),它支持非常多的數(shù)據(jù)類型和metrics;每一個(gè)類型的數(shù)據(jù)都是上圖中的一個(gè)collector,它除了收集Ceph本身的狀態(tài)信息,它還可以收集關(guān)鍵的資源使用情況和性能數(shù)據(jù),包括CPU,內(nèi)存,網(wǎng)絡(luò),I / O負(fù)載和磁盤指標(biāo)。Collector都是使用本地的命令行來收集數(shù)據(jù),然后報(bào)告給Graphite。

Graphite不僅是一個(gè)企業(yè)級的監(jiān)控工具, 還可以實(shí)時(shí)繪圖。carbon-cache是Python實(shí)現(xiàn)的高度可擴(kuò)展的事件驅(qū)動(dòng)的I/O架構(gòu)的后端進(jìn)程,它可以有效地跟大量的客戶端通信并且以較低的開銷處理大量的業(yè)務(wù)量。

Whisper跟RRDtool類似,提供數(shù)據(jù)庫開發(fā)庫給html' target='_blank'>應(yīng)用程序來操縱和檢索存儲在特殊格式的文件數(shù)據(jù)(時(shí)間數(shù)據(jù)點(diǎn)數(shù)據(jù)),Whisper最基本的操作是創(chuàng)建作出新的Whisper文件,更新寫入新的數(shù)據(jù)點(diǎn)到一個(gè)文件中,并獲取檢索的數(shù)據(jù)點(diǎn)

Graphite_web是用戶接口,用來生成圖片,用戶可以直接通過URL的方式訪問這些生成的圖片。

Calamari 使用了Saltstack讓Calamari Server和Ceph server node通信。Saltstack是一個(gè)開源的自動(dòng)化運(yùn)維管理工具,與Chef和Puppet功能類似。Salt-master發(fā)送指令給指定的Salt-minion來完成對Cpeh Cluster的管理工作;Salt-minion 在Ceph server node安裝后都會(huì)從master同步并安裝一個(gè)ceph.py文件,里面包含Ceph操作的API,它會(huì)調(diào)用librados或命令行來最終和Ceph Cluster通信。

calamari_rest提供Calamari REST API,詳細(xì)的接口請大家參照官方文檔。Ceph的REST API是一種低層次的接口,其中每個(gè)URL直接映射到等效的CEPH CLI;Calamari REST API提供了一個(gè)更高層次的接口,API的使用者可以習(xí)慣的使用GET/POST/PATCH方法來操作對象,而無需知道底層的Ceph的命令;它們之間的主要區(qū)別在于,Ceph的REST API的使用者需要非常了解Ceph本身,而Calamari 的REST API更貼近對Ceph資源的描述,所以更加適合給上層的應(yīng)用程序調(diào)用。

cthulhu可以理解是Calamari Server的Service層,對上為API提供接口,對下調(diào)用Salt-master。

calamari_clients是一套用戶界面,Calamari Server在安裝的過程中會(huì)首先創(chuàng)建opt/calamari/webapp目錄,并且把webapp/calamari下的manager.py(django 配置)文件考進(jìn)去, calamari_web的所有內(nèi)容到要放到opt/calamari/webapp下面來提供UI的訪問頁面。

calamari-web包下面的文件提供所有web相關(guān)的配置,calamari_rest和calamari_clients都要用到。

該框架使用了大量的開源軟件,但是從擴(kuò)展的角度來說還是值得學(xué)習(xí)的,其中saltstack實(shí)現(xiàn)了管理節(jié)點(diǎn)和服務(wù)器節(jié)點(diǎn)的通信鏈路,而且支持多節(jié)點(diǎn)的管理,這樣不需要考慮管理節(jié)點(diǎn)和服務(wù)器之間的通信問題,在服務(wù)器端只需要實(shí)現(xiàn)具體的業(yè)務(wù)邏輯,即具體管理任務(wù)的實(shí)現(xiàn)。同時(shí)Saltstack是采用Python開發(fā)的,這樣便于快速的開發(fā)系統(tǒng),非常的方便管理人員在現(xiàn)場進(jìn)行調(diào)試,定位問題。ceph本身也提供了python的API接口,直接通過Ceph的API就能實(shí)現(xiàn)集群的控制。SaltStack的使用使得集群可以到達(dá)一定的規(guī)模。SaltStack的Master端實(shí)際上作為管理端的控制接口,而SaltStack作為服務(wù)器的Agent端。在Calamari中通過Saltstack發(fā)送心跳報(bào)文,檢查服務(wù)器的信息、集群的信息,控制命令的分發(fā)。可以說理解了SaltStack的基本模式就能理解Calamari的開發(fā)和擴(kuò)展。

該框架中另一組非常重要的開源軟件是diamond+graphite,其中diamond完成了服務(wù)器端信息的收集工作,而graphite實(shí)現(xiàn)了圖表信息的提供。diamond目前提供了絕大多數(shù)開源系統(tǒng)的信息收集,提供服務(wù)器基本信息的收集(CPU、內(nèi)存、磁盤等信息),也是采用Python實(shí)現(xiàn),非常容易擴(kuò)展和調(diào)試。目前diamond中已經(jīng)存在了Ceph的信息收集。而graphite主要是為前臺提供時(shí)序數(shù)據(jù),這樣就簡化了重新編寫具體的業(yè)務(wù)邏輯。

學(xué)習(xí)和了解Calamari就必須了解一些基本的組件,掌握這些組件的作用和目的。下面從代碼的層面介紹如何擴(kuò)展Calamari。
1 Calamari的擴(kuò)展

在Calamari的基礎(chǔ)之上進(jìn)行新的功能開發(fā),主要分為如下的幾個(gè)模塊,這部分包括Rest-API部分,Cthulhu、salt客戶端的擴(kuò)展。關(guān)于擴(kuò)展新功能的基本步驟如下:

>> 擴(kuò)展URL模塊,確定對應(yīng)的響應(yīng)接口參數(shù)、對應(yīng)ViewSet中的響應(yīng)接口。

>> 完成ViewSet中部分接口的實(shí)現(xiàn),這部分主要涉及與cthulhu的交互,如何獲取數(shù)據(jù)信息,有些情況下還需要獲取serializer中對象的序列化操作。

>> 完成后臺rpc.py中對應(yīng)類型的擴(kuò)展,這部分主要是針對部分的post操作。

>> 完成cluster_monitor.py的擴(kuò)展,對于提供操作的部分功能需要支持create、update、delete等操作,必須提供對應(yīng)的RequestFactory。而在cluster_monitor.py中需要將對應(yīng)的RequestFactory添加代碼中。

>> 完成對應(yīng)RequestFactory類的編寫,這部分主要是完成命令操作的封裝。并構(gòu)建對應(yīng)的請求操作。

>> salt-minion的擴(kuò)展,這部分主要是針對ceph.py文件的擴(kuò)展,當(dāng)然也可以提供新的xxx.py文件。

接下來以PG的控制和操作為例進(jìn)行說明。

1.1URL模塊擴(kuò)展

目前Calmamari采用Rest-API形式,采用Django的Rest-Framework框架支持,這部分在rest-api代碼目錄中。Django采用Url和代碼邏輯分離的實(shí)現(xiàn)方式,因此URL可以單獨(dú)的擴(kuò)展。

在rest-api/calamari-rest/urls/v2.py中添加如下的有關(guān)PG的URL:

url(r'^cluster/(?P[a-zA-Z0-9-]+)/pool/(?P/d+)/pg$', calamari_rest.views.v2.PgViewSet.as_view({'get': 'list'}), name='cluster-pool-pg-list'),

url(r'^cluster/(?P[a-zA-Z0-9-]+)/pool/(?P/d+)/pg/(?P[0-9a-fA-F]+/.[0-9a-fA-F]+)/command/(?P[a-zA-Z_]+)$',

calamari_rest.views.v2.PgViewSet.as_view({'post': 'apply'}),

name='cluster-pool-pg-control'),

以上定義了兩個(gè)URL,分別是:

api/v2/cluster/xxxx/pool/x/pg

api/v2/cluster/xxxx/pool/x/pg/xx/command/xxx

以上兩個(gè)URL分別指定了PgViewSet中的接口,url的get方法對應(yīng)了list接口。post接口對應(yīng)的apply接口。這兩個(gè)接口就是PgViewSet中必須實(shí)現(xiàn)的。

1.2ViewSet的擴(kuò)展

在擴(kuò)展URL之后,接下來就是進(jìn)行對應(yīng)響應(yīng)接口的擴(kuò)展,這部分的擴(kuò)展主要是針對在URL中指定的接口類進(jìn)行實(shí)現(xiàn)。在之前的PG指定了兩個(gè)不同的接口,分別是獲取和操作命令,對應(yīng)的代碼路徑為/rest-api/calamari-rest/view/v2.py,具體的代碼如下:

class PgViewSet(RPCViewSet):

serializer_class= PgSerializer

deflist(self, request, fsid, pool_id):

poolName = self.client.get(fsid, POOL, int(pool_id))['pool_name']

pg_summary = self.client.get_sync_object(fsid, PgSummary.str)

pg_pools = pg_summary['pg_pools']['by_pool'][int(pool_id)]

forpg in pg_pools:

pg['pool'] = poolName

return Response(PgSerializer(pg_pools, many=True).data)

defapply(self, request, fsid, pool_id, pg_id, command):

return Response(self.client.apply(fsid, PG, pg_id, command), status=202)

從如上的實(shí)現(xiàn)可知,代碼實(shí)現(xiàn)了兩個(gè)接口,分別是list和apply接口,即對應(yīng)與之前的get、post操作。以上兩個(gè)操作都會(huì)與后臺cthulhu進(jìn)行交互。分別是獲取參數(shù)和提交請求。返回內(nèi)容也有一定的差異。

同時(shí)在list接口中進(jìn)行了序列化設(shè)置,即PgSerializer,該實(shí)現(xiàn)在rest-api/calamari-rest/serializer/v2.py中。

1.2.1 序列化操作

通常在Rest-Api中會(huì)進(jìn)行數(shù)據(jù)的序列化,這部分并不是一定要進(jìn)行的,通常在需要更改的操作中是有必要的。如下是Pg的序列化操作:

class PgSerializer(serializers.Serializer):

classMeta:

fields = ('id', 'pool', 'state', 'up', 'acting', 'up_primary','acting_primary')

id =serializers.CharField(source='pgid')

pool =serializers.CharField(help_text='pool name')

state =serializers.CharField(source='state', help_text='pg state')

up =serializers.Field(help_text='pg Up set')

acting =serializers.Field(help_text='pg acting set')

up_primary = serializers.IntegerField(help_text='pg up primary')

acting_primary =serializers.IntegerField(help_text='pg acting primary')

這部分并不是必須的。有些模塊可能不存在這部分的操作。在之前的三個(gè)步驟中基本上就實(shí)現(xiàn)了Rest-API部分的擴(kuò)展,其中主要的ViewSet的擴(kuò)展。有關(guān)ViewSet實(shí)際上實(shí)現(xiàn)了cthulhu與rest-api的交互方法。

在ViewSet的擴(kuò)展中實(shí)際上采用了rpc與后臺交互,因此在cthulhu的實(shí)現(xiàn)部分主要是處理對應(yīng)的rpc請求。

1.3rpc擴(kuò)展

rpc.py中實(shí)現(xiàn)了所有請求的操作,但是新擴(kuò)展的操作也是需要支持?jǐn)U展的,以pg為例繼續(xù)說明:

defapply(self, fs_id, object_type, object_id, command):

"""

Apply commands that do not modify an object in a cluster.

"""

cluster = self._fs_resolve(fs_id)

ifobject_type == OSD:

# Run a resolve to throw exception if it's unknown

self._osd_resolve(cluster, object_id)

return cluster.request_apply(OSD, object_id, command)

elifobject_type == PG:

return cluster.request_apply(PG,object_id, command)

else:

raise NotImplementedError(object_type)

而Pg的列表是通過PgSummary獲取。這部分在之前的實(shí)現(xiàn)中已存在,之前的代碼實(shí)現(xiàn)如下:

defget_sync_object(self, fs_id, object_type, path=None):

"""

Getone of the objects that ClusterMonitor keeps a copy of from the mon, such

asthe cluster maps.

:param fs_id: The fsid of a cluster

:param object_type: String, one of SYNC_OBJECT_TYPES

:param path: List, optional, a path within the object to return insteadof the whole thing

:return: the requested data, or None if it was not found (including ifany element of ``path``

was not found)

"""

ifpath:

obj =self._fs_resolve(fs_id).get_sync_object(SYNC_OBJECT_STR_TYPE[object_type])

try:

for part in path:

if isinstance(obj, dict):

obj = obj[part]

else:

obj = getattr(obj, part)

except (AttributeError, KeyError) as e:

log.exception("Exception %s traversing %s: obj=%s" % (e, path,obj))

raise NotFound(object_type, path)

return obj

else:

returnself._fs_resolve(fs_id).get_sync_object_data(SYNC_OBJECT_STR_TYPE[object_type])

1.4cluster_monitor.py擴(kuò)展

有關(guān)請求的操作都會(huì)進(jìn)行集群的控制,這部分可以通過cluster_monitor進(jìn)行實(shí)現(xiàn),以pg為例進(jìn)行說明。

def__init__(self, fsid, cluster_name, notifier, persister, servers, eventer,requests):

super(ClusterMonitor, self).__init__()

self.fsid = fsid

self.name = cluster_name

self.update_time = datetime.datetime.utcnow().replace(tzinfo=utc)

self._notifier = notifier

self._persister= persister

self._servers = servers

self._eventer = eventer

self._requests = requests

#Which mon we are currently using for running requests,

#identified by minion ID

self._favorite_mon = None

self._last_heartbeat = {}

self._complete = gevent.event.Event()

self.done = gevent.event.Event()

self._sync_objects = SyncObjects(self.name)

self._request_factories = {

CRUSH_MAP: CrushRequestFactory,

CRUSH_NODE: CrushNodeRequestFactory,

OSD: OsdRequestFactory,

POOL: PoolRequestFactory,

CACHETIER: CacheTierRequestFactory,

PG: PgRequestFactory,

ERASURE_PROFILE: ErasureProfileRequestFactory,

ASYNC_COMMAND: AsyncComRequestFactory

}

self._plugin_monitor = PluginMonitor(servers)

self._ready = gevent.event.Event()

這部分主要是將對應(yīng)的請求與對應(yīng)的請求工廠類進(jìn)行綁定,這樣才能產(chǎn)生出合適的請求。

1.5工廠類編寫

該工廠類主要是針對不同的需求,實(shí)現(xiàn)具體的接口類,不同的對象有不同的請求類,以Pg為例說明:

from cthulhu.manager.request_factory importRequestFactory

from cthulhu.manager.user_request importRadosRequest

from calamari_common.types importPG_IMPLEMENTED_COMMANDS, PgSummary

class PgRequestFactory(RequestFactory):

def scrub(self,pg_id):

return RadosRequest(

"Initiating scrub on{cluster_name}-pg{id}".format(cluster_name=self._cluster_monitor.name,id=pg_id),

self._cluster_monitor.fsid,

self._cluster_monitor.name,

[('pg scrub', {'pgid': pg_id})])

defdeep_scrub(self, pg_id):

return RadosRequest(

"Initiating deep-scrub on{cluster_name}-osd.{id}".format(cluster_name=self._cluster_monitor.name,id=pg_id),

self._cluster_monitor.fsid,

self._cluster_monitor.name,

[('pg deep-scrub', {'pgid': pg_id})])

defrepair(self, pg_id):

return RadosRequest(

"Initiating repair on{cluster_name}-osd.{id}".format(cluster_name=self._cluster_monitor.name,id=pg_id),

self._cluster_monitor.fsid,

self._cluster_monitor.name,

[('pg repair', {'pgid': pg_id})])

defget_valid_commands(self, pg_id):

ret_val = {}

file('/tmp/pgsummary.txt', 'a+').write(PgSummary.str + '/n')

pg_summary = self._cluster_monitor.get_sync_object(PgSummary)

pg_pools = pg_summary['pg_pools']['by_pool']

pool_id = int(pg_id.split('.')[0])

pool= pg_pools[pool_id]

forpg in pool:

if pg['pgid'] == pg_id:

ret_val[pg_id] = {'valid_commands': PG_IMPLEMENTED_COMMANDS}

else:

ret_val[pg_id] = {'valid_commands': []}

return ret_val

該類中實(shí)現(xiàn)了三個(gè)不同的命令的實(shí)現(xiàn),該命令主要是進(jìn)行對應(yīng)的封裝,這部分關(guān)鍵字需要根據(jù)ceph源碼中的參數(shù)進(jìn)行選擇,因此在編碼時(shí)需要參照ceph源碼中對應(yīng)命令的json參數(shù)名。

1.6salt-minion的擴(kuò)展這部分是salt的擴(kuò)展模塊,主要用于獲取對應(yīng)的數(shù)據(jù)信息,執(zhí)行對應(yīng)的操作命令等。在cthulhu中通過salt執(zhí)行對應(yīng)的操作命令。Ceph.py中有rados.commands等接口,該接口可用于執(zhí)行ceph的命令。工廠類中封裝的命令最終都會(huì)通過該接口執(zhí)行。

總結(jié)
整體而言,Calamari的代碼結(jié)構(gòu)比較清晰,而且該開源框架也是值得學(xué)習(xí)的,在后續(xù)的分布式管理系統(tǒng)中也可參考saltstack+diamond+graphite的架構(gòu),前者實(shí)現(xiàn)控制邏輯,后面兩個(gè)實(shí)現(xiàn)數(shù)據(jù)采集和數(shù)據(jù)的存儲顯示。

http://www.bkjia.com/PHPjc/1092984.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1092984.htmlTechArticleceph管理平臺Calamari的擴(kuò)展開發(fā) 接近大半年沒有寫日志了,也許是自己越來越懶惰吧。但有時(shí)候?qū)憣憱|西能夠讓自己沉淀,還是回來記錄一下...

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時(shí)間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产一级片在线播放| 亚洲欧美一区二区三区在线播放| 精品视频一区二区观看| 中文字幕在线免费| 欧美专区日韩| 中文字幕在线永久在线视频| 中文字幕中文字幕在线中高清免费版| 国产精品自产拍在线网站| 国产性色视频| 亚洲精品天堂在线| 久久五月精品中文字幕| 中文字幕成人乱码在线电影| 91中文在线| 日本一二三区视频免费高清| 欧美日韩在线精品成人综合网| 国产在线三区| 91午夜在线| 久久久久久久久久久久久91| 国产美女自拍视频| 在线国产中文字幕| 久热精品免费视频| 国产三级做爰在线观看| 亚洲综合在线免费| 最近中文字幕在线中文视频 | 轻轻色免费在线视频| 丁香视频免费观看| 99reav| 国产三级做爰在线观看| 成年黄网站在线观看免费| 精品美女视频在线观看免费软件| 黄色在线视频观看网站| 精品视频一二三| 国产一二在线观看| 另类专区欧美| 免费久久网站| 欧美性猛交xxxx免费看蜜桃| 伊人av免费在线观看| 国产黄在线观看| 五月婷婷视频在线观看| 免费精品国产自产拍观看| 在线免费国产视频| 精品偷拍激情视频在线观看| 国产三级在线观看| 国产视频中文字幕| 最好看更新中文字幕| 中文字幕在线看精品乱码| 青青久草在线| www.99av| 国内自拍视频在线观看| 丁香综合在线| 国产女人伦码一区二区三区不卡| 国产在线一二| 91超碰在线免费| 国产精品久久人| 99热99re6国产在线播放| 尤物在线精品视频| 免费一区二区三区视频狠狠| 免费a级毛片在线观看| 国产在线视精品麻豆| 国产精品入口免费麻豆| 精品推荐国产麻豆剧传媒| 国产黄色在线看| 精品国产福利一区二区在线| 亚洲wwwwww| 国产精品自产拍在线观看2019| 国产天堂在线观看| 日日夜夜中文字幕| 国产视频2区| 国产网站在线播放| 国产精品美女一区二区视频| 精品a在线观看| 麻豆精品免费视频入口| 国产特级毛片| 欧美韩日国产| 精品一二三四| 国产中文字幕在线| 中文字幕在线视频网| 中文日本在线观看| 欧美日韩亚洲国内综合网| 国产精品一卡二卡三卡| av在线你懂的| 精精国产xxxx视频在线动漫| 国产尤物视频在线| xxxxx中文字幕| 国产成在线观看免费视频| 欧美国产中文| 永久免费av网站| 国产一卡2卡3卡免费网站| 日韩中文字幕久久久经典网| 国产黄色免费| 国产色婷婷在线| 成人免费一区二区三区视频网站| 91桃色在线| 国产成人无吗| 国产日本在线视频| 国产视频福利在线| 国产精品综合久久久久| 免费中文字幕| 狠狠色综合久久婷婷| 免费看黄视频网站| 超碰91在线| 激情六月婷婷| 久热中文字幕精品视频在线| 四虎a级欧美在线观看| 怡红院av在线| 亚洲wwwwww| 亚洲成av人影片在线观看| a√在线视频| 亚洲精品aaaa| 欧美精品久久久久久久小说| 日韩精品免费一区二区| 欧美性猛交xxxx免费看蜜桃| 不卡av免费观看| 天堂资源最新版在线视频观看免费网 | 日本电影全部在线观看网站视频 | 国产高清视频免费最新在线| 高清色视频在线观看| 国产理论电影在线| 国产福利在线免费观看| 一本大道香蕉8中文在线视频| www.色五月| 国产精品一区二区三区高清在线 | 精品三级久久久久久久电影聊斋| 精精国产xxxx视频在线| 亚洲大香人伊一本线| 久色视频在线观看| 午夜视频在线免费| 精品国内自产拍在线视频| www.九九热.com| 国产经典av| 欧美亚洲另类在线观看| 国产特级嫩嫩嫩bbb| 日本片在线看| 国产精品69xx| 久蕉依人在线视频| √天堂资源中文www| 麻豆福利在线观看| 精品福利视频导航大全| 国产在线高潮| 欧美精品日韩少妇| 在线播放国产区| 欧美精品se| 99热国产在线| 国产一级在线观看www色| 青青草原国产在线观看| 国产网站免费观看| 欧美色欧美亚洲另类二区精品| 国产三级在线免费观看| 免费在线黄色网址| 中文字幕av在线播放| 自拍亚洲国产| 导航福利在线| 免费不卡中文字幕视频| 亚洲一道本在线| 在线视频xx| 亚洲天堂电影在线观看| 国产精品欧美色图| 国产一级免费在线观看| 国产在线观看a| 国产尤物视频| 国产专区在线播放| 久久久久久久美女| 黄色在线视频观看网站| www.操操操| 女子免费在线观看视频www| jizz在线视频| 国产在线资源| 国产小视频免费在线观看| 国产一级二级在线| 2019天天操夜夜操| 亚洲视频网站在线| 亚洲欧美精品日韩欧美 | 久久国产综合视频| 久青青在线观看视频国产| 麻豆网站在线免费观看| 国产中文字幕av| 国产三区四区在线观看| 国产三级视频在线播放线观看| 18av在线视频| 蜜桃视频中文字幕| 国产久草在线| 一本大道香蕉久久| wwww在线观看免费视频| 激情亚洲综合网| 97国产视频| 毛片在线视频| 国产黄色免费网站| 天天干天天摸| 国产小视频在线观看| 在线中文av| 国产美女一区视频| 在线观看的网站你懂的| 老鸭窝av在线| 中文字幕av免费| 精品中文字幕不卡在线视频| 97视频免费| 综合激情亚洲| 麻豆网站在线免费观看| 国产精选一区二区三区不卡催乳| 2021av天天|