日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > PHP > 正文

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

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

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

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

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

最近在從事Ceph的相關管理平臺開發(fā)工作,熟悉了官方提供的Calamari平臺,該平臺目前主要提供了Ceph分布式存儲系統(tǒng)的管理工作,整體上主要是提供了頁面管理Ceph的手段。從目前的實現(xiàn)角度來看,該平臺還存在一定的局限性,不能完成強大的功能,或者說目前提供的版本只能提供一些基本的功能。但是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負責收集監(jiān)控數(shù)據(jù),它支持非常多的數(shù)據(jù)類型和metrics;每一個類型的數(shù)據(jù)都是上圖中的一個collector,它除了收集Ceph本身的狀態(tài)信息,它還可以收集關鍵的資源使用情況和性能數(shù)據(jù),包括CPU,內(nèi)存,網(wǎng)絡,I / O負載和磁盤指標。Collector都是使用本地的命令行來收集數(shù)據(jù),然后報告給Graphite。

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

Whisper跟RRDtool類似,提供數(shù)據(jù)庫開發(fā)庫給html' target='_blank'>應用程序來操縱和檢索存儲在特殊格式的文件數(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,詳細的接口請大家參照官方文檔。Ceph的REST API是一種低層次的接口,其中每個URL直接映射到等效的CEPH CLI;Calamari REST API提供了一個更高層次的接口,API的使用者可以習慣的使用GET/POST/PATCH方法來操作對象,而無需知道底層的Ceph的命令;它們之間的主要區(qū)別在于,Ceph的REST API的使用者需要非常了解Ceph本身,而Calamari 的REST API更貼近對Ceph資源的描述,所以更加適合給上層的應用程序調(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 配置)文件考進去, calamari_web的所有內(nèi)容到要放到opt/calamari/webapp下面來提供UI的訪問頁面。

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

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

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

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

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

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

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

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

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

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

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

接下來以PG的控制和操作為例進行說明。

1.1URL模塊擴展

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

在rest-api/calamari-rest/urls/v2.py中添加如下的有關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方法對應了list接口。post接口對應的apply接口。這兩個接口就是PgViewSet中必須實現(xiàn)的。

1.2ViewSet的擴展

在擴展URL之后,接下來就是進行對應響應接口的擴展,這部分的擴展主要是針對在URL中指定的接口類進行實現(xiàn)。在之前的PG指定了兩個不同的接口,分別是獲取和操作命令,對應的代碼路徑為/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接口,即對應與之前的get、post操作。以上兩個操作都會與后臺cthulhu進行交互。分別是獲取參數(shù)和提交請求。返回內(nèi)容也有一定的差異。

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

1.2.1 序列化操作

通常在Rest-Api中會進行數(shù)據(jù)的序列化,這部分并不是一定要進行的,通常在需要更改的操作中是有必要的。如下是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部分的擴展,其中主要的ViewSet的擴展。有關ViewSet實際上實現(xiàn)了cthulhu與rest-api的交互方法。

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

1.3rpc擴展

rpc.py中實現(xiàn)了所有請求的操作,但是新擴展的操作也是需要支持擴展的,以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擴展

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

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()

這部分主要是將對應的請求與對應的請求工廠類進行綁定,這樣才能產(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ù)ceph源碼中的參數(shù)進行選擇,因此在編碼時需要參照ceph源碼中對應命令的json參數(shù)名。

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

總結(jié)
整體而言,Calamari的代碼結(jié)構(gòu)比較清晰,而且該開源框架也是值得學習的,在后續(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的擴展開發(fā) 接近大半年沒有寫日志了,也許是自己越來越懶惰吧。但有時候?qū)憣憱|西能夠讓自己沉淀,還是回來記錄一下...

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
日韩精品一级| 欧美日韩高清| 中文精品电影| 先锋男人资源站| 中文字幕精品亚洲| 91麻豆精品国产91久久久使用方法| 免费在线亚洲| 午夜一区二区三区视频| 亚洲综合欧美在线| 日韩va亚洲va欧洲va国产| 国产福利不卡| 亚洲福利在线视频| av免费不卡国产观看| 国产99亚洲| 欧美亚洲国产日韩2020| 欧美.日韩.国产.一区.二区| 亚洲第一精品在线| 精品久久久视频| 国产xxx在线| 亚洲美女视频一区| 一区在线免费| 日韩精品免费视频一区二区三区| 在线三级av| 91精品国产自产观看在线 | 亚洲一区资源| 中文字幕在线导航| 欧美日韩在线中文字幕| 久久精品黄色片| 一区在线免费| 91久久精品网| 91精品国产入口| 日韩在线中文字幕| 国产一级片网站| 亚洲免费观看视频| 一级片免费网站| av三级在线观看| 国产1区在线| 欧美日韩国产黄色| 亚洲区中文字幕| 国产一级一片免费播放| 亚洲欧美视频一区二区三区| 日韩欧美一级在线| 欧美在线中文字幕| 日韩免费视频| 日韩在线不卡| 在线欧美日韩国产| 久久精品欧美日韩精品| 亚洲大片免费看| 国产亚洲人成a一在线v站| 久久久久久欧美| 精品国产欧美成人夜夜嗨| 综合激情一区| 欧美国产一级| 精品视频资源站| 中文字幕亚洲区| 中文字幕日韩视频| 亚洲热线99精品视频| 国产乱国产乱300精品| 色综合久久88色综合天天免费| 国产小视频在线观看免费| 日韩中文字幕在线视频播放| av免费观看国产| 国产九九在线| 色综合婷婷久久| av一级在线| 国产劲爆久久| 国产免费一级片| 国产偷国产偷亚洲清高网站| 91精品视频在线| 精品久久91| 日韩精品视频免费| 在线观看91精品国产入口| 在线观看一区日韩| 国产一级视频在线播放| 亚洲大片精品永久免费| 欧美日韩中文| 欧美日韩精品区| 国产小视频免费在线观看| 日韩精品在线网站| 免费网站看黄yyy222| 91精品国产欧美日韩| 日韩三级在线播放| 精品国产1区2区3区| 国产在成人精品线拍偷自揄拍| 国产黄色在线网站| 国产成人精品免费网站| 国产欧美日韩最新| 欧美日韩国产一区| 色屁屁一区二区| 日韩精品丝袜在线| 在线国产日本| 欧美一级日韩不卡播放免费 | 日韩精品在线免费看| 欧美日韩精品欧美日韩精品一| 伊人www22综合色| 国产成人精品综合网站| 亚洲国产欧美91| 欧美日韩中文字幕在线视频| 欧美日韩国产一级片| 日韩三级一区| 中文在线一区二区| 日韩三级免费观看| 日韩欧美一级精品久久| 欧美成人vr18sexvr| 日韩在线不卡| 国产免费播放一区二区| 深夜福利亚洲| 精品国产免费观看一区| 亚洲制服丝袜一区| 久久久91精品| 国产欧美日韩在线观看| 一区在线视频观看| 欧美日韩视频在线| 婷婷中文字幕在线观看| 欧美sm一区| 91精品国产自产| 天天摸日日摸狠狠添| 天堂在线中文资源| 国产丝袜一区二区| 精品色蜜蜜精品视频在线观看| 色综合久久88色综合天天免费| √新版天堂资源在线资源| 在线视频你懂得一区| 91精品在线视频观看| 国产成人精品网址| 亚洲狠狠婷婷综合久久久久图片| 日韩不卡高清视频| 在线观看精品国产| 尤物av一区二区| 欧美日韩精品中文字幕| 影音先锋一区二区资源站| 日韩欧美中文字幕公布| 国产高清精品二区| 欧美日韩在线看| 不卡福利视频| 国产欧美日韩在线观看| 国产欧美日韩精品高清二区综合区| 国产午夜精品一区二区三区视频| 久久福利视频一区二区| 欧美变态tickling挠脚心| 精品国内自产拍在线视频| 日韩在线二区| 日本国产在线视频| 国产一级视频| 亚洲第一中文字幕| www.中文字幕在线| 99国内精品| 久久精品欧美日韩精品| 国产裸体歌舞团一区二区 | 国产欧美日韩在线视频| 国产在线观看色| 一区二区不卡在线| 亚洲成在线观看| 日本不卡高清视频一区| 欧美日韩国产高清一区| 欧美日韩视频不卡| 日韩精品视频在线看| 亚洲一级在线| 日韩欧美亚洲日产国| 亚洲专区一二三| 日韩在线观看精品| www在线播放| 欧美日韩国产免费观看视频| 国产激情久久| 一区二区不卡视频| 欧美亚洲天堂网| 国产成人一二三区| 三级网站免费观看| 日韩欧美亚洲国产一区| 在线观看免费国产小视频| 日韩国产成人| 伊人国产视频| 国产一级久久久| 1区2区在线| 色国产在线视频| 欧美日韩亚洲系列| 免费视频二区| 日韩欧美999| 91精品国产自产| 深夜日韩欧美| 中文字幕欧美国内| 一区二区三区高清在线| 日韩你懂的电影在线观看| 欧美日韩成人一区二区| 日韩欧美一级在线播放| 国产一卡2卡3卡免费网站| 欧美一级日韩不卡播放免费 | 在线综合 亚洲 欧美中文字幕| 99精品一级欧美片免费播放| 不卡一区二区三区视频| www在线视频| 中文天堂在线一区| 国产色在线视频| 国产wwww| 黄色在线资源| 欧美三级日韩三级| 一区视频在线播放| 中文字幕亚洲区| 国产婷婷一区二区| 国产偷国产偷亚洲清高网站| 亚洲综合日韩欧美| 国产黄色一级片| 亚洲免费福利视频| 日韩欧美综合视频| av午夜在线| 中文字幕欧美国内| 国产黄色在线| 91精品国产自产| 欧美日韩色综合| 国产欧美自拍一区| 日韩中文字幕视频网| 国产欧美久久久| 日韩精品在线网站| 91精品国产自产观看在线| 先锋男人资源站| 精品在线观看一区| 91精品国产综合久久香蕉的特点| 久久中文精品| 日本а中文在线天堂| 国产视频一区三区| 国产亚洲短视频| 欧美日韩国产综合视频在线观看| 一区二区91| 欧美日韩精品在线| 日韩欧美999| 黄色一级大片在线免费看国产一| 国产欧美日韩不卡| 国产美女主播视频一区| 欧美日韩亚洲天堂| 欧美日韩精品免费看| 日本а中文在线天堂| 国产一区不卡精品| 二区三区不卡不卡视频| 色猫猫国产区一区二在线视频 | 亚洲视频一二三四| 日韩欧美中文在线| 国产 日韩 欧美 综合 一区| 日韩欧美一级视频| 国产福利久久久| 99综合精品久久| 国产999在线观看| 中文字幕精品视频| 91精品国产调教在线观看| 91精品999| www在线视频| 欧美日韩亚洲国内综合网| 国产乱一区二区| 精品国产免费视频| 国产欧美一级| 亚洲免费播放| 国产一区不卡精品| 欧美三级视频在线| 色综合久久88色综合天天免费| 欧美xxxx中国| 99热最新网址| 日韩av一区在线| 国产欧美日韩视频| 久久精品蜜桃| 麻豆精品视频入口| 日韩欧美一卡二卡| 欧美 日韩 国产在线观看| 三级网站免费观看| 精品日韩av一区二区| 一区二区高清视频| 日韩国产欧美在线视频| 中文字幕欧美在线| 欧美不卡视频一区发布| 国产免费一级| av首页在线| 免费国产h视频在线观看86| 日韩国产在线观看一区| 欧美日韩在线不卡一区| 欧美成人一区二区| 中文字幕伊人| 国产网站av| 欧美日韩激情一区| 精品视频999| 国产视频一区二| 99精品在线播放| 成人久久久久| 国产一区日韩| 中文天堂资源在线| 欧美日韩精品免费| 欧美日韩国产一区| 国产视频一区二| 国产一级免费看| 国产www在线观看| 色妇色综合久久夜夜| 国产h片在线观看| 欧美日韩在线不卡视频| 91精品在线观看视频| av中文在线播放| 在线精品观看| 婷婷中文字幕一区三区| 中文字幕欧美日韩在线| 色偷偷一区二区三区| 日韩av一区在线| 一区二区在线观| 午夜福利一区二区三区| 欧美日韩亚洲天堂| 日韩欧美在线网址| 中文国产字幕在线观看| 欧美日韩精品中文字幕| 一级日本免费的| 国产高清大尺度一区二区不卡| www.老鸭窝.com| 日韩久久在线| 不卡一区2区| 中文字幕国产在线| 色欧美日韩亚洲| 国产绿帽一区二区三区| 国产又粗又猛又爽又黄91精品| 国产福利三区| 日韩不卡av| 中文字幕精品在线视频| 黄色资源在线观看| 国产免费永久在线观看| 国产黄色高清在线| 精品国产欧美日韩| 在线一区二区不卡| 日韩中文首页| 中文字幕第一页在线播放| 国产成人精品综合网站| 亚洲黄色www| 国产午夜精品视频免费不卡69堂| 欧美日韩国产亚洲一区| 欧美中文字幕| 在线免费视频一区二区| av免费看在线| 亚洲第一中文字幕在线观看| 国产视频一区二| 国产在成人精品线拍偷自揄拍| 日韩视频在线一区二区三区| 91亚洲国产| 国产成人精品日本亚洲专区61 | 国产免费久久| 粉嫩喷白浆久久| 欧美日韩中文在线| 欧美日韩在线视频一区| 亚洲黄页一区| 色综合天天综合网天天狠天天 | 精品免费视频| 国产欧美日韩第一页| 中文字幕一区不卡| 91精品国产91久久久久久久久| 精品综合久久久久| 日韩欧美中文字幕公布| 中文字幕在线中文字幕二区| 色欧美日韩亚洲| 日韩欧美在线精品| av免费不卡国产观看| 精品国产免费观看一区| 欧美va亚洲va日韩∨a综合色| 色偷偷一区二区三区| 日韩国产在线观看一区| 日韩视频不卡中文| 免费精品国产自产拍观看| 日韩欧美国产成人精品免费| 亚洲成av人综合在线观看| 日韩视频中文字幕| 精品国内自产拍在线视频| 日韩www在线| 亚洲黄色片在线观看| 久久99久久久久| 97视频在线| wwwww亚洲| 欧美日本精品在线| 亚洲一级在线| 国内不卡的二区三区中文字幕| 免费精品国产自产拍观看| 日韩在线视频网| 亚洲最新永久观看在线| 欧美日韩国产中文| 一区二区三区久久| www.狠狠| 日韩在线视频一区二区三区| 国产日韩1区| 日韩欧美中文视频| 最近中文字幕日韩精品| 在线视频日韩欧美| 国产偷国产偷亚洲清高网站 | 日韩精品在线免费播放| 欧美日韩精品久久久| 亚洲国产欧美91| 日韩精品a在线观看91| 欧美日韩性视频一区二区三区| 午夜国产视频| 亚洲高清中文字幕| 精品视频123区在线观看| 91精品国产综合久久久久久漫画| 亚洲成年网站在线观看| 一级一片免费视频| 欧美亚洲天堂| 国产羞羞视频在线播放| 欧美日韩综合高清一区二区| 亚洲成a人片在线www| 91精品国产全国免费观看| 国产嫩草影院久久久久| 精品久久久久久综合日本欧美| 国产真实乱子伦精品视频|