亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

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

2020-03-24 18:12:08
字體:
供稿:網(wǎng)友
ceph管理平臺Calamari的擴(kuò)展開發(fā)
接近大半年沒有寫日志了,也許是自己越來越懶惰吧。但有時候?qū)憣憱|西能夠讓自己沉淀,還是回來記錄一下吧。入職大半年了,熟悉了一些相關(guān)的工作,目前主要從事分布式系統(tǒng)的研究和開發(fā),目前的開發(fā)主要是停留在管理層面的開發(fā),還未到達(dá)修改代碼。這半年的時間熟悉了兩款非常不錯的分布式系統(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的代碼比較簡單,層次比較明顯,堆棧式的處理流程非常清晰。非常容易實現(xiàn)文件系統(tǒng)的功能擴(kuò)展(在客戶端服務(wù)器端添加處理模塊即可),雖然服務(wù)器端、客戶端代碼是一份代碼,但整體而言代碼比較清晰,代碼量較少。

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

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

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

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

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

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

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

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

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

calamari_rest提供Calamari REST API,詳細(xì)的接口請大家參照官方文檔。Ceph的REST API是一種低層次的接口,其中每個URL直接映射到等效的CEPH CLI;Calamari REST API提供了一個更高層次的接口,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在安裝的過程中會首先創(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實現(xiàn)了管理節(jié)點和服務(wù)器節(jié)點的通信鏈路,而且支持多節(jié)點的管理,這樣不需要考慮管理節(jié)點和服務(wù)器之間的通信問題,在服務(wù)器端只需要實現(xiàn)具體的業(yè)務(wù)邏輯,即具體管理任務(wù)的實現(xiàn)。同時Saltstack是采用Python開發(fā)的,這樣便于快速的開發(fā)系統(tǒng),非常的方便管理人員在現(xiàn)場進(jìn)行調(diào)試,定位問題。ceph本身也提供了python的API接口,直接通過Ceph的API就能實現(xiàn)集群的控制。SaltStack的使用使得集群可以到達(dá)一定的規(guī)模。SaltStack的Master端實際上作為管理端的控制接口,而SaltStack作為服務(wù)器的Agent端。在Calamari中通過Saltstack發(fā)送心跳報文,檢查服務(wù)器的信息、集群的信息,控制命令的分發(fā)??梢哉f理解了SaltStack的基本模式就能理解Calamari的開發(fā)和擴(kuò)展。

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

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

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

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

>> 完成ViewSet中部分接口的實現(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和代碼邏輯分離的實現(xiàn)方式,因此URL可以單獨的擴(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'),

以上定義了兩個URL,分別是:

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

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

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

1.2ViewSet的擴(kuò)展

在擴(kuò)展URL之后,接下來就是進(jìn)行對應(yīng)響應(yīng)接口的擴(kuò)展,這部分的擴(kuò)展主要是針對在URL中指定的接口類進(jìn)行實現(xiàn)。在之前的PG指定了兩個不同的接口,分別是獲取和操作命令,對應(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)

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

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

1.2.1 序列化操作

通常在Rest-Api中會進(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')

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

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

1.3rpc擴(kuò)展

rpc.py中實現(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獲取。這部分在之前的實現(xiàn)中已存在,之前的代碼實現(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)請求的操作都會進(jìn)行集群的控制,這部分可以通過cluster_monitor進(jìn)行實現(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工廠類編寫

該工廠類主要是針對不同的需求,實現(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

該類中實現(xiàn)了三個不同的命令的實現(xiàn),該命令主要是進(jìn)行對應(yīng)的封裝,這部分關(guān)鍵字需要根據(jù)ceph源碼中的參數(shù)進(jìn)行選擇,因此在編碼時需要參照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的命令。工廠類中封裝的命令最終都會通過該接口執(zhí)行。

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

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

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
日韩欧美在线播放| 搜索黄色一级片| 国产不卡视频一区| 17c国产在线| 亚洲毛片av| 中文字幕一区三区久久女搜查官| 日韩av在线影院| 亚洲狠狠婷婷综合久久久| 成人污污视频| 国产亚洲综合在线| www.国产福利| 日韩小视频在线| 亚洲女人天堂| 黄色国产在线视频| 欧美亚洲色综久久精品国产| 国产一区欧美一区| 喷水视频在线观看| 中文字幕成人动漫| av福利在线播放| 成人在线免费观看视频| 成人在线视频区| 国产一级免费黄色片| 一本一本久久a久久精品牛牛影视| 国产精品久久久久久久妇| 国产最新精品视频| 天天干天天舔| 2019日本中文字幕| 国产国产一区| 亚洲综合婷婷久久| 亚洲精品成a人在线观看| 任你躁av一区二区三区| 看全色黄大色黄大片免责看的| 国产免费福利视频| 国产一区二区区别| 国模娜娜一区二区三区| 日韩欧美三级视频| 亚洲精品免费一二三区| 成人h在线播放| 久久国产精品第一页| 欧美激情2020午夜免费观看| 精品黑人一区二区三区在线观看| 99久久久免费精品国产一区二区| 狠狠色噜噜狠狠狠狠色吗综合| 高清一区二区三区日本久| 国产在线精品成人一区二区三区| 欧美日韩精品在线观看视频| 日韩三级在线播放| 欧美午夜春性猛交xxxx| 97精品国产97久久久久久久久久久久| 女女色综合影院| 亚洲精品一区中文字幕电影| 国产精品久久影院| 女人爱爱视频| 日韩免费观看网站| 精品中文字幕人| a级日韩大片| 黄色小视频免费看| 国产色在线观看| 午夜激情成人网| 久久久久久国产精品一区| 国产精品美女无圣光视频| 精品日本高清在线播放| 中文在线资源新版官网| 国产精品国产三级国产专区53| 国产suv一区二区三区| 中文字幕在线网址| 九九免费精品视频在线观看| 国产成人精品无码片区在线| 国内视频精品| 亚洲精品欧美二区三区中文字幕| 导航福利在线| 永久免费在线观看视频| 特黄一区二区三区| 尹人成人综合网| 日韩视频免费观看高清在线视频| 日韩一区二区在线看片| 国产老女人乱淫免费| 欧美午夜宅男影院在线观看| 99国产精品久| 黑吊大战白xxxxxx| 天堂成人在线观看| 中文字幕精品视频在线| 亚洲欧美日本另类| 91大神在线资源观看无广告| 亚洲女同志freevdieo| 在线播放www| 日韩欧美亚洲| 不卡一区视频| 香蕉成人app| 无码精品一区二区三区在线播放| 久久久久久久色| 懂色一区二区三区av片| 国产精品毛片一区视频播| 国产精品三p一区二区| 国模精品视频一区二区| 日韩无套无码精品| h视频免费在线观看| 国产女人18毛片水18精| 99视频国产精品| 99久久精品久久亚洲精品| 欧美精品色哟哟| 亚洲色图国产精品| 在线观看高清免费视频| 日韩精品视频在线| 日韩中文字幕在线看| 五月激情六月婷婷| 久久密一区二区三区| 色婷婷狠狠18禁久久| 日韩欧美伦理电影院| 国产日韩第一页| 欧美日韩a v| 麻豆视频免费网站| 亚洲成人1234| 国产黄视频在线| 美女少妇精品视频| 神马一区二区三区| 一区二区三区性视频| 日韩免费va| 日韩在线观看电影完整版高清免费| 一本一道久久a久久精品逆3p| 中文字幕亚洲欧洲| 国产真实生活伦对白| av在线不卡顿| 可以直接看的黄色网址| 欧美午夜寂寞影院| 免费毛片a线观看| 美女毛片在线看| 国产在线精品国自产拍免费| 亚洲精品福利视频网站| 91视频免费观看| 欧美性videos高清精品| 色yeye香蕉凹凸一区二区av| 国产精品乱码视频| 精品一区在线看| 成人一区而且| 亚洲精品永久免费| 日韩a级在线观看| 国产精品网站在线看| www.超碰97| 在线观看二区| 国产成人在线中文字幕| av成人天堂| 日本污视频在线观看| 在线观看午夜av| 精品黄色免费中文电影在线播放| 亚洲免费在线电影| 欧美一区免费观看| 国产精品爽黄69天堂a| 国产精品㊣新片速递bt| 热久久精品国产| 一区二区三区四区视频在线观看| 天天操天天干视频| 中文字幕欧美一| 一本大道一区二区三区| 欧美视频亚洲图片| 日韩欧美国产精品一区二区三区| 亚洲欧美成人网| 女同性αv亚洲女同志| 中文幕av一区二区三区佐山爱| av中文在线资源| 一道本在线观看| 久久躁日日躁aaaaxxxx| 91啪国产在线| 黄色网址视频在线观看| 欧美精品videosbestsex另类| 亚洲精品少妇网址| x88av蜜桃臀一区二区| 91美女片黄在线| 久久不见久久见免费视频7| www国产亚洲精品久久网站| 久久激情久久| 久久涩涩网站| 首页国产精品| 国产一级成人av| 美女视频一区二区| av日韩亚洲| 国精品一区二区三区| 喷白浆一区二区| 久久91亚洲精品中文字幕| 久久国产精品免费视频| 日韩av电影中文字幕| 日韩一二三四区| 成人福利影院| 欧美三级视频在线| 国产一级片一区二区| 亚洲一区二区精品3399| 北条麻妃av毛片免费观看| 成人精品小蝌蚪| 精品国产视频在线观看| aiai久久| 国产91对白在线观看九色| 台湾无码一区二区| 中文字幕乱在线伦视频乱在线伦视频| 亚洲第一区视频| 久久躁狠狠躁夜夜爽| 久久精品人人做人人爽电影| 成人毛片免费在线观看| 亚洲成人国产综合| 97理论电影| 成人亚洲精品777777大片| 男人的天堂va免费视频| 337p粉嫩色噜噜噜大肥臀| 亚洲电影先锋| 欧美成年网站| 亚洲乱码视频| 无码人妻精品一区二区50| 丁香婷婷综合网| 国产精品成人网站| 麻豆影视在线观看_| youjizz.com在线观看| 69视频在线播放| 三级欧美韩日大片在线看| 国产三级三级三级精品8ⅰ区| 中文字幕av手机在线| 天天影视欧美综合在线观看| 欧美色图俺去了| 精品国产91洋老外米糕| 欧美成ee人免费视频| 免费观看在线黄色网| 女尊高h男高潮呻吟| 国产区av在线| 久久免费国产精品1| 欧美色窝79yyyycom| 国产精品视频yy9299一区| 一区二区三区鲁丝不卡| 91手机在线观看| 精品国产乱码久久久久久蜜柚| 神马午夜在线视频| 色婷婷综合久久久| 日韩精品综合一本久道在线视频| 亚洲精品天堂在线观看| 亚洲精品国产一区二区精华液| 中文字幕xxxx| 国产免费又粗又猛又爽| 国产91色综合久久免费分享| 亚洲免费不卡视频| 欧美第一淫aaasss性| 国产精品无码一区二区在线| 国产成人精品综合在线观看| 一区二区三区高清在线观看| 欧美在线国产| 国产精品免费视频久久久| 午夜影院免费视频| 国产精品视频公开费视频| 日本精品视频在线观看| 色狠狠av一区二区三区香蕉蜜桃| 免费吸乳羞羞网站视频| 日本久久精品一区二区| 亚洲人成精品久久久久| 麻豆一区区三区四区产品精品蜜桃| 欧美xxx在线观看| 国产乱码字幕精品高清av| 亚洲国产精品一区二区久久| 麻豆精品蜜桃视频网站| 国产精品9999久久久久仙踪林| 久久国产午夜精品理论片最新版本| 91视频地址| 欧美男女视频| 国产精品一区免费视频| 欧美91看片特黄aaaa| 国产精品12345| 精品午夜一区二区三区在线观看| 欧美日韩影视| 日韩a在线播放| 日本xxxxxwwwww| 成人福利电影精品一区二区在线观看| 91porny九色| 国产精品片aa在线观看| 亚洲精品一区二区在线看| 精品调教chinesegay| 香蕉人妻av久久久久天天| 九色|91porny| 秋霞视频一区二区| 国产成人福利在线| 97se亚洲国产综合自在线不卡| 日韩一区二区三区四区视频| 影音先锋国产在线资源| 亚洲电影一级片| 久久亚洲AV成人无码国产野外| 日本小视频网站| 国产资源在线视频| 欧美xxxx做受欧美护士| 欧美人妖在线观看| 午夜小视频福利在线观看| 鲁大师影院一区二区三区| 亚洲欧美精品中文第三| 欧美高清视频一区| 亚洲欧美综合另类在线卡通| 少妇毛片一区二区三区| 国产伦精品一区二区三区四区视频_| 无颜之月在线看| 欧美中文字幕一区二区三区亚洲| 日韩黄色在线观看| 色哟哟网站在线观看| 91热视频在线观看| 欧美第一精品| 国产女主播喷水高潮网红在线| 91在线资源| 亚洲综合无码一区二区| 欧美1区二区| 日韩精品不卡一区二区| 亚洲一区网站| 日本特黄a级高清免费大片| 在线观看av网站| 性做久久久久久久久| 欧美天堂影院| 丰腴饱满的极品熟妇| 日本视频一区二区在线观看| 亚洲成人人体| 国产网站一区二区| 亚洲区小说区| 无码精品a∨在线观看中文| 一区一区视频| 日韩av电影在线观看| 尤物视频在线观看网站| 亚洲女同二女同志奶水| 久久99国产乱子伦精品免费| 欧美国产精品中文字幕| 日韩精品欧美精品| 亚洲男女av一区二区| 欧美另类精品xxxx孕妇| 99久久九九| 国产精品第二十页| 99热精品免费| 91免费国产精品| 亚洲欧美一区二区三区极速播放| 思思99热久久精品在线6| 精品国产sm最大网站免费看|