1. 背景
日志領(lǐng)域是Elasticsearch(ES)最重要也是規(guī)模最大的應(yīng)用場景之一。這得益于 ES 有高性能倒排索引、靈活的 schema、易用的分布式架構(gòu),支持高吞吐寫入、高性能查詢,同時(shí)有強(qiáng)大的數(shù)據(jù)治理生態(tài)、端到端的完整解決方案。但原生 ES 在高吞吐寫入、低成本存儲(chǔ)、高性能查詢等方面還有非常大的優(yōu)化空間,本文重點(diǎn)剖析騰訊云大數(shù)據(jù) ES 團(tuán)隊(duì)在這三個(gè)方面的內(nèi)核增強(qiáng)優(yōu)化。
?
2. 日志領(lǐng)域的挑戰(zhàn)
我們先來看看日志領(lǐng)域的挑戰(zhàn)有哪些。
首先從日志本身的數(shù)據(jù)特點(diǎn)來看,主要以半結(jié)構(gòu)化、非結(jié)構(gòu)化為主,傳統(tǒng)的數(shù)據(jù)庫方案沒法很好的解決解析、存儲(chǔ)等問題。ES 支持 JSON 且支持動(dòng)態(tài)映射,高版本還支持 Runtime Feilds,能在查詢時(shí)動(dòng)態(tài)提取字段,天然支持了日志場景復(fù)雜、靈活的數(shù)據(jù)結(jié)構(gòu)。
日志數(shù)據(jù)進(jìn)入 ES 則面臨高并發(fā)、高吞吐的寫入性能挑戰(zhàn)。內(nèi)核層面我們進(jìn)行了定向路由、物理復(fù)制等重磅優(yōu)化,有效解決日志入口吞吐瓶頸,提升寫入性能一倍+。
日志數(shù)據(jù)的存儲(chǔ)是另一大挑戰(zhàn),日志往往是海量的且往往價(jià)值不高,存儲(chǔ)成本成為用戶最顧慮的痛點(diǎn)之一。騰訊云 ES 一方面通過壓縮編碼優(yōu)化來降低單位文檔存儲(chǔ)成本,另一方面我們通過基于云原生環(huán)境自研混合存儲(chǔ)方案,實(shí)現(xiàn)存儲(chǔ)與計(jì)算分離,降低存儲(chǔ)成本 50% 以上。
日志數(shù)據(jù)的出口,查詢性能也是一大挑戰(zhàn),海量數(shù)據(jù)場景下,大查詢對(duì)資源的開銷非常高,帶來的查詢延時(shí)也非常明顯。ES 原生支持了倒排索引,點(diǎn)查過濾的性能非常好,但無法滿足日志場景大范圍查詢、聚合分析等性能需求。對(duì)此,騰訊云 ES 進(jìn)行了查詢裁剪、查詢并行化等一系列系統(tǒng)性優(yōu)化,提升查詢性能數(shù)十倍。
下面是日志領(lǐng)域的挑戰(zhàn)總結(jié),后面將針對(duì)高吞吐寫入、低成本存儲(chǔ)、高性能查詢層面的優(yōu)化進(jìn)行詳細(xì)分析。

3. 高吞吐寫入
3.1 定向路由

ES 的一個(gè) Bulk 寫入先進(jìn)到協(xié)調(diào)節(jié)點(diǎn)(任意一個(gè)數(shù)據(jù)節(jié)點(diǎn)),會(huì)被拆分為若干個(gè)分片粒度的子寫入請(qǐng)求,并分發(fā)給對(duì)應(yīng)的數(shù)據(jù)節(jié)點(diǎn)。當(dāng)集群規(guī)模較大,索引的分片數(shù)較多的場景下,分布式寫入的扇出放大非常嚴(yán)重,很容易受到個(gè)別長尾節(jié)點(diǎn)的 GC、慢盤、網(wǎng)絡(luò)抖動(dòng)等影響,導(dǎo)致寫入堆積,資源利用率低,拒絕率高。
騰訊云 ES 內(nèi)核通過引入寫入定向路由優(yōu)化,將用戶的一個(gè) Bulk 請(qǐng)求路由到一個(gè)分片數(shù)可控的分片組,降低寫入請(qǐng)求扇出影響,容忍慢節(jié)點(diǎn),在不可靠的環(huán)境中提供可靠的服務(wù)。基于定向路由優(yōu)化,某日志業(yè)務(wù)場景,寫入吞吐提升一倍多,CPU 資源利用率提升 58%,拒絕率從 3% 降至 0。
定向路由解決了慢節(jié)點(diǎn)對(duì)寫入的影響,接下來我們看看如何優(yōu)化寫入層面冗余的計(jì)算開銷來提升性能。
3.2 物理復(fù)制

ES 單機(jī)引擎寫入,底層數(shù)據(jù)接收到可見分為三個(gè)步驟,如上圖所示。
-
數(shù)據(jù)在內(nèi)存中構(gòu)建各種數(shù)據(jù)類型,包括行存、列存、各種索引。 -
寫入 Translog,相當(dāng)于 WAL 確保數(shù)據(jù)可靠性,機(jī)器掛掉數(shù)據(jù)可重放。 -
周期性 refresh 將內(nèi)存中的數(shù)據(jù)結(jié)構(gòu) buffer 構(gòu)建成完整的 segment 并打開 reader 可查。
ES 分布式層的寫入,數(shù)據(jù)先從協(xié)調(diào)節(jié)點(diǎn)轉(zhuǎn)發(fā)至 Primary,主分片寫完 Lucene 和 Translog 之后并行轉(zhuǎn)發(fā)給多個(gè) Replica,副本分片完成 Lucene 和 Translog 的寫入。這個(gè)過程中,副本分片的 Lucene 寫入是冗余的,因?yàn)檫@個(gè)寫入棧在 Primary 上進(jìn)行了一遍,在 Replica 上會(huì)完整的再來一遍,開銷非常高。
物理復(fù)制解決的就是從分片上冗余寫入棧的開銷。

如上圖方案所示,第一步當(dāng) Primary 產(chǎn)生新的 Segment 之后,會(huì)及時(shí)通過物理拷貝方式同步至 Replica,使得 Segment 在 Replica 上可見,同時(shí)消除 Replica 上內(nèi)存構(gòu)建 Segment 過程的計(jì)算開銷。當(dāng) Primary 上產(chǎn)生新的 Commit 文件之后,也會(huì)及時(shí)同步至 Replica。同步 Commit 文件的目的主要是在 Replica 側(cè)清理過期的 Translog 和被合并的 Segment。例如在上面第三、四步中就描述了 Primary 側(cè) Segment 合并之后同步到 Replica 側(cè)清理的過程。
通過 Segment 物理復(fù)制的能力,有效裁剪了 Replica 寫入的計(jì)算開銷,在主從副本場景下提升寫入性能接近一倍。
4. 低成本存儲(chǔ)
前面我們重點(diǎn)介紹了海量日志數(shù)據(jù)高吞吐寫入層面的性能優(yōu)化。海量的數(shù)據(jù)流入到 ES 之后,存儲(chǔ)是另一大挑戰(zhàn),接下來我們來探討一下海量存儲(chǔ)場景如何進(jìn)行成本優(yōu)化,我們先來看看背景。

存儲(chǔ)成本的影響面主要分為三個(gè)層面:
-
云原生環(huán)境下分布式架構(gòu)層。ES 的主從副本乘以底層云盤、對(duì)象存儲(chǔ)等三份副本(EC 編碼優(yōu)化推出可能在 1.33 左右)。 -
單機(jī)存儲(chǔ)引擎層。由于 ES 是行列混存,且有豐富的索引結(jié)構(gòu),應(yīng)用場景豐富的同時(shí),也導(dǎo)致了單位文檔存儲(chǔ)成本放大較多。 -
底層基礎(chǔ)設(shè)施。為了應(yīng)對(duì)高吞吐寫入,往往需要引入 SSD 硬盤,其成本高壽命短。如果用冷熱架構(gòu),溫層往往會(huì)掛多塊 HDD 盤來擴(kuò)大容量,此時(shí)單盤的損壞會(huì)導(dǎo)致整個(gè)節(jié)點(diǎn)替換,存在大量的數(shù)據(jù)恢復(fù)搬遷,代價(jià)太大。另外機(jī)器運(yùn)維的人力成本也不低。
從上面幾個(gè)維度的成本影響面來看,我們的優(yōu)化重點(diǎn)一方面是降低單位文檔的存儲(chǔ)成本,另一方面是降低冗余副本、存儲(chǔ)介質(zhì)的成本。
4.1 壓縮編碼優(yōu)化

壓縮編碼優(yōu)化是在原始數(shù)據(jù)結(jié)構(gòu)不變的前提下,降低單位文檔存儲(chǔ)成本非常有效的方式。上圖中描述了 ES 底層 Lucene 的存儲(chǔ)格式,以及這些格式所用到的壓縮算法。其中列存壓縮是由騰訊貢獻(xiàn)給社區(qū)的。
4.1.1 列存壓縮

Lucene 列存存儲(chǔ)分為兩部分,term dictionary 和 term ords,每個(gè)字段值的原始內(nèi)容存儲(chǔ)在 term dictionary 中,實(shí)際編碼、計(jì)算的時(shí)候?yàn)榱吮苊馊哂喽捎?term ords,后者會(huì)隨著新數(shù)據(jù)的持續(xù)寫入而動(dòng)態(tài)更新。優(yōu)化的主要內(nèi)容是對(duì) term dictionary 中的原始字段字面內(nèi)容進(jìn)行壓縮存儲(chǔ)。從優(yōu)化后的壓縮效果對(duì)比來看,寫入、merge 耗時(shí)基本不變的情況下,列存存儲(chǔ)下降了 40%+。
4.1.2 擴(kuò)展基礎(chǔ)壓縮算法
除了優(yōu)化列存以外,我們還引入了新的通用壓縮算法。

Zstandard 算法在壓縮比上比 LZ4 更優(yōu),在性能上比 Deflate 更優(yōu),能兼容兩者的優(yōu)點(diǎn)。我們將該通用壓縮算法引入到行存、列存、索引文件壓縮中,實(shí)測業(yè)務(wù)開啟 Zstandard 算法之后,整體存儲(chǔ)成本下降 30%+。
4.2 混合存儲(chǔ)引擎
前面主要介紹了通過壓縮編碼優(yōu)化降低單位文檔存儲(chǔ)成本,而單位文檔的存儲(chǔ)優(yōu)化是有極限的。另一個(gè)方向是從存儲(chǔ)架構(gòu)層面進(jìn)行優(yōu)化。在云原生的背景下,我們引入了自研混合存儲(chǔ)引擎方案。

混合存儲(chǔ)引擎的整體設(shè)計(jì)思路是基于典型的 delta + base 架構(gòu)。其中 delta 部分我們采用 SSD,主要目的為了扛高并發(fā)寫入,以及小 segment 的存儲(chǔ)及合并;而 base 部分采用對(duì)象存儲(chǔ),用于存儲(chǔ)大量不可變的大 segment,一方面其高可用(4 個(gè) 9 一個(gè) 5)、高可靠(12 個(gè) 9)、按量付費(fèi)、免運(yùn)維的架構(gòu)降低了大量運(yùn)維成本,更重要的是其提供的標(biāo)準(zhǔn)、低頻、歸檔等靈活的低成本存儲(chǔ)方案能大幅降低海量日志的存儲(chǔ)成本。
接下來我們結(jié)合索引數(shù)據(jù)的生命周期看看混合存儲(chǔ)引擎的整體設(shè)計(jì)。

混合存儲(chǔ)引擎整體分為兩層。上層存儲(chǔ)介質(zhì)為 SSD,提供高并發(fā)的寫入能力,準(zhǔn)實(shí)時(shí)產(chǎn)生的 segment 會(huì)通過物理復(fù)制的能力從 primary 拷貝至 replica。同時(shí)主從副本均寫入 translog,確保主從切換數(shù)據(jù)無縫對(duì)接及重啟數(shù)據(jù)不丟失,更重要的是主從副本之間的數(shù)據(jù)、segment 完全一致,這便于我們在 primary 上將數(shù)據(jù)下沉至底層共享存儲(chǔ)后,replica 可以無縫掛載查詢。每個(gè)分片本地都會(huì)有一個(gè) RemoteDirectoryWrapper 封裝了對(duì)遠(yuǎn)程共享存儲(chǔ)數(shù)據(jù)的訪問,包含了數(shù)據(jù)緩存的邏輯。底層共享存儲(chǔ)采用對(duì)象存儲(chǔ),數(shù)據(jù)按照索引、分片粒度分目錄存儲(chǔ),segment 數(shù)據(jù)文件一對(duì)一映射,方便存取。
下面我們細(xì)分流程看看整體方案的設(shè)計(jì)細(xì)節(jié)。

如上圖所示,前五個(gè)階段,主要是我們之前描述的物理復(fù)制的流程,主要目的是為了提升寫入性能,確保 primary 和 replica 數(shù)據(jù)保持完全一致,為后續(xù)的數(shù)據(jù)共享提供基礎(chǔ)。前面已描述詳細(xì)流程,這里不展開分析。

第六個(gè)階段,本地 segment 通過 merge 產(chǎn)生了較大的 segment,會(huì)被凍結(jié)不再參與 merge,并下沉至底層共享存儲(chǔ)。注意這個(gè)階段是從熱數(shù)據(jù)就開始的,并不是數(shù)據(jù)降溫后才啟動(dòng)下沉,可以避免數(shù)據(jù)降溫后整體下沉的排隊(duì)擁塞,當(dāng)然可以根據(jù)用戶的需求進(jìn)行靈活配置。此時(shí),日志場景大量的查詢會(huì)集中在本地,本地 primary 和 replica 也能很好的抗住讀寫壓力。
第七個(gè)階段,數(shù)據(jù)的查詢頻次有所降低。一般情況,本地的 primary 即可滿足絕大部分查詢性能需求。此時(shí) replica 會(huì)從本地卸載,讀取會(huì)走遠(yuǎn)端共享存儲(chǔ),同時(shí)本地會(huì)有緩存機(jī)制保存用戶常用查詢數(shù)據(jù)提升性能。此時(shí)的查詢會(huì)優(yōu)先打到 primary。通過卸載本地 replica,我們可以縮減約 50% 的 SSD 容量。

第八個(gè)階段,查詢頻率大幅縮減。Primary 上只有部分?jǐn)?shù)據(jù)或部分 segment 需要被查詢,此時(shí) primary 上的部分文件或 segment 會(huì)先被卸載。同時(shí)本地構(gòu)建緩存體系加速查詢。本階段 SSD 的縮減達(dá)到 70% 左右,但仍然能滿足業(yè)務(wù)的查詢需求。
第九個(gè)階段,查詢幾乎沒有了,數(shù)據(jù)處于歸檔狀態(tài)。本地的 primary 徹底實(shí)現(xiàn)卸載,依靠本地的緩存加速滿足極少量的查詢需求。本階段 SSD 的縮減到達(dá) 90% 左右。

在整個(gè)數(shù)據(jù)生命周期中,segment 呈現(xiàn)三種形態(tài):
-
Local Segment。行列存、索引文件等全部在本地,抗住熱數(shù)據(jù)高并發(fā)讀寫請(qǐng)求。 -
Mixed Segment。行列存等數(shù)據(jù)文件可能卸載,只有部分索引文件在本地,滿足少量的查詢請(qǐng)求。 -
Remote Segment。行列存、索引文件等全部在遠(yuǎn)程,本地只有少量元數(shù)據(jù)文件,滿足冷數(shù)據(jù)低成本歸檔需求。

上面是完整的索引生命周期中數(shù)據(jù)的演變過程,存儲(chǔ)重心隨著數(shù)據(jù)逐漸降溫過程逐步從 SSD 到對(duì)象存儲(chǔ)遷移,且用戶無明顯感知,最終整體存儲(chǔ)成本下降 50% - 80%。

日志場景傳統(tǒng)的降本方案一般采用冷熱分層?;旌洗鎯?chǔ)引擎與冷熱分層主要的區(qū)別包括:
-
存儲(chǔ)架構(gòu)差異。1). 傳統(tǒng)冷熱分層索引級(jí)別存儲(chǔ)介質(zhì)固定。2). 混合存儲(chǔ) SSD 和對(duì)象存儲(chǔ)是一個(gè)整體,數(shù)據(jù)可以雙向局部流通。 -
副本差異。1). 傳統(tǒng)冷熱分層存在冗余副本。2). 混合存儲(chǔ)底層采用共享存儲(chǔ),上層分片最終形態(tài)為邏輯分片,消除了云原生環(huán)境下的冗余副本。 -
數(shù)據(jù)搬遷差異。1). 傳統(tǒng)冷熱分層數(shù)據(jù)降溫后索引需要整體搬遷。2). 混合存儲(chǔ)支持在熱數(shù)據(jù)階段 segment 級(jí)別的數(shù)據(jù)下沉。 -
配置策略差異。1). 傳統(tǒng)冷熱分層依賴用戶的靜態(tài)配置策略,靈活性低、運(yùn)維成本高。2). 混合存儲(chǔ)除了支持用戶配置外,還可根據(jù)用戶訪問統(tǒng)計(jì)信息自動(dòng)決策數(shù)據(jù)下沉、卸載時(shí)機(jī),實(shí)現(xiàn)數(shù)據(jù)智能分層。
截止目前日志場景海量數(shù)據(jù)的低成本存儲(chǔ)優(yōu)化到這里就介紹完畢了,后面繼續(xù)介紹查詢性能優(yōu)化。
5. 高性能查詢
5.1 查詢性能影響面
前面我們分析了日志場景的海量存儲(chǔ)成本優(yōu)化。數(shù)據(jù)存儲(chǔ)降本之后,接下來要考慮的是數(shù)據(jù)流出,如何解決用戶查詢性能問題。因?yàn)榛旌洗鎯?chǔ)底層采用對(duì)象存儲(chǔ),其和 SSD 的性能差異肯定是有一個(gè)量級(jí)的區(qū)別。我們需要系統(tǒng)性做一些查詢優(yōu)化、緩存優(yōu)化來找回這種存儲(chǔ)介質(zhì)的變更帶來的性能損耗。

我們先來看看混合存儲(chǔ)引擎背景下,查詢性能的瓶頸在哪些方面。
5.1.1 大量查詢空轉(zhuǎn)掃描
ES 有高效的倒排索引,點(diǎn)查的性能是非常強(qiáng)悍的。多索引或通過別名關(guān)聯(lián)索引查詢也是相對(duì)傳統(tǒng)數(shù)據(jù)庫的一個(gè)優(yōu)勢特性,而這一特性也會(huì)帶來一些性能瓶頸問題。如上圖所示,當(dāng)我們查詢的索引是一個(gè)星號(hào),或者一個(gè)索引前綴匹配,或是一個(gè)別名的時(shí)候,底層可能關(guān)聯(lián)多個(gè)物理索引,而我們的查詢可能只有部分索引會(huì)有數(shù)據(jù)命中。而 ES 實(shí)際執(zhí)行查詢會(huì)將底層所有匹配的索引、包括每個(gè)索引底層的每個(gè)分片逐一遍歷查詢。這樣會(huì)存在大量的無用索引、分片、segment 的查詢空轉(zhuǎn)掃描。
5.1.2 Segment 串行化執(zhí)行
ES 底層分片之間是可以并行化的,但是單個(gè)分片內(nèi)部多個(gè) segment 之間是串行化的?;旌洗鎯?chǔ)引擎的底層是對(duì)象存儲(chǔ),多個(gè) segment 串行化導(dǎo)致 IO 排隊(duì)嚴(yán)重,查詢效率低下,尤其是在大查詢拉取數(shù)據(jù)較多的場景下。
5.2 索引分片級(jí)時(shí)序裁剪優(yōu)化
基于上面兩大影響面分析,我們針對(duì)性的優(yōu)化思路是查詢裁剪和查詢并行化,下面我們來展開分析。

在日志場景,索引一般是按照一定的時(shí)間周期進(jìn)行滾動(dòng),騰訊自研了自治索引,幫助用戶托管索引分片的管理,用戶無需關(guān)心底層分片的數(shù)量、大小、分布配置。簡化數(shù)據(jù)接入門檻。在此基礎(chǔ)上,我們維護(hù)了索引級(jí)別的 Min/Max,當(dāng)查詢請(qǐng)求進(jìn)來的時(shí)候,可以針對(duì)用戶的查詢區(qū)間進(jìn)行精準(zhǔn)的物理索引過濾裁剪,大幅降低無用索引的空轉(zhuǎn)掃描過程。通過索引分片維度的時(shí)序裁剪,大幅提升查詢性能,內(nèi)部視頻日志業(yè)務(wù)實(shí)測查詢性能提升 8 倍。
5.3 Segment 級(jí)別查詢裁剪
單個(gè)分片包含多個(gè) segment,在查詢過程中會(huì)依次遍歷 segment 進(jìn)行查詢。但往往只有部分 segment 或者 segment 內(nèi)部部分?jǐn)?shù)據(jù)段存在有效數(shù)據(jù),因此 segment 維度的查詢裁剪也是優(yōu)化的重點(diǎn)。

Segment 級(jí)別查詢裁剪分為兩個(gè)維度:
-
Segment 整體裁剪。社區(qū)版本已經(jīng)支持列存、數(shù)值索引等維度的裁剪,對(duì) Terms 維度還缺少整體裁剪,騰訊進(jìn)行了優(yōu)化,并提交給了社區(qū),點(diǎn)查性能提升 25.7%。 -
Segment 內(nèi)數(shù)據(jù)裁剪。1). 流式聚合裁剪。在 Composite Aggregation 場景,支持聚合翻頁,每次翻頁會(huì)涉及大量重復(fù)數(shù)據(jù)的查詢,騰訊進(jìn)行了優(yōu)化,基于 index sorting,每次翻頁采用起始 doc id 跳轉(zhuǎn),加上滿足 size 條件提前結(jié)束優(yōu)化,流式聚合性能提升 7 倍,且支持正、逆序,已反饋給社區(qū)。2). 時(shí)序裁剪。社區(qū)版本,在大的時(shí)序范圍查詢場景,構(gòu)建實(shí)踐范圍 posting list 的時(shí)候,涉及大量的數(shù)據(jù)文件遍歷,產(chǎn)生大量的隨機(jī) IO 影響查詢性能。TencentES OTeam 協(xié)作進(jìn)行了深度優(yōu)化,基于 index sorting,利用 BKD 做二級(jí)索引,實(shí)現(xiàn)端點(diǎn)提取裁剪遍歷,逆序采用二分查找,滿足了大范圍的時(shí)序查詢性能需求,時(shí)序搜索性能提升 40 倍。
5.4 Segment 并行化

原生 ES 單個(gè)分片內(nèi)部多個(gè) segment 查詢?yōu)榇谢瘓?zhí)行。Segment 并行化的思路主要是將多個(gè) segment 的文檔進(jìn)行統(tǒng)籌規(guī)劃,按照多線程切分,并行化查詢。對(duì)于做完 forcemerge 的場景也能很好的提高并行度。于此同時(shí),我們在拉取底層共享存儲(chǔ)時(shí),并不會(huì)整個(gè)文件拉回來,而是結(jié)合前面描述的數(shù)據(jù)裁剪能力,按照查詢需要拉取局部的數(shù)據(jù)段,大幅提升拉取效率。混合存儲(chǔ)引擎中,開啟并行化查詢優(yōu)化相較原生版本查詢性能提升 5 倍。
6. 云原生數(shù)據(jù)平臺(tái)

下一階段,騰訊云 ES 將打造云原生數(shù)據(jù)平臺(tái),閉環(huán) PB 級(jí)數(shù)據(jù)檢索、分析場景,全面覆蓋日志場景低成本、高性能的需求。底層基于共享存儲(chǔ),消除冗余副本,實(shí)現(xiàn)存算分離架構(gòu),中間計(jì)算層會(huì)提供多種維度的集群,實(shí)現(xiàn)讀寫分離,檢索、分析場景分離等。上層提供各種免運(yùn)維的數(shù)據(jù)服務(wù),實(shí)現(xiàn)資源靈活調(diào)度,數(shù)據(jù)跨節(jié)點(diǎn)、跨邏輯集群掛載等。
目前騰訊云推出的 Elasticsearch Serverless 服務(wù)已覆蓋上述大部分能力,后續(xù)會(huì)持續(xù)完善,敬請(qǐng)關(guān)注。文章來源:http://www.zghlxwxcb.cn/news/detail-496295.html
作者:daniel文章來源地址http://www.zghlxwxcb.cn/news/detail-496295.html
到了這里,關(guān)于Elasticsearch核心應(yīng)用場景-日志優(yōu)化實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!