中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
億級流量系統(tǒng)架構之如何支撐百億級數(shù)據(jù)的存儲與計算【石杉的架構筆記】

一、背景引入


首先簡單介紹一下項目背景,公司對合作商家提供一個付費級產品,這個商業(yè)產品背后涉及到數(shù)百人的研發(fā)團隊協(xié)作開發(fā),包括各種業(yè)務系統(tǒng)來提供很多強大的業(yè)務功能,同時在整個平臺中包含了一個至關重要的核心數(shù)據(jù)產品,這個數(shù)據(jù)產品的定位是全方位支持用戶的業(yè)務經(jīng)營和快速決策。


這篇文章就聊聊這個數(shù)據(jù)產品背后對應的一套大型商家數(shù)據(jù)平臺,看看這個平臺在分布式、高并發(fā)、高可用、高性能、海量數(shù)據(jù)等技術挑戰(zhàn)下的架構演進歷程。


因為整套系統(tǒng)規(guī)模過于龐大,涉及研發(fā)人員很多,持續(xù)時間很長,文章難以表述出其中各種詳細的技術細節(jié)以及方案,因此本文主要從整體架構演進的角度來闡述。


至于選擇這個商家數(shù)據(jù)平臺項目來聊架構演進過程,是因為這個平臺基本跟業(yè)務耦合度較低,不像我們負責過的C端類的電商平臺以及其他業(yè)務類平臺有那么重的業(yè)務在里面,文章可以專注闡述技術架構的演進,不需要牽扯太多的業(yè)務細節(jié)。



此外,這個平臺項目在筆者帶的團隊負責過的眾多項目中,相對算比較簡單的,但是前后又涉及到各種架構的演進過程,因此很適合通過文字的形式來展現(xiàn)出來。



二、商家數(shù)據(jù)平臺的業(yè)務流程


下面幾點,是這個數(shù)據(jù)產品最核心的業(yè)務流程:

  • 每天從用戶使用的大量業(yè)務系統(tǒng)中實時的采集過來各種業(yè)務數(shù)據(jù)

  • 接著存儲在自己的數(shù)據(jù)中心里

  • 然后實時的運算大量的幾百行~上千行的SQL來生成各種數(shù)據(jù)報表

  • 最后就可以提供這些數(shù)據(jù)報表給用戶來分析。


基本上用戶在業(yè)務系統(tǒng)使用過程中,只要數(shù)據(jù)一有變動,立馬就反饋到各種數(shù)據(jù)報表中,用戶立馬就可以看到數(shù)據(jù)報表中的各種變化,進而快速的指導自己的決策和管理。


整個過程,大家看看下面的圖就明白了。



三、從0到1的過程中上線的最low版本


看著上面那張圖好像非常的簡單,是不是?


看整個過程,似乎數(shù)據(jù)平臺只要想個辦法把業(yè)務系統(tǒng)的數(shù)據(jù)采集過來,接著放在MySQL的各種表里,直接咔嚓一下運行100多個幾百行的大SQL,然后SQL運行結果再寫到另外一些MySQL的表里作為報表數(shù)據(jù),接著用戶直接點擊報表頁面查詢MySQL里的報表數(shù)據(jù),就可以了!


其實任何一個系統(tǒng)從0到1的過程,都是比較low的,剛開始為了快速開發(fā)出來這個數(shù)據(jù)平臺,還真的就是用了這種架構來開發(fā),大家看下面的圖。




其實在剛開始業(yè)務量很小,請求量很小,數(shù)據(jù)量很小的時候,上面那種架構也沒啥問題,還挺簡單的。


我們直接基于自己研發(fā)的數(shù)據(jù)庫binlog采集中間件(這個是另外一套復雜系統(tǒng)了,不在本文討論的范圍里,以后有機會可以聊聊),感知各個業(yè)務系統(tǒng)的數(shù)據(jù)庫中的數(shù)據(jù)變更,毫秒級同步到數(shù)據(jù)平臺自己的MySQL庫里;


接著數(shù)據(jù)平臺里做一些定時調度任務,每隔幾秒鐘就運行上百個復雜大SQL,計算各種報表的數(shù)據(jù)并將結果存儲到MySQL庫中;


最后用戶只要對報表刷新一下,立馬就可以從MySQL庫里查到最新的報表數(shù)據(jù)。


基本上在無任何技術挑戰(zhàn)的前提下,這套簡易架構運行的會很順暢,效果很好。然而,事情往往不是我們想的那么簡單的,因為大家都知道國內那些互聯(lián)網(wǎng)巨頭公司最大的優(yōu)勢和資源之一,就是有豐富以及海量的C端用戶以及B端的合作商家。


對C端用戶,任何一個互聯(lián)網(wǎng)巨頭推出一個新的C端產品,很可能迅速就是上億用戶量;


對B端商家,任何一個互聯(lián)網(wǎng)巨頭如果打B端市場,憑借巨大的影響力以及合作資源,很可能迅速就可以聚攏數(shù)十萬,乃至上百萬的付費B端用戶。


因此,很不幸,接下來的一兩年內,這套系統(tǒng)將要面臨業(yè)務的高速增長帶來的巨大技術挑戰(zhàn)和壓力。



四、海量數(shù)據(jù)存儲和計算的技術挑戰(zhàn)


其實跟很多大型系統(tǒng)遇到的第一個技術挑戰(zhàn)一樣,這套系統(tǒng)遇到的第一個大問題,就是海量數(shù)據(jù)的存儲。


你一個系統(tǒng)剛開始上線也許就幾十個商家用,接著隨著你們產品的銷售持續(xù)大力推廣,可能幾個月內就會聚攏起來十萬級別的用戶。


這些用戶每天都會大量的使用你提供的產品,進而每天都會產生大量的數(shù)據(jù),大家可以想象一下,在數(shù)十萬規(guī)模的商家用戶使用場景下,每天你新增的數(shù)據(jù)量大概會是幾千萬條數(shù)據(jù),記住,這可是每天新增的數(shù)據(jù)!這將會給上面你看到的那個很low的架構帶來巨大的壓力。


如果你在負責上面那套系統(tǒng),結果慢慢的發(fā)現(xiàn),每天都要涌入MySQL幾千萬條數(shù)據(jù),這種現(xiàn)象是令人感到崩潰的,因為你的MySQL中的單表數(shù)據(jù)量會迅速膨脹,很快就會達到單表幾億條數(shù)據(jù),甚至是數(shù)十億條數(shù)據(jù),然后你對那些怪獸一樣的大表運行幾百行乃至上千行的SQL?其中包含了N層嵌套查詢以及N個各種多表連接?


我跟你打賭,如果你愿意試一下,你會發(fā)現(xiàn)你的數(shù)據(jù)平臺系統(tǒng)直接卡死,因為一個大SQL可能都要幾個小時才能跑完。然后MySQL的cpu負載壓力直接100%,弄不好就把MySQL數(shù)據(jù)庫服務器給搞宕機了。


所以這就是第一個技術挑戰(zhàn),數(shù)據(jù)量越來越大,SQL跑的越來越慢,MySQL服務器壓力越來越大。


我們當時而言,已經(jīng)看到了業(yè)務的快速增長,因此絕對要先業(yè)務一步來重構系統(tǒng)架構,不能讓上述情況發(fā)生,第一次架構重構,勢在必行!




五、離線計算與實時計算的拆分


其實在幾年前我們做這個項目的時候,大數(shù)據(jù)技術已經(jīng)在國內開始運用的不錯了,而且尤其在一些大型互聯(lián)網(wǎng)公司內,我們基本上都運用大數(shù)據(jù)技術支撐過很多生產環(huán)境的項目了,在大數(shù)據(jù)這塊技術的經(jīng)驗積累,也是足夠的。


針對這個數(shù)據(jù)產品的需求,我們完全可以做到,將昨天以及昨天以前的數(shù)據(jù)都放在大數(shù)據(jù)存儲中,進行離線存儲和離線計算,然后只有今天的數(shù)據(jù)是實時的采集的。


因此在這種技術挑戰(zhàn)下,第一次架構重構的核心要義,就是將離線計算與實時計算進行拆分。




大家看上面那張圖,新的架構之下,分為了離線與實時兩條計算鏈路。


一條是離線計算鏈路:每天凌晨,我們將業(yè)務系統(tǒng)MySQL庫中的昨天以前的數(shù)據(jù),作為離線數(shù)據(jù)導入Hadoop HDFS中進行離線存儲,然后凌晨就基于Hive / Spark對離線存儲中的數(shù)據(jù)進行離線計算。


如果有同學不清楚大數(shù)據(jù)的知識,可以參加我之前寫的一篇文章:《兄弟,用大白話告訴你小白都能聽懂的Hadoop架構原理》。Hadoop與Spark作為世界上最優(yōu)秀、運用最廣泛的大數(shù)據(jù)技術,天然適合PB級海量數(shù)據(jù)的分布式存儲和分布式計算。


在離線計算鏈路全面采用大數(shù)據(jù)相關技術來支撐過后,完美解決了海量數(shù)據(jù)的存儲,哪怕你一天進來上億條數(shù)據(jù)都沒事,分布式存儲可以隨時擴容,同時基于分布式計算技術天然適合海量數(shù)據(jù)的離線計算。


即使是每天凌晨耗費幾個小時將昨天以前的數(shù)據(jù)完成計算,這個也沒事,因為凌晨一般是沒人看這個數(shù)據(jù)的,所以主要在人家早上8點上班以前,完成數(shù)據(jù)計算就可以了。


另外一條是實時計算鏈路:每天零點過后,當天最新的數(shù)據(jù)變更,全部還是走之前的老路子,秒級同步業(yè)務庫的數(shù)據(jù)到數(shù)據(jù)平臺存儲中,接著就是數(shù)據(jù)平臺系統(tǒng)定時運行大量的SQL進行計算。同時在每天零點的時候,還會從數(shù)據(jù)平臺的存儲中清理掉昨天的數(shù)據(jù),僅僅保留當天一天的數(shù)據(jù)而已。


實時計算鏈路最大的改變,就是僅僅在數(shù)據(jù)平臺的本地存儲中保留當天一天的數(shù)據(jù)而已,這樣就大幅度降低了要放在MySQL中的數(shù)據(jù)量了。


舉個例子:比如一天就幾千萬條數(shù)據(jù)放在MySQL里,那么單表數(shù)據(jù)量被維持在了千萬的級別上,此時如果對SQL對應索引以及優(yōu)化到極致之后,勉強還是可以在幾十秒內完成所有報表的計算。




六、持續(xù)增長的數(shù)據(jù)量和計算壓力


但是如果僅僅只是做到上面的架構,還是只能暫時性的緩解系統(tǒng)架構的壓力,因為業(yè)務還在加速狂飆,繼續(xù)增長。


你老是期望單日的數(shù)據(jù)量在千萬級別,怎么可能?業(yè)務是不會給你這個機會的。很快就可以預見到單日數(shù)據(jù)量將會達到幾億,甚至十億的級別。


如果一旦單日數(shù)據(jù)量達到了數(shù)十億的級別,單表數(shù)據(jù)量上億,你再怎么優(yōu)化SQL性能,有無法保證100多個幾百行的復雜SQL可以快速的運行完畢了。


到時候又會回到最初的問題,SQL計算過慢會導致數(shù)據(jù)平臺核心系統(tǒng)卡死,甚至給MySQL服務器過大壓力,CPU 100%負載后宕機。


而且此外還有另外一個問題,那就是單個MySQL數(shù)據(jù)庫服務器的存儲容量是有限的,如果一旦單日數(shù)據(jù)量達到甚至超過了單臺MySQL數(shù)據(jù)庫服務器的存儲極限,那么此時也會導致單臺MySQL數(shù)據(jù)庫無法容納所有的數(shù)據(jù)了,這也是一個很大的問題!


第二次架構重構,勢在必行!



七、大數(shù)據(jù)領域的實時計算技術的缺陷


在幾年前做這個項目的背景下,當時可供選擇的大數(shù)據(jù)領域的實時計算技術,主要還是Storm,算是比較成熟的一個技術,另外就是Spark生態(tài)里的Spark Streaming。當時可沒有什么現(xiàn)在較火的Flink、Druid等技術。


在仔細調研了一番過后發(fā)現(xiàn),根本沒有任何一個大數(shù)據(jù)領域的實時計算技術可以支撐這個需求。


因為Storm是不支持SQL的,而且即使勉強你讓他支持了,他的SQL支持也會很弱,完全不可能運行幾百行甚至上千行的復雜SQL在這種流式計算引擎上的執(zhí)行。


Spark Streaming也是同理,當時功能還是比較弱小的,雖然可以支持簡單SQL的執(zhí)行,但是完全無法支持這種復雜SQL的精準運算。


因此很不幸的是,在當時的技術背景下,遇到的這個實時數(shù)據(jù)運算的痛點,沒有任何開源的技術是可以解決的。必須得自己根據(jù)業(yè)務的具體場景,從0開始定制開發(fā)自己的一套數(shù)據(jù)平臺系統(tǒng)架構。



八、分庫分表解決數(shù)據(jù)擴容問題


首先我們要先解決第一個痛點,就是一旦單臺數(shù)據(jù)庫服務器無法存儲下當日的數(shù)據(jù),該怎么辦?


第一個首選的方案當然就是分庫分表了。我們需要將一個庫拆分為多庫,不用的庫放在不同的數(shù)據(jù)庫服務器上,同時每個庫里放多張表。


采用這套分庫分表架構之后,可以做到每個數(shù)據(jù)庫服務器放一部分的數(shù)據(jù),而且隨著數(shù)據(jù)量日益增長,可以不斷地增加更多的數(shù)據(jù)庫服務器來容納更多的數(shù)據(jù),做到按需擴容。


同時,每個庫里單表分為多表,這樣可以保證單表數(shù)據(jù)量不會太大,控制單表的數(shù)據(jù)量在幾百萬的量級,基本上性能優(yōu)化到極致的SQL語句跑起來效率還是不錯的,秒級出結果是可以做到的。


同樣,給大家來一張圖,大家直觀的感受一下:





九、讀寫分離降低數(shù)據(jù)庫服務器的負載


此時分庫分表之后,又面臨著另外一個問題,就是現(xiàn)在如果對每個數(shù)據(jù)庫服務器又是寫入又是讀取的話,會導致數(shù)據(jù)庫服務器的CPU負載和IO負載非常的高!


為什么這么說呢?因為在此時寫數(shù)據(jù)庫的每秒并發(fā)已經(jīng)達到幾千了,同時還頻繁的運行那種超大SQL來查詢數(shù)據(jù),數(shù)據(jù)庫服務器的CPU運算會極其的繁忙。


因此我們將MySQL做了讀寫分離的部署,每個主數(shù)據(jù)庫服務器都掛了多個從數(shù)據(jù)庫服務器,寫只能寫入主庫,查可以從從庫來查。


大家一起來看看下面這張圖:





十、自研的滑動窗口動態(tài)計算引擎



但是光是做到這一點還是不夠的,因為其實在生產環(huán)境發(fā)現(xiàn),哪怕單表數(shù)據(jù)量限制在了幾百萬的級別,你運行幾百個幾百行復雜SQL,也要幾十秒甚至幾分鐘的時間,這個時效性對付費級的產品已經(jīng)有點無法接受,產品提出的極致性能要求是,秒級!


因此對上述系統(tǒng)架構,我們再次做了架構的優(yōu)化,在數(shù)據(jù)平臺中嵌入了自己純自研的滑動窗口計算引擎,核心思想如下:


  • 在數(shù)據(jù)庫binlog采集中間件采集的過程中,要將數(shù)據(jù)的變更切割為一個一個的滑動時間窗口,每個滑動時間窗口為幾秒鐘,對每個窗口內的數(shù)據(jù)打上那個窗口的標簽


  • 同時需要維護一份滑動時間窗口的索引數(shù)據(jù),包括每個分片的數(shù)據(jù)在哪個窗口里,每個窗口的數(shù)據(jù)的一些具體的索引信息和狀態(tài)


  • 接著數(shù)據(jù)平臺中的核心計算引擎,不再是每隔幾十秒就運行大量SQL對當天所有的數(shù)據(jù)全部計算一遍了,而是對一個接一個的滑動時間窗口,根據(jù)窗口標簽提取出那個窗口內的數(shù)據(jù)進行計算,計算的僅僅是最近一個滑動時間窗口內的數(shù)據(jù)


  • 接著對這個滑動時間窗口內的數(shù)據(jù),可能最多就千條左右吧,運行所有的復雜SQL計算出這個滑動時間窗口內的報表數(shù)據(jù),然后將這個窗口數(shù)據(jù)計算出的結果,與之前計算出來的其他窗口內的計算結果進行合并,最后放入MySQL中的報表內

  • 此外,這里需要考慮到一系列的生產級機制,包括滑動時間窗口如果計算失敗怎么辦?如果一個滑動時間窗口計算過慢怎么辦?滑動窗口計算過程中系統(tǒng)宕機了如何在重啟之后自動恢復計算?等等



通過這套滑動窗口的計算引擎,我們直接將系統(tǒng)計算性能提升了幾十倍,基本上每個滑動窗口的數(shù)據(jù)只要幾秒鐘就可以完成全部報表的計算,相當于一下子把最終呈現(xiàn)給用戶的實時數(shù)據(jù)的時效性提升到了幾秒鐘,而不是幾十秒。


同樣,大家看看下面的圖。






十一、離線計算鏈路的性能優(yōu)化


實時計算鏈路的性能問題通過自研滑動窗口計算引擎來解決了,但是離線計算鏈路此時又出現(xiàn)了性能問題。。。


因為每天凌晨從業(yè)務庫中離線導入的是歷史全量數(shù)據(jù),接著需要在凌晨針對百億量級的全量數(shù)據(jù),運行很多復雜的上千行復雜SQL來進行運算,當數(shù)據(jù)量達到百億之后,這個過程耗時很長,有時候要從凌晨一直計算到上午。


關鍵問題就在于,離線計算鏈路,每天都是導入全量數(shù)據(jù)來進行計算,這就很坑了。


之所以這么做,是因為從業(yè)務庫同步數(shù)據(jù)時,每天都涉及到數(shù)據(jù)的更新操作,而hadoop里的數(shù)據(jù)是沒法跟業(yè)務庫那樣來進行更新的,因此最開始都是每天導入全量歷史數(shù)據(jù),作為一個最新快照來進行全量計算。


在這里,我們對離線計算鏈路進行了優(yōu)化,主要就是全量計算轉增量計算:每天數(shù)據(jù)在導入hadoop之后,都會針對數(shù)據(jù)的業(yè)務時間戳來分析和提取出來每天變更過的增量數(shù)據(jù),將這些增量數(shù)據(jù)放入獨立的增量數(shù)據(jù)表中。


同時需要根據(jù)具體的業(yè)務需求,自動分析數(shù)據(jù)計算的基礎血緣關系,有可能增量數(shù)據(jù)需要與部分全量數(shù)據(jù)混合才能完成計算,此時可能會提取部分全量歷史數(shù)據(jù),合并完成計算。計算完成之后,將計算結果與歷史計算結果進行合并。


在完成這個全量計算轉增量計算的過程之后,離線計算鏈路在凌晨基本上百億級別的數(shù)據(jù)量,只要對昨天的增量數(shù)據(jù)花費一兩個小時完成計算之后,就可以完成離線計算的全部任務,性能相較于全量計算提升至少十倍以上。





十二、階段性總結


到此為止,就是這套系統(tǒng)在最初一段時間做出來的一套架構,不算太復雜,還有很多缺陷,不完美,但是在當時的業(yè)務背景下效果相當?shù)牟诲e。


在這套架構對應的早期業(yè)務背景下,每天新增數(shù)據(jù)大概是億級左右,但是分庫分表之后,單表數(shù)據(jù)量在百萬級別,單臺數(shù)據(jù)庫服務器的高峰期寫入壓力在2000/s,查詢壓力在100/s,數(shù)據(jù)庫集群承載的總高峰寫入壓力在1萬/s,查詢壓力在500/s,有需要還可以隨時擴容更多的數(shù)據(jù)庫服務器,承載更多的數(shù)據(jù)量,更高的寫入并發(fā)與查詢并發(fā)。


而且,因為做了讀寫分離,因此每個數(shù)據(jù)庫服務器的CPU負載和IO負載都不會在高峰期打滿,避免數(shù)據(jù)庫服務器的負載過高。


而基于滑動時間窗口的自研計算引擎,可以保證當天更新的實時數(shù)據(jù)主要幾秒鐘就可以完成一個微批次的計算,反饋到用戶看到的數(shù)據(jù)報表中。


同時這套引擎自行管理著計算的狀態(tài)與日志,如果出現(xiàn)某個窗口的計算失敗、系統(tǒng)宕機、計算超時,等各種異常的情況,這個套引擎可以自動重試與恢復。


此外,昨天以前的海量數(shù)據(jù)都是走Hadoop與Spark生態(tài)的離線存儲與計算。經(jīng)過性能優(yōu)化之后,每天凌晨花費一兩個小時,算好昨天以前所有的數(shù)據(jù)即可。


最后實時與離線的計算結果在同一個MySQL數(shù)據(jù)庫中融合,此時用戶如果對業(yè)務系統(tǒng)做出操作,實時數(shù)據(jù)報表在幾秒后就會刷新,如果要看昨天以前的數(shù)據(jù)可以隨時選擇時間范圍查看即可,暫時性是滿足了業(yè)務的需求。


早期的幾個月里,日增上億數(shù)據(jù),離線與實時兩條鏈路中的整體數(shù)據(jù)量級達到了百億級別,無論是存儲擴容,還是高效計算,這套架構基本是撐住了。



十三、下一階段的展望


這個大型系統(tǒng)架構演進實踐是一個系列的文章,將會包含很多篇文章,因為一個大型的系統(tǒng)架構演進的過程,會持續(xù)很長時間,做出很多次的架構升級與重構,不斷的解決日益增長的技術挑戰(zhàn),最終完美的抗住海量數(shù)據(jù)、高并發(fā)、高性能、高可用等場景。


下一篇文章會說說下一步是如何將數(shù)據(jù)平臺系統(tǒng)重構為一套高可用高容錯的分布式系統(tǒng)架構的,來解決單點故障、單系統(tǒng)CPU負載過高、自動故障轉移、自動數(shù)據(jù)容錯等相關的問題。包括之后還會有多篇文章涉及到我們自研的更加復雜的支撐高并發(fā)、高可用、高性能、海量數(shù)據(jù)的平臺架構。


十四、上篇文章的答疑


上一篇文章寫了一個分布式鎖的高并發(fā)優(yōu)化的文章,具體參見:《每秒上千訂單場景下的分布式鎖高并發(fā)優(yōu)化實踐》。收到了大家很多的提問,其實最終都是一個問題:


針對那篇文章里的用分布式鎖的分段加鎖的方式,解決庫存超賣問題,那如果一個分段的庫存不滿足要購買的數(shù)量,怎么辦?


第一,我當時文章里提了一句,可能沒寫太詳細,如果一個分段庫存不足,要鎖其他的分段,進行合并扣減,如果你做分段加鎖,那就是這樣的,很麻煩。


如果大家去看看Java 8里的LongAdder的源碼,他的分段加鎖的優(yōu)化,也是如此的麻煩,要做段遷移。


第二,我在那篇文章里反復強調了一下,不要對號入座,因為實際的電商庫存超賣問題,有很多其他的技術手段,我們就用的是其他的方案,不是這個方案,以后有機會給大家專門講如何解決電商庫存超賣問題。


那篇文章僅僅是用那個例作為一個業(yè)務案例而已,闡述一下分布式鎖的并發(fā)問題,以及高并發(fā)的優(yōu)化手段,方便大家來理解那個意思,僅此而已。


第三,最后再強調一下,大家關注分段加鎖的思想就好,切記不要對號入座,不要關注過多在庫存超賣業(yè)務上了。

本站僅提供存儲服務,所有內容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
一套大而全的系統(tǒng)架構體系與具體落地方案(有彩蛋)
分布式HTAP數(shù)據(jù)庫PetaData——OLTP與OLAP一站式解決方案
TiDB 在中國電信翼支付的大規(guī)模深度實踐
數(shù)據(jù)庫也去中心化?深度解析分布式數(shù)據(jù)庫
趕考狀元:如何快速應對數(shù)據(jù)庫QPS暴漲20倍?我們做了三次決策
阿里云數(shù)據(jù)庫架構是如何實現(xiàn)的
更多類似文章 >>
生活服務
熱點新聞
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服