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

從 Notion 分片 Postgres 中吸取的教訓(xùn)

開發(fā) 前端
雖然轉(zhuǎn)換成功讓大家歡欣鼓舞,但我們?nèi)匀槐3殖聊苑肋w移后出現(xiàn)任何問題。令我們高興的是,用戶很快開始注意到改進(jìn)。完全是 “show don't tell”。

今年(2021)早些時(shí)候,我們對(duì) Notion 進(jìn)行了五分鐘的定期維護(hù)。雖然我們的聲明指向“提高穩(wěn)定性和性能”,但在幕后是數(shù)月專注、緊迫的團(tuán)隊(duì)合作的結(jié)果:將 Notion 的 PostgreSQL 整體分片成一個(gè)水平分區(qū)的數(shù)據(jù)庫(kù)艦隊(duì)。

分片命名法被認(rèn)為起源于 MMORPG Ultima Online,當(dāng)時(shí)游戲開發(fā)者需要一個(gè)宇宙解釋來解釋存在多個(gè)運(yùn)行平行世界副本的游戲服務(wù)器。具體來說,每一個(gè)碎片都是從一個(gè)破碎的水晶中出現(xiàn)的,邪惡的巫師蒙丹曾試圖通過它奪取世界的控制權(quán)。

https://www.raphkoster.com/2009/01/08/database-sharding-came-from-uo/

https://uo.com/

雖然轉(zhuǎn)換成功讓大家歡欣鼓舞,但我們?nèi)匀槐3殖聊?,以防遷移后出現(xiàn)任何問題。令我們高興的是,用戶很快開始注意到改進(jìn)。完全是 “show don't tell”。

讓我告訴你我們?nèi)绾畏制墓适乱约拔覀冊(cè)诖诉^程中學(xué)到的東西。

決定何時(shí)分片

分片是我們不斷努力提高應(yīng)用程序性能的一個(gè)重要里程碑。在過去的幾年里,看到越來越多的人將 Notion 應(yīng)用到他們生活的方方面面,這令人欣慰和謙卑。不出所料,所有新的公司 wiki、項(xiàng)目跟蹤器和圖鑒都意味著數(shù)十億新的blocks、files 和 spaces。到 2020 年年中,很明顯,產(chǎn)品的使用將超過我們值得信賴的 Postgres 單體的能力,后者在五年和四個(gè)數(shù)量級(jí)的增長(zhǎng)中盡職盡責(zé)地為我們服務(wù)。隨叫隨到的工程師經(jīng)常被數(shù)據(jù)庫(kù) CPU 峰值喚醒,簡(jiǎn)單的僅目錄遷移變得不安全和不確定。

  • https://www.notion.so/blog/data-model-behind-notion
  • https://medium.com/paypal-tech/postgresql-at-scale-database-schema-changes-without-downtime-20d3749ed680

在分片方面,快速發(fā)展的初創(chuàng)公司必須進(jìn)行微妙的權(quán)衡。在此期間,大量博客文章過早地闡述了分片的危險(xiǎn):增加的維護(hù)負(fù)擔(dān)、應(yīng)用程序級(jí)代碼中新發(fā)現(xiàn)的約束以及架構(gòu)路徑依賴性。1當(dāng)然,在我們的規(guī)模上,分片是不可避免的。問題只是什么時(shí)候。

  • https://www.percona.com/blog/2009/08/06/why-you-dont-want-to-shard/
  • http://www.37signals.com/svn/posts/1509-mr-moore-gets-to-punt-on-sharding#
  • https://www.drdobbs.com/errant-architectures/184414966
  • https://www.infoworld.com/article/2073449/think-twice-before-sharding.html

對(duì)我們來說,當(dāng) Postgres VACUUM 進(jìn)程開始持續(xù)停止時(shí),拐點(diǎn)就到了,阻止了數(shù)據(jù)庫(kù)從死元組中回收磁盤空間。雖然可以增加磁盤容量,但更令人擔(dān)憂的是 transaction ID (TXID) wraparound,這是一種 Postgres 將停止處理所有寫入以避免破壞現(xiàn)有數(shù)據(jù)的安全機(jī)制。意識(shí)到 TXID wraparound 會(huì)對(duì)產(chǎn)品構(gòu)成生存威脅,我們的基礎(chǔ)架構(gòu)團(tuán)隊(duì)加倍努力并開始工作。

https://blog.sentry.io/2015/07/23/transaction-id-wraparound-in-postgres

設(shè)計(jì)分片方案

如果您以前從未對(duì)數(shù)據(jù)庫(kù)進(jìn)行過分片,那么這里的想法是:不要使用越來越多的實(shí)例垂直擴(kuò)展數(shù)據(jù)庫(kù),而是通過跨多個(gè)數(shù)據(jù)庫(kù)分區(qū)數(shù)據(jù)來水平擴(kuò)展?,F(xiàn)在,您可以輕松啟動(dòng)其他主機(jī)以適應(yīng)增長(zhǎng)。不幸的是,現(xiàn)在您的數(shù)據(jù)位于多個(gè)位置,因此您需要設(shè)計(jì)一個(gè)在分布式環(huán)境中最大限度地提高性能和一致性的系統(tǒng)。

為什么不保持垂直縮放?正如我們發(fā)現(xiàn)的那樣,使用 RDS“調(diào)整實(shí)例大小”按鈕玩 Cookie Clicker 并不是一個(gè)可行的長(zhǎng)期策略——即使你有預(yù)算。查詢性能和維護(hù)過程通常在表達(dá)到最大硬件綁定大小之前就開始下降;我們停止的 Postgres auto-vacuum 就是這種軟限制的一個(gè)例子。

應(yīng)用級(jí)分片

我們決定實(shí)現(xiàn)我們自己的分區(qū)方案并從應(yīng)用程序邏輯路由查詢,這種方法稱為應(yīng)用程序級(jí)分片。在我們最初的研究中,我們還考慮了打包的分片/集群解決方案,例如用于 Postgres 的 Citus 或用于 MySQL 的 Vitess。雖然這些解決方案因其簡(jiǎn)單性而吸引人,并提供開箱即用的跨分片工具,但實(shí)際的集群邏輯是不透明的,我們希望控制數(shù)據(jù)的分布。2

https://www.citusdata.com/

https://vitess.io/

應(yīng)用程序級(jí)分片要求我們做出以下設(shè)計(jì)決策:

  • 我們應(yīng)該分片哪些數(shù)據(jù)? 使我們的數(shù)據(jù)集與眾不同的部分原因在于,block 表反映了用戶創(chuàng)建內(nèi)容的樹,這些內(nèi)容的大小、深度和分支因子可能會(huì)有很大差異。例如,單個(gè)大型企業(yè)客戶產(chǎn)生的負(fù)載比許多普通個(gè)人工作空間的總和還要多。我們只想對(duì)必要的表進(jìn)行分片,同時(shí)保留相關(guān)數(shù)據(jù)的局部性。
  • 我們應(yīng)該如何對(duì)數(shù)據(jù)進(jìn)行分區(qū)? 良好的分區(qū)鍵可確保元組在分片中均勻分布。分區(qū)鍵的選擇還取決于應(yīng)用程序結(jié)構(gòu),因?yàn)榉植际竭B接很昂貴,并且事務(wù)性保證通常僅限于單個(gè)主機(jī)。
  • 我們應(yīng)該創(chuàng)建多少個(gè)分片?應(yīng)該如何組織這些分片? 這種考慮包括每個(gè)表的邏輯分片數(shù)量,以及邏輯分片和物理主機(jī)之間的具體映射。

決策 1:對(duì)所有與塊有傳遞關(guān)系的數(shù)據(jù)進(jìn)行分片

由于 Notion 的數(shù)據(jù)模型圍繞塊的概念展開,每個(gè)塊在我們的數(shù)據(jù)庫(kù)中占據(jù)一行,因此 block(塊) 表是分片的最高優(yōu)先級(jí)。但是,塊可能會(huì)引用其他表,例如space(工作區(qū))或 discussion(page-level 和 inline discussion 線程)。反過來,discussion 可能會(huì)引用 comment 表中的行,等等。

https://www.notion.so/blog/data-model-behind-notion

我們決定通過某種外鍵關(guān)系對(duì)所有可從 block 表訪問的表進(jìn)行分片。并非所有這些表都需要分片,但是如果一條記錄存儲(chǔ)在主數(shù)據(jù)庫(kù)中,而其相關(guān)塊存儲(chǔ)在不同的物理分片上,我們可能會(huì)在寫入不同的數(shù)據(jù)存儲(chǔ)時(shí)引入不一致。

例如,考慮一個(gè)存儲(chǔ)在一個(gè)數(shù)據(jù)庫(kù)中的塊,在另一個(gè)數(shù)據(jù)庫(kù)中具有相關(guān)的評(píng)論。如果塊被刪除,評(píng)論應(yīng)該被更新 — 但是,由于事務(wù)性保證只適用于每個(gè)數(shù)據(jù)存儲(chǔ),所以塊刪除可能成功,而評(píng)論更新可能失敗。

決策 2:按 Workspace ID 劃分塊數(shù)據(jù)

一旦我們決定分片哪些表,我們就必須將它們分開。選擇一個(gè)好的分區(qū)方案很大程度上取決于數(shù)據(jù)的分布和連通性;由于 Notion 是基于團(tuán)隊(duì)的產(chǎn)品,我們的下一個(gè)決定是按 workspace ID 對(duì)數(shù)據(jù)進(jìn)行分區(qū)。3

每個(gè)工作空間在創(chuàng)建時(shí)都分配了一個(gè) UUID,因此我們可以將 UUID 空間劃分為統(tǒng)一的存儲(chǔ)桶。因?yàn)榉制碇械拿恳恍幸词且粋€(gè)塊,要么與一個(gè)塊相關(guān),并且每個(gè)塊都屬于一個(gè)工作區(qū),所以我們使用 workspace ID 作為分區(qū)鍵(partition key)。由于用戶通常一次在單個(gè)工作空間內(nèi)查詢數(shù)據(jù),因此我們避免了大多數(shù)跨分片連接。

決策 3:容量規(guī)劃

決定了分區(qū)方案后,我們的目標(biāo)是設(shè)計(jì)一個(gè)分片設(shè)置,以處理我們現(xiàn)有的數(shù)據(jù)和規(guī)模,以輕松滿足我們兩年的使用預(yù)測(cè)。以下是我們的一些限制條件:

  • 實(shí)例類型: 以 IOPS 量化的磁盤 I/O 吞吐量受 AWS 實(shí)例類型和磁盤容量的限制。我們需要至少 60K 的總 IOPS 來滿足現(xiàn)有需求,并在需要時(shí)具有進(jìn)一步擴(kuò)展的能力。

https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_Storage.html

  • 物理和邏輯分片的數(shù)量: 為了保持 Postgres 正常運(yùn)行并保留 RDS 復(fù)制保證,我們將每個(gè)表的上限設(shè)置為 500 GB,每個(gè)物理數(shù)據(jù)庫(kù)設(shè)置為 10 TB。我們需要選擇多個(gè)邏輯分片和多個(gè)物理數(shù)據(jù)庫(kù),以便分片可以在數(shù)據(jù)庫(kù)之間均勻劃分。
  • 實(shí)例數(shù): 更多實(shí)例意味著更高的維護(hù)成本,但是系統(tǒng)更健壯。
  • 成本: 我們希望我們的賬單隨著我們的數(shù)據(jù)庫(kù)設(shè)置線性擴(kuò)展,并且我們希望能夠靈活地分別擴(kuò)展計(jì)算和磁盤空間。

在計(jì)算了數(shù)字之后,我們確定了一個(gè)由 480 個(gè)邏輯分片(logical shards)組成的架構(gòu),這些分片均勻分布在 32 個(gè)物理數(shù)據(jù)庫(kù)中。層次結(jié)構(gòu)如下所示:

  • 物理數(shù)據(jù)庫(kù)(共 32 個(gè))

block 表(每個(gè)邏輯分片 1 個(gè),總共 480 個(gè))

collection 表(每個(gè)邏輯分片 1 個(gè),總共 480 個(gè))

space 表(每個(gè)邏輯分片 1 個(gè),總共 480 個(gè))

等所有分片表

邏輯分片,表示為 Postgres 模式(每個(gè)數(shù)據(jù)庫(kù) 15 個(gè),總共 480 個(gè))

您可能想知道,“為什么要 480 個(gè)分片?我認(rèn)為所有計(jì)算機(jī)科學(xué)都是以 2 的冪次方完成的,這不是我認(rèn)識(shí)的驅(qū)動(dòng)器大小!”

有很多因素導(dǎo)致選擇 480:

  • 2
  • 3
  • 4
  • 5
  • 6
  • 8
  • 10, 12, 15, 16, 20, 24, 30, 32, 40, 48, 60, 80, 96, 120, 160, 240

關(guān)鍵是,480 可以被很多數(shù)字整除——這提供了添加或刪除物理主機(jī)的靈活性,同時(shí)保持統(tǒng)一的分片分布。例如,將來我們可以從 32 臺(tái)擴(kuò)展到 40 臺(tái)再到 48 臺(tái)主機(jī),每次都進(jìn)行增量跳躍。相比之下,假設(shè)我們有 512 個(gè)邏輯分片。512 的因數(shù)都是 2 的冪,這意味著如果我們想保持分片均勻,我們會(huì)從 32 臺(tái)主機(jī)跳到 64 臺(tái)主機(jī)。任何 2 的冪都需要我們將物理主機(jī)的數(shù)量增加一倍以進(jìn)行升級(jí)。選擇具有很多因素的值!

我們從包含每張表的單個(gè)數(shù)據(jù)庫(kù)發(fā)展為由 32 個(gè)物理數(shù)據(jù)庫(kù)組成的艦隊(duì),每個(gè)數(shù)據(jù)庫(kù)包含 15 個(gè)邏輯分片,每個(gè)分片包含每個(gè)分片表中的一個(gè)。我們總共有 480 個(gè)邏輯分片。

我們選擇將 schema001.block、schema002.block 等構(gòu)建為單獨(dú)的表,而不是為每個(gè)數(shù)據(jù)庫(kù)維護(hù)一個(gè)具有 15 個(gè)子表的分區(qū) block 表。原生分區(qū)表引入了另一條路由邏輯:

  • 應(yīng)用代碼:workspace ID → 物理數(shù)據(jù)庫(kù)。
  • 分區(qū)表:workspace ID → 邏輯 schema。

https://www.postgresql.org/docs/10/ddl-partitioning.html

保留單獨(dú)的表允許我們直接從應(yīng)用程序路由到特定的數(shù)據(jù)庫(kù)和邏輯分片。

我們想要從 workspace ID 路由到邏輯分片的單一事實(shí)來源,因此我們選擇單獨(dú)構(gòu)建表并在應(yīng)用程序中執(zhí)行所有路由。

遷移到分片

一旦我們建立了分片方案,就該實(shí)施它了。對(duì)于任何遷移,我們的一般框架都是這樣的:

  • 雙寫(Double-write):傳入的寫入同時(shí)應(yīng)用于舊數(shù)據(jù)庫(kù)和新數(shù)據(jù)庫(kù)。
  • 回填(Backfill):雙寫開始后,將舊數(shù)據(jù)遷移到新數(shù)據(jù)庫(kù)。
  • 驗(yàn)證(Verification):確保新數(shù)據(jù)庫(kù)中數(shù)據(jù)的完整性。
  • 切換(Switch-over):實(shí)際切換到新數(shù)據(jù)庫(kù)。這可以逐步完成,例如:雙讀,然后遷移所有的讀。

用審計(jì)日志雙重寫入

雙寫階段確保新數(shù)據(jù)同時(shí)填充新舊數(shù)據(jù)庫(kù),即使新數(shù)據(jù)庫(kù)尚未使用。雙寫有幾種選擇:

  • 直接寫入兩個(gè)數(shù)據(jù)庫(kù):看似簡(jiǎn)單,但任何一種寫入的任何問題都可能很快導(dǎo)致數(shù)據(jù)庫(kù)之間的不一致,從而使這種方法對(duì)于關(guān)鍵路徑生產(chǎn)數(shù)據(jù)存儲(chǔ)來說過于不穩(wěn)定。
  • 邏輯復(fù)制:內(nèi)置的 Postgres 功能,使用發(fā)布/訂閱模型將命令廣播到多個(gè)數(shù)據(jù)庫(kù)。在源數(shù)據(jù)庫(kù)和目標(biāo)數(shù)據(jù)庫(kù)之間修改數(shù)據(jù)的能力有限。

https://www.postgresql.org/docs/10/logical-replication.html

  • 審核日志和追趕腳本:創(chuàng)建審核日志表以跟蹤對(duì)遷移中的表的所有寫入。一個(gè)追趕過程遍歷審計(jì)日志并將每次更新應(yīng)用到新數(shù)據(jù)庫(kù),并根據(jù)需要進(jìn)行任何修改。

我們選擇了 audit log 策略而不是邏輯復(fù)制,因?yàn)楹笳咴诔跏伎煺詹襟E中難以跟上 block 表寫入量。

https://www.postgresql.org/docs/10/logical-replication-architecture.html#LOGICAL-REPLICATION-SNAPSHOT

我們還準(zhǔn)備并測(cè)試了一個(gè)反向?qū)徲?jì)日志和腳本,以防我們需要從分片切換回單體應(yīng)用。該腳本將捕獲對(duì)分片數(shù)據(jù)庫(kù)的任何傳入寫入,并允許我們?cè)趩误w應(yīng)用程序上重放這些編輯。最后,我們不需要恢復(fù),但這是我們應(yīng)急計(jì)劃的重要組成部分。

回填舊數(shù)據(jù)

一旦傳入的寫入成功傳播到新數(shù)據(jù)庫(kù),我們就會(huì)啟動(dòng)回填過程以遷移所有現(xiàn)有數(shù)據(jù)。使用我們預(yù)置的 m5.24xlarge 實(shí)例上的所有 96 CPUs(!),我們的最終腳本大約需要三天時(shí)間來回填生產(chǎn)環(huán)境。

任何值得稱道的回填都應(yīng)該在寫入舊數(shù)據(jù)之前比較記錄版本,跳過具有最近更新的記錄。通過以任何順序運(yùn)行追趕腳本和回填,新數(shù)據(jù)庫(kù)最終將聚合以復(fù)制整體。

驗(yàn)證數(shù)據(jù)完整性

遷移僅與底層數(shù)據(jù)的完整性一樣好,因此在分片與單體應(yīng)用保持同步后,我們開始驗(yàn)證正確性的過程。

  • 驗(yàn)證腳本:我們的腳本驗(yàn)證了從給定值開始的 UUID 空間的連續(xù)范圍,將單體上的每條記錄與相應(yīng)的分片記錄進(jìn)行比較。因?yàn)槿頀呙钑?huì)非常昂貴,所以我們隨機(jī)抽樣 UUID 并驗(yàn)證它們的相鄰范圍。
  • “暗”讀:在遷移讀查詢之前,我們添加了一個(gè)標(biāo)志來從新舊數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)(稱為暗讀)。我們比較了這些記錄并丟棄了分片副本,記錄了過程中的差異。引入暗讀增加了 API 延遲,但提供了無縫切換的信心。

https://slack.engineering/re-architecting-slacks-workspace-preferences-how-to-move-to-an-eav-model-to-support-scalability/

作為預(yù)防措施,遷移和驗(yàn)證邏輯是由不同的人實(shí)現(xiàn)的。否則,在兩個(gè)階段都犯同樣錯(cuò)誤的可能性更大,削弱了驗(yàn)證的前提。

艱難的教訓(xùn)

雖然分片項(xiàng)目的大部分內(nèi)容都讓 Notion 的工程團(tuán)隊(duì)處于最佳狀態(tài),但我們事后會(huì)重新考慮許多決定。這里有一些例子:

  • 分片過早。作為一個(gè)小團(tuán)隊(duì),我們敏銳地意識(shí)到與過早優(yōu)化相關(guān)的權(quán)衡。但是,我們一直等到現(xiàn)有數(shù)據(jù)庫(kù)嚴(yán)重緊張,這意味著我們必須非常節(jié)儉地進(jìn)行遷移,以免增加更多負(fù)載。這種限制使我們無法使用邏輯復(fù)制進(jìn)行雙重寫入。workspace ID(我們的分區(qū)鍵)尚未填充到舊數(shù)據(jù)庫(kù)中,回填此列會(huì)加劇我們單體應(yīng)用的負(fù)載。相反,我們?cè)趯懭敕制瑫r(shí)即時(shí)回填每一行,需要一個(gè)自定義的追趕腳本。
  • 旨在實(shí)現(xiàn)零停機(jī)遷移。雙寫吞吐量是我們最終切換的主要瓶頸:一旦我們關(guān)閉服務(wù)器,我們需要讓追趕腳本完成將寫入傳播到分片。如果我們?cè)倩ㄒ恢軙r(shí)間優(yōu)化腳本,以便在切換期間花不到 30 秒的時(shí)間趕上分片,則可能可以在負(fù)載均衡器級(jí)別進(jìn)行熱交換而無需停機(jī)。
  • 引入組合主鍵而不是單獨(dú)的分區(qū)鍵。今天,分表中的行使用復(fù)合鍵:id,舊數(shù)據(jù)庫(kù)中的主鍵;和 space_id,當(dāng)前排列中的分區(qū)鍵。由于無論如何我們都必須進(jìn)行全表掃描,我們可以將兩個(gè)鍵合并到一個(gè)新列中,從而無需在整個(gè)應(yīng)用程序中傳遞 space_ids。

盡管有這些假設(shè),分片還是取得了巨大的成功。對(duì)于 Notion 用戶來說,幾分鐘的停機(jī)時(shí)間使產(chǎn)品明顯更快。在內(nèi)部,我們?cè)跁r(shí)間敏感的目標(biāo)下展示了協(xié)調(diào)的團(tuán)隊(duì)合作和果斷的執(zhí)行力。

腳注

  • [1] 除了引入不必要的復(fù)雜性之外,過早分片的一個(gè)被低估的危險(xiǎn)是它可以在產(chǎn)品模型在業(yè)務(wù)方面得到明確定義之前對(duì)其進(jìn)行約束。例如,如果一個(gè)團(tuán)隊(duì)按用戶分片并隨后轉(zhuǎn)向以團(tuán)隊(duì)為中心的產(chǎn)品策略,那么架構(gòu)阻抗不匹配可能會(huì)導(dǎo)致嚴(yán)重的技術(shù)難題,甚至?xí)拗颇承┕δ堋?/li>
  • [2] 除了打包的解決方案外,我們還考慮了一些替代方案:切換到另一個(gè)數(shù)據(jù)庫(kù)系統(tǒng),如 DynamoDB(對(duì)于我們的用例來說風(fēng)險(xiǎn)太大),并在裸機(jī) NVMe 重型實(shí)例上運(yùn)行 Postgres,以獲得更大的磁盤吞吐量(由于備份和復(fù)制的維護(hù)成本而被拒絕)。

https://aws.amazon.com/ec2/instance-types/i3en/

  • [3] 除了基于鍵的分區(qū)(基于某些屬性劃分?jǐn)?shù)據(jù))之外,還有其他方法:按服務(wù)進(jìn)行垂直分區(qū),以及使用中間查找表路由所有讀寫的基于目錄的分區(qū)。

https://www.startuplessonslearned.com/2009/01/sharding-for-startups.html?m=1#comment-form


責(zé)任編輯:武曉燕 來源: 黑客下午茶
相關(guān)推薦

2022-09-30 14:44:07

云計(jì)算元宇宙云遷移

2013-01-07 09:22:02

DLP數(shù)據(jù)丟失防護(hù)

2022-10-08 15:52:37

元宇宙云計(jì)算安全

2011-04-26 09:26:53

亞馬遜云服務(wù)

2020-02-12 10:23:54

云遷移云計(jì)算

2022-05-18 14:37:23

網(wǎng)絡(luò)安全供應(yīng)鏈漏洞

2020-05-12 10:04:31

企業(yè)經(jīng)驗(yàn)和教訓(xùn)CIO

2013-11-28 10:56:05

2021-04-06 10:34:47

IT領(lǐng)導(dǎo)冠狀病毒疫情首席信息官

2013-11-28 16:41:13

2021-05-28 10:45:32

美國(guó)銀行數(shù)字化5G

2020-09-08 10:17:38

企業(yè)視頻數(shù)字企業(yè)阿拉貢

2024-08-08 19:09:51

2021-11-24 11:31:58

制造商運(yùn)營(yíng)疫情

2012-01-16 14:02:52

2023-06-07 00:04:56

2019-03-10 09:11:04

物聯(lián)網(wǎng)物流行業(yè)IOT

2013-01-23 09:07:37

云計(jì)算大數(shù)據(jù)ERP

2020-08-10 11:15:07

機(jī)器學(xué)習(xí)ML人工智能

2022-05-31 10:14:31

企業(yè)網(wǎng)絡(luò)攻擊
點(diǎn)贊
收藏

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

国产欧美日韩伦理| 性视频1819p久久| 日本免费色视频| 动漫一区在线| 91丨九色丨尤物| 国产精品视频内| 免费在线一级片| 国产传媒欧美日韩成人精品大片| 欧美电影一区二区| 国产精品网站免费| 黄网站免费在线播放| 99久久免费精品| 成人国内精品久久久久一区| 久久不卡免费视频| 国产精品久久久久无码av| 日韩av在线网页| 亚洲网中文字幕| 欧美成人h版| 亚洲国产日韩综合久久精品| 日韩中文不卡| 污视频软件在线观看| 麻豆精品久久久| 欧美怡春院一区二区三区| 色哟哟一一国产精品| 欧美**vk| 亚洲福利视频免费观看| 免费人成视频在线播放| 精品美女一区| 色偷偷久久人人79超碰人人澡| 成人免费看片'免费看| av中文天堂在线| 91美女福利视频| 国产区一区二区三区| 国产三级第一页| 蜜桃av一区二区三区| 日本高清久久天堂| 日韩精品视频播放| 黄色精品免费| 欧美老妇交乱视频| 五月天激情丁香| 99久久婷婷| 正在播放亚洲1区| 自拍偷拍亚洲天堂| 亚洲男人都懂第一日本| 亚洲精品国产免费| 你懂的在线观看网站| 哺乳一区二区三区中文视频| 欧美一卡2卡三卡4卡5免费| 手机看片一级片| 狠狠久久综合| 精品视频免费看| 一级在线免费视频| 99久久久国产精品免费调教网站| 日本久久电影网| 欧美日韩在线成人| 精品免费av一区二区三区| 色婷婷综合久久久久中文 | 国产精品日韩电影| 亚洲视屏在线观看| 美女视频一区二区| 国产自摸综合网| 91精品国自产| 国产精品影视天天线| 亚洲一区免费网站| 亚洲国产精品二区| 91免费看视频| 色视频一区二区三区| 免费在线你懂的| 亚洲美女在线国产| 影音先锋成人资源网站| 日本乱理伦在线| 舔着乳尖日韩一区| 日本女优爱爱视频| 亚洲一区有码| 精品国产区一区| 香蕉视频黄色在线观看| 国产一区二区三区四区五区传媒| 伊是香蕉大人久久| 亚洲国产精品免费在线观看| 黄色亚洲在线| 国产成人91久久精品| 夜夜爽8888| 丁香天五香天堂综合| 欧美精品一区三区在线观看| 91在线直播| 亚洲影院在线观看| 日本三级免费网站| 香蕉久久一区| 亚洲成人精品视频| 四虎国产精品成人免费入口| 天天揉久久久久亚洲精品| 欧美激情精品久久久久久大尺度| aaa人片在线| 老司机一区二区| 国产日韩久久| 幼a在线观看| 亚洲.国产.中文慕字在线| 日本新janpanese乱熟| 日本免费一区二区三区视频| 亚洲国产中文字幕在线观看| a资源在线观看| 尤物网精品视频| 国产精品久久久| 亚洲av少妇一区二区在线观看 | 黑人精品视频| 在线观看日韩av先锋影音电影院| 中文字幕日韩久久| 欧美猛男同性videos| 成人444kkkk在线观看| 国产美女激情视频| 国产成人啪免费观看软件| 日韩精品久久久| 丁香花在线影院| 欧美猛男gaygay网站| 国产麻豆天美果冻无码视频| 中文精品久久| 国产精品久久网| 艳母动漫在线看| 一区2区3区在线看| xx欧美撒尿嘘撒尿xx| 亚洲免费成人av在线| 欧美激情视频一区二区| 一区二区日韩在线观看| 久久综合网色—综合色88| 久久精品无码中文字幕| 香蕉成人在线| 色播久久人人爽人人爽人人片视av| 日韩经典在线观看| 成人一区二区三区在线观看| 手机福利在线视频| 九九久久国产| 一夜七次郎国产精品亚洲| 国产又黄又猛又粗又爽| 成人动漫av在线| 4444在线观看| 999精品视频在线观看| 亚洲性视频网址| 日本韩国欧美中文字幕| 91在线视频网址| 性欧美大战久久久久久久| 51亚洲精品| 欧美人成在线视频| 国产三级第一页| 亚洲日本在线a| 91插插插影院| 亚洲欧美网站在线观看| 91久久久久久久久久久| 免费观看成人高潮| 555夜色666亚洲国产免| 久久成人小视频| 精品中文字幕一区二区| 中文字幕在线中文字幕日亚韩一区| 国产一区二区三区朝在线观看| 日韩毛片在线观看| 亚洲 日本 欧美 中文幕| 久久久av毛片精品| 国产三级日本三级在线播放| 国产在线观看91一区二区三区| 欧美亚洲视频在线看网址| 同心难改在线观看| 在线精品视频免费观看| 日本免费www| 国产一区二区精品久久99| 亚洲色婷婷久久精品av蜜桃| 中文字幕亚洲在线观看| 欧美激情伊人电影| 外国精品视频在线观看 | 簧片在线免费看| 人人狠狠综合久久亚洲婷| 国产精品电影网站| 麻豆av在线导航| 日韩视频在线你懂得| 国产精品6666| 国产亚洲精品免费| 最新av免费在线观看| 欧美aa国产视频| 国产伦精品一区二区三区四区免费| 国产美女精品写真福利视频| 国产亚洲精品va在线观看| 国产麻豆一精品一男同| 亚洲国产日韩在线一区模特| 成人午夜剧场视频网站| 久久97超碰国产精品超碰| 国产 欧美 日韩 一区| 日韩精品丝袜美腿| 成人激情av在线| 9999在线视频| 亚洲新中文字幕| 国产成人精品一区二区无码呦| 黄色一区二区在线| 日本成人精品视频| 波多野洁衣一区| 日本不卡一区在线| 亚洲午夜极品| 亚洲欧洲日韩综合二区| 国产精品黄网站| 成人av在线天堂| 成人bbav| xvideos亚洲| 天天综合网在线观看| 欧美日韩一区二区三区在线| 国产精品成人aaaa在线| 欧美激情一二三区| 亚洲精品第二页| 美女精品一区二区| 免费看一级大黄情大片| 欧美国产一区二区三区激情无套| 国产精品有限公司| 欧美男男gaygay1069| 91成人免费观看网站| 国产成人l区| 中文字幕精品久久| 青青免费在线视频| 亚洲国产毛片完整版| 国产视频在线一区| 欧美午夜电影网| 国产超碰人人爽人人做人人爱| 亚洲视频1区2区| 一级黄色毛毛片| 久久蜜桃av一区二区天堂| 伊人影院在线观看视频| 麻豆91在线播放免费| 日本a级片免费观看| 伊人久久亚洲美女图片| 吴梦梦av在线| 日韩欧美网址| 天堂精品视频| 国产探花在线精品一区二区| 国产亚洲欧美另类一区二区三区 | 国产久一道中文一区| 欧美男女视频| 国产精品一区二区性色av| 三上悠亚亚洲一区| 日本午夜在线亚洲.国产| 牛牛在线精品视频| 免费99精品国产自在在线| 日本激情在线观看| 日韩中文字幕av| av大片在线播放| 在线观看日韩www视频免费| 激情视频在线观看免费| 亚洲乱码av中文一区二区| 日韩专区第一页| 日韩精品自拍偷拍| 国产黄色一区二区| 日韩精品一区二| 亚洲精品久久久狠狠狠爱| 日韩欧美国产wwwww| 国产99视频在线| 欧美电影精品一区二区| www.av导航| 精品久久久久久亚洲综合网| 好吊色一区二区三区| 亚洲成avwww人| 亚洲日本国产精品| 亚洲人成网站免费播放| 成人高清免费在线播放| 中文字幕日韩在线观看| 国产在线更新| 欧美黑人巨大xxx极品| av中文字幕电影在线看| 欧美亚洲在线视频| 国产综合色区在线观看| 国产精品狼人色视频一区| 激情久久99| 亚洲最大av网站| 红杏aⅴ成人免费视频| 久久久久久久久久久久久久久久av| 小说区图片区色综合区| 视频一区二区三区免费观看| 欧美mv日韩| 99国产精品白浆在线观看免费| 亚洲另类视频| 天天爽天天爽夜夜爽| 蜜臀久久久久久久| 在线观看网站黄| 91色乱码一区二区三区| 人成免费在线视频| 亚洲综合精品久久| 亚洲欧美一区二区三区在线观看 | 99久久99久久久精品棕色圆| 欧美mv日韩mv国产网站| 久久免费看视频| 精品国产一区二区三区久久久狼 | 天堂成人在线| 最近2019中文字幕mv免费看| 欧美性video| 国产精品第二页| 亚洲1区在线| 日本一区二区在线| 激情婷婷久久| 国产九九在线视频| 成人黄色小视频在线观看| 影音先锋男人在线| 亚洲午夜精品在线| 中文字幕精品一区二| 精品国产1区二区| av电影在线网| 97久久精品国产| 精品一区二区三区视频在线播放| 精品国产福利| 天天操夜夜操国产精品| 日韩精品视频久久| 国产激情一区二区三区桃花岛亚洲| 扒开jk护士狂揉免费| 一区二区三区四区不卡在线| 国产一区免费看| 亚洲第一精品电影| 超碰在线caoporen| 国产精品福利在线观看| 精品一区二区男人吃奶| 中文字幕一区二区三区精彩视频 | www.色.com| 国产精品免费视频网站| aaa人片在线| 精品美女被调教视频大全网站| 91大神xh98hx在线播放| 91av成人在线| eeuss鲁片一区二区三区| 曰韩不卡视频| 日韩av在线发布| 国产精品无码网站| 亚洲丶国产丶欧美一区二区三区| 国产又大又黑又粗| 在线观看久久av| 欧美极品免费| 欧美日韩国产免费一区二区三区| 欧美欧美全黄| 黄色一级片免费播放| 国产精品―色哟哟| 久久国产香蕉视频| 亚洲欧美国产视频| 在线成人av观看| 精品久久久久久亚洲| 在线精品一区| xxxxxx黄色| 午夜精品爽啪视频| 欧美特黄一级视频| 久久久久久久久久久成人| 日韩欧美一级| 久久久久久av无码免费网站下载| 免费观看30秒视频久久| 免费看的黄色录像| 欧美日韩国产天堂| 最新真实国产在线视频| 国产精品视频公开费视频| 欧美日韩一区二区三区视频播放| 国产精品乱码久久久久| 国产欧美精品一区二区色综合| 国产免费一区二区三区四区五区| 亚洲日韩第一页| 91成人在线| 91香蕉视频网址| 国产乱码精品一区二区三| 可以直接看的黄色网址| 精品三级在线看| 99色在线观看| 欧美日韩大片一区二区三区| 日韩va欧美va亚洲va久久| 中文字幕求饶的少妇| 欧美一区二区三区视频在线观看| av毛片在线免费看| 激情小说网站亚洲综合网| 三级在线观看一区二区| 天天摸日日摸狠狠添| 欧美一区二区视频观看视频 | 国产高清视频一区三区| 精品国产精品| 天堂中文av在线| 亚洲一区二区三区激情| 图片区 小说区 区 亚洲五月| 日韩免费在线看| 久久久久免费av| 日韩aaaaa| 欧美色图在线观看| 羞羞视频在线观看不卡| 免费av在线一区二区| 美女免费视频一区| 国产精品第二十页| 亚洲性夜色噜噜噜7777| 国产精品一区二区三区av| 国产 日韩 亚洲 欧美| 久久精品网站免费观看| 国产青青草视频| 欧美中文字幕在线视频| 91综合在线| 午夜一区二区三区免费| 56国语精品自产拍在线观看| 国产美女精品写真福利视频| 天堂一区二区三区| av在线综合网| 亚洲一区二区色| 午夜精品视频网站| 国产精品久久占久久| 国产美女喷水视频| 欧美嫩在线观看| 亚洲美女炮图| 成人小视频在线观看免费| 欧美国产精品一区| 亚洲精选一区二区三区|