国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

基于 Flink 構(gòu)建萬(wàn)億數(shù)據(jù)量下的實(shí)時(shí)數(shù)倉(cāng)及實(shí)時(shí)查詢系統(tǒng)

共 12125字,需瀏覽 25分鐘

 ·

2021-10-20 07:02

一、背景介紹


1. 需要解決的業(yè)務(wù)痛點(diǎn)


推薦系統(tǒng)


對(duì)于推薦同學(xué)來(lái)說(shuō),想知道一個(gè)推薦策略在不同人群中的推薦效果是怎么樣的。


運(yùn)營(yíng)


對(duì)于運(yùn)營(yíng)的同學(xué)來(lái)說(shuō),想知道在廣東省的用戶中,最火的廣東地域內(nèi)容是哪些?方便做地域 push。


審核


對(duì)于審核的同學(xué),想知道過去 5 分鐘游戲類被舉報(bào)最多的內(nèi)容和賬號(hào)是哪些,方便能夠及時(shí)處理。


內(nèi)容創(chuàng)作


對(duì)于內(nèi)容的作者,想知道今天到目前為止,內(nèi)容被多少個(gè)用戶觀看,收到了多少個(gè)點(diǎn)贊和轉(zhuǎn)發(fā),方便能夠及時(shí)調(diào)整他的策略。


老板決策


對(duì)于老板來(lái)說(shuō),想知道過去 10 分鐘有多少用戶消費(fèi)了內(nèi)容,對(duì)消費(fèi)人群有一個(gè)宏觀的了解。






以上這幾點(diǎn)都是我們?nèi)粘9ぷ髦薪?jīng)常遇到的業(yè)務(wù)場(chǎng)景,后面的篇幅中會(huì)給出對(duì)應(yīng)的解決方案。


2. 開發(fā)前調(diào)研



在進(jìn)行開發(fā)之前我們做了如下這些調(diào)研。





■?2.1 離線數(shù)據(jù)分析平臺(tái)能否滿足這些需求


調(diào)研的結(jié)論是不能滿足離線數(shù)據(jù)分析平臺(tái),不行的原因如下:


  • 首先用戶的消費(fèi)行為數(shù)據(jù)上報(bào)需要經(jīng)過 Spark 的多層離線計(jì)算,最終結(jié)果出庫(kù)到 MySQL 或者 ES 提供給離線分析平臺(tái)查詢。這個(gè)過程的延時(shí)至少是 3-6 個(gè)小時(shí),目前比較常見的都是提供隔天的查詢,所以很多實(shí)時(shí)性要求高的業(yè)務(wù)場(chǎng)景都不能滿足。




  • 另一個(gè)問題是騰訊看點(diǎn)的數(shù)據(jù)量太大,帶來(lái)的不穩(wěn)定性也比較大,經(jīng)常會(huì)有預(yù)料不到的延遲,所以離線分析平臺(tái)是無(wú)法滿足這些需求的。




■?2.2 準(zhǔn)實(shí)時(shí)數(shù)據(jù)分析平臺(tái)



在騰訊內(nèi)部提供了準(zhǔn)實(shí)時(shí)數(shù)據(jù)查詢的功能,底層技術(shù)用的是 Kudu + Impala,Impala 雖然是 MPP 架構(gòu)的大數(shù)據(jù)計(jì)算引擎,并且訪問以列式存儲(chǔ)數(shù)據(jù)的 Kudu。但是對(duì)于實(shí)時(shí)數(shù)據(jù)的分析場(chǎng)景來(lái)說(shuō),它的查詢響應(yīng)速度和數(shù)據(jù)的延遲都還是比較高的。比如說(shuō)查詢一次實(shí)時(shí)的 DAU 返回結(jié)果的耗時(shí)至少是幾分鐘,無(wú)法提供良好的交互式的用戶體驗(yàn)。

所以 Kudu+Impala 這種通用的大數(shù)據(jù)處理框架的速度優(yōu)勢(shì),更多的是相比 Spark 加 HDFS 這種離線分析框架來(lái)說(shuō)的,對(duì)于我們實(shí)時(shí)性要求更高的場(chǎng)景是無(wú)法滿足的。因此需要進(jìn)行開發(fā),這就涉及到了方案選型和架構(gòu)設(shè)計(jì)。


3. 騰訊看點(diǎn)信息流的業(yè)務(wù)流程



在大家介紹一下騰訊看點(diǎn)信息流的業(yè)務(wù)流程,了解了業(yè)務(wù)的流程,就能夠更好的理解技術(shù)架構(gòu)的方案。


  • 第 1 步,內(nèi)容創(chuàng)作者發(fā)布內(nèi)容;




  • 第 2 步,內(nèi)容會(huì)經(jīng)過內(nèi)容審核系統(tǒng)啟用或者下架;




  • 第 3 步,啟用的內(nèi)容給到推薦系統(tǒng)和運(yùn)營(yíng)系統(tǒng),分發(fā)給 C 側(cè)用戶;




  • 第 4 步,內(nèi)容分發(fā)給 C 側(cè)用戶之后,用戶會(huì)產(chǎn)生各種行為,比如說(shuō)曝光、點(diǎn)擊舉報(bào)等,這些行為數(shù)據(jù)通過埋點(diǎn)上報(bào),實(shí)時(shí)接入到消息隊(duì)列中;




  • 第 5 步,構(gòu)建實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù);




  • 第 6 步,構(gòu)建實(shí)時(shí)數(shù)據(jù)查詢系統(tǒng)。






我們做的工作主要就在第 5 步和第 6 步,可以看一下我們的業(yè)務(wù)流程圖來(lái)進(jìn)一步的了解。





在業(yè)務(wù)流程圖中,我們主要做的兩部分工作,就是圖中有顏色的這兩部分:


  • 橙色部分,我們構(gòu)建了一個(gè)騰訊看點(diǎn)的實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù);




  • 綠色部分,我們基于了 OLAP 的存儲(chǔ)計(jì)算引擎,開發(fā)了實(shí)時(shí)數(shù)據(jù)分析系統(tǒng)。



為什么要構(gòu)建實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù)?因?yàn)樵嫉臄?shù)據(jù)上報(bào)數(shù)據(jù)量非常大,一天上報(bào)的峰值就有上萬(wàn)億條,而且上報(bào)的格式非?;靵y,缺乏了內(nèi)容的維度、信息用戶的畫像信息,下游就根本沒有辦法直接使用。

而我們提供的實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù),是根據(jù)騰訊看點(diǎn)信息流的業(yè)務(wù)場(chǎng)景,進(jìn)行了內(nèi)容維度的關(guān)聯(lián),用戶畫像的關(guān)聯(lián)和各種粒度的聚合,下游可以非常方便的使用實(shí)時(shí)數(shù)據(jù),而且實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù)可以提供給下游的用戶反復(fù)的消費(fèi)使用,可以大量的減少重復(fù)的工作。

綠色部分的多維實(shí)時(shí)數(shù)據(jù)分析系統(tǒng),消費(fèi)了我們提供的實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù),利用了 OLAP 存儲(chǔ)計(jì)算引擎,將海量的數(shù)據(jù)進(jìn)行高效的存儲(chǔ),再提供高性能的多維實(shí)時(shí)分析功能。

二、架構(gòu)設(shè)計(jì)



1. 設(shè)計(jì)的目標(biāo)與難點(diǎn)


首先來(lái)看一下數(shù)據(jù)分析系統(tǒng)的設(shè)計(jì)目標(biāo)與難點(diǎn)。我們的實(shí)時(shí)數(shù)據(jù)分析系統(tǒng)分為四大模塊:


  • 實(shí)時(shí)計(jì)算引擎;




  • 實(shí)時(shí)存儲(chǔ)引擎;




  • 后臺(tái)服務(wù)層;




  • 前端展示層。







難點(diǎn)主要在于前兩個(gè)模塊,實(shí)時(shí)計(jì)算引擎和實(shí)時(shí)存儲(chǔ)引擎。


  • 千萬(wàn)級(jí)每秒的海量數(shù)據(jù)如何實(shí)時(shí)的接入,并且進(jìn)行極低延遲的維表關(guān)聯(lián)是有難度的;




  • 實(shí)時(shí)存儲(chǔ)引擎如何支持高并發(fā)的寫入。高可用分布式和高性能的索引查詢是比較難的,可以看一下我們的系統(tǒng)架構(gòu)設(shè)計(jì)來(lái)了解這幾個(gè)模塊的具體實(shí)現(xiàn)。




2. 系統(tǒng)架構(gòu)設(shè)計(jì)



關(guān)于系統(tǒng)架構(gòu)的設(shè)計(jì),主要從以下幾方面來(lái)講。


■?2.1 實(shí)時(shí)計(jì)算


  • 接入層主要是從千萬(wàn)級(jí)每秒的原始消息隊(duì)列中拆分出不同業(yè)務(wù)不同行為數(shù)據(jù)的微隊(duì)列。拿 QQ 看點(diǎn)的視頻內(nèi)容來(lái)說(shuō),拆分過后的數(shù)據(jù)就只有百萬(wàn)級(jí)每秒了。


  • 實(shí)時(shí)計(jì)算層主要是負(fù)責(zé)多行行為流水?dāng)?shù)據(jù)進(jìn)行 "行轉(zhuǎn)列" 的操作,實(shí)時(shí)關(guān)聯(lián)用戶畫像數(shù)據(jù)和內(nèi)容維度數(shù)據(jù)。


  • 實(shí)時(shí)數(shù)倉(cāng)存儲(chǔ)層主要就是設(shè)計(jì)出符合看點(diǎn)的業(yè)務(wù),下游好用的實(shí)時(shí)消息隊(duì)列。







我們暫時(shí)提供了兩個(gè)消息隊(duì)列,作為實(shí)時(shí)數(shù)倉(cāng)的兩層:


  • 第一層是 DWM 層,它是內(nèi)容 ID 和用戶 ID 粒度聚合的,就是說(shuō)一條數(shù)據(jù)包含了內(nèi)容 ID 和用戶 ID,然后還有 B 側(cè)的內(nèi)容維度數(shù)據(jù),C 側(cè)的用戶行為數(shù)據(jù),還有用戶畫像數(shù)據(jù)。




  • 第二層是 DWS 層,這一層是內(nèi)容 ID 粒度聚合的,就是一條數(shù)據(jù)包含了內(nèi)容 ID、B 側(cè)數(shù)據(jù)和 C 側(cè)數(shù)據(jù)??梢钥吹絻?nèi)容 ID 和用戶 ID 粒度的消息,隊(duì)列流量進(jìn)一步減小到了 10 萬(wàn)級(jí)每秒,內(nèi)容 ID 粒度更是減小到了萬(wàn)級(jí)每秒,并且格式更加清晰,維度信息更加豐富。







■?2.2 實(shí)時(shí)存儲(chǔ)




  • 實(shí)時(shí)寫入層主要是負(fù)責(zé) Hash 路由,將數(shù)據(jù)寫入;




  • OLAP 存儲(chǔ)層是利用 MPP 的存儲(chǔ)引擎,設(shè)計(jì)出符合業(yè)務(wù)的索引和物化視圖,高效存儲(chǔ)海量數(shù)據(jù);




  • 后臺(tái)接口層是提供了高效的多維實(shí)時(shí)查詢接口。







■?2.3 后臺(tái)服務(wù)



后臺(tái)服務(wù)是基于騰訊自研的 RPC 后臺(tái)服務(wù)框架寫的,并且會(huì)進(jìn)行一些二級(jí)緩存。


■?2.4 前端服務(wù)



前端采用的是開源組件 Ant Design,利用了 Nginx,反向代理了瀏覽器的請(qǐng)求到后臺(tái)服務(wù)器上。


3. 方案選型



關(guān)于架構(gòu)設(shè)計(jì)的方案選型,我們對(duì)比了業(yè)內(nèi)的領(lǐng)先方案,最終選擇了最符合我們業(yè)務(wù)場(chǎng)景的方案。





■ 3.1 實(shí)時(shí)數(shù)倉(cāng)的選型



我們選擇的是業(yè)內(nèi)比較成熟的 Lambda 架構(gòu),它的優(yōu)點(diǎn)是成熟度高,靈活性高,遷移成本低等等。但是它有一個(gè)缺點(diǎn),實(shí)時(shí)和離線用了兩套代碼,可能會(huì)存在一個(gè)口徑修改了數(shù)據(jù),但另一個(gè)沒有修改從而造成數(shù)據(jù)不一致的問題。我們的解決方案每天都有做數(shù)據(jù)對(duì)賬的工作,如果有異常會(huì)進(jìn)行告警。


■?3.2 實(shí)時(shí)計(jì)算引擎的選型



我們選擇了 Flink 作為實(shí)時(shí)計(jì)算引擎,是因?yàn)?Flink 在設(shè)計(jì)之初就是為了流處理來(lái)設(shè)計(jì)的,Sparks Streaming 嚴(yán)格來(lái)說(shuō)還是微批處理,storm 現(xiàn)在用的已經(jīng)不是很多了。并且, Flink 還有 exactly-once 的準(zhǔn)確性,輕量級(jí)的容錯(cuò)機(jī)制,低延遲高吞吐,應(yīng)用性高的特點(diǎn),所以我們選擇了 Flink 作為實(shí)時(shí)計(jì)算引擎。


■?3.3 實(shí)時(shí)存儲(chǔ)引擎



我們的要求是需要有維度索引,支持高并發(fā)的寫入和高性能的多維實(shí)時(shí) OLAP 查詢??梢钥吹?HBase,TiDB 和 ES 都不能滿足要求。Druid 有一個(gè)缺陷,它是按照時(shí)序劃分 Segment,也就說(shuō)明無(wú)法將同一個(gè)內(nèi)容全部存放在同一個(gè) Segment 上,所以在計(jì)算全局的 Top N 的時(shí)候就只能夠計(jì)算近似值。于是我們選擇了最近兩年大火的 MPP 數(shù)據(jù)庫(kù)引擎 Clickhouse,后面我會(huì)結(jié)合我們的具體使用場(chǎng)景和 Clickhouse 的內(nèi)核原理,介紹一下 Clickhouse 的優(yōu)勢(shì)。

三、實(shí)時(shí)數(shù)倉(cāng)



實(shí)時(shí)數(shù)倉(cāng)也分為三塊來(lái)介紹:


  • 第一是如何構(gòu)建實(shí)時(shí)數(shù)倉(cāng);




  • 第二是實(shí)時(shí)數(shù)倉(cāng)的優(yōu)點(diǎn);




  • 第三是基于實(shí)時(shí)數(shù)倉(cāng),利用 Flink 開發(fā)實(shí)時(shí)應(yīng)用時(shí)候遇到的一些問題。



實(shí)時(shí)數(shù)倉(cāng)這一部分的難度在于它處于一個(gè)比較新的領(lǐng)域,并且各個(gè)公司各個(gè)業(yè)務(wù)的差距都比較大,怎么樣能夠設(shè)計(jì)出方便好用,符合看點(diǎn)信息流業(yè)務(wù)場(chǎng)景的實(shí)時(shí)數(shù)倉(cāng)是有難度的。


1. 如何構(gòu)建實(shí)時(shí)數(shù)倉(cāng)



先看一下實(shí)時(shí)數(shù)倉(cāng)要做什么。實(shí)時(shí)數(shù)倉(cāng)對(duì)外來(lái)說(shuō)就是幾個(gè)消息隊(duì)列,不同的消息隊(duì)列里面存放的是不同聚合粒度的實(shí)時(shí)數(shù)據(jù),包括了內(nèi)容 ID、用戶 ID、C 側(cè)用戶行為數(shù)據(jù),B 側(cè)內(nèi)容維度數(shù)據(jù)和用戶畫像數(shù)據(jù)等。搭建實(shí)時(shí)數(shù)倉(cāng)可以分為三步。





■?1.1數(shù)據(jù)清洗



首先從海量的原始消息隊(duì)列中進(jìn)行復(fù)雜的數(shù)據(jù)清洗操作,可以獲得格式清晰的實(shí)時(shí)數(shù)據(jù)。它的具體操作其實(shí)就是在 Flink 的實(shí)時(shí)計(jì)算環(huán)節(jié),先按照一分鐘的粒度進(jìn)行了窗口的聚合,在窗口內(nèi)原本多行的行為數(shù)據(jù)被轉(zhuǎn)成了一行多列的數(shù)據(jù)格式。


■?1.2 高性能維表關(guān)聯(lián)



第二步是進(jìn)行高性能的實(shí)時(shí)維表關(guān)聯(lián),補(bǔ)充用戶畫像數(shù)據(jù)和內(nèi)容維度數(shù)據(jù)等。但是海量的用戶畫像數(shù)據(jù)是存在于 HDFS 上的,內(nèi)容維度數(shù)據(jù)又是存在于 HBase 上的,所以想要極低延遲的維表關(guān)聯(lián)是有技術(shù)挑戰(zhàn)的。這一塊在后文會(huì)單獨(dú)介紹。


■?1.3 不同粒度聚



第三步是將算好的實(shí)時(shí)數(shù)據(jù)按照不同的粒度進(jìn)行聚合,然后放到對(duì)應(yīng)的消息隊(duì)列中進(jìn)行保存,可以提供給下游多用戶復(fù)用,到這里實(shí)時(shí)數(shù)倉(cāng)就搭建完成了。





接下來(lái)詳細(xì)介紹一下第二步中高性能實(shí)時(shí)維表關(guān)聯(lián)是怎么處理的。


幾十億的用戶畫像數(shù)據(jù)存放在 HDFS 上,肯定是無(wú)法進(jìn)行高性能的維表關(guān)聯(lián)的,所以需要進(jìn)行緩存。由于數(shù)據(jù)量太大,本地緩存的代價(jià)不合理,我們采用的是 Redis 進(jìn)行緩存,具體實(shí)現(xiàn)是通過 Spark 批量讀取 HDFS 上的畫像數(shù)據(jù),每天更新 Redis 緩存,內(nèi)容維度數(shù)據(jù)存放在 HBase 中。


為了不影響線上的業(yè)務(wù),我們?cè)L問的是 HBase 的備庫(kù),而且由于內(nèi)容維度變化的頻率遠(yuǎn)高于用戶畫像,所以維度關(guān)聯(lián)的時(shí)候,我們需要盡量的關(guān)聯(lián)到實(shí)時(shí)的 HBase 數(shù)據(jù)。


一分鐘窗口的數(shù)據(jù),如果直接關(guān)聯(lián) HBase 的話,耗時(shí)是十幾分鐘,這樣會(huì)導(dǎo)致任務(wù)延遲。我們發(fā)現(xiàn) 1000 條數(shù)據(jù)訪問 HBase 是秒級(jí)的,而訪問 Redis 的話只是毫秒級(jí)的,訪問 Redis 的速度基本上是訪問 HBase 的 1000 倍,所以我們?cè)谠L問 HBase 的內(nèi)容之前設(shè)置了一層 Redis 緩存,然后通過了監(jiān)聽 HBase-proxy 寫流水,通過這樣來(lái)保證緩存的一致性。


這樣一分鐘的窗口數(shù)據(jù),原本關(guān)聯(lián)內(nèi)容維度數(shù)據(jù)耗時(shí)需要十幾分鐘,現(xiàn)在就變成了秒級(jí)。我們?yōu)榱朔乐惯^期的數(shù)據(jù)浪費(fèi)緩存,緩存的過期時(shí)間我們?cè)O(shè)置成了 24 個(gè)小時(shí)。


最后還有一些小的優(yōu)化,比如說(shuō)內(nèi)容數(shù)據(jù)上報(bào)過程中會(huì)上報(bào)不少非常規(guī)的內(nèi)容 ID,這些內(nèi)容 ID 在 HBase 中是不存儲(chǔ)的,會(huì)造成緩存穿透的問題。所以在實(shí)時(shí)計(jì)算的時(shí)候,我們直接過濾掉這些內(nèi)容 ID,防止緩存穿透,又減少了一些時(shí)間。另外,因?yàn)樵O(shè)置了定時(shí)緩存,會(huì)引入一個(gè)緩存雪崩的問題,所以我們?cè)趯?shí)時(shí)計(jì)算的過程中進(jìn)行了削峰填谷的操作,錯(cuò)開了設(shè)置緩存的時(shí)間,來(lái)緩解緩存雪崩的問題。


2. 實(shí)時(shí)數(shù)倉(cāng)的優(yōu)點(diǎn)







我們可以看一下,在我們建設(shè)實(shí)時(shí)數(shù)倉(cāng)的前后,開發(fā)一個(gè)實(shí)時(shí)應(yīng)用的區(qū)別。


沒有數(shù)倉(cāng)的時(shí)候,我們需要消費(fèi)千萬(wàn)級(jí)每秒的原始隊(duì)列,進(jìn)行復(fù)雜的數(shù)據(jù)清洗,然后再進(jìn)行用戶畫像關(guān)聯(lián)、內(nèi)容維度關(guān)聯(lián),才能夠拿到符合要求格式的實(shí)時(shí)數(shù)據(jù)。開發(fā)和擴(kuò)展的成本都會(huì)比較高。如果想開發(fā)一個(gè)新的應(yīng)用,又要走一遍流程?,F(xiàn)在有了實(shí)時(shí)數(shù)倉(cāng)之后,如果再想開發(fā)一個(gè)內(nèi)容 ID 粒度的實(shí)時(shí)應(yīng)用,就直接申請(qǐng) TPS 萬(wàn)級(jí)每秒的 DWS 層消息對(duì)列即可,開發(fā)成本變低很多,資源消耗小了很多,可擴(kuò)展性也強(qiáng)了很多。


我們看一個(gè)實(shí)際的例子,開發(fā)我們系統(tǒng)的實(shí)時(shí)數(shù)據(jù)大屏,原本需要進(jìn)行如上的所有操作才能夠拿到數(shù)據(jù),現(xiàn)在只需要消費(fèi) DWS 層消息隊(duì)列寫一條 Flink SQL 即可,僅僅會(huì)消耗 2 個(gè) CPU 核心和 1GB 的內(nèi)存。以 50 個(gè)消費(fèi)者為例,建立實(shí)時(shí)數(shù)倉(cāng)的前后,下游開發(fā)一個(gè)實(shí)時(shí)應(yīng)用,可以減少 98% 的資源消耗,包括了計(jì)算資源、存儲(chǔ)資源、人力成本和開發(fā)人員的學(xué)習(xí)接入成本等等,并且隨著消費(fèi)者越多節(jié)省的就越多,就拿 Redis 存儲(chǔ)這一部分來(lái)說(shuō),一個(gè)月就能夠省下上百萬(wàn)的人民幣。


3. Flink 開發(fā)過程中遇到的問題總結(jié)



在利用 Flink 開發(fā)實(shí)時(shí)應(yīng)用的過程中遇到過不少問題,這里選擇幾個(gè)比較有代表性的給大家分享一下。


■?3.1 實(shí)時(shí)數(shù)據(jù)大屏



第一個(gè)是開發(fā)實(shí)時(shí)數(shù)據(jù)大屏的時(shí)候,開始是通過 Flink SQL 來(lái)實(shí)現(xiàn)的,功能非常簡(jiǎn)單,就是計(jì)算當(dāng)天截止到當(dāng)前累計(jì)的點(diǎn)擊數(shù),實(shí)現(xiàn)的方式也非常簡(jiǎn)單,輸入的 source table 是實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù)的消息隊(duì)列。輸出的 sink table 就是 Redis。SQL 就是:select sum(click) from sourceTable Group by day time。

這個(gè)任務(wù)看起來(lái)是沒有問題的,但是實(shí)際跑起來(lái)數(shù)據(jù)卻無(wú)法實(shí)時(shí)更新,是因?yàn)?source table 每到達(dá)一條點(diǎn)擊數(shù)據(jù),累計(jì)值都會(huì)加一,然后就會(huì)往 Redis 中寫一條最新的數(shù)據(jù)。所以當(dāng)數(shù)據(jù)量太大的時(shí)候,它就會(huì)頻繁的寫 Redis,所以這樣就會(huì)導(dǎo)致寫 Redis 的網(wǎng)絡(luò)延遲會(huì)顯得非常高,從而會(huì)導(dǎo)致背壓數(shù)據(jù)無(wú)法實(shí)時(shí)更新。

我們做了一個(gè)簡(jiǎn)單的優(yōu)化,用 table API 執(zhí)行完 SQL 之后,轉(zhuǎn)化成 DataStream,然后通過一個(gè)一秒鐘的數(shù)據(jù)窗口,每秒鐘僅僅會(huì)輸出最新的累計(jì)值到 Redis 中,這樣的數(shù)據(jù)就可以實(shí)時(shí)更新了。





■?3.2 Flink state 的 TTL



Flink 的 1.6 版本開始引入了 state TTL,開啟了 state TTL 之后,F(xiàn)link 就會(huì)為每一個(gè) keyed state 增加一個(gè)時(shí)間戳字段,通過時(shí)間戳字段就可以判斷 state 是不是過期,是否需要進(jìn)行清理。但是如果僅僅從字面意思上理解就會(huì)遇到一些問題,在 1.10 版本之前,雖然開啟了 state TTL,但是 Flink 默認(rèn)是不會(huì)自動(dòng)清理過期的 state 的。所以如果是 heap memory backend,就會(huì)導(dǎo)致 OOM 的問題;如果是 rocksDB backend,就會(huì)導(dǎo)致 state 的狀態(tài)越來(lái)越大,最終會(huì)導(dǎo)致重啟的時(shí)候耗費(fèi)的時(shí)間過長(zhǎng)。后面經(jīng)過調(diào)研,我們發(fā)現(xiàn)有兩種方式可以清理 Flink 的過期的 state。

第一種是手動(dòng)清理,第二種的話是自動(dòng)清理。我們最終選擇的是以手動(dòng)觸發(fā)的方式來(lái)清理過期的 state。每天在深夜,也就是業(yè)務(wù)低谷期的時(shí)候,我們會(huì)對(duì) state 中的數(shù)據(jù)進(jìn)行遍歷的訪問,訪問到過期的數(shù)據(jù),就會(huì)進(jìn)行清理。

為什么我們沒有選擇 Flink 的自動(dòng)清理策略,是因?yàn)?Flink 在 1.8 版本之前,只有一種自動(dòng)清理策略,clean up in full snapshot。這種清理策略從名字上來(lái)看就知道他是在做全量 snapshot 的時(shí)候會(huì)進(jìn)行清理,但是有一個(gè)致命的缺陷,它并不會(huì)減少本身 state 的大小,而是僅僅把清理過后的 state 做到 snapshot 里面,最終還是會(huì) OOM。并且,它重啟之后才能夠加載到之前清理過的 state,會(huì)導(dǎo)致它頻繁的重啟。

雖然在 1.8 版本之后,增加了兩種自動(dòng)清理的策略,但是因?yàn)樗钱惒角謇?,所以他的清理時(shí)機(jī)和使用方式都不如手動(dòng)清理那么靈活,所以最終我們還是選擇了手動(dòng)觸發(fā)的方式進(jìn)行清理。在 1.10 版本之后,默認(rèn)是選擇了自動(dòng)清理的策略,但是這就要求用戶對(duì)自動(dòng)清理策略的時(shí)機(jī)和策略 有比較好的了解,這樣才能夠更好的滿足業(yè)務(wù)的需求。





■?3.3 使用 Flink valueState 和 mapState 經(jīng)驗(yàn)總結(jié)


雖然通過 valueState 也可以存儲(chǔ) map 結(jié)構(gòu)的數(shù)據(jù),但是能夠使用 mapState 的地方盡量使用 mapState,最好不要通過 valueState 來(lái)存儲(chǔ) map 結(jié)構(gòu)的數(shù)據(jù),因?yàn)?Flink 對(duì) mapState 是進(jìn)行了優(yōu)化的,效率會(huì)比 valuState 中存儲(chǔ) map 結(jié)構(gòu)的數(shù)據(jù)更加高效。


比如我們遇到過的一個(gè)問題就是使用 valueState 存儲(chǔ)了 map 結(jié)構(gòu)的數(shù)據(jù),選擇的是 rocksDB backend。我們發(fā)現(xiàn)磁盤的 IO 變得越來(lái)越高,延遲也相應(yīng)的增加。后面發(fā)現(xiàn)是因?yàn)?valueState 中修改 map 中的任意一個(gè) key 都會(huì)把整個(gè) map 的數(shù)據(jù)給讀出來(lái),然后再寫回去,這樣會(huì)導(dǎo)致 IO 過高。但是 mapState,它每一個(gè) key 在 rocksDB 中都是一條單獨(dú)的 key,磁盤 IO 的代價(jià)就會(huì)小很多。







■?3.4 Checkpoint 超時(shí)問題


我們還遇到過一些問題,比如說(shuō) Checkpoint 超時(shí)了,當(dāng)時(shí)我們第一個(gè)想法就是計(jì)算資源不足,并行度不夠?qū)е碌某瑫r(shí),所以我們直接增加了計(jì)算資源,增大了并行度,但是超時(shí)的情況并沒有得到緩解。后面經(jīng)過研究才發(fā)現(xiàn)是數(shù)據(jù)傾斜,導(dǎo)致某個(gè)節(jié)點(diǎn)的 barrier 下發(fā)不及時(shí)導(dǎo)致的,通過 rebalance 之后才能夠解決。


總的來(lái)說(shuō) Flink 功能還是很強(qiáng)的,它文檔比較完善,網(wǎng)上資料非常豐富,社區(qū)也很活躍,一般遇到問題都能夠比較快的找到解決方案。



四、實(shí)時(shí)數(shù)據(jù)查詢系統(tǒng)



我們的實(shí)時(shí)查詢系統(tǒng),多維實(shí)時(shí)查詢系統(tǒng)用的是 Clickhouse 來(lái)實(shí)現(xiàn)的,這塊分為三個(gè)部分來(lái)介紹。第一是分布式高可用,第二是海量數(shù)據(jù)的寫入,第三是高性能的查詢。


Click house 有很多表引擎,表引擎決定了數(shù)據(jù)以什么方式存儲(chǔ),以什么方式加載,以及數(shù)據(jù)表?yè)碛惺裁礃拥奶匦??目?Clickhouse 擁有 merge tree、replaceingMerge Tree、AggregatingMergeTree、外存、內(nèi)存、IO 等 20 多種表引擎,其中最體現(xiàn) Clickhouse 性能特點(diǎn)的是 merge tree 及其家族表引擎,并且當(dāng)前 Clickhouse 也只有 merge 及其家族表引擎支持了主鍵索引、數(shù)據(jù)分區(qū)、數(shù)據(jù)副本等優(yōu)秀的特性。我們當(dāng)前使用的也是 Clickhouse 的 merge tree 及其家族表引擎,接下來(lái)的介紹都是基于引擎展開的。


1. 分布式高可用



先看分布式高可用,不管單節(jié)點(diǎn)的性能多強(qiáng),隨著業(yè)務(wù)的增長(zhǎng),早晚都會(huì)有遇到瓶頸的一天,而且意外的宕機(jī)在計(jì)算機(jī)的運(yùn)行中是無(wú)法避免的。Clickhouse 通過分片來(lái)水平擴(kuò)展集群,將總的數(shù)據(jù)水平分成 m 分,然后每個(gè)分片中保存一份數(shù)據(jù),避開了單節(jié)點(diǎn)的性能瓶頸,然后通過副本即每個(gè)分片擁有若干個(gè)數(shù)據(jù)一樣的副本來(lái)保障集群的高可用。

再看看 Clickhouse 默認(rèn)的高可用方案,數(shù)據(jù)寫入是通過分布式表寫入,然后分布式表會(huì)將數(shù)據(jù)同時(shí)寫入到同一個(gè)分片的所有副本里面。這里會(huì)有一個(gè)問題,如果副本 0 寫入成功,副本 1 寫入失敗,那么就會(huì)造成同一個(gè)分片的不同副本數(shù)據(jù)不一致的問題,所以默認(rèn)的高可用方案是不能夠用于生產(chǎn)環(huán)境的。

我們這里聽取的是 Clickhouse 官方的建議,借助了 Zookeeper 實(shí)現(xiàn)高可用的方案,數(shù)據(jù)寫入一個(gè)分片的時(shí)候,僅僅寫入一個(gè)副本,然后再寫 Zookeeper,通過 Zookeeper 告訴同一個(gè)分片的其他副本,再過來(lái)拉取數(shù)據(jù),保證數(shù)據(jù)的一致性。

接下來(lái)看一下 Clickhouse 實(shí)現(xiàn)這種高可用方案的底層原理,這種高可用的方案需要通過 Clickhouse 的 replicated merge tree 表引擎來(lái)實(shí)現(xiàn),其中在 replicated merge tree 表引擎的核心代碼中,有大量跟 Zookeeper 進(jìn)行交互的邏輯,從而實(shí)現(xiàn)了多個(gè)副本的協(xié)同,包括主副本的選舉寫入任務(wù)隊(duì)列的變更和副本狀態(tài)的變化等等??梢钥吹酵獠繑?shù)據(jù)寫入 Clickhouse 的一個(gè)分片,會(huì)先寫入一個(gè)副本的內(nèi)存中,在內(nèi)存中按照指定的條件排好序,再寫入磁盤的一個(gè)臨時(shí)目錄。最后將臨時(shí)目錄重命名為最終目錄的名字,寫完之后通過 Zookeeper 進(jìn)行一系列的交互,實(shí)現(xiàn)數(shù)據(jù)的復(fù)制。

這里沒有選用消息隊(duì)列進(jìn)行數(shù)據(jù)的同步,是因?yàn)?Zookeeper 更加輕量級(jí),而且寫的時(shí)候任意寫一個(gè)副本,其他的副本都能夠通過讀 Zookeeper 獲得一致性的數(shù)據(jù),而且就算其他節(jié)點(diǎn)第一次來(lái)獲取數(shù)據(jù)失敗了,后面只要發(fā)現(xiàn)它跟 Zookeeper 上的數(shù)據(jù)記錄不一致,就會(huì)再次嘗試獲取數(shù)據(jù),保證數(shù)據(jù)的一致性。





2. 海量數(shù)據(jù)的寫入




■?2.1 Append + Merge



數(shù)據(jù)寫入遇到的第一個(gè)問題是海量數(shù)據(jù)直接寫 Clickhouse 是會(huì)失敗的。Clickhouse 的 merge tree 家族表引擎的底層原理類似于 LSM tree,數(shù)據(jù)是通過 append 的方式寫入,后續(xù)再啟動(dòng) merge 線程,將小的數(shù)據(jù)文件進(jìn)行合并。了解了 Clickhouse merge tree 家族表引擎的寫入過程,我們就會(huì)發(fā)現(xiàn)以下兩個(gè)問題。


  • 如果一次寫入的數(shù)據(jù)太少,比如一條數(shù)據(jù)只寫一次,就會(huì)產(chǎn)生大量的文件目錄。當(dāng)后臺(tái)合并線程來(lái)不及合并的時(shí)候,文件目錄的數(shù)量就會(huì)越來(lái)越多,這會(huì)導(dǎo)致 Clickhouse 拋出 too many parts 的異常,寫入失敗。




  • 另外,之前介紹的每一次寫入除了數(shù)據(jù)本身,Clickhouse 還會(huì)需要跟 Zookeeper 進(jìn)行 10 來(lái)次的數(shù)據(jù)交互,而我們知道 Zookeeper 本身是不能夠承受很高的并發(fā)的,所以可以看到寫入 Clickhouse QPS 過高,導(dǎo)致 zookeeper 的崩潰。







我們采用的解決方案是改用 batch 的方式寫入,寫入 zookeeper 一個(gè) batch 的數(shù)據(jù),產(chǎn)生一個(gè)數(shù)據(jù)目錄,然后再與 Zookeeper 進(jìn)行一次數(shù)據(jù)交互。那么 batch 設(shè)置多大?如果 batch 太小的話,就緩解不了 Zookeeper 的壓力;但是 batch 也不能設(shè)置的太大,要不然上游的內(nèi)存壓力以及數(shù)據(jù)的延遲都會(huì)比較大。所以通過實(shí)驗(yàn),最終我們選擇了大小幾十萬(wàn)的 batch,這樣可以避免了 QPS 太高帶來(lái)的問題。


其實(shí)當(dāng)前的方案還是有優(yōu)化空間的,比如說(shuō) Zookeeper 無(wú)法線性擴(kuò)展,我有了解到業(yè)內(nèi)有些團(tuán)隊(duì)就把 Mark 和 date part 相關(guān)的信息不寫入 Zookeeper。這樣能夠減少 Zookeeper 的壓力。不過這樣涉及到了對(duì)源代碼的修改,對(duì)于一般的業(yè)務(wù)團(tuán)隊(duì)來(lái)說(shuō),實(shí)現(xiàn)的成本就會(huì)比較高。







■?2.2 分布式表寫入



如果數(shù)據(jù)寫入通過分布式表寫入會(huì)遇到單點(diǎn)的磁盤問題,先介紹一下分布式表,分布式表實(shí)際上是一張邏輯表,它本身并不存儲(chǔ)真實(shí)的數(shù)據(jù),可以理解為一張代理表,比如用戶查詢分布式表,分布式表會(huì)將查詢請(qǐng)求下發(fā)到每一個(gè)分片的本地表上進(jìn)行查詢,然后再收集每一個(gè)本地表的查詢結(jié)果,匯總之后再返回給用戶。那么用戶寫入分布式表的場(chǎng)景,是用戶將一個(gè)大的 batch 的數(shù)據(jù)寫入分布式表,然后分布式表示按照一定的規(guī)則,將大的 batch 的數(shù)據(jù)劃分為若干個(gè) mini batch 的數(shù)據(jù),存儲(chǔ)到不同的分片上。





這里有一個(gè)很容易誤解的地方,我們最開始也是以為分布式表只是按照一定的規(guī)則做一個(gè)網(wǎng)絡(luò)的轉(zhuǎn)發(fā),以為萬(wàn)兆網(wǎng)卡的帶寬就足夠,不會(huì)出現(xiàn)單點(diǎn)的性能瓶頸。但是實(shí)際上 Clickhouse 是這樣做的,我們看一個(gè)例子,有三個(gè)分片 shard1,shard2 和 shard3,其中分布式表建立在 shard2 的節(jié)點(diǎn)上。







  • 第一步,我們給分布式表寫入 300 條數(shù)據(jù),分布式表會(huì)根據(jù)路由規(guī)則把數(shù)據(jù)進(jìn)行分組,假設(shè) shard1 分到 50 條,shard2 分到 150 條,shard3 分到 100 條。




  • 第二步,因?yàn)榉植际奖砀?shard2 是在同一臺(tái)機(jī)器上,所以 shard2 的 150 條就直接寫入磁盤了。然后 shard1 的 50 條和 shard3 的 100 條,并不是直接轉(zhuǎn)發(fā)給他們的,而是也會(huì)在分布式表的機(jī)器上先寫入磁盤的臨時(shí)目錄。




  • 第三步,分布式表節(jié)點(diǎn) shard2 會(huì)向 shard1 節(jié)點(diǎn)和 shard3 節(jié)點(diǎn)分別發(fā)起遠(yuǎn)程連接的請(qǐng)求,將對(duì)應(yīng)臨時(shí)目錄的數(shù)據(jù)發(fā)送給 shard1 和 shard3。



這里可以看到分布式表所在的節(jié)點(diǎn) shard2 全量數(shù)據(jù)都會(huì)先落在磁盤上,我們知道磁盤的讀寫速度都是不夠快的,很容易就會(huì)出現(xiàn)單點(diǎn)的磁盤性能瓶頸。比如單 QQ 看點(diǎn)的視頻內(nèi)容,每天可能寫入百億級(jí)的數(shù)據(jù),如果寫一張分布式表,很容易就會(huì)造成單臺(tái)機(jī)器出現(xiàn)磁盤的瓶頸,尤其是 Clickhouse 的底層運(yùn)用的是 merge tree,它在合并的過程中會(huì)存在寫放大的問題,這樣會(huì)加重磁盤的壓力。

我們做的兩個(gè)優(yōu)化方案:


  • 第一個(gè)就是對(duì)磁盤做了 RAID 提升了磁盤的 IO;




  • 第二就是在寫入之前,上游進(jìn)行了數(shù)據(jù)的劃分分表操作,直接分開寫入到不同的分片上,磁盤的壓力直接變?yōu)榱嗽瓉?lái)的 n 分之一,這樣就很好的避免了磁盤的單點(diǎn)的瓶頸。







■?2.3 局部 Top 并非全局 Top



雖然我們的寫入是按照分片進(jìn)行了劃分,但是這里引入了一個(gè)分布式系統(tǒng)常見的問題,就是局部的 Top 并非全局 Top。比如說(shuō)同一個(gè)內(nèi)容 x 的數(shù)據(jù)落在了不同的分片上,計(jì)算全局 Top100 點(diǎn)擊內(nèi)容的時(shí)候,之前說(shuō)到分布式表會(huì)將查詢請(qǐng)求下發(fā)到各個(gè)分片上,計(jì)算局部的 Top100 點(diǎn)擊的內(nèi)容,然后將結(jié)果進(jìn)行匯總。

舉個(gè)例子,內(nèi)容 x 在分片一和分片二上不是 Top100,所以在匯總數(shù)據(jù)的時(shí)候就會(huì)丟失掉分片一和分片二上的內(nèi)容 x 的點(diǎn)擊數(shù)據(jù)。





第二是會(huì)造成數(shù)據(jù)錯(cuò)誤,我們做的優(yōu)化就是在寫入之前加上了一層路由,我們將同一個(gè)內(nèi)容 ID 的數(shù)據(jù)全部路由到了同一個(gè)分片上,解決了該問題。這里需要多說(shuō)一下,現(xiàn)在最新版的 Clickhouse 都是不存在這樣這個(gè)問題的,對(duì)于有 group by 和 limit 的 SQL 命令,只把 group by 語(yǔ)句下發(fā)到本地表進(jìn)行執(zhí)行,然后各個(gè)本地表執(zhí)行完的全量結(jié)果都會(huì)傳到分布式表,在分布式表再進(jìn)行一次全局的 group by,最后再做 limit 的操作。


這樣雖然能夠保證全局 top N 的正確性,但代價(jià)就是犧牲了一部分的執(zhí)行性能。如果想要恢復(fù)到更高的執(zhí)行性能,我們可以通過 Clickhouse 提供的 distributed_group_by_no_merge 參數(shù)來(lái)選擇執(zhí)行的方式。然后再將同一個(gè)內(nèi)容 ID 的記錄全部路由到同一個(gè)分片上,這樣在本地表也能夠執(zhí)行 limit 操作。


3. 高性能的存儲(chǔ)和查詢



Clickhouse 高性能查詢的一個(gè)關(guān)鍵點(diǎn),就是稀疏索引。稀疏索引這個(gè)設(shè)計(jì)很有講究,設(shè)計(jì)的好可以加速查詢,設(shè)計(jì)的不好反而會(huì)影響查詢效率。因?yàn)槲覀兊牟樵兇蟛糠侄际菚r(shí)間和內(nèi)容 ID 相關(guān)的,比如說(shuō)某個(gè)內(nèi)容過去 n 分鐘在各個(gè)人群的表現(xiàn)如何,我按照日期分鐘粒度時(shí)間和內(nèi)容 ID 建立了稀疏索引,針對(duì)某個(gè)內(nèi)容的查詢,建立稀疏索引之后,可以減少 99% 的文件掃描。

Clickhouse 高性能查詢的第二點(diǎn),就是我們現(xiàn)在的數(shù)據(jù)量太大,維度太多,拿 QQ 看點(diǎn)的視頻內(nèi)容來(lái)說(shuō),一天入庫(kù)的流水就有上百億條,有些維度有幾百個(gè)類別,如果一次性把所有的維度進(jìn)行預(yù)聚合查詢反而會(huì)變慢,并且索引會(huì)占用大量的存儲(chǔ)空間。我們的優(yōu)化就是針對(duì)不同的維度建立對(duì)應(yīng)的預(yù)聚合和物化視圖,用空間換時(shí)間,這樣可以縮短查詢的時(shí)間。





舉個(gè)例子,通過 summary merge tree 建立一個(gè)內(nèi)容 ID 粒度聚合的累積,累加 pv 的物化視圖,這樣相當(dāng)于提前進(jìn)行了 group by 的計(jì)算,等真正需要查詢聚合結(jié)果的時(shí)候,就直接查詢物化視圖,數(shù)據(jù)都是已經(jīng)聚合計(jì)算過的,且數(shù)據(jù)的掃描量只是原始流水的千分之一。


分布式表查詢還會(huì)有一個(gè)問題,就是查詢單個(gè)內(nèi)容 ID 的時(shí)候,分布式表會(huì)將查詢請(qǐng)求下發(fā)到所有的分片上,然后再返回給查詢結(jié)果進(jìn)行匯總。實(shí)際上因?yàn)樽鲞^路由,一個(gè)內(nèi)容 ID 只存在于一個(gè)分片上,剩下的分片其實(shí)都是在空跑。針對(duì)這類的查詢,我們的優(yōu)化就是后臺(tái)按照同樣的規(guī)則先進(jìn)行路由,然后再查詢目標(biāo)分片,這樣減少了 n 分之 n -1 的負(fù)載,可以大量的縮短查詢時(shí)間。而且由于我們提供的是 OLAP 的查詢,數(shù)據(jù)滿足最終的一致性即可。所以通過主從副本的讀寫分離,也可以進(jìn)一步的提升性能。我們?cè)诤笈_(tái)還做了一個(gè)一分鐘的數(shù)據(jù)緩存,這樣針對(duì)相同條件的查詢,后臺(tái)就可以直接返回。







4. Clickhouse 擴(kuò)容方案



我們調(diào)研了業(yè)內(nèi)一些常見的方案:


  • 比如說(shuō) HBase 原始數(shù)據(jù)是存放在 HDFS 上的,擴(kuò)容只是 region server 的擴(kuò)容,并不涉及到原始數(shù)據(jù)的遷移。




  • 但是 Clickhouse 的每個(gè)分片數(shù)據(jù)都是在本地,更像是 RocksDB 的底層存儲(chǔ)引擎,不能像 HBase 那樣方便的擴(kuò)容。




  • 然后是 Redis,Redis 是 Hash 槽這一種,類似于一致性 Hash 的方式,是比較經(jīng)典的分布式緩存方案。



Redis slot 在 Hash 的過程中,雖然會(huì)存在短暫的 ASK 不可用,但是總體上來(lái)說(shuō)遷移還是比較方便的。就從原來(lái)的 h0 遷移遷移到 h1,最后再刪除 h0,但是 Clickhouse 大部分都是 OLAP 的批量查詢,而且由于列式存儲(chǔ)不支持刪除的特性,一致性 hash 的方案也不是很合適。

我們目前的擴(kuò)容方案就是從實(shí)時(shí)數(shù)倉(cāng)另外消費(fèi)一份數(shù)據(jù)寫入新的 Clickhouse 集群,兩個(gè)集群一起跑一段時(shí)間,因?yàn)閷?shí)時(shí)數(shù)據(jù)我們現(xiàn)在就保存了三天,等三天之后,后臺(tái)服務(wù)就直接訪問新的 Clickhouse 集群。

五、實(shí)時(shí)系統(tǒng)應(yīng)用成果總結(jié)



我們輸出了騰訊看點(diǎn)的實(shí)時(shí)數(shù)據(jù)倉(cāng)庫(kù),DWM 層和 DWS 層兩個(gè)消息隊(duì)列,上線了騰訊看點(diǎn)的實(shí)時(shí)數(shù)據(jù)分析系統(tǒng),該系統(tǒng)能夠亞秒級(jí)的響應(yīng)多維條件查詢請(qǐng)求。在未命中緩存的情況下:


  • 過去 30 分鐘的內(nèi)容查詢,99% 的請(qǐng)求耗時(shí)在一秒內(nèi);




  • 過去 24 小時(shí)的內(nèi)容查詢 90% 的請(qǐng)求耗時(shí)在 5 秒內(nèi),99% 的請(qǐng)求耗時(shí)在 10 秒內(nèi)。




瀏覽 47
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 中文字幕在线视频观看| 亚洲无码av中文字幕| 亚洲人成人无码一区二区三区| 特级A级毛片| www.911国产| 亚洲激情黑人| 在线A片免费观看| 97精品人妻一区二区三区香蕉| 日逼91| 首页-91n| 操逼视频国产91| 午夜ww| 激情综合婷婷久久| 江苏妇搡BBBB搡BBB| 国产精品91久久久| 色婷婷一二三精品A片| 97黄片| 91在线无码精品秘国产色多多 | 精品国产一区二区三区久久久蜜月 | 婷婷国产精品视频| 97人人色| 97人妻人人澡人人爽人人精品 | 亚欧精品久久久| 亚洲人妻一区二区| 男女av| 成人性生交大片免费看小芳| 99er在线观看视频| 五月伊人网| 99久久久国产精品免费蜜臀| 综合激情AV| 国产亚洲欧美精品综合在线 | 一本高清无码| 永久免费看片视频5355| 亚洲制服中文字幕| 久久综合久久鬼| 亚洲性爱专区| 色五月激情小说| 天天干天天日天天| 精品无码一区二区人妻久久蜜桃| 黄在线免费观看| 制服丝袜强奸乱伦| 日韩一级中文字幕| 天天日天天摸| AV在线免费播放| 干B网| 色网站在线观看| 精品人妻一二三区| 丰满人妻一区二区三区四区不卡| 乱子伦】国产精品| 欧美成人中文字幕| 中文字幕成人A片| www.三级| 欧美18成人| 欧美毛片A| 性爱AV| 国产毛片毛片毛片毛片毛片| 91日逼| 安徽妇搡BBBB搡BBB| 亚洲小视频在线播放| 韩国AV在线| 国产乱子伦真实精品!| 各种妇女撒尿mm毛免费网站 | 影音先锋成人AV| 亚洲日本三级| A级网站| 国产在线观看mv免费全集电视剧大全 | 日韩三级在线免费观看| 欧美日韩成人一区二区三区| 搡BBB搡BBBB搡BBBB-百度| 超碰欧美在线| 欧美在线一区二区| 四虎成人精品永久免费AV九九 | 最新va在线观看| 嫩小槡BBBB槡BBBB槡免费-百度| 91精品国产综合久久久蜜臀酒店| 亚洲AV女人18毛片水真多| 内射国产| 国产超级无码高清在线视频观看 | 五月丁香在线| 国产草莓视频| 中文字幕视频一区| 亚洲男人的天堂av| 久久综合中文| 日韩欧美国产一区二区| 欧美日韩99| 亚洲精品乱码在线| 亚洲免费黄色电影| 午夜福利视频无码| 成人伊人大香蕉| 五月天啪啪视频| 一二三四在线视频| 久操免费在线观看| 婷婷五月天av| 视色AV| 一本色道久久加勒比精品| 7x7x7x人成免费观学生视频| 日韩日逼视频| 3D动漫精品一区二区在线播放免费| 免费观看毛片| 免费看黄的网站在线观看| 国产系列每日更新| 国产成人无码AⅤ片免费播放| 久久99高清视频| jizzjizz欧美| 国产婷婷五月| 91国产爽黄在线| 欧美视频区| 亚洲日韩一区二区| 91亚洲精品国偷拍自产在线观看| 操噜噜噜噜噜插| 国产成人免费做爰视频| 老鸭窝久久| 亚洲做爱视频| 国产精品999999| 久久久麻豆| 无码伦理| 中文大香蕉视频| 黄色小网站在线观看| 男人的天堂视频在线| 爱操视频| 亚洲.无码.制服.日韩.中文字幕 | 清清草视频| 日韩毛片在线看| 韩国午夜电影| 一本一道无码免费看视频| 亚洲无码高清免费| 四房婷婷| 精品黄色片| 午夜成人国产| 中文字幕无码在线播放| 视色视频在线观看18| 青青草视频免费看| 一区二区三区四区久久| 草逼视频免费看| 日本精品久久| seseav| 久久不射网站| 无码人妻丰满熟妇精品区| 亚洲AV无码免费| 人人操人人操人人操人人操| 色欲影视插综合一区二区三区 | 韩国成人无码| 麻豆精品国产| 人妻视频网| 91黄色视频在线播放| 四虎在线视频观看96| 嘿嘿午夜| 69成人视频| 超碰91免费在线观看| 大香蕉在线电影| 久久五月视频| 97免费视频在线观看| 激情婷婷 | 色悠悠久久| 人妻少妇无码精品| 少妇人妻av| 久久无码免费| 国产女18毛片多18精品| 色婷婷视频网站| 亚洲综合图色40p| 亲子乱婬一级A片| 91亚洲一线产区二线产区| 亚洲狠狠撸| 可以看的三级网站| 国产强伦轩免费视频在线| 做爱视频无码| 91蝌蚪91九色| 亚洲中文字幕无码爆乳av| 亚洲一级二级三级| 色天天综合网| 亚洲黄色三级| 中文字幕精品三区无码| 一级A片免费黄色视频| 日本性爱一区| 日韩无码视频网站| 欧美成人网址在线观看| 日韩黄色中文字幕| 亚洲婷婷在线| 一级a一级a爱片免费免免高潮| 国产ts在线观看| 最新毛片网站〖网:.〗| 91视频免费观看| 国产av中文字幕| 国产a片免费看| 韩国无码高清视频| 国产成人小视频在线观看| 北条麻妃在线无码| 色片视频| 北条麻妃中文字幕在线观看| 狠狠干2025| 蜜桃人妻| 亚洲AV无码成人网站国产网站| 欧美视频在线播放| 亚洲无码视频观看| 影音先锋成人资源网| 青草青草视频| 波多野结衣无码一区| 天天日天天操天天日| 成人福利视频| 碰碰视频| 青娱乐无码| 麻豆三级片在线观看| 2025中文字幕在线| 亚洲成人影音先锋| 一本色道久久综合熟妇人妻| 午夜做爱福利视频| 麻豆精品| 欧美午夜福利视频| 91中文字幕+乱码| 国产成人性爱| 奇米色婷婷| 亚洲一区二区久久| 免费无码国产在线| 成人影片在线观看18| 国产精品9999久久久久仙踪林| 日韩黄色电影在线观看| 在线观看黄色av| 午夜av在线观看| 色综合天| 91ThePorn国产| 国产精品欧美性爱| 色色色无码| 久久久久亚洲| 免费的a片| 欧美日韩中字| 后入少妇视频| 亚洲天媒在线播放| 欧美成人一区二区| 美女天天操| 91av| 欧美三级片网址| 色xxxx| 视频一区二区三区免费| 色网站在线观看| 99精品热视频| 三级午夜在线无码| 亚洲精品伊人| 亚洲精品suv视频| 人人爱久久| 日韩av小说| 日日碰狠狠躁久久躁婷婷| 国产精品麻豆视频| 欧美作爱| 中文字幕在线播放AV| 親子亂子倫XXXX| 日本视频网| 成人毛片在线播放免费| 大香蕉在线免| 伊人五月婷婷| 国产精品三级在线| 在线观看高清无码视频| www国产亚洲精品久久网站 | 91牛视频| 91丨九色丨熟女老版| 久久911| 牛牛影视一区二区| 影音先锋女人aV鲁色资源网站| 亚洲欧美激情小说另类| 日本色中文字幕| 免费福利视频网站| AV无码网| 狠狠干天天操| 黄片视频免费播放| 人妻无码一区二区| 丰满人妻一区二区三区精品高 | 国产性爱自拍视频| 99热在线只有精品| 毛片91| 黄色三级毛片| 五月丁香激情视频| 97干干| 日韩精品在线视频| 2025最新偷拍| 按摩性高湖婬AAA片A片中国 | 精品无码产区一区二| 欧美日韩有码视频网址大全| 日本黄色视频官网| 亚洲天堂美女| 日韩日韩日韩日韩日韩| 日韩无码av电影| 久热精品在线观看视频| www.俺也去| 欧美级毛片一夜| 91高清视频| 久久久国产视频| 日韩在线中文字幕亚洲| 亲子乱AV一区二区| 亚洲欧洲日本在线| 亚洲人成人无码一区二区三区| 亚洲综合干| 日本免费高清视频| 九九热在线视频| 日韩字幕久久| 嫖中国站街老熟女HD| 亚洲国产精品尤物yw在线观看| 亚洲AⅤ无码一区二区波多野按摩| 69式荫蒂被添全过程| 中国老女人操逼视频| 亚洲国产婷婷| 久久性爱视频| 特级西西444www高清大胆免费看 | 伊人综合大香蕉| 性亚洲| 亚洲人妻AV| 综合导航无码| 在线免费观看av片| 一级免费黄色视频| 国产真实露脸乱子伦对白高清视频| 亚洲AV男人天堂| A片网| 五月天亚洲无码| 91三级片在线观看| 天堂中文资源库| 综合成人| gay成人在线观看| 免费看黄色大全| 操逼视频网站免费观看| 九九九欧美| 婷婷五月影院| 成人在线免费| 欧美精品在线免费| 黄片高清无码在线观看| 操天天| 无码专区一区二区三区| 婷婷激情丁香五月天| 免费污视频在线观看| 毛片中文字幕| 亚洲永久免费| 波多野结衣av在线观看窜天猴| 日韩视频中文字幕在线| www.日本色| 这里都是精品| 香蕉视频免费| 77777精品成人免费A片| 五月婷亚洲精品AV天堂| 久草视频免费在线观看| 操日韩美女| 无码在线播放视频| 婷婷在线电影| 国产中文字幕视频| 这里只有精品视频| 悠悠色导航| 亚洲天堂网在线视频| 成人日韩无码| 大香蕉在线99| 免费A片在线播放| 亚洲AV无码成人精品涩涩麻豆| 国产免费精彩视频| 性色在线| 欧美午夜福利电影| 亚洲AV无码第一区二区三区蜜桃| 欧美黄片一区二区| 草草网站| 俺来俺去www色婷婷| 九一亚洲精品| 荫蒂添出高潮A片视频| 日日免费视频| 色五月激情网| 日韩高清无码中文字幕| 中文字幕一区三区人妻视频| 不卡无码高清| 中文字幕A片无码免费看| 亚洲无码免费在线视频| 奇米影视狠狠干| 18禁黄网站| 99在线观看免费| 日本丰满老熟妇乱子伦| 色综合视频| 欧美啪啪网站| 97人人妻| 日韩wuma| 国产免费自拍视频| 久久99久久99久久99国内少妇精品| 欧美日韩亚洲一区二区三区| 激情无码一区二区| 国产精品激情| 国产一区二区不卡亚洲涩情| 岛国AV免费看| 国产黄色av| 国产精品美女在线观看| 久久五月天婷婷| 日本欧美成人片AAAA| 影音先锋AV在线资源| 日韩一级一片内射视频4K| 先锋成人av| 在线观看免费无码视频| 91黄网站在线观看| 婷婷五月天黄色| 高清毛片AAAAAAAAA片| 久久久人妻熟妇精品无码蜜桃| 久久婷婷五月| 日韩精品成人免费观看视频| 操逼逼网| 好男人一区二区三区在线观看 | 黄色影视不卡| 大香蕉在线75| 99电影网手机在线观看| 好吊顶亚洲AV大香蕉色色| 国产三级在线播放| 色香蕉网| 一道本在线视频| 亚洲色图欧美| 欧美日韩91| 秘蜜桃色一区二区三区在线观看 | 无码在线观看免费视频| 一级色色片| 处破女初破全过免费看| 白浆四溢av| 人人插人人射| 午夜亚洲国产一区视频网站| 国产老女人农村HD| 久草福利在线观看| 九九色热| 无码在线免费| 成人激情免费视频| 国产大奶一区二区| 高清无码视频18| 午色婷婷国产无码| 麻豆传媒电影| 18禁网站在线看| 一区二区三区精品视频| 综合激情av| 护士小雪的yin荡高日记H视频 | 中文字幕高清无码视频| 亚洲北条麻妃一级A片| 午夜性爱网站| 无码人妻免费视频| 亚洲骚逼| 国产色色视频| 国产无码一区| 欧美va在线| 国产乱伦熟女| 无码人妻精品一区二区三千菊电影| 亚洲青娱乐在线| 高清无码免费观看| 国产亚洲99久久精品熟女| 成人在线视频免费观看| 中文字幕区| 操逼无码精品| 日韩无码视| 夜夜嗨AⅤ一区二区三区| 在线观看中文字幕av| 亚洲综合在线播放| 夜夜狠狠躁日日| 欧洲一区二区三区| 亚洲无码乱码精品| 91人人操| 麻豆性爱视频| 欧美中文字| 天天日综合| 久久一区二区三区四区五区| 中文原创麻豆传媒md0052| 一级大片| a片视频免费| 日韩精品一区二区三区四在线播放| 三级在线观看视频| 免费看黄色片视频| 蜜桃视频在线观看18| 2018人人操| 狠狠色噜噜狠狠狠888| 99这里只有精品| AV无码中文| 2021国产精品视频| 伊人成人在线视频| 五月在线视频| 大香煮伊在75| 免费草逼视频| 只有精品| 日本一区二区三区视频在线观看| 九色自拍| 男人的天堂亚洲| 婷婷丁香五月网| 国产操B| 亚洲最大的成人网站| 香蕉成人网站| 青草网在线观看| 男女午夜福利| 五月色丁香| 欧美a片在线看| 日韩无码毛片| 国产AV不卡| 99久久伊人| 精品伊人大香蕉| 国产精品久久久久野外| 国产成人无码免费| 国产精品一区二区在线播放| 综合欧美国产视频二区| 91在线小视频| 综合大香蕉| 一级无码免费| 亚洲成人怡红院| 色婷婷综合久久久中文字幕| 麻豆传媒电影| 免费尻屄视频| 久色入口| 成人伊人网| 一级大片| 在线天堂19| 俺去也俺去啦| 大香焦草久| 国产女人在线| 亚洲毛片视频| 国产精品久久久久久无码人妻| Www.黄色| 巨乳无码噜噜噜久久久| 亚洲十八禁| 人人操人人干人人爽| 日韩中文字幕精品| 亚洲视频在线观看网站| 美女久草| 中文一区二区| 精精品人妻一区二区三区| 深夜福利av| 久久国产乱子伦精品免费午夜... 国产毛片精品一区二区色欲黄A片 | 51福利视频| 欧美成人性爱图片| 大香蕉在线啪啪| 人人操人人妻人人| 日逼一级| 国产你懂的| 91国产爽黄| 五月丁香婷婷在线| AAA无码| 3D动漫精品啪啪一区二区竹笋| 亚洲无码视频在线观看高清 | 色婷婷AV一区二区三区软件| 91视频网站在线| 大炕上公让我高潮了六次| 欧美日韩黄色极品| 国产高清在线免费观看AV片| 热久久亚洲中文字幕| 国产黄色免费网站| 亚州无码视频| 中文字幕无码高清| 亚洲高清无码在线免费观看| 河南熟妇搡BBBB搡BBBB| 日韩中文AV| 99热一区二区三区| 精品视频在线播放| 免费看V片| 色久悠悠综合网| 亚洲天堂网在线视频| 一级黄色视频片| 成人毛片一区二区三区无码| 无码人妻精品一区二区三区温州| 韩日不卡视频| 88AV视频| 无码免费一区二区三区| 亚洲骚妇| 超碰乱伦| 尤物视频网址| 黄片免费看| 青青草大香蕉| 欧美福利| 欧美日韩在线一区| www欧美日韩| 亚洲日逼视频| x88AV吊钟奶熟女| 日韩激情网站| 熟女嗷嗷叫高潮合集91| 操综合网| 中文字幕你懂的| 91在线无码精品秘入口男同| 99热国产在线观看| AA丁香综合激情| 91丨九色丨蝌蚪丨丝袜| 99re6热在线精品视频| 欧洲亚洲在线| 国产一级a一片成人AV| 成人电影综合网| 伊人操逼| 高清亚洲| 四川BBBBBB搡BBBBB| 91国语又粗又大对白| 丁香五月六月婷婷| 成人午夜在线| 久久久久久久精| 激情深爱| 亚洲一区AV| AV女人天堂| 无码免费婬AV片在线观看| 日韩成人影片| 欧美亚洲视频| 国产福利视频在线观看| 免费超碰| 国产在线欧美在线| 黄色免费a级片一级片| 亚洲中文字幕播放| 亚洲五月激情| 四虎成人精品永久免费AV九九| 无码国产av| 亚洲AV无码秘翔田| 环亚无码| 成人亚洲在线| 中文字幕AV播放| 狠狠狠狠狠狠| www黄片| 在线观看AV91| 你懂的在线视频观看| 国产狼友| 草草草视频| 国产欧美综合在线观看| 影音先锋91久久网| 色婷婷六月| 久久99久久99| 激情国产av| 免费日逼| 亚洲三级视频| 51成人免费| 欧美成综合| 精品人妻一区二区免费蜜桃| 国产毛片777777| 三级无码中文| 特极西西444WWW大胆无码| 大香蕉中文在线| 淫荡少妇美红久久久久久久久久| 国产精品麻豆视频| 九色蝌蚪9l视频蝌蚪9l视频成人熟妇| 成人性爱视频网| 亚洲国产精品二二三三区| 人成视频在线免费观看| 国产精品久久视频| 视频一区乳奴| AV口爆| 特级西西人体444www高清| 中文字幕在线免费播放| 黄色美女视频网站| 国产成人在线播放| 婷婷视频网站| 五月婷婷成人| 99在线看| 99久久久久久| 欧美日韩免费| 国产又粗又猛又黄又爽无遮挡| 五月丁香欧美综合| 2025精品视频| 性生活毛片| 2015中文字幕黄色视频| 日韩AV无码高清| 亚洲无码久久精品| 91免费| www.久草| 51午夜福利| 亚洲无码专区视频| 99九九久久| 91AV视频在线观看| 日本性欧美| 十八女人高潮A片免费| 一本色道久久综合亚洲精品小说| 97在线观看视频| 久久九九国产精品怡红院| 北条麻妃一区二区三区在线播放| 国产精品1区2区| 欧美福利导航| 欧美色逼| 无码中文AV| av黄色在线观看| 亚洲AV无码乱码AV| 天堂资源站| 中文字幕日韩高清| 台湾无码| 国产无码做爱视频| 日本免费不卡| 黄色视频网站在线观看| 大鸡巴操B视频| 黄色片在线观看视频| 在线操| 大香蕉伊人操| 亚洲男人的天堂视频网在线观看+720P | 小處女末发育嫩苞AV| 午夜亚洲AV永久无码精品蜜芽| 九九九视频在线观看| 色婷婷在线影院| 亚洲精品国产精品国自产在线| 91丨九色丨熟女老版| 天天操比| 91麻豆精品传媒国产| 色天堂视频在线观看| 日韩免费不卡| 免费看一级片| 苍井空中文字幕在线观看| 国产毛片777777| 黄色成人在线| 友田真希一级婬片A片| 亚洲五月天婷婷| 久久久久久久久久久久久久久久久久久久| 国产白浆一区二区三区| 人人操久久| AAA激情| 精品人妻一区二区三区阅读全文| 人妻免费视频| 中文字幕资源在线| 人妻成人网| 精品国产乱码一区二区| 3d动漫精品一区二区三区在线观看 | 丰满熟妇人妻无码视频| 人人摸人人操人人| 亚洲成人情趣大香蕉| 亚洲免费黄色视频| 球AV在线| 精品码产区一区二亚洲国产| 久久高清无码视频| 996热re视频精品视频这里| 国产在线视频一区| 操逼视频一区| 日本精品人妻| 在线免费黄片| 国产aaaaaa| 欧美日韩精品| 黄色生活片| 无码一区二区三区在线| 欧美性爱第四页| 黄色片一级| 人人草人人看人人摸| 久久久久精| 波多野结衣无码流出| 国产精品视频99| 自拍偷拍网| 日本操B视频| 免费中文字幕日韩欧美| 青青草原成人视频| 日本成人电影| 综合视频一区| 国产午夜福利在线| 无码A级| 第一福利成人AV导航| 波多野结衣无码NET,AV| 日韩中文一区| 91一区二区在线观看| 人成视频在线| 99久久人妻精品免费二区| www.A片| 香蕉中文网| 日韩无码一区二区三区四区| 操逼三级片| 欧美日韩免费在线观看| 日韩无码系列| 操b视频网站| www.五月天.con| 丁香五月在线观看| 成人免费精品| AV在线不卡中文| 一级中国毛片| 国内一级黄片| 色五婷婷| 天天日日日干| 色婷婷精品国产一区二区三区| 亚洲男人的天堂av| 午夜艹 | 免费无码毛片一区二区A片| 中文字幕AV在线播放| 日韩AV成人电影| 国产V精品| 97人妻人人揉人人躁人人| 蜜芽成人在线视频| 日韩精品人妻中文字幕| 成人在线一区二区三区| 你懂的在线视频| 国产精品秘久久久久久1-~/\v7-/ 囯产精品一区二区三区线一牛影视1 | 国精久久久久| 99国产精品免费视频观看8| 亚洲天堂2016| 国产精品久久久久野外| 91无码人妻一区二区成人aⅴ| 免费无码视频一区二区| 亚洲精品人妻在线| 日韩极品在线观看| 久久蜜桃| 99视频| 国产无码内射视频| 91精品人妻一区二区三区蜜桃欧美| 成人毛片18| 91麻豆福利在线观看| 六月婷婷久久| 免费色色视频| 亚洲免费在线| 18禁网站禁片免费观看| 国内无码视频| 黄色视频日本| 北条麻妃黄色视频| 亚洲AV无码成人精品区www| 蜜桃视频网站18| 女人一区二区| 欧美人人操| AV自拍偷拍| 亚洲无遮挡| 黄色一级大片| 亚洲午夜久久久久久久久红桃| 亚洲区一区二| 无码免费观看| 一级特黄大片色| 91热爆TS人妖系列| 老司机精品在线观看| 免费一级黄色视频| 成人福利在线观看| 91精彩视频| 影音先锋一区二区| 欧美日逼网站| 国产一区二区视频在线| 农村一级婬片A片| 亚洲vs无码秘蜜桃少妇| 国产超碰| 江苏妇搡BBBB搡BBBB-百度| xiuxiuav| 亚洲综合电影| 热久久9| 色播欧美| 麻豆疯狂做受XXXX高潮视频| 黄网站免费看| 欧美性猛交XXXX乱大交| 日韩a在线观看| 日本色情视频网站| 国产AV大全| 国产精品久久久久久久久久久久久久 | 嫩草av在线| 国产成人一区二区三区| 欧美激情另类| 久久久久亚洲AV成人片乱码| AV黄色| 成年人黄色视频免费观看| 黄色大片久草| 亚洲熟妇无码| 日韩黄色电影视频| 一级做a爰片毛片A片| 自拍偷拍视频网站| 操学生妹| 欧美+日韩+国产+成人+在线| 人人操在线公开| 亚洲一二三四| 88AV在线播放| 无码一区二区高清| 波多野结衣中文字幕久久| 黄网站免费观看| 婷婷在线综合| 内射视频在线免费观看| 欧美精品成人网站| 一区二区三区视屏| 一区二区三区视频免费| 福利导航在线| 国产女人18毛片水18精品| 人妻毛片| 99色亚洲| 日韩欧美不卡色不卡| 蜜臀久久99精品久久久电影| 九九热国产视频| 六月婷婷网| 高潮毛片| 超碰91免费在线观看| 人人妻人人澡人人爽久久con| 7799精品视频| 国产精品久久久久久久久久久久久久 | 欧美自拍| www黄色片| 亚洲视频在线免费| 亚洲国产剧情| 91福利网| 国产久久久久久| 午夜无码在线| 日本久久综合| 丁香五月激情在线| 国产亚洲精品久久久波多野结衣| 91黄在线观看| 最好看的2019中文在线大全电影| a片在线免费看| 日韩中文无码字幕| 天天日天天操天天爽| 夜夜撸夜夜| 中国老少配BBwBBwBBW| 啪视频网站国产馆| 欧美激情综合| 国产午夜无码视频在线观看| 丁香六月综合激情| 一级A毛片| 91麻豆免费看| 亚洲AV在线观看| 日皮视频免费| 人妻成人网| 91精品在线免费观看| 五月天丁香花| 精品无人区无码乱码毛片国产| 人妻在线无码| 天天天做夜夜夜夜爽无码| 国产香蕉视频| 人妖黄片| 成人A片在线观看| 丰满少妇在线观看网站| 怡红院综合网| 天天艹| 激情视频免费在线观看| 欧美性区| 婷婷五月天丁香在线| 免费日批网站| 豆花视频无码| 中文字幕乱在线| 亚洲精品少妇| 亚洲一本色道中文无码| 国产欧美精品在线观看| 日韩欧美在线中文| 欧美日韩免费在线播放电影在线播放电影在线播放电影免费 | 爱爱电影无码|