[mongo] {第七部分} mongodb sharding

      網(wǎng)友投稿 947 2025-04-04

      分片


      分片是一種用于在多臺計算機之間分配數(shù)據(jù)的方法。MongoDB使用分片來支持具有非常大的數(shù)據(jù)集和高吞吐量操作的部署。

      具有大數(shù)據(jù)集或高吞吐量應(yīng)用程序的數(shù)據(jù)庫系統(tǒng)對單個服務(wù)器的具有很大挑戰(zhàn)。例如,高查詢率可能會耗盡服務(wù)器的CPU容量。大于系統(tǒng)RAM的工作集大小會增加磁盤驅(qū)動器的I / O容量。

      解決系統(tǒng)增長的方法有兩種:垂直擴容和水平擴展。

      垂直擴容涉及增加單個服務(wù)器的容量,例如使用功能更強大的CPU,添加更多RAM或增加存儲空間量??捎眉夹g(shù)的局限性可能會限制一臺計算機對于給定的工作負載而言功能不足。此外,基于云的提供程序具有基于可用硬件配置的嚴(yán)格上限。結(jié)果,垂直縮放有一個實際的最大值。

      水平擴展涉及劃分系統(tǒng)數(shù)據(jù)集并在多臺服務(wù)器上加載,并添加其他服務(wù)器以根據(jù)需要增加容量。雖然單臺計算機的整體速度或容量可能不高,但是每臺計算機只能處理一部分整體工作負載,因此與單臺高速大容量服務(wù)器相比,可能提供更高的效率。擴展部署的容量僅需要根據(jù)需要添加其他服務(wù)器,這可以比單臺機器的高端硬件降低總體成本。折衷方案是增加基礎(chǔ)結(jié)構(gòu)和部署維護的復(fù)雜性。

      MongoDB通過分片支持水平擴展。

      群集分片

      MongoDB群集分片由以下組件組成:

      shard:每個shard包含被分片數(shù)據(jù)的子集。每個分片都可以部署為副本集。

      mongos:mongos充當(dāng)查詢路由器,在客戶端應(yīng)用程序和分片群集之間提供接口。從MongoDB 4.4開始,mongos可以支持??hedged reads以最大程度地減少延遲。

      config服務(wù)器:配置服務(wù)器存儲集群的元數(shù)據(jù)和配置設(shè)置。

      下圖描述了分片群集中組件的交互:

      MongoDB在collection級別分片數(shù)據(jù),從而將收集數(shù)據(jù)分布在集群中的各個分片上。

      Shard

      shard包含被分片的數(shù)據(jù)的一個子集分片簇。群集的分片一起保存了群集的整個數(shù)據(jù)集。

      從MongoDB 3.6起,必須將分片部署為replica set,以提供冗余和高可用性。

      用戶,客戶端或應(yīng)用程序應(yīng)僅直接連接到分片以執(zhí)行本地管理和維護操作。

      在單個分片上執(zhí)行查詢只會返回一部分?jǐn)?shù)據(jù)。連接到mongos以執(zhí)行集群級別的操作,包括讀取或?qū)懭氩僮鳌?/p>

      重要:MongoDB不保證任何兩個連續(xù)的chunk?都駐留在單個分片上。

      主分片

      分片群集中的每個數(shù)據(jù)庫都有一個主分片,其中包含該數(shù)據(jù)庫的所有未分片集合。每個數(shù)據(jù)庫都有其自己的主分片。主分片與副本集中的主分片沒有任何關(guān)系。

      mongos當(dāng)創(chuàng)建新數(shù)據(jù)庫時,通過在數(shù)據(jù)量最少的集群中選擇分片,該選擇器將選擇主分片。?mongos將命令totalSize返回的字段?listDatabase用作選擇條件的一部分。

      要更改數(shù)據(jù)庫的主分片,請使用movePrimary命令。遷移主分的過程可能需要很長時間才能完成,在遷移完成之前,無法訪問有關(guān)聯(lián)的集合。根據(jù)遷移的數(shù)據(jù)量,遷移可能會影響整個群集操作。在嘗試更改主分片之前,請考慮對群集操作和網(wǎng)絡(luò)負載的影響。

      當(dāng)您使用以前用作副本集的分片部署新的碎片群集時,所有現(xiàn)有數(shù)據(jù)庫將繼續(xù)駐留在其原始副本集上。隨后創(chuàng)建的數(shù)據(jù)庫可以駐留在集群中的任何分片上。

      Shard Status

      使用 sh.status() 方法來查看集群的基本信息(包括哪個shard是數(shù)據(jù)庫的主shard以及跨shard的塊分布)。

      分片群集安全性

      使用內(nèi)部/成員身份驗證可以加強集群內(nèi)部的安全性,并防止未經(jīng)授權(quán)的集群組件訪問集群。您必須mongod使用適當(dāng)?shù)陌踩O(shè)置啟動集群中的每個服務(wù)器,以強制執(zhí)行內(nèi)部身份驗證。

      分片本地用戶

      每個分片均支持基于角色的訪問控制?(RBAC),用于限制對分片數(shù)據(jù)和操作的未授權(quán)訪問。mongod?使用--auth強制RBAC的選項啟動副本集中的每個副本。另外,對群集內(nèi)部安全性強制執(zhí)行內(nèi)部/成員身份驗證也可以通過RBAC進行用戶訪問控制。

      每個分片都有其自己的分片本地用戶。這些用戶不能用于其他分片,也不能用于通過進行連接mongos。

      Config Servers(元數(shù)據(jù))

      重要:從3.4開始,mongod?不再支持SCCC。在將分片群集升級到3.4之前,必須將配置服務(wù)器從SCCC轉(zhuǎn)換為CSRS。

      配置服務(wù)器存儲分片群集的元數(shù)據(jù)。元數(shù)據(jù)反映分片群集中所有數(shù)據(jù)和組件的狀態(tài)和組織。元數(shù)據(jù)包括每個分片上的塊列表以及定義塊的范圍。

      該mongos實例緩存此數(shù)據(jù),并將其用于路由讀取和在正確的sharad進行寫入。mongos?當(dāng)集群的元數(shù)據(jù)發(fā)生更改時(例如Chunk Splits或添加shard)會更新緩存。分片也可以從配置服務(wù)器讀取chunk元數(shù)據(jù)。

      配置服務(wù)器還存儲身份驗證配置信息,例如基于角色的訪問控制或群集的內(nèi)部身份驗證設(shè)置。

      MongoDB還使用配置服務(wù)器來管理分布式鎖。

      每個分片群集必須具有自己的配置服務(wù)器。不要將相同的配置服務(wù)器用于不同的分片群集。

      警告

      在配置服務(wù)器上執(zhí)行的管理操作可能會對分片群集的性能和可用性產(chǎn)生重大影響。根據(jù)受影響的配置服務(wù)器的數(shù)量,群集可能在一段時間內(nèi)處于只讀或脫機狀態(tài)。

      副本集配置服務(wù)器

      在版本3.4中更改。

      從MongoDB 3.2開始,分片群集的配置服務(wù)器可以部署為副本集(CSRS),而不是三個鏡像配置服務(wù)器(SCCC)。為配置服務(wù)器使用副本集可提高配置服務(wù)器之間的一致性,因為MongoDB可以利用配置文件的標(biāo)準(zhǔn)副本集讀寫協(xié)議。另外,將副本集用于配置服務(wù)器允許分片群集具有3個以上的配置服務(wù)器,因為副本集最多可具有50個成員。要將配置服務(wù)器部署為副本集,配置服務(wù)器必須運行WiredTiger存儲引擎。

      當(dāng)用于配置服務(wù)器時,以下限制適用于副本集配置:

      不允許使用仲裁者。

      不允許使用延時節(jié)點。

      必須建立索引(即,任何成員都不可將?buildIndexes設(shè)置設(shè)置為false)。

      在配置服務(wù)器讀取和寫入操作

      配置服務(wù)器上要有admin數(shù)據(jù)庫和config數(shù)據(jù)庫。

      admin數(shù)據(jù)庫包含與身份驗證和授權(quán)有關(guān)的集合以及其他供內(nèi)部使用system.*。的集合。

      配置數(shù)據(jù)庫包含集合(分片群集的元數(shù)據(jù)的集合)。當(dāng)元數(shù)據(jù)發(fā)生更改時(例如,在塊遷移或塊拆分之后),MongoDB會將數(shù)據(jù)寫入配置數(shù)據(jù)庫。

      用戶應(yīng)避免在正常操作或維護過程中直接寫入config數(shù)據(jù)庫。

      當(dāng)寫入配置服務(wù)器,MongoDB使用一個"majority"的write concern。

      MongoDB從admin數(shù)據(jù)庫中讀取身份驗證和授權(quán)數(shù)據(jù)以及其他內(nèi)部用途。

      MongoDB在mongos?開始或元數(shù)據(jù)更改后(例如在塊遷移之后)從config數(shù)據(jù)庫讀取。分片還從配置服務(wù)讀取塊元數(shù)據(jù)。

      從副本集配置服務(wù)讀取數(shù)據(jù)時,MongoDB使用"majority"的Read Concern。

      配置服務(wù)器可用性

      如果配置服務(wù)副本集primary不可用,將無法選舉primary,則集群的元數(shù)據(jù)將變?yōu)橹蛔x。您仍然可以從分片讀取和寫入數(shù)據(jù),但是在副本集可以選擇主副本之前,不會發(fā)生任何塊遷移或塊拆分。

      在分片簇,mongod和mongos實例監(jiān)控分片集群中的副本集(例如shard replica sets, config server replica set)。

      如果所有配置服務(wù)器都不可用,則群集可能無法運行。為了確保配置服務(wù)器保持可用和完整,配置服務(wù)器的備份至關(guān)重要。與集群中存儲的數(shù)據(jù)相比,配置服務(wù)器上的數(shù)據(jù)很小,并且配置服務(wù)器的活動負載相對較低。

      分片群集的元數(shù)據(jù)

      配置服務(wù)器將元數(shù)據(jù)存儲在配置數(shù)據(jù)庫中。

      重要

      config在配置服務(wù)器上進行任何維護之前,請始終備份數(shù)據(jù)庫。

      Mongos(路由)

      MongoDB 的mongos實例路由查詢并將操作寫入分片群集中的分片。mongos從應(yīng)用程序的角度來看,它是分片群集的唯一接口。應(yīng)用程序無法與shard直接連接或通信。

      mongos通過緩存來自配置服務(wù)器的元數(shù)據(jù)來跟蹤是哪個shard上的數(shù)據(jù)。mongos使用元數(shù)據(jù)將操作從應(yīng)用程序和客戶端路由到mongod實例。mongos沒有持久狀態(tài),消耗的系統(tǒng)資源最少。

      最常見的做法是在與應(yīng)用服務(wù)器相同的系統(tǒng)上運行mongos實例,但是您可以在shard或其他專用資源上維護mongos實例。

      路由和結(jié)果進程(Routing And Results Process)

      mongos實例路由查詢到集群:

      確定必須接收查詢的分片列表。

      在所有目標(biāo)分片上建立游標(biāo)。

      mongos合并來自每個target shard的數(shù)據(jù),并返回結(jié)果的文檔。在mongos檢索結(jié)果之前,對每個shard執(zhí)行某些查詢操作,例如排序。

      在版本3.6中更改:對于在多個分片上運行的聚合操作,如果這些操作不需要在數(shù)據(jù)庫的主分片上運行,則這些操作可能會將結(jié)果路由回到mongos來合并結(jié)果。

      在兩種情況下,mongod無法進行管道操作。

      第一種情況發(fā)生在拆分管道的合并部分包含必須在主分片上運行的階段時。例如,如果$lookup要求訪問與正在運行聚合的分片集合位于同一數(shù)據(jù)庫中的未分片集合,則合并必須在主分片上運行。

      第二種情況發(fā)生在拆分管道的合并部分包含可以將臨時數(shù)據(jù)寫入磁盤的stage時,例如$group,并且客戶機指定了owDiskUse:true。在這種情況下,假設(shè)合并管道中沒有其他階段需要主分片,則合并將在聚合目標(biāo)分片集中隨機選擇的分片上運行。

      有關(guān)如何在分片集群查詢的組件之間拆分聚合工作的更多信息,請使用解釋:正確aggregation()調(diào)用的參數(shù)。返回將包括三個json對象。mergeType顯示合并階段發(fā)生的位置(“primaryShard”、“anyShard”或“mongos”)。splitPipeline顯示管道中的哪些操作在單個碎片上運行。碎片顯示每個碎片所做的工作。

      在某些情況下,當(dāng)分片鍵或分片鍵的前綴是查詢的一部分時,會mongos執(zhí)行??targeted operation,將查詢路由到集群中的分片的子集。

      mongos對不包含分片?鍵的查詢執(zhí)行廣播操作(?broadcast operation),將查詢路由到集群中的所有分片。確實包含分片鍵的某些查詢可能仍會導(dǎo)致廣播操作,具體取決于群集中數(shù)據(jù)的分布和查詢的選擇性。

      如何mongos處理查詢修飾符

      如果查詢的結(jié)果未排序,則mongos?實例將打開結(jié)果游標(biāo),該游標(biāo)將對分片上的所有游標(biāo)進行“輪循”。

      如果查詢使用limit()cursor方法限制了結(jié)果集的大小?,則mongos?實例將該限制傳遞給分片,然后將該限制重新應(yīng)用于結(jié)果,然后再將結(jié)果返回給客戶端。

      如果查詢使用skip()游標(biāo)方法指定要跳過的記錄數(shù),mongos將無法將跳過傳遞給shard,而是從shard中檢索未跳過的結(jié)果,并在組裝完整結(jié)果時跳過適當(dāng)數(shù)量的文檔。

      當(dāng)與limit()一起使用時,mongos會將limit加上skip()的值傳遞給shard,以提高這些操作的效率。

      Read Preference?和分片

      對于分片群集,從分片讀取時,mongos應(yīng)用?read preference?。所選成員受?read preference?和?replication.localPingThresholdMs設(shè)置的支配,并針對每個操作進行重新評估。

      從版本4.4開始,mongos實例可以對使用非主要讀取首選項的讀取進行hedged reads。對于hedged reads,mongos實例將讀取操作路由到每個查詢的shard的兩個副本集成員,并返回第一個響應(yīng)的結(jié)果。

      hedged reads是讀取首選項的一部分,每個操作都指定了限制讀取。非主要讀取首選項支持hedged reads。

      要為非主讀取首選項指定限制讀取,請參閱驅(qū)動程序讀取首選項API文檔。

      Read preference nearest在默認情況下啟用hedged Read選項。

      默認情況下,mongos實例支持使用hedged reads。要關(guān)閉mongos實例對hedged reads的支持,請參閱readHedgingMode參數(shù)。如果hedged reads支持為off,mongos則無論hedge為讀取首選項指定了什么選項,都不使用hedged reads。

      Targeted Operations vs. Broadcast Operations

      通常,分片環(huán)境中最快的查詢是mongos使用分片鍵和配置服務(wù)器中的群集元數(shù)據(jù)路由到單個分片的查詢?。這些目標(biāo)操作使用分片鍵值來定位滿足查詢文檔的分片或分片子集。

      對于不包含分mongos片鍵的查詢,必須查詢所有分片,等待它們的響應(yīng),然后將結(jié)果返回給應(yīng)用程序。這些“分散/聚集”查詢可能是長時間運行的操作。

      Broadcast Operations

      Targeted Operations

      索引使用

      如果查詢不包含分片鍵,則?mongos必須將查詢作為“分散/聚集”操作發(fā)送給所有分片。每個shard都會反過來,使用任何的碎片關(guān)鍵指標(biāo)或其他更有效的指標(biāo)來滿足查詢。

      如果查詢包含引用由分片鍵和輔助索引索引的字段的多個子表達式,則?mongos可以將查詢路由到特定分片,并且分片將使用使它最有效地執(zhí)行的索引。

      [mongo] {第七部分} mongodb sharding

      其他

      從MongoDB 4.0開始,mongos嘗試連接功能兼容版本(fCV)大于的mongod實例?時,二進制文件將崩潰。例如,您不能將fCV設(shè)置為4.2的MongoDB 4.0版本連接到4.2分片群集。但是,您可以將MongoDB 4.0版本連接?到fCV設(shè)置為4.0的4.2分片群集。mongosmongosmongos

      從MongoDB 4.2開始,MongoDB添加了參數(shù)?ShardingTaskExecutorPoolReplicaSetMatching。此參數(shù)確定mongod/mongos實例到分片群集的每個成員的連接池的最小大小?。該值在運行時可能會有所不同。

      mongod并mongos維護分片群集中每個副本集的每個副本集的連接池。默認情況下,這些池的連接數(shù)至少是與主數(shù)據(jù)庫的連接數(shù)。

      要進行修改,請參見ShardingTaskExecutorPoolReplicaSetMatching。

      分片群集安全性

      使用內(nèi)部/成員身份驗證可以加強集群內(nèi)部的安全性,并防止未經(jīng)授權(quán)的集群組件訪問集群。您必須mongod使用適當(dāng)?shù)陌踩O(shè)置啟動集群中的每個服務(wù)器,以強制執(zhí)行內(nèi)部身份驗證。

      分片鍵

      MongoDB使用分片鍵在各個分片之間分發(fā)collection的文檔。分片鍵由文檔中的一個或多個字段組成。

      從版本4.4開始,分片集合中的文檔可能缺少分片鍵字段。在跨分片分布文檔時,缺少分片鍵字段將被視為具有空值,但在路由查詢時則不會。有關(guān)更多信息,請參見?Missing Shard Key。

      在4.2版及更早版本中,分片集合中的每個文檔中都必須存在分片鍵字段。

      在分片集合時選擇分片鍵。

      從MongoDB 4.4開始,您可以通過向現(xiàn)有鍵中添加一個或多個后綴字段來優(yōu)化集合的分片鍵。有關(guān)refineCollectionShardKey詳細信息,請參見?。

      在MongoDB 4.2和更低版本中,無法在分片后更改分片鍵的選擇。

      文檔的分片鍵值決定了其在各個分片中的分布。

      從MongoDB 4.2開始,您可以更新文檔的分片鍵值,除非您的分片鍵字段為不可變_id字段。有關(guān)更多信息,請參見?更改文檔的分片鍵值。

      在MongoDB 4.0和更早版本中,文檔的分片鍵字段值是不可變的。

      分片索引

      要對已填充的集合進行分片,該集合必須具有以分片鍵開頭的?索引。分片一個空集合時,如果該集合還沒有針對指定分片鍵的適當(dāng)索引,則MongoDB會創(chuàng)建支持索引。

      分片鍵策略

      分片鍵的選擇會影響分片群集的性能,效率和可伸縮性。選擇分片鍵可以使具有最佳硬件和基礎(chǔ)結(jié)構(gòu)的群集成為瓶頸。分片鍵及其索引的選擇也會影響群集可以使用的分片策略。

      塊(Chunks)

      MongoDB的分區(qū)分片數(shù)據(jù)分成塊。每個分塊都有一個基于分片鍵的上下限范圍?。

      均衡器(Balancer?)和塊分布

      為了在整個集群中的所有分片上實現(xiàn)塊的均勻分布,平衡器在后臺運行,以在各分片上遷移塊。

      拆分的優(yōu)勢

      讀/寫

      MongoDB將讀寫工作負載分布在分片集群中的各個分?片上,從而允許每個分片處理集群操作的子集。通過添加更多分片,可以在集群中水平擴展讀寫工作負載。

      對于包含分片關(guān)鍵字或復(fù)合分片關(guān)鍵字的前綴mongos的查詢,可以將查詢定位到特定的分片或一組分片。這些目標(biāo)操作通常比廣播到群集中的每個分片更有效?。

      從MongoDB 4.4開始,mongos可以支持hedged reads?以最大程度地減少延遲。

      存儲容量

      分片橫跨分發(fā)數(shù)據(jù)碎片在集群中,允許每個碎片以包含總簇數(shù)據(jù)的子集。隨著數(shù)據(jù)集的增長,其他分片將增加群集的存儲容量。

      高可用性

      將配置服務(wù)器和分片作為副本集進行部署可提高可用性。

      即使一個或多個分片副本集變得完全不可用,分片群集也可以繼續(xù)執(zhí)行部分讀取和寫入操作。也就是說,雖然無法訪問不可用分片上的數(shù)據(jù),但是針對可用分片的讀取或?qū)懭肴匀豢梢猿晒Α?/p>

      分片前的注意事項

      分片式群集基礎(chǔ)結(jié)構(gòu)的要求和復(fù)雜性要求仔細計劃,執(zhí)行和維護。

      分片后,MongoDB不會提供任何方法來取消分片。

      為了確保群集的性能和效率,在選擇分片密鑰時需要仔細考慮。

      分片有一定的操作要求和限制。

      如果查詢不包含分片鍵或復(fù)合分片鍵的前綴?,請mongos執(zhí)行廣播操作,查詢分?片群集中的所有分片。這些分散/聚集查詢可能是長時間運行的操作。

      分片和非分片集合

      數(shù)據(jù)庫可以包含分片和未分片集合的混合。分片集合在群集中的分片上分區(qū)和分布?。未分片的集合存儲在?主分片上。每個數(shù)據(jù)庫都有其自己的主碎片。

      連接到分片群集

      您必須連接到mongos路由器才能與分片群集中的任何集合進行交互。這包括分片和未分片的集合。客戶端永遠不要連接到單個分片以執(zhí)行讀取或?qū)懭氩僮鳌?/p>

      分片策略

      MongoDB支持兩種分片策略,用于在分片群集之間分布數(shù)據(jù)。

      哈希分片

      哈希分片涉及計算分片鍵字段值的哈希值。然后,根據(jù)散列的分片鍵值為每個塊分配一個范圍。

      建議

      使用哈希索引解析查詢時,MongoDB自動計算哈希值。應(yīng)用程序也不會需要計算哈希值。

      盡管一系列分片鍵可能是“接近”的,但它們的散列值不太可能在同一塊上?;谏⒘兄档臄?shù)據(jù)分發(fā)有助于更均勻的數(shù)據(jù)分發(fā),尤其是在分片鍵單調(diào)更改的數(shù)據(jù)集中。

      但是,散列分布意味著對分片鍵的基于范圍的查詢不太可能針對單個分片,從而導(dǎo)致更多的群集范圍?廣播操作

      范圍(range)分片

      遠程分片涉及根據(jù)分片鍵值將數(shù)據(jù)劃分為多個范圍。然后,根據(jù)分片鍵值為每個塊分配一個范圍。

      值為“ close”的一系列分片鍵更有可能駐留在同一塊上。這允許有針對性的操作,因為mongos可以將操作僅路由到包含所需數(shù)據(jù)的分片。

      遠程分片的效率取決于選擇的分片鍵。分片密鑰考慮不周全會導(dǎo)致數(shù)據(jù)分布不均,這可能會削弱分片的某些優(yōu)勢或?qū)е滦阅芷款i。

      分片群集中的Zones

      Zones?可以幫助改進跨多個數(shù)據(jù)中心的分片集群的數(shù)據(jù)位置。

      在分片群集中,您可以基于shard key創(chuàng)建分片數(shù)據(jù)Zones?。您可以將每個Zones?與集群中的一個或多個分片關(guān)聯(lián)。分片可以與任意數(shù)量的區(qū)域關(guān)聯(lián)。在平衡的集群中,MongoDB僅將Zones?覆蓋的塊遷移到與該區(qū)域關(guān)聯(lián)的碎片。

      每個Zones?覆蓋一個或多個分片鍵值范圍。區(qū)域覆蓋的每個范圍始終包括其下邊界和上邊界。

      在定義要覆蓋的Zones?的新范圍時,必須使用分片鍵中包含的字段。如果使用復(fù)合分片鍵,則范圍必須包含分片鍵的前綴。有關(guān)更多信息,請參見區(qū)域中的分片鍵。

      選擇分片鍵時,應(yīng)考慮將來可能使用的區(qū)域。

      建議

      從MongoDB 4.0.3開始,在?對空集合或不存在的集合進行分片之前設(shè)置區(qū)域和區(qū)域范圍可以更快地設(shè)置區(qū)域分片。

      分片中的排序規(guī)則

      使用shardCollection命令和排序規(guī)則:{locale:“simple”}選項來切分具有默認排序規(guī)則的集合。成功的分片需要:

      集合必須有一個索引,該索引的前綴是分片鍵

      索引必須具有排序規(guī)則?{?locale:?"simple"?}

      使用排序規(guī)則創(chuàng)建新集合時,請在分片集合之前確保滿足這些條件。

      注意:對分片集合的查詢繼續(xù)使用為集合配置的默認排序規(guī)則。要使用shard key索引的簡單排序規(guī)則,請在查詢的排序規(guī)則文檔中指定{locale:“simple”}。

      MongoDB 云數(shù)據(jù)庫 GaussDB(for Mongo) 數(shù)據(jù)庫

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:刪多余的頁數(shù)(刪除多余的頁數(shù))
      下一篇:如何去掉和值為0的0(0可以除0嗎?)
      相關(guān)文章
      中文字幕在亚洲第一在线| 亚洲国产成AV人天堂无码| 亚洲精品亚洲人成在线观看麻豆| 亚洲精品无码鲁网中文电影| 春暖花开亚洲性无区一区二区| 亚洲一区二区三区免费视频| 亚洲天堂福利视频| 亚洲校园春色小说| 亚洲最大成人网色香蕉| 亚洲成人黄色在线| 中文字幕在线观看亚洲视频| 456亚洲人成影院在线观| 亚洲免费闲人蜜桃| 亚洲av无码专区在线| 33333在线亚洲| 亚洲最大天堂无码精品区| 亚洲男人的天堂网站| 亚洲AV无码AV男人的天堂不卡 | 亚洲中文字幕无码亚洲成A人片| 中文字幕亚洲综合小综合在线| 国产亚洲中文日本不卡二区| 亚洲人成人网站18禁| 日韩亚洲翔田千里在线| 亚洲欧洲日产国码高潮αv| 国产成人精品久久亚洲高清不卡 | 国产亚洲精品久久久久秋霞| 国产亚洲精品无码成人| 亚洲最大的成网4438| 亚洲人成高清在线播放| 亚洲日韩精品国产一区二区三区 | 亚洲日韩看片无码电影| 亚洲av色香蕉一区二区三区| 亚洲av午夜精品一区二区三区| 亚洲一区精品伊人久久伊人| 国产亚洲免费的视频看| 亚洲综合成人网在线观看| 亚洲一级免费毛片| 欧美日韩亚洲精品| 久久亚洲精品无码播放| 亚洲电影国产一区| 亚洲一区二区影视|