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

攜程分布式圖數(shù)據(jù)庫(kù)Nebula Graph運(yùn)維治理實(shí)踐

數(shù)據(jù)庫(kù) 新聞
在攜程,很早就有一些業(yè)務(wù)嘗試了圖技術(shù),并將其運(yùn)用到生產(chǎn)中,以Neo4j和JanusGraph為主。

作者簡(jiǎn)介

Patrick Yu,攜程云原生研發(fā)專家,關(guān)注非關(guān)系型分布式數(shù)據(jù)存儲(chǔ)及相關(guān)技術(shù)。

一、背景

隨著互聯(lián)網(wǎng)世界產(chǎn)生的數(shù)據(jù)越來(lái)越多,數(shù)據(jù)之間的聯(lián)系越來(lái)越復(fù)雜層次越來(lái)越深,人們希望從這些紛亂復(fù)雜的數(shù)據(jù)中探索各種關(guān)聯(lián)的需求也在與日遞增。為了更有效地應(yīng)對(duì)這類(lèi)場(chǎng)景,圖技術(shù)受到了越來(lái)越多的關(guān)注及運(yùn)用。

DB-ENGINES 趨勢(shì)報(bào)告顯示圖數(shù)據(jù)庫(kù)趨勢(shì)增長(zhǎng)遙遙領(lǐng)先

在攜程,很早就有一些業(yè)務(wù)嘗試了圖技術(shù),并將其運(yùn)用到生產(chǎn)中,以Neo4j和JanusGraph為主。2021年開(kāi)始,我們對(duì)圖數(shù)據(jù)庫(kù)進(jìn)行集中的運(yùn)維治理,期望規(guī)范業(yè)務(wù)的使用,并適配攜程已有的各種系統(tǒng),更好地服務(wù)業(yè)務(wù)方。經(jīng)過(guò)調(diào)研,我們選擇分布式圖數(shù)據(jù)庫(kù)Nebula Graph作為管理的對(duì)象,主要基于以下幾個(gè)因素考慮:

1)Nebula Graph開(kāi)源版本即擁有橫向擴(kuò)展能力,為大規(guī)模部署提供了基本條件;

2)使用自研的原生存儲(chǔ)層,相比JanusGraph這類(lèi)構(gòu)建在第三方存儲(chǔ)系統(tǒng)上的圖數(shù)據(jù)庫(kù),性能和資源使用效率上具有優(yōu)勢(shì);

3)支持兩種語(yǔ)言,尤其是兼容主流的圖技術(shù)語(yǔ)言Cypher,有助于用戶從其他使用Cypher語(yǔ)言的圖數(shù)據(jù)庫(kù)(例如Neo4j)中遷移;

4)擁有后發(fā)優(yōu)勢(shì)(2019起開(kāi)源),社區(qū)活躍,且主流的互聯(lián)網(wǎng)公司都有參與(騰訊,快手,美團(tuán),網(wǎng)易等);

5)使用技術(shù)主流,代碼清晰,技術(shù)債較少,適合二次開(kāi)發(fā);

二、Nebula Graph架構(gòu)及集群部署

Nebula Graph是一個(gè)分布式的計(jì)算存儲(chǔ)分離架構(gòu),如下圖:

其主要由Graphd,Metad和Storaged三部分服務(wù)組成,分別負(fù)責(zé)計(jì)算,元數(shù)據(jù)存取,圖數(shù)據(jù)(點(diǎn),邊,標(biāo)簽等數(shù)據(jù))的存取。在攜程的網(wǎng)絡(luò)環(huán)境中,我們提供了三種部署方式來(lái)支撐業(yè)務(wù):

2.1 三機(jī)房部署

用于滿足一致性和容災(zāi)的要求,優(yōu)點(diǎn)是任意一個(gè)機(jī)房發(fā)生機(jī)房級(jí)別故障,集群仍然可以使用,適用于核心應(yīng)用。但缺點(diǎn)也是比較明顯的,數(shù)據(jù)通過(guò)raft協(xié)議進(jìn)行同步的時(shí)候,會(huì)遇到跨機(jī)房問(wèn)題,性能會(huì)受到影響。

2.2 單機(jī)房部署

集群所有節(jié)點(diǎn)都在一個(gè)機(jī)房中,節(jié)點(diǎn)之間通訊可以避免跨機(jī)房問(wèn)題(應(yīng)用端與服務(wù)端之間仍然會(huì)存在跨機(jī)房調(diào)用),由于機(jī)房整體出現(xiàn)問(wèn)題時(shí)該部署模式的系統(tǒng)將無(wú)法使用,所以適用于非核心應(yīng)用進(jìn)行訪問(wèn)。

2.3 藍(lán)綠雙活部署

在實(shí)際使用中,以上兩種常規(guī)部署方式并不能滿足一些業(yè)務(wù)方的需求,比如性能要求較高的核心應(yīng)用,三機(jī)房的部署方式所帶來(lái)的網(wǎng)絡(luò)損耗可能會(huì)超出預(yù)期。根據(jù)攜程酒店某個(gè)業(yè)務(wù)場(chǎng)景真實(shí)測(cè)試數(shù)據(jù)來(lái)看,本地三機(jī)房的部署方式延遲要比單機(jī)房高50%+,但單機(jī)房部署無(wú)法抵抗單個(gè)IDC故障,此外還有用戶希望能存在類(lèi)似數(shù)據(jù)回滾的能力,以應(yīng)對(duì)應(yīng)用發(fā)布,集群版本升級(jí)可能導(dǎo)致的錯(cuò)誤。

考慮到使用圖數(shù)據(jù)庫(kù)的業(yè)務(wù)大多數(shù)據(jù)來(lái)自離線系統(tǒng),通過(guò)離線作業(yè)將數(shù)據(jù)導(dǎo)入到圖數(shù)據(jù)庫(kù)中,數(shù)據(jù)一致的要求并不高,在這種條件下使用藍(lán)綠部署能夠在災(zāi)備和性能上得到很好的滿足。

與此同時(shí)我們還增加了一些配套的輔助功能,比如:

分流:可以按比例分配機(jī)房的訪問(wèn),也可以主動(dòng)切斷對(duì)某個(gè)機(jī)房的流量訪問(wèn)

災(zāi)備:在發(fā)生機(jī)房級(jí)故障時(shí),可自動(dòng)切換讀訪問(wèn)的流量,寫(xiě)訪問(wèn)的流量切換則通過(guò)人工進(jìn)行操作

藍(lán)綠雙活方式是在性能、可用性、一致性上的一個(gè)折中的選擇,使用此方案時(shí)應(yīng)用端架構(gòu)也需要有更多的調(diào)整以配合數(shù)據(jù)的存取。

生產(chǎn)上的一個(gè)例子:

三機(jī)房情況

藍(lán)綠部署

三、中間件及運(yùn)維管理

我們基于k8s crd和operator來(lái)進(jìn)行Nebula Graph的部署,同時(shí)通過(guò)服務(wù)集成到現(xiàn)有的部署配置頁(yè)面和運(yùn)維管理頁(yè)面,來(lái)獲得對(duì)pod的執(zhí)行和遷移的控制能力。基于sidecar模式監(jiān)控收集Nebula Graph的核心指標(biāo)并通過(guò)telegraf發(fā)送到攜程自研的Hickwall集中展示,并設(shè)置告警等一系列相關(guān)工作。

此外我們集成了跨機(jī)房的域名分配功能,為節(jié)點(diǎn)自動(dòng)分配域名用于內(nèi)部訪問(wèn)(域名只用于集群內(nèi)部,集群與外部連通是通過(guò)ip直連的),這樣做是為了避免節(jié)點(diǎn)漂移造成ip變更,影響集群的可用性。

在客戶端上,相比原生客戶端,我們主要做了以下幾個(gè)改進(jìn)和優(yōu)化:

3.1 Session管理功能

原生客戶端Session管理比較弱,尤其是2.x早期幾個(gè)版本,多線程訪問(wèn)Session并不是線程安全的,Session過(guò)期或者失效都需要調(diào)用方來(lái)處理,不適合大規(guī)模使用。同時(shí)雖然官方客戶端創(chuàng)建的Session是可以復(fù)用的,并不需要release,官方也鼓勵(lì)用戶復(fù)用,但是卻沒(méi)有提供統(tǒng)一的Session管理功能來(lái)幫助用戶復(fù)用,因此我們?cè)黾恿薙ession Pool的概念來(lái)實(shí)現(xiàn)復(fù)用。

其本質(zhì)上是管理一個(gè)或多個(gè)Session Object Queue,通過(guò)borrow-and-return的方式(下圖),確保了一個(gè)Session在同一時(shí)間只會(huì)由一個(gè)執(zhí)行器在使用,避免了共用Session產(chǎn)生的問(wèn)題。同時(shí)通過(guò)對(duì)隊(duì)列的管理,我們可以進(jìn)行Session數(shù)量和版本的管理,比如預(yù)生成一定量的Session,或者在管理中心發(fā)出消息之后變更Session的數(shù)量或者訪問(wèn)的路由。

3.2  藍(lán)綠部署(包括讀寫(xiě)分離)

上面章節(jié)中介紹了藍(lán)綠部署,相應(yīng)的客戶端也需要改造以支持訪問(wèn)2個(gè)集群。由于生產(chǎn)中,讀和寫(xiě)的邏輯往往不同,比如讀操作希望可以由2個(gè)集群共同提供數(shù)據(jù),而寫(xiě)的時(shí)候只希望影響單邊,所以我們?cè)谶M(jìn)行藍(lán)綠處理的時(shí)候也增加了讀寫(xiě)分離(下圖)。

3.3  流量分配

如果要考慮到單邊切換以及讀寫(xiě)不同的路由策略,就需要增加流量分配功能。我們沒(méi)有采用攜程內(nèi)廣泛使用的Virtual IP作為訪問(wèn)路由,希望有更為強(qiáng)大的定制管理能力及更好的性能。

a)通過(guò)直連而不是Virtual IP中轉(zhuǎn)可以減少一次轉(zhuǎn)發(fā)的損耗

b)在維持長(zhǎng)連接的同時(shí)也能實(shí)現(xiàn)每次請(qǐng)求使用不同的鏈路,平攤graphd的訪問(wèn)壓力

c)完全自主控制路由,可以實(shí)現(xiàn)更為靈活的路由方案

d)當(dāng)存在節(jié)點(diǎn)無(wú)法訪問(wèn)的時(shí)候,客戶端可以自動(dòng)臨時(shí)排除有問(wèn)題的IP,在短時(shí)間內(nèi)避免再次使用。而如果使用Virtual IP的話,由于一個(gè)Virtual IP會(huì)對(duì)應(yīng)多個(gè)物理IP,就沒(méi)有辦法直接這樣操作。

通過(guò)構(gòu)造面向不同idc的Session Pool,并根據(jù)配置進(jìn)行權(quán)重輪詢,就可以達(dá)到按比例分配訪問(wèn)流量的目的(下圖)。

將流量分配集成進(jìn)藍(lán)綠模式,就基本實(shí)現(xiàn)了基本的客戶端改造(下圖)。

3.4  結(jié)構(gòu)化語(yǔ)句查詢

圖DSL目前主流的有兩種,Gremlin和Cypher,前者是過(guò)程式語(yǔ)言而后者是聲明式語(yǔ)言。Nebula Graph支持了openCypher(Cypher的開(kāi)源項(xiàng)目)語(yǔ)法和自己設(shè)計(jì)的nGQL原生語(yǔ)法,這兩種都是聲明式語(yǔ)言,在風(fēng)格上比較類(lèi)似SQL。盡管如此,對(duì)于一些較為簡(jiǎn)單的語(yǔ)句,類(lèi)似Gremlin風(fēng)格的過(guò)程式語(yǔ)法對(duì)用戶會(huì)更為友好,并且有利用監(jiān)控埋點(diǎn)。基于這個(gè)原因,我們封裝了一個(gè)過(guò)程式的語(yǔ)句生成器。

例如:

Cypher風(fēng)格

MATCH (v:user{name:"XXX"})-[e:follow|:serve]->(v2)  RETURN v2 AS Friends;




新增的過(guò)程式風(fēng)格

Builder.match()

.vertex("v")

.hasTag("user")

.property("name", "XXX", DataType.String())

.edge("e", Direction.OUTGOING)

.type("follow")

.type("serve")

.vertex("v2")

.ret("v2", "Friends")

四、系統(tǒng)調(diào)優(yōu)實(shí)踐

由于建模,使用場(chǎng)景,業(yè)務(wù)需求的差異,使用Nebula Graph的過(guò)程中所遇到的問(wèn)題很可能會(huì)完全不同,以下以攜程酒店信息圖譜線上具體的例子進(jìn)行說(shuō)明,在整個(gè)落地過(guò)程我們遇到的問(wèn)題及處理過(guò)程(文中以下內(nèi)容是基于Nebula Graph 2.6.1進(jìn)行的)。

關(guān)于酒店該業(yè)務(wù)的更多細(xì)節(jié),可以閱讀《 信息圖譜在攜程酒店的應(yīng)用 》這篇文章。

4.1 酒店集群不穩(wěn)定

起因是酒店應(yīng)用上線后發(fā)生了一次故障,大量的訪問(wèn)超時(shí),并伴隨著“The leader has changed”這樣的錯(cuò)誤信息。稍加排查,我們發(fā)現(xiàn)metad集群有問(wèn)題,metad0的local ip和metad_server_address的配置不一致,所以metad0實(shí)際上一直沒(méi)有工作。

但這本身并不會(huì)導(dǎo)致系統(tǒng)問(wèn)題,因?yàn)?節(jié)點(diǎn)部署,只需要2個(gè)節(jié)點(diǎn)工作即可,后來(lái)metad1容器又意外被漂移了,導(dǎo)致ip變更,這個(gè)時(shí)候?qū)嶋H上metad集群已經(jīng)無(wú)法工作(下圖),導(dǎo)致整個(gè)集群都受到了影響。

在處理完以上故障并重啟之后,整個(gè)系統(tǒng)卻并沒(méi)有恢復(fù)正常,cpu的使用率很高。此時(shí)外部應(yīng)用并沒(méi)有將流量接入進(jìn)來(lái),但整個(gè)metad集群內(nèi)部網(wǎng)絡(luò)流量卻很大,如下圖所示:

監(jiān)控顯示metad磁盤(pán)空間使用量很大,檢查下來(lái)WAL在不斷增加,說(shuō)明這些流量主要是數(shù)據(jù)的寫(xiě)入操作。我們打開(kāi)WAL數(shù)據(jù)的某幾個(gè)文件,其大部分都是Session的元數(shù)據(jù),因?yàn)镾ession信息是會(huì)在Nebula集群內(nèi)持久化的,所以考慮問(wèn)題可能出在這里。閱讀源碼我們注意到,graphd會(huì)從metad中同步所有的session信息,并在修改之后將數(shù)據(jù)再全部回寫(xiě)到metad中,所以如果流量都是session信息的話,那么問(wèn)題就可能:

a)Session沒(méi)有過(guò)期

b)創(chuàng)建了太多的Session

檢查發(fā)現(xiàn)該集群沒(méi)有配置超時(shí)時(shí)間, 所以我們修改以下配置來(lái)處理 這個(gè)問(wèn)題:

類(lèi)型

配置項(xiàng)

原始值

修改值

說(shuō)明

Graphd

session_idle_timeout_secs

默認(rèn)(0)

86400

此配置控制session的過(guò)期,由于初始我們沒(méi)有設(shè)置這個(gè)參數(shù),這意味著session永遠(yuǎn)不會(huì)過(guò)期,這會(huì)導(dǎo)致過(guò)去訪問(wèn)過(guò)該graphd的session會(huì)永遠(yuǎn)存在于metad存儲(chǔ)層,造成session元數(shù)據(jù)累積。

session_reclaim_interval_secs

默認(rèn)(10)

30

原設(shè)置說(shuō)明每10s graphd會(huì)將session信息發(fā)送給metad持久化。這也會(huì)導(dǎo)致寫(xiě)入數(shù)據(jù)量過(guò)多。考慮到即使down機(jī)也只是損失部分的Session元數(shù)據(jù)更新,這些損失帶來(lái)的危害比較小,所以我們改成了30s以減少于metad之間同步元數(shù)據(jù)的次數(shù)。

Metad

wal_ttl

默認(rèn)(14400)

3600

wal用于記錄修改操作的,一般來(lái)說(shuō)是不需要保留太久的,況且nebula graph為了安全,都至少會(huì)為每個(gè)分片保留最后2個(gè)wal文件,所以減少ttl加快wal淘汰,將空間節(jié)約出來(lái)

修改之后,metad的磁盤(pán)空間占用下降,同時(shí)通信流量和磁盤(pán)讀寫(xiě)也明顯下降(下圖):

系統(tǒng)逐步恢復(fù)正常,但是還有一個(gè)問(wèn)題沒(méi)有解決,就是為什么有如此之多的session數(shù)據(jù)?查看應(yīng)用端日志,我們注意到session創(chuàng)建次數(shù)超乎尋常,如下圖所示:

通過(guò)日志發(fā)現(xiàn)是我們自己開(kāi)發(fā)的客戶端中的bug造成的。我們會(huì)在報(bào)錯(cuò)時(shí)讓客戶端釋放對(duì)應(yīng)的session,并重新創(chuàng)建,但由于系統(tǒng)抖動(dòng),這個(gè)行為造成了比較多的超時(shí),導(dǎo)致更多的session被釋放并重建,引起了惡性循環(huán)。針對(duì)這個(gè)問(wèn)題,對(duì)客戶端進(jìn)行了如下優(yōu)化:

修改

1

將創(chuàng)建session行為由并發(fā)改為串行,每次只允許一個(gè)線程進(jìn)行創(chuàng)建工作,不參與創(chuàng)建的線程監(jiān)聽(tīng)session pool

2

進(jìn)一步增強(qiáng)session的復(fù)用,當(dāng)session執(zhí)行失敗的時(shí)候,根據(jù)失敗原因來(lái)決定是否需要release。

原有的邏輯是一旦執(zhí)行失敗就release當(dāng)前session,但有些時(shí)候并非是session本身的問(wèn)題,比如超時(shí)時(shí)間過(guò)短,nGQL有錯(cuò)誤這些應(yīng)用層的情況也會(huì)導(dǎo)致執(zhí)行失敗,這個(gè)時(shí)候如果直接release,會(huì)導(dǎo)致session數(shù)量大幅度下降從而造成大量session創(chuàng)建。根據(jù)問(wèn)題合理的劃分錯(cuò)誤情況來(lái)進(jìn)行處理,可以最大程度保持session狀況的穩(wěn)定

3

增加預(yù)熱功能,根據(jù)配置提前創(chuàng)建好指定數(shù)量的session,以避免啟動(dòng)時(shí)集中創(chuàng)建session導(dǎo)致超時(shí)

4.2 酒店集群存儲(chǔ)服務(wù)CPU使用率過(guò)高

酒店業(yè)務(wù)方在增加訪問(wèn)量的時(shí)候,每次到80%的時(shí)候集群中就有少數(shù)storaged不穩(wěn)定,cpu使用率突然暴漲,導(dǎo)致整個(gè)集群響應(yīng)增加,從而應(yīng)用端產(chǎn)生大量超時(shí)報(bào)錯(cuò),如下圖所示:

和酒店方排查下來(lái)初步懷疑是存在稠密點(diǎn)問(wèn)題(在圖論中,稠密點(diǎn)是指一個(gè)點(diǎn)有著極多的相鄰邊,相鄰邊可以是出邊或者是入邊),部分storaged被集中訪問(wèn)引起系統(tǒng)不穩(wěn)定。由于業(yè)務(wù)方強(qiáng)調(diào)稠密點(diǎn)是其業(yè)務(wù)場(chǎng)景難以避免的情況,我們決定采取一些調(diào)優(yōu)手段來(lái)緩解這個(gè)問(wèn)題。

1)嘗試通過(guò)Balance來(lái)分?jǐn)傇L問(wèn)壓力

回憶之前的官方架構(gòu)圖,數(shù)據(jù)在storaged中是分片的,且raft協(xié)議中只有l(wèi)eader才會(huì)處理請(qǐng)求,所以重新進(jìn)行數(shù)據(jù)平衡操作,是有可能將多個(gè)稠密點(diǎn)分?jǐn)偟讲煌姆?wù)上意減輕單一服務(wù)的壓力。同時(shí)我們對(duì)整個(gè)集群進(jìn)行compaction操作(由于Storaged內(nèi)部使用了RocksDB作為存儲(chǔ)引擎,數(shù)據(jù)是通過(guò)追加來(lái)進(jìn)行修改的,Compaction可以清楚過(guò)時(shí)的數(shù)據(jù),提高訪問(wèn)效率)。

操作之后集群的整體cpu是有一定的下降,同時(shí)服務(wù)的響應(yīng)速度也有小幅的提升,如下圖。

但在運(yùn)行一段時(shí)間之后仍然遇到了cpu突然增加的情況,稠密點(diǎn)顯然沒(méi)有被平衡掉,也說(shuō)明在分片這個(gè)層面是沒(méi)法緩解稠密點(diǎn)帶來(lái)的訪問(wèn)壓力的 。

2)嘗試通過(guò)配置緩解鎖競(jìng)爭(zhēng)

進(jìn)一步調(diào)研出現(xiàn)問(wèn)題的storaged的cpu的使用率,可以看到當(dāng)流量增加的時(shí)候,內(nèi)核占用的cpu非常高,如下圖所示:

抓取perf看到,鎖競(jìng)爭(zhēng)比較激烈,即使在“正常”情況下,鎖的占比也很大,而在競(jìng)爭(zhēng)激烈的時(shí)候,出問(wèn)題的storaged服務(wù)上這個(gè)比例超過(guò)了50%。如下圖所示:

所以我們從減少?zèng)_突入手,對(duì)nebula graph集群主要做了如下改動(dòng):

類(lèi)型

配置項(xiàng)

原始值

修改值

說(shuō)明

Storaged

rocksdb_block_cache

默認(rèn)(4)

8192

block cache用緩存解壓縮之后的數(shù)據(jù),cache越大,數(shù)據(jù)淘汰情況越低,這樣就越可能更快的命中數(shù)據(jù),減少反復(fù)從page  cache加載及depress的操作

enable_rocksdb_prefix_filtering

false

true

在內(nèi)存足夠的情況下,我們打開(kāi)prefix過(guò)濾,是希望通過(guò)其通過(guò)前綴更快的定位到數(shù)據(jù),減少查詢非必要的數(shù)據(jù),減少數(shù)據(jù)競(jìng)爭(zhēng)

RocksDB

disable_auto_compactions

默認(rèn)

false

打開(kāi)自動(dòng)compaction,緩解因?yàn)閿?shù)據(jù)碎片造成的查詢cpu升高

write_buffer_size

默認(rèn)

134217728

將memtable設(shè)置為128MB,減少其flush的次數(shù)

max_background_compactions

默認(rèn)

4

控制后臺(tái)compactions的線程數(shù)

重新上線之后,整個(gè)集群服務(wù)變得比較平滑,cpu的負(fù)載也比較低,正常情況下鎖競(jìng)爭(zhēng)也下降不少(下圖),酒店也成功的將流量推送到了100%。

但運(yùn)行了一段時(shí)間之后,我們?nèi)匀挥龅搅朔?wù)響應(yīng)突然變慢的情況,熱點(diǎn)訪問(wèn)帶來(lái)的壓力 的確超過(guò)了優(yōu)化帶來(lái)的提升。

3)嘗試減小鎖的顆粒度

考慮到在分片級(jí)別的balance不起作用,而cpu的上升主要是因?yàn)殒i競(jìng)爭(zhēng)造成的,那我們想到如果減小鎖的顆粒度,是不是就可以盡可能減小競(jìng)爭(zhēng)?RocksDB的LRUCache允許調(diào)整shared數(shù)量,我們對(duì)此進(jìn)行了修改:

版本

LRUCache默認(rèn)分片數(shù)

方式

2.5.0

2 8

修改代碼,將分片改成2 10

2.6.1及以上

2 8

通過(guò)配置cache_bucket_exp = 10,將分片數(shù)改為2 10

觀察下來(lái)效果不明顯,無(wú)法解決熱點(diǎn)競(jìng)爭(zhēng)導(dǎo)致的雪崩問(wèn)題。其本質(zhì)同balance操作一樣,只是粒度的大小的區(qū)別,在熱點(diǎn)非常集中的情況下,在數(shù)據(jù)層面進(jìn)行處理是走不通的。

4)嘗試使用ClockCache

競(jìng)爭(zhēng)的鎖來(lái)源是block cache造成的。nebula storaged使用rocksdb作為存儲(chǔ),其使用的是LRUCache作為block cache等一系列cache的存儲(chǔ)模塊,LRUCache在任何類(lèi)型的訪問(wèn)的時(shí)候需要需要加鎖操作,以進(jìn)行一些LRU信息的更新,排序的調(diào)整及數(shù)據(jù)的淘汰,存在吞吐量的限制。

由于我們主要面臨的就是鎖競(jìng)爭(zhēng),在業(yè)務(wù)數(shù)據(jù)沒(méi)法變更的情況下,我們希望其他cache模塊來(lái)提升訪問(wèn)的吞吐。按照rocksdb官方介紹,其還支持一種cache類(lèi)型ClockCache,特點(diǎn)是在查詢時(shí)不需要加鎖,只有在插入時(shí)才需要加鎖,會(huì)有更大的訪問(wèn)吞吐,考慮到我們主要是讀操作,看起來(lái)ClockCache會(huì)比較合適。

LRU cache和Clock cache的區(qū)別: https://rocksdb.org.cn/doc/Block-Cache.html

經(jīng)過(guò)修改源碼和重新編譯,我們將緩存模塊改成了ClockCache,如下圖所示:

但集群使用時(shí)沒(méi)幾分鐘就core, 查找資料我們發(fā)現(xiàn)目前ClockCache支持還存在問(wèn)題( https://github.com/facebook/rocksdb/pull/8261) , 此方案目前無(wú)法使用。

5)限制線程使用

可以看到整個(gè)系統(tǒng)在當(dāng)前配置下,是存在非常多的線程的,如下圖所示。

如果是單線程,就必然不會(huì)存在鎖競(jìng)爭(zhēng)。但作為一個(gè)圖服務(wù),每次訪問(wèn)幾乎會(huì)解析成多個(gè)執(zhí)行器來(lái)并發(fā)訪問(wèn),強(qiáng)行改為單線程必然會(huì)造成訪問(wèn)堆積。

所以我們考慮將原有的線程池中的進(jìn)程調(diào)小,以避免太多的線程進(jìn)行同步等待帶來(lái)的線程切換,以減小系統(tǒng)對(duì)cpu的占用。

類(lèi)型

配置項(xiàng)

原始值

修改值

說(shuō)明

Storaged

num_io_threads

默認(rèn)(16)

4或者8

num_worker_threads

默認(rèn)(32)

4或者8

reader_handlers

默認(rèn)(32)

8或者12

官方未公開(kāi)配置

調(diào)整之后整個(gè)系統(tǒng)cpu非常平穩(wěn),絕大部分物理機(jī)cpu在20%以內(nèi),且沒(méi)有之前遇到的突然上下大幅波動(dòng)的情況(瞬時(shí)激烈鎖競(jìng)爭(zhēng)會(huì)大幅度提升cpu的使用率),說(shuō)明這個(gè)調(diào)整對(duì)當(dāng)前業(yè)務(wù)來(lái)說(shuō)是有一定效果的。

隨之又遇到了下列問(wèn)題,前端服務(wù)突然發(fā)現(xiàn)nebula的訪問(wèn)大幅度超時(shí),而從系統(tǒng)監(jiān)控的角度卻毫無(wú)波動(dòng)(下圖24,19:53系統(tǒng)其實(shí)已經(jīng)響應(yīng)出現(xiàn)問(wèn)題了,但cpu沒(méi)有任何波動(dòng))。

原因是在于,限制了thread 確實(shí)有效果,減少了競(jìng)爭(zhēng),但隨著壓力的正大,線程吞吐到達(dá)極限,但如果增加線程,資源的競(jìng)爭(zhēng)又會(huì)加劇,無(wú)法找到平衡點(diǎn)。

6)關(guān)閉數(shù)據(jù)壓縮,關(guān)閉block cache

在沒(méi)有特別好的方式避免鎖競(jìng)爭(zhēng)的情況,我們重新回顧了鎖競(jìng)爭(zhēng)的整個(gè)發(fā)生過(guò)程,鎖產(chǎn)生本身就是由cache自身的結(jié)構(gòu)帶來(lái)的,尤其是在讀操作的時(shí)候,我們并不希望存在什么鎖的行為。

使用block cache,是為了在合理的緩存空間中盡可能的提高緩存命中率,以提高緩存的效率。但如果緩存空間非常充足,且命中長(zhǎng)期的數(shù)據(jù)長(zhǎng)期處于特定的范圍內(nèi),實(shí)際上并沒(méi)有觀察到大量的緩存淘汰的情況,且當(dāng)前服務(wù)的緩存實(shí)際上也并沒(méi)有用滿,所以想到,是不是可以通過(guò)關(guān)閉block cache,而直接訪問(wèn)page cache來(lái)避免讀操作時(shí)的加鎖行為。

除了block cache,存儲(chǔ)端還有一大類(lèi)內(nèi)存使用是Indexes and filter blocks,與此有關(guān)的設(shè)置在RocksDB中是cache_index_and_filter_blocks。當(dāng)這個(gè)設(shè)置為true的時(shí)候,數(shù)據(jù)會(huì)緩存到block cache中,所以如果關(guān)閉了block cache,我們就需要同樣關(guān)閉cache_index_and_filter_blocks(在Nebula Graph中,通過(guò)配置項(xiàng)enable_partitioned_index_filter替代直接修改RocksDB的cache_index_and_filter_blocks)。

但僅僅修改這些并沒(méi)有解決問(wèn)題,實(shí)際上觀察perf我們?nèi)匀豢吹芥i的競(jìng)爭(zhēng)造成的阻塞(下圖):

這是因?yàn)楫?dāng)cache_index_and_filter_blocks為false的時(shí)候,并不代表index和filter數(shù)據(jù)不會(huì)被加載到內(nèi)存中,這些數(shù)據(jù)其實(shí)會(huì)被放進(jìn)table cache里,仍然需要通過(guò)LRU來(lái)維護(hù)哪些文件的信息需要淘汰,所以LRU帶來(lái)的問(wèn)題并沒(méi)有完全解決。處理的方式是將max_open_files設(shè)置為-1,以提供給系統(tǒng)無(wú)限制的table cache的使用,在這種情況下,由于沒(méi)有文件信息需要置換出去,算法邏輯被關(guān)閉。

總結(jié)下來(lái)核心修改如下表:

類(lèi)型

配置項(xiàng)

原始值

修改值

說(shuō)明

Storaged

rocksdb_block_cache

8192

-1

關(guān)閉block cache

rocksdb_compression_per_level

lz4

no:no:no:no:lz4:lz4:lz4

在L0~L3層關(guān)閉壓縮

enable_partitioned_index_filter

true

false

避免將index和filter緩存進(jìn)block  cache

RocksDB

max_open_files

4096

-1

避免文件被table cache淘汰,避免文件描述符被關(guān)閉,加快文件的讀取

關(guān)閉了block cache后,整個(gè)系統(tǒng)進(jìn)入了一個(gè)非常穩(wěn)定的狀態(tài),線上集群在訪問(wèn)量增加一倍以上的情況下,系統(tǒng)的cpu峰值反而穩(wěn)定在30%以下,且絕大部分時(shí)間都在10%以內(nèi)(下圖)。

需要說(shuō)明的是,酒店場(chǎng)景中關(guān)閉block cache是一個(gè)非常有效的手段,能夠?qū)ζ涮囟ㄇ闆r下的熱點(diǎn)訪問(wèn)起到比較好的效果,但這并非是一個(gè)常規(guī)方式,我們?cè)谄渌麡I(yè)務(wù)方的nebula graph集群中并沒(méi)有關(guān)閉block cache。

4.3 數(shù)據(jù)寫(xiě)入時(shí)服務(wù)down機(jī)

起因酒店業(yè)務(wù)在全量寫(xiě)入的時(shí)候,即使量不算很大(4~5w/s),在不特定的時(shí)間就會(huì)導(dǎo)致整個(gè)graphd集群完全down機(jī),由于graphd集群都是無(wú)狀態(tài)的,且互相之間沒(méi)有關(guān)系,如此統(tǒng)一的在某個(gè)時(shí)刻集體down機(jī),我們猜測(cè)是由于訪問(wèn)請(qǐng)求造成。通過(guò)查看堆棧發(fā)現(xiàn)了明顯的異常(下圖):

可以看到上圖中的三行語(yǔ)句被反復(fù)執(zhí)行,很顯然這里存在遞歸調(diào)用,并且無(wú)法在合理的區(qū)間內(nèi)退出,猜測(cè)為堆棧已滿。在增加了堆棧大小之后,整個(gè)執(zhí)行沒(méi)有任何好轉(zhuǎn),說(shuō)明遞歸不僅層次很深,且可能存在指數(shù)級(jí)的增加的情況。同時(shí)觀察down機(jī)時(shí)的業(yè)務(wù)請(qǐng)求日志,失敗瞬間大量執(zhí)行失敗,但有一些執(zhí)行失敗顯示為null引用錯(cuò)誤,如下圖所示:

這是因?yàn)榉祷亓藞?bào)錯(cuò),但沒(méi)有error message,導(dǎo)致發(fā)生了空引用(空引用現(xiàn)象是客戶端未合理處理這種情況,也是我們客戶端的bug),但這種情況很奇怪,為什么會(huì)沒(méi)有error message,檢查其trace日志,發(fā)現(xiàn)這些請(qǐng)求執(zhí)行nebula時(shí)間都很長(zhǎng),且存在非常大段的語(yǔ)句,如下圖所示:

預(yù)感是這些語(yǔ)句導(dǎo)致了graphd的down機(jī),由于執(zhí)行被切斷導(dǎo)致客戶端生成了一個(gè)null值。將這些語(yǔ)句進(jìn)行重試,可以必現(xiàn)down機(jī)的場(chǎng)景。檢查這樣的請(qǐng)求發(fā)現(xiàn)其是由500條語(yǔ)句組成(業(yè)務(wù)方語(yǔ)句拼接上限500),并沒(méi)有超過(guò)配置設(shè)置的最大執(zhí)行語(yǔ)句數(shù)量(512)。

看起來(lái)這是一個(gè)nebula官方的bug,我們已經(jīng)將此問(wèn)題提交給官方。同時(shí)業(yè)務(wù)方語(yǔ)句拼接限制從500降為200后順利避免該問(wèn)題導(dǎo)致的down機(jī)。

五、Nebula Graph二次開(kāi)發(fā)

當(dāng)前我們對(duì)Nebula Graph的修改主要集中的幾個(gè)運(yùn)維相關(guān)的環(huán)節(jié)上,比如新增了命令來(lái)指定遷移Storaged中的分片,以及將leader遷移到指定的實(shí)例上(下圖)。

六、未來(lái)規(guī)劃

  • 與攜程大數(shù)據(jù)平臺(tái)整合,充分利用Spark或者Flink來(lái)實(shí)現(xiàn)數(shù)據(jù)的傳輸和ETL,提高異構(gòu)集群間數(shù)據(jù)的遷移能力。
  • 提供Slowlog檢查功能,抓取造成slowlog的具體語(yǔ)句。
  • 參數(shù)化查詢功能,避免依賴注入。
  • 增強(qiáng)可視化能力,增加定制化功能。
責(zé)任編輯:張燕妮 來(lái)源: 攜程技術(shù)
相關(guān)推薦

2022-11-14 08:14:28

分布式數(shù)據(jù)庫(kù)運(yùn)維

2023-10-10 08:11:24

數(shù)據(jù)庫(kù)運(yùn)維多租戶

2022-08-04 07:51:09

分布式轉(zhuǎn)型運(yùn)維

2020-03-23 07:30:57

數(shù)據(jù)庫(kù)運(yùn)維架構(gòu)

2017-10-09 09:12:35

攜程運(yùn)維架構(gòu)

2019-07-11 16:16:03

智能分布式數(shù)據(jù)

2022-02-08 10:21:17

運(yùn)維應(yīng)用監(jiān)控

2022-06-27 09:42:55

攜程金融nebula圖平臺(tái)

2021-11-08 10:52:02

數(shù)據(jù)庫(kù)分布式技術(shù)

2018-12-14 11:04:56

數(shù)據(jù)庫(kù)運(yùn)維智能

2022-09-01 07:23:53

云原生數(shù)據(jù)庫(kù)Aurora

2023-04-17 08:21:42

2023-03-26 12:43:31

數(shù)據(jù)庫(kù)KeyValue

2013-04-26 16:18:29

大數(shù)據(jù)全球技術(shù)峰會(huì)

2021-12-20 15:44:28

ShardingSph分布式數(shù)據(jù)庫(kù)開(kāi)源

2023-12-05 07:30:40

KlustronBa數(shù)據(jù)庫(kù)

2014-06-30 14:20:05

NoSQL數(shù)據(jù)庫(kù)

2022-04-07 18:41:31

云計(jì)算數(shù)據(jù)治理

2018-04-25 09:01:02

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

最好看的2019年中文视频| 色综合久久中文字幕综合网| 91色视频在线观看| 加勒比av在线播放| 精品综合久久88少妇激情| 激情成人中文字幕| 国产综合色区在线观看| 一区二区小说| 在线精品国精品国产尤物884a| 成人午夜免费剧场| 亚洲国产av一区二区三区| 国产成人精品一区二区色戒| 日韩欧美高清| 日韩一区二区三区电影在线观看 | 久久精品亚洲一区| wwwxx日本| 日韩高清不卡| 一区二区三区色| 欧美色欧美亚洲另类七区| 91亚洲欧美激情| 99精品国产在热久久| 色吧影院999| 亚洲香蕉中文网| 激情久久99| 午夜a成v人精品| 在线免费观看成人网| 神马午夜精品95| 精品一区二区三区在线观看国产 | 久久精品观看| 久久久免费精品| 萌白酱视频在线| 色婷婷精品视频| 日韩欧美国产一区二区在线播放| 青青青国产在线视频| 搞黄网站在线看| 国产精品二区一区二区aⅴ污介绍| 精品久久久久久中文字幕动漫| 国产免费视频一区二区三区| 三级欧美在线一区| 91国产美女视频| 青青草手机在线观看| 欧美激情偷拍自拍| 国产午夜精品视频免费不卡69堂| 日本一区二区在线观看视频| а天堂中文最新一区二区三区| 日韩欧美国产高清91| 国产欧美日韩小视频| a级影片在线观看| 一区视频在线播放| 亚洲精品免费在线看| 久久精品蜜桃| 久久一二三国产| 激情小说综合网| 亚洲乱码在线观看| 国产成人午夜精品5599| 亚洲综合在线小说| 99在线小视频| 国产一区三区三区| 国产主播在线一区| 一区二区三区午夜| 久久99热狠狠色一区二区| 国产精品久久中文| 最新黄色网址在线观看| 免费成人在线视频观看| 国产精品嫩草影院久久久| 国产无遮挡又黄又爽又色视频| 男女精品网站| 国产a∨精品一区二区三区不卡| 丰满少妇乱子伦精品看片| 亚洲人妖在线| 8x拔播拔播x8国产精品| 天天综合网久久综合网| 亚洲欧美春色| 国产精品成人久久久久| 中文字幕网址在线| 狠狠狠色丁香婷婷综合激情| 91精品综合久久| 女人18毛片一区二区三区| 99麻豆久久久国产精品免费| 欧美大香线蕉线伊人久久| 国产在线你懂得| 国产精品女主播在线观看| 中文字幕av久久| 影音先锋在线视频| 亚洲成av人片在线观看| 黄色免费观看视频网站| 成人午夜毛片| 日韩欧美国产一区在线观看| jizz日本免费| 成人久久电影| 欧美肥婆姓交大片| 久久精品视频1| 久久精品国产99国产精品| 18成人在线| 亚洲欧美色视频| 日本一区二区三级电影在线观看 | 一区二区三区高清不卡| 青青草视频在线免费播放| 欧美日韩123区| 欧美日韩国产高清一区二区三区| 能看毛片的网站| 自拍自偷一区二区三区| 精品国产自在精品国产浪潮| 国产污片在线观看| 精品一二三四五区| 欧洲精品一区二区三区| 日韩手机在线导航| 性高潮久久久久久久| 希岛爱理一区二区三区| 欧美亚洲国产另类| 国产三级第一页| 久久久久久久国产精品影院| 特级黄色录像片| 中文不卡1区2区3区| 91精品国产综合久久婷婷香蕉| 久久久久国产精品无码免费看| 欧美限制电影| 97国产一区二区精品久久呦 | 春色成人在线视频| 成人免费黄色网页| 午夜精品在线视频一区| www.日本久久| 国产精品免费大片| 久久久久国色av免费观看性色 | www.久久艹| 91在线直播| 粉嫩av一区二区三区免费野| 无码人妻少妇色欲av一区二区| 欧美精选视频在线观看| 91精品国产免费久久久久久 | 欧美精品一区二区三区在线播放| 中文字幕黄色网址| 国产日韩欧美在线播放不卡| 91在线免费看片| 男人天堂久久久| 欧美性猛交一区二区三区精品| 亚洲视频在线播放免费| 中文字幕免费一区二区| 国产欧美在线看| 国产私拍精品| 日韩欧美国产激情| 亚州av综合色区无码一区| 午夜精品av| 91久久精品美女| 调教视频免费在线观看| 欧美午夜精品久久久久久孕妇| 成人免费看aa片| 一区二区亚洲| 成人三级视频在线观看一区二区| 成年人黄视频在线观看| 91精品国产综合久久久蜜臀图片| 美国一级黄色录像| 蜜臀a∨国产成人精品| 视频在线观看成人| 国产精品久久乐| 日韩中文视频免费在线观看| 岳乳丰满一区二区三区| 国产精品免费看片| www.cao超碰| 999精品色在线播放| 国产日韩欧美在线看| 五月婷婷在线观看| 91精品国产综合久久久久久| 性色av无码久久一区二区三区| 国产精品自拍网站| 欧美性猛交内射兽交老熟妇| 深夜福利一区| 高清一区二区三区四区五区| 天天干,夜夜操| 欧美日韩亚洲视频一区| 亚洲a v网站| 奇米色一区二区三区四区| 亚洲三级一区| 久久免费精品| 午夜伦理精品一区| 国产在线视频网址| 67194成人在线观看| 青娱乐国产在线| 91亚洲精品一区二区乱码| 国产精品无码专区av在线播放| 精品美女在线视频| 91牛牛免费视频| 2018av在线| 亚洲人成啪啪网站| 国产又大又长又粗| 五月综合激情婷婷六月色窝| 亚洲精品乱码久久久久久久久久久久| 日本欧美一区二区三区| 欧美精品一区二区性色a+v| 国产精品调教| 国产精品99久久久久久人 | 在线免费观看中文字幕| 亚洲精品乱码久久久久久久久| 日韩av无码一区二区三区不卡| 久久精品成人| 看一级黄色录像| 日韩av影院| 国产日韩精品在线| av中文字幕电影在线看| 中文字幕精品av| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 日本韩国精品一区二区在线观看| 老司机成人免费视频| 波多野结衣精品在线| 亚洲 中文字幕 日韩 无码| 中文在线日韩| 日韩成人在线资源| 综合中文字幕| 国产精品久久久久av| 日本动漫理论片在线观看网站| 亚洲老头老太hd| 国产av精国产传媒| 欧美亚洲一区二区在线观看| 日韩三级免费看| 亚洲欧美色一区| av网站免费在线看| 波多野结衣中文字幕一区| 在线观看国产福利| 日日骚欧美日韩| 成人毛片视频网站| 欧美精品偷拍| 色呦呦网站入口| 精品久久久亚洲| 国产尤物99| 91麻豆精品激情在线观看最新| 国产日韩精品在线播放| 日本欧美韩国| 69视频在线免费观看| 日本aa在线| 久久躁狠狠躁夜夜爽| 最新av网站在线观看| 亚洲另类激情图| 少妇av在线播放| 日韩欧美区一区二| 国产精品一区二区免费视频| 欧美日韩在线观看一区二区| 欧美h在线观看| 亚洲福利一区二区三区| 看片网站在线观看| 亚洲人123区| 亚洲区一区二区三| 国产精品灌醉下药二区| 亚洲图片第一页| 国产精品色噜噜| 亚洲图片另类小说| 久久久久国产精品麻豆ai换脸| 日本黄色动态图| 99精品桃花视频在线观看| 中国xxxx性xxxx产国| 粉嫩嫩av羞羞动漫久久久| 中文字幕乱码在线人视频| 狠狠色伊人亚洲综合成人| 亚洲精品久久久久久宅男| 久草在线在线精品观看| 日韩高清第一页| 久久99精品国产麻豆婷婷洗澡| 伊人色在线观看| 国内精品国产三级国产a久久 | 国产综合色区在线观看| 国产精品国产三级国产aⅴ9色| 亚洲承认视频| 国产精品v片在线观看不卡| 欧美xxxx做受欧美护士| 国产精品久久久久久一区二区| 久久久久黄色| 91免费国产视频| 日韩在线观看一区二区三区| 99在线视频播放| 好吊妞视频这里有精品| 久久亚洲国产精品日日av夜夜| 亚欧日韩另类中文欧美| 日本一区免费在线观看| 久久福利影院| 热久久最新网址| 在线日韩中文| 999香蕉视频| 精品一区二区三区在线观看| 亚洲黄色小说在线观看| 91网页版在线| 综合 欧美 亚洲日本| 亚洲少妇中出一区| 久热这里只有精品在线| 色综合久久中文字幕综合网| 一级特黄录像免费看| 日韩美女在线视频| 男生女生差差差的视频在线观看| 影音先锋日韩有码| а√天堂官网中文在线| 91产国在线观看动作片喷水| 日韩精品一区二区三区av| 91嫩草视频在线观看| 天天躁日日躁狠狠躁欧美| 亚洲欧美日韩精品在线| 激情丁香综合| 啊啊啊国产视频| 成人va在线观看| 免费视频91蜜桃| 亚洲最新视频在线观看| 亚洲大尺度在线观看| 日韩一区二区在线播放| 噜噜噜在线观看播放视频| 欧美成人午夜影院| 456成人影院在线观看| dy888夜精品国产专区| 成人中文在线| 国产精品网站免费| 精品一区二区三区在线观看| 一出一进一爽一粗一大视频| 中文字幕日韩精品一区 | 在线播放日韩| 一区二区免费av| 91视频www| 九九在线观看视频| 欧美日韩免费一区二区三区| 天天干天天干天天干| 久久久成人的性感天堂| 欧美18av| 国产一区免费| 欧美一区久久| 男人插女人下面免费视频| av毛片久久久久**hd| 九九精品在线观看视频| 欧美日韩一区三区| 亚洲色欧美另类| 欧美精品videosex牲欧美| 亚洲91在线| 亚洲激情一区二区| 手机精品视频在线观看| 六十路息与子猛烈交尾| 一区二区国产视频| 精品人妻无码一区二区| www.久久撸.com| 久久麻豆视频| 五月天久久狠狠| 美女日韩在线中文字幕| yy1111111| 午夜久久福利影院| 日本久久一级片| 久久人人97超碰精品888| 亚洲精选av| 大地资源网在线观看免费官网| 久久成人18免费观看| 啪啪一区二区三区| 欧美日韩国产成人在线免费| 国产51人人成人人人人爽色哟哟| 日韩av色在线| 国产精品免费不| 国内自拍视频网| 国产精品久久久久久久久快鸭| 波多野结衣绝顶大高潮| 亚洲香蕉av在线一区二区三区| 亚洲最大成人| 欧美日韩亚洲一区二区三区在线观看| 午夜在线播放视频欧美| v8888av| 福利视频一区二区| 邻居大乳一区二区三区| 国产精品久久久久久一区二区 | 国产a视频精品免费观看| 国产一级一级片| 亚洲成人亚洲激情| 五月天av在线| 色婷婷精品国产一区二区三区| 日韩福利电影在线| 5566中文字幕| 日韩欧美国产一区二区在线播放| 国产精品69xx| 久久国产精品久久| 日韩中文字幕不卡| 久久噜噜色综合一区二区| 日韩午夜激情视频| 国产不卡123| 日本在线观看一区二区三区| 男男成人高潮片免费网站| 午夜剧场免费在线观看| 欧美变态凌虐bdsm| 午夜精品久久久久久久久久蜜桃| 天堂资源在线亚洲资源| 国产在线国偷精品产拍免费yy| 国产精选第一页| 亚洲欧美日韩中文在线制服| 免费视频观看成人| 日韩 欧美 视频| 国产午夜一区二区三区| 国产精品乱码久久久| 国内外成人免费激情在线视频| 免费一区二区三区视频导航| 91精品999| 亚洲成人av一区二区三区| 国产三级电影在线| 97人人模人人爽视频一区二区| 国产精品久久国产愉拍| 国产精品一区二区亚洲| 精品久久久久一区二区国产| 欧美人与性动交xxⅹxx| 超碰超碰超碰超碰超碰| 久久久久久久性| www.天堂在线| 国产成人高潮免费观看精品| 欧美在线三区|