日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

MongoDB 基础浅谈

發布時間:2024/2/28 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MongoDB 基础浅谈 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:hazenweng,騰訊 QQ 音樂后臺開發工程師

MongoDB 作為一款優秀的基于分布式文件存儲的 NoSQL 數據庫,在業界有著廣泛的應用。下文對 MongoDB 的一些基礎概念進行簡單介紹。

1 MongoDB 特點

  • 面向集合存儲:MongoDB 是面向集合的,數據以 collection 分組存儲。每個 collection 在數據庫中都有唯一的名稱。

  • 模式自由:集合的概念類似 MySQL 里的表,但它不需要定義任何模式。

  • 結構松散:對于存儲在數據庫中的文檔,不需要設置相同的字段,并且相同的字段不需要相同的數據類型,不同結構的文檔可以存在同一個 collection 里。

  • 高效的二進制存儲:存儲在集合中的文檔,是以鍵值對的形式存在的。鍵用于唯一標識一個文檔,一般是 ObjectId 類型,值是以 BSON 形式存在的。BSON = Binary JSON, 是在 JSON 基礎上加了一些類型及元數據描述的格式。

  • 支持索引:可以在任意屬性上建立索引,包含內部對象。MongoDB 的索引和 MySQL 的索引基本一樣,可以在指定屬性上創建索引以提高查詢的速度。除此之外,MongoDB 還提供創建基于地理空間的索引的能力。

  • 支持 mapreduce:通過分治的方式完成復雜的聚合任務。

  • 支持 failover:通過主從復制機制,可以實現數據備份、故障恢復、讀擴展等功能?;趶椭萍膹椭茩C制提供了自動故障恢復的功能,確保了集群數據不會丟失。

  • 支持分片:MongoDB 支持集群自動切分數據,可以使集群存儲更多的數據,實現更大的負載,在數據插入和更新時,能夠自動路由和存儲。

  • 支持存儲大文件:MongoDB 中 BSON 對象最大不能超過 16 MB。對于大文件的存儲,BSON 格式無法滿足。GridFS 機制提供了一個存儲大文件的機制,可以將一個大文件分割成為多個較小的文檔進行存儲。

2 MongoDB 要素

  • database: 數據庫。

  • collection: 數據集合,相當于 MySQL 的 table。

  • document: 數據記錄行,相當于 MySQL 的 row。

  • field: 數據域,相當于 MySQL 的 column。

  • index: 索引。

  • primary key: 主鍵。

3 MongoDB 數據庫

一個 MongoDB 實例可以創建多個 database。連接時如果沒開啟免認證模式的話,需要連接到 admin 庫進行認證。如果開啟免認證模式,若不指定 database 進行連接,默認連接一個叫 db 的數據庫,該數據庫存儲在 data 目錄中。通過 show dbs 命令可以查看所有的數據庫。數據庫名不能包含空字符。數據庫名不能為空并且必須小于 64 個字符。

MongoDB 預留了幾個特殊的 database。

  • admin: admin 數據庫主要是保存 root 用戶和角色。例如,system.users 表存儲用戶,system.roles 表存儲角色。一般不建議用戶直接操作這個數據庫。將一個用戶添加到這個數據庫,且使它擁有 admin 庫上的名為 dbAdminAnyDatabase 的角色權限,這個用戶自動繼承所有數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,比如關閉服務器。

  • local: local 數據庫是不會被復制到其他分片的,因此可以用來存儲本地單臺服務器的任意 collection。一般不建議用戶直接使用 local 庫存儲任何數據,也不建議進行 CRUD 操作,因為數據無法被正常備份與恢復。

  • config: 當 MongoDB 使用分片設置時,config 數據庫可用來保存分片的相關信息。

一個 MongoDB 實例的數據結構如下圖:

4 MongoDB 集合

MongoDB 集合存在于數據庫中,沒有固定的結構,可以往集合插入不同格式和類型的數據。集合不需要事先創建。當第一個文檔插入,或者第一個索引創建時,集合就會被創建。集合名必須以下劃線或者字母符號開始,并且不能包含 $,不能為空字符串(比如 ""),不能包含空字符,且不能以 system. 為前綴。

capped collection 是固定大小的集合,支持高吞吐的插入操作和查詢操作。它的工作方式與循環緩沖區類似,當一個集合填滿了被分配的空間,則通過覆蓋最早的文檔來為新的文檔騰出空間。和標準的 collection 不同,capped collection 需要顯式創建,指定大小,單位是字節。capped collection 可以按照文檔的插入順序保存到集合中,而且這些文檔在磁盤上存放位置也是按照插入順序來保存的,所以更新 capped collection 中的文檔,不可以超過之前文檔的大小,以便確保所有文檔在磁盤上的位置一直保持不變。

5 MongoDB 視圖

視圖基于已有的集合進行創建,是只讀的,不實際存儲硬盤,通過視圖進行寫操作會報錯。視圖使用其上游集合的索引。由于索引是基于集合的,所以你不能基于視圖創建、刪除或重建索引,也不能獲取視圖的索引列表。如果視圖依賴的集合是分片的, 那么視圖也視為分片的。視圖是實時計算并讀取的。

6 MongoDB 索引

MongoDB 支持豐富的索引方式。如果沒有索引,讀操作就必須掃描集合中的每個文檔并篩選符合查詢條件的記錄。索引能夠在很大程度上提高查詢速度。

  • 單字段索引:有三種方式,(1)在單個字段上創建索引;(2)在嵌入式字段上創建索引;(3)在內嵌文檔上創建索引。

  • 復合索引:支持在多個字段上匹配的查詢。對任何復合索引施加 32 個字段的限制。對于復合索引,MongoDB 可以使用索引來支持對索引前綴的查詢。

  • 多鍵索引:為了索引包含數組值的字段,MongoDB 為數組中的每個元素創建一個索引鍵。這些多鍵索引支持對數組字段的高效查詢。

  • 文本索引:支持對字符串內容的文本搜索查詢。文本索引可以包含任何值為字符串或字符串元素數組的字段。一個集合最多可以有一個文本索引。

  • 通配符索引:支持針對未知或任意字段的查詢。例如:db.collection.createIndex( {"a.$**" : 1 } ) 可支持諸如 db.collection.find({ "a.b" : 1 })、db.collection.find({ "a.c" : { $lt : 2 } }) 等查詢,提高查詢效率。不能使用通配符索引來分片集合。不能為通配符創建復合索引。

  • 通配符文本索引:通配符文本索引不同于通配符索引。通配符索引不支持使用 $text操作符的查詢。通配符文本索引為集合中每個文檔中包含字符串數據的每個字段建立索引。索引的創建方式示例:db.collection.createIndex( { "$**": "text" } )。

  • 2dsphere 索引:支持球體上的地理空間查詢:包含、相交和鄰近度查詢。

  • hashed 索引:支持使用哈希的分片鍵進行分片?;诠5姆制褂米侄蔚纳⒘兴饕鳛榉制I,以便跨分片集群對數據進行分區。MongoDB 支持任何單個字段的哈希索引,但不支持創建具有多個哈希字段的復合索引,也不能在索引上指定唯一哈希索引。

  • ttl 索引:一種特殊的單字段索引,支持在一定的時間或特定的期限后自動從集合中刪除文檔。TTL 索引不能保證過期數據在過期時立即刪除。默認每 60 秒運行一次刪除過期文檔的后臺進程。capped collection 不支持 ttl 索引。

  • 唯一索引:確保索引字段不會存儲重復值。如果集合已經存在了違反索引的唯一約束的文檔,則后臺創建唯一索引會失敗。

  • 部分索引:只索引集合中滿足指定篩選器表達式的文檔。例如:db.collection.createIndex({ a:1 },{ partialFilterExpression: { b: { $lt: 100 } } }) 表示只對集合中 b 字段小于 100 的文進行索引,大于等于 100 的文檔不會被索引。這可以有效提高存儲效率。

  • 稀疏索引:只包含有索引字段的文檔的條目,即使索引字段包含空值。索引會跳過任何缺少索引字段的文檔。非稀疏索引包含集合中的所有文檔,為那些不包含索引字段的文檔存儲空值。

7 MongoDB ObjectId

ObjectId 可以快速生成并排序,長度為 12 個字節,包括:

  • 一個 4 字節的時間戳,表示 unix 時間戳

  • 5 字節隨機值

  • 3 字節遞增計數器,初始化為隨機值

在 MongoDB 中,存儲在集合中的每個文檔都需要一個唯一的 _id 字段作為主鍵。如果插入的文檔省略了 _id 字段,則自動為文檔生成一個 _id。

8 MongoDB 復制集

MongoDB 的復制集又稱為副本集(Replica Set),是一組維護相同數據集合的 mongod 進程。復制集包含多個數據節點和一個可選的仲裁節點(arbiter)。在數據節點中,有且僅有一個成員為主節點(primary),其他節點為從節點(secondary)。

一個典型的復制集架構圖如下:

8.1 復制集節點類型

  • 主節點:接收所有的寫操作,并將集合所有的變化記錄到操作日志中,即 oplog。

  • 從節點:通過復制主節點的操作來維護一個相同的數據集。從節點有幾個選配項:v 參數決定是否具有投票權;priority 參數決定節點選主過程時的優先級;hidden 參數 決定是否對客戶端可見;slaveDelay 參數表示復制 n 秒之前的數據,保持與主節點的時間差。從節點可以配置成 0 優先級,阻止它在選舉中成為主節點,適用于將該節點部署在備用數據中心,或者將它作為一個冷節點;可以配置為隱藏復制集,防止應用程序從它讀取數據,適用于在該節點上運行需要與正常流量分離的程序;可以配置為延遲復制集,保持一個歷史快照,以便做按特定時間的故障恢復。

  • 仲裁節點:如果將一個 mongod 實例作為仲裁節點添加到一個復制集中,該節點可以參與主節點選舉,但不保存數據。仲裁節點永遠只能是仲裁節點。

8.2 復制集選主

MongoDB 的副本集協議(又稱為 pv1),是一種 raft-like 協議,即基于 raft 協議的理論思想實現,并且對之進行了一些擴展。當往復制集添加一個節點,或當主節點無法和集群中其他節點通信的時間超過參數 electionTimeoutMillis 配置的期限時,從節點會嘗試通過 pv1 協議發起選舉來推薦自己成為新主節點。

在選舉前具有投票權的節點之間兩兩互相發送心跳,以偵測節點是否存活。復制集節點每兩秒向彼此發送心跳。如果心跳未在 10 秒內返回,則發送心跳的一方將被發送方標記為不可訪問,也就是說,默認當 5 次心跳未收到時判斷為節點失聯。如果失聯的是主節點,從節點會發起選舉,選出新的主節點;如果失聯的是從節點則不會產生新的選舉。選舉基于 raft 一致性算法實現,在大多數投票節點存活下選舉出主節點。只有能夠與多數節點建立連接且具有較新的 oplog 的節點才可能被選舉為主節點,如果集群里的節點配置了優先級,那么具有較高的優先級的節點更可能被選舉為主節點。

復制集中最多可以有 50 個節點,但具有投票權的節點最多 7 個。

8.3 復制集作用

  • 主節點發生故障時自動選舉出一個新的主節點,以實現 failover。

  • 將數據從一個數據中心復制到另一個數據中心,減少另一個數據中心的讀延遲。

  • 實現讀寫分離。

  • 實現容災,可以在數據中心故障時快速切換到同城或異地的數據中心。

9 MongoDB 分片集

MongoDB 支持通過分片技術來支持海量數據存儲。解決數據增長的擴展方式有兩種:垂直擴展和水平擴展。垂直擴展通過增加單個服務器的能力來實現,比如磁盤空間、內存容量、CPU 數量等;水平擴展則通過將數據存儲到多個服務器上來實現。MongoDB 通過分片實現水平擴展。

一個典型的分片集群架構如下:

9.1 分片集組件

  • shard:每個分片上可以保存一個集合的子集,所有分片上的子集的數據互不相交,構成完整的集合。每個分片可以被部署為復制集架構。最大為 1024 個分片。

  • mongos:充當查詢路由器,在客戶端和分片集之間提供讀寫接口。mongos 提供集群單一入口,轉發應用端請求,選擇合適的數據節點進行讀寫,合并多個數據節點的返回。mongos 是無狀態的,分片集群一般需要配置至少 2 個 mongos。

  • config server:存儲分片集的相關配置信息。

9.2 分片鍵

MongoDB 集合若要采用分片,必須要指定分片鍵(shard key)。分片鍵由文檔中的一個或多個字段組成。分片集合必須具有支持分片鍵的索引,索引可以是分片鍵的索引,也可以是以分片鍵是索引前綴的復合索引。要對已填充的集合進行分片,該集合必須具有以分片鍵開頭的索引;分片一個空集合時,如果該集合還沒有包含指定分片鍵的索引,則 MongoDB 會默認給分片鍵創建索引。

對于一個即將要分片的集合,如果該集合具有其他唯一索引,則無法分片該集合。

對于已分片的集合,不能在其他字段上創建唯一索引。

4.2 版本開始可以更改文檔的分片鍵值,除非分片鍵字段為不可變的 _id 字段。更新分片鍵時必須在事務中或以可重試寫入的方式在 mongos 上運行,不能直接在分片上執行操作。在此之前文檔的分片鍵字段值是不可變的。

4.4 版本開始,可以向現有片鍵中添加一個或多個后綴字段以優化集合的片鍵。

5.0 版本開始,實現了實時重新分片(live resharding),可以實現分片鍵的完全重新選擇。live resharding 機制下,數據將根據新的分片規則進行遷移,不過有一些限制,比如一個實例中有且只能有一個集合在相同的時間下 resharding 等。

數據庫可以混合使用分片和未分片集合。分片集合被分區并分布在集群中的各個分片中。而未分片集合僅存儲在主分片中。

設置 shard key 時應該充分考慮取值基數和取值分布。分片鍵應被盡可能多的業務場景用到。盡可能避免使用單調遞增或遞減的字段作為分片鍵。

9.3 分片策略

MongoDB 將分片數據拆分成塊。每個分塊都有一個基于分片鍵的上下限范圍 。分片策略包括哈希分片、范圍分片和自定義 zone 分片。

  • 哈希分片會計算分片鍵字段的哈希值,這個值被用作片鍵,然后根據哈希值的散列為每個塊分配一個范圍。

  • 范圍分片根據分片鍵的值將數據劃分為多個連續范圍。,然后基于分片鍵的值分配每個塊的范圍。當片鍵的基數大、頻率低且值非單調變更時,范圍分片更高效。

  • 自定義 zone 分片基于 shard key 創建。每個 zone 與集群中的一個或者更多分片關聯。一個分片可以和任意數目的非沖突 zone 相關聯。

10 MongoDB 聚合

MongoDB 聚合框架(Aggregation Framework)是一個計算框架,功能是:

  • 作用在一個或幾個集合上。

  • 對集合中的數據進行的一系列運算。

  • 將這些數據轉化為期望的形式。

MongoDB 提供了三種執行聚合的方法:聚合管道,map-reduce 和單一目的聚合方法(如 count、distinct 等方法)。

10.1 聚合管道

在聚合管道中,整個聚合運算過程稱為管道(pipeline),它是由多個步驟(stage)組成的, 每個管道的工作流程是:

  • 接受一系列原始數據文檔

  • 對這些文檔進行一系列運算

  • 結果文檔輸出給下一個 stage

  • 聚合計算基本格式如下:

    pipeline?=?[$stage1,?$stage2,?...$stageN];?????db.collection.aggregate(?pipeline,?{?options?}?)

    10.2 map-reduce

    map-reduce 操作包括兩個階段:map 階段處理每個文檔并將 key 與 value 傳遞給 reduce 函數進行處理,reduce 階段將 map 操作的輸出組合在一起。map-reduce 可使用自定義 JavaScript 函數來執行 map 和 reduce 操作,以及可選的 finalize 操作。通常情況下效率比聚合管道低。

    10.3 單一目的聚合方法

    主要包括以下三個:

    • db.collection.estimatedDocumentCount()

    • db.collection.count()

    • db.collection.distinct()

    11 MongoDB 一致性

    分布式系統有個 PACELC 理論。根據 CAP,在一個存在網絡分區(P)的分布式系統中,要面臨在可用性(A)和一致性(C)之間的權衡,除此之外(E),即使沒有網絡分區的存在,在實際系統中,我們也要面臨在訪問延遲(L)和一致性(C)之間的權衡。MongoDB 的一致性模型對讀寫操作 L 和 C 的選擇提供了豐富的選項。

    11.1 因果一致性

    單節點的數據庫由于為讀寫操作提供了順序保證,因此實現了因果一致性。分布式系統同樣可以提供這些保證,但必須對所有節點上的相關事件進行協調和排序。

    以下是一個不遵循因果一致性的例子:

    為了保持因果一致性,必須有以下保證:


    實現因果一致性的單號讀寫應遵循以下流程:

    為了建立復制集和分片集事件的全局偏序關系,MongoDB 實現了一個邏輯時鐘,稱為 lamport logical clock。每個寫操作在應用于主節點時都會被分配一個時間值。這個值可以在副本和分片之間進行比較。從驅動到查詢路由器再到數據承載節點,分片集群中的每個成員都必須在每條消息中跟蹤和發送其最新時間值,從而允許分片之間的每個節點在最新時間保持一致。主節點將最新的時間值賦值給后續的寫入,這為任何一系列相關操作創建了一個因果順序。節點可以使用這個因果順序在執行所需的讀或寫之前等待,以確保它在另一個操作之后發生。

    從 MongoDB 3.6 開始,在客戶端會話中開啟因果一致性,保證 read concern 為 majority 的讀操作和 write concern 為 majority 的寫操作的關聯序列具有因果關系。應用程序必須確保一次只有一個線程在客戶端會話中執行這些操作。

    對于因果相關的操作:

  • 客戶端開啟客戶端會話,需滿足以下條件:read concern 為 majority,數據已被大多數復制集成員確認并且是持久化的;write concern 為 majority,確認該操作已應用于復制集中大多數可投票成員。

  • 當客戶端發出 read concern 為 majority 的讀操作和 write concern 為 majority 的寫操作的序列時,客戶端將會話信息包含在每個操作中。

  • 對于與會話相關聯的每個 read concern 為 majority 的讀操作和 write concern 為 majority 的寫操作,即使操作出錯,MongoDB 也會返回操作時間和集群時間。

  • 相關的客戶端會話會跟蹤這兩個時間字段。

  • 11.2 線性一致性

    線性一致性又被稱為強一致性。CAP 中的 C 指的就是線性一致性。順序一致性中進程只關心各自的順序一樣就行,不需要與全局時鐘一致。線性一致性是順序一致性的進化版,要求順序一致性的這種偏序(partial order)要達到全序(total order)。

    在實現了線性一致性的系統中,任何操作在該系統生效的時刻都對應時間軸上的一個點。把這些時刻連接成一條線,則這條線會一直沿時間軸向前,不會反向。任何操作都需要互相比較決定發生的順序。

    以下是一個線性一致性的系統示例:

    在以上系統中,寫操作生效之前的任何時刻,讀取值均為 1,生效后均為 2。也就是說,任何讀操作都能讀到某個數據的最近一次寫的數據。系統中的所有進程看到的操作順序,都遵循全局時鐘的順序。

    11.3 read concern

    read concern 是針對讀操作的配置。它控制讀取數據的新近度和持久性。read concern 選項控制數據讀取的一致性,分為 local、available、majority、linearizable 四種,它們對一致性的承諾依次由弱到強。其中 linearizable 表示線性一致性,另外 3 種級別代表了 MongoDB 在實現最終一致性時,對訪問延遲和一致性的取舍。

    • local/available: 語義基本一致,都是讀操作直接讀取本地最新的數據,但不保證該數據已被寫入大多數復制集成員。數據可能會被回滾。默認是針對主節點讀。如果讀取操作與因果一致的會話相關聯,則針對副節點讀。唯一的區別在于,avaliable 在分片集群場景下,為了保證性能,可能返回孤兒文檔。

    • majority:讀取 majority committed 的數據,可以保證讀取的數據不會被回滾,但是并不能保證讀到本地最新的數據。受限于不同節點的復制進度,可能會讀取到更舊的值。當寫操作對應的 write concern 配置中 w 的值越大,則寫操作在擴散到更多的復制集節點上之后才返回寫成功,這時通過 read concern 被配置為 majority 的讀操作進行讀取數據,就有更大的概率讀取到最新的數據。

    • linearizable:讀取 majority committed 的數據,但會等待在讀之前所有的 majority committed 確認。它承諾線性一致性,要求讀寫順序和操作真實發生的時間完全一致,既保證能讀取到最新的數據,也保證讀到數據不會被回滾。只對讀取單個文檔時有效,且可能導致非常慢的讀,因此總是建議配合使用 maxTimeMS 使用。linearizable 只能用在主節點的讀操作上,考慮到寫操作也只能發生在主節點上,相當于說 MongoDB 的線性一致性被限定在單機環境下實現。實現 linearizable,讀取的數據應該是被 write concern 為 majority 的寫操作寫入到 MongoDB 集群中的、且持久化到日志中的數據。如果數據寫入到多數節點后,沒有在日志中持久化,當這些節點發生重啟恢復,那么之前通過配置 read concern 為 linearizable 的讀操作讀取到的數據就可能丟失??梢酝ㄟ^ writeConcernMajorityJournalDefault 選項保證指定 write concern 為 majority 的寫操作在日志中是否持久化。如果寫操作持久化到了日志中,但是沒有復制到多數節點,在重新選主后,同樣可能會發生數據丟失,違背一致性承諾。

    • snapshot: 與關系型數據庫中的快照隔離級別語義一致。最高隔離級別,接近于 serializable。是伴隨著 MongoDB 4.0 版本中新出現的多文檔事務而設計的,只能用在顯式開啟的多文檔事務中。如果事務是因果一致會話的一部分,且 write concern 為 majority,則在事務提交后,讀操作可以保證已從多數提交數據的快照中讀取,該快照提供與該事務開始之前的操作的因果一致性。它讀取 majority committed 的數據,但可能讀不到最新的已提交數據。snapshot 保證在事務中的讀不出現臟讀、不可重復讀和幻讀。因為所有的讀都將使用同一個快照,直到事務提交為止該快照才被釋放。

    下面借用一張圖展示 majority 和 linearizable 的區別:

    11.4 write concern

    write concern 是針對寫操作的配置,表示寫請求對獨立 mongod 實例或復制集或分片集進行寫操作的確認級別。它主要是控制數據寫入的持久性。包含三個選項:

    • w:指定了寫操作需要復制并應用到多少個復制集成員才能返回成功,可以為數字或 majority。

      • w:0 表示客戶端不需要收到任何有關寫操作是否執行成功的確認,就直接返回成功,具有最高性能。

      • w:1 表示寫主成功則返回。

      • w: majority 需要收到多數節點(含主節點)關于操作執行成功的確認,具體個數由 MongoDB 根據復制集配置自動得出。w 值越大,對客戶端來說,數據的持久性保證越強,寫操作的延遲越大。w:1 要求事務只要在本地成功提交即可,而 w: majority 要求事務在復制集的多數派節點提交成功。

      • w:all 表示全部節點確認才返回成功。

    • j:表示寫操作對應的修改是否要被持久化到存儲引擎日志中,只能選填 true 或 false。

      • j:false 表示寫操作到達內存即算作成功。

      • j:true 表示寫操作落到 journal 文件中才算成功。w:0 如果指定 j:true,則優先使用 j:true 來請求獨立或復制集主副本的確認。j:true 本身并不能保證不會因復制集主故障轉移而回滾寫操作。

    • wtimeout:主節點在等待足夠數量的確認時的超時時間,單位為毫秒。超時返回錯誤,但并不代表寫操作已經執行失敗。跟 w 有關,比如:w 是 1,則是帶主節點確認的超時時間;w 為 0,則永不返回錯誤;w 為 majority,表示多數節點確認的超時時間。

    12 MongoDB WiredTiger 引擎

    從 3.2 版本開始,默認使用 WiredTiger 存儲引擎,每個被創建的表和索引,都對應各自獨立的 WiredTiger 表。為了保證 MongoDB 中數據的持久性,使用 WiredTiger 的寫操作會先寫入 cache,并持久化到 WAL(write ahead log),每 60s 或日志文件達到 2 GB,就會做一次 checkpoint,定期將緩存數據刷到磁盤,將當前的數據持久化產生一個新的快照。

    12.1 WiredTiger 數據結構

    MongoDB 采用插件式存儲引擎架構,實現了服務層和存儲引擎層的解耦,可支持使用多種存儲引擎。除此之外,底層的 WiredTiger 引擎還支持使用 B+ 樹和 LSM 兩種數據結構進行數據管理和存儲,默認使用 B+ 樹結構做存儲。使用 B+ 樹時,WiredTiger 以 page 為單位往磁盤讀寫數據,B+ 樹的每個節點為一個 page,包含三種類型的 page,即 root page、internal page 和 leaf page。

    以下是 B+ 樹的結構示意圖:

    • root page 是 B+ 樹的根節點。

    • internal page 是不實際存儲數據的中間索引節點。

    • leaf page 是真正存儲數據的葉子節點,包含頁頭(page header)、塊頭(block header)和真正的數據(key-value 對)。page header 定義了頁的類型、頁存儲的記錄條數等信息;塊頭定義了頁的校驗和 checksum、塊在磁盤上的尋址位置等信息。真正的數據由一個 WT_ROW 結構的數組變量進行存儲,每一條記錄還有一個 cell_offset 變量,表示這條記錄在 page 上的偏移量。WiredTiger 有一個用來為 page 分配 block 的塊設備管理模塊。定位文檔位置時,先計算 block 的位置,通過 block 的位置找到它對應的 page,再通過 page 找到文檔行數據的相對位置。leaf page 為了實現 MVCC,還會維護一個 WT_UPDATE 結構的數組變量,每條記錄對應一個數組元素,每個元素是一個鏈表,將所有修改值以鏈表形式保存。

    12.2 WiredTiger 壓縮

    WiredTiger 支持在內存和磁盤上對索引進行壓縮,通過前綴壓縮的方式減少 RAM 的使用。

    12.3 WiredTiger 一致性原理

    WiredTiger 使用了二級緩存 WiredTiger Cache 和 File System Cache 來保證 Disk 上 Database File 數據的最終一致性。

    • WiredTiger Cache:通過 B+ 樹緩存未壓縮的數據,并通過淘汰算法確保內存占用在合理范圍內。

    • File System Cache:由操作系統管理,緩存壓縮后的數據。

    • Database File:存儲壓縮后的數據。每個 WiredTiger 表對應一個獨立的磁盤文件。磁盤文件劃分成多個按 4 KB 對齊的 extent,并通過 3 個鏈表來管理:available list(可分配的 extent 列表) ,discard list(廢棄的 extent 列表)和 allocate list(當前已分配的 extent 列表)

    12.4 WiredTiger MVCC

    WiredTiger 使用 MVCC 進行寫操作,多個客戶端可以并發同時修改集合的不同文檔。事務開始時,WiredTiger 為操作提供反映內存數據的一致視圖的時間點快照。MVCC 通過非鎖機制進行讀寫操作,是一種樂觀并發控制模式。WiredTiger 僅在全局、數據庫和集合級別使用意向鎖。當存儲引擎檢測到兩個操作之間存在沖突時,將引發寫沖突,從而導致 MongoDB 自動重試該操作。

    使用 WiredTiger,如果沒有 journal 記錄,MongoDB 能且僅能從最后一個檢查點恢復。如果需要恢復最后一次 checkpoint 之后所做的更改,那么開啟日志是必要的。

    13 MongoDB 數據讀寫

    13.1 讀偏好 ReadPerference

    默認情況下,客戶端讀取復制集主節點上的數據。但客戶端可以指定一個 read perference 改變讀取行為,以便對復制集上的其他節點進行直接讀操作??蛇x值包括:


    13.2 在復制集上進行讀寫操作

    讀操作由客戶端指定的 read prefenence 選項決定。

    所有的寫操作都在集合的主節點上執行。主節點執行寫操作并將操作記錄在操作日志或 oplog 上。oplog 是 local 數據庫的一個集合,叫 local.oplog.rs。這是一個 capped collection,是固定大小,循環使用的。oplog 是對數據集的可重復操作序列,其記錄的每個操作都是冪等的,也就是說,對目標數據集應用一次或多次 oplog 操作都會產生相同的結果。從節點從上一次結束時間點建立 tailable cursor,不斷的從同步源拉取 oplog 并重放應用到自身,且嚴格按照原始的寫順序對給定的文檔執行寫操作。mongodb 使用多線程批量執行寫操作來提高并發,根據文檔 id 進行分批執行。MongoDB 為了提升同步效率,將拉取 oplog 以及重放 oplog 分到了不同的線程來執行。

    大致的寫流程如下:

    • producer thread 不斷的從主節點上拉取 oplog,并把它加入到一個 blockQueue 里,blockQueue 不是無限容量的,當超過最大存儲容量,producer thread 就必須等到 oplog 被 replBatcher thread 從隊列里取出后才能繼續拉取 oplog。

    • replBatcher thread 不斷從 producer thread 對應的 blockQueue 里取出 oplog,放到自己的內存隊列里,內存隊列也不是無限容量,一旦滿了,就需要等待被 oplogApplication thread 消費。

    • oplogApplication thread 不斷取出 replBatch thread 內存隊列里的所有元素,分散到不同的 replWriter thread,由 replWriter thread 根據 oplog 進行寫操作。等待所有 oplog 都應用完畢,oplogApplication hread 將所有的 oplog 順序寫入到 local.oplog.rs 集合。

    13.3 在分片集群上進行讀寫操作

    對于分片集群,需要一個 mongos 實例提供客戶端應用程序和分片集群之間的接口。在客戶端看來,該 mongos 實例的行為與其他 MongoDB 實例是相同的??蛻舳讼蚵酚晒濣c mongos 發送請求,由該節點決定往哪個分片進行讀寫。對于讀取操作,若能定向到特定分片時,效率最高。一般而言,分片集合的查詢應包含集合的分片鍵,以避免低效的全分片查詢。在這種情況下,mongos 可以使用配置數據庫 config 中的集群元數據信息,將查詢路由到分片。如果查詢不包含分片鍵,則 mongos 節點必須將查詢定向到集群中的所有分片,然后在 mongos 上聚合所有分片的查詢結果,返回給客戶端。

    對于寫操作, mongos 定向到負責數據集特定部分的分片,config 數據庫上有集合相關的分片鍵信息,mongos 從中讀取配置,并路由寫操作到適當的分片。

    14 MongoDB 事務

    14.1 ACID 特性

    MongoDB 在一定程度上支持了事務的 ACID 特性。MongoDB 4.0 版本開始支持復制集上的多文檔事務,4.2 版本引入了分布式事務,它增加了對分片群集上多文檔事務的支持。

    • 原子性:成功提交事務時,事務中所有數據更新將完全進行成功,并在事務外部可見。在提交事務之前,事務外部看不到在事務中進行的任何數據更新。當事務被打斷或終止時,事務中進行的所有數據更新都將被丟棄,對事務外部完全不可見。但是當事務寫入多個分片時,并非所有事務外的讀操作都需要等待事務提交后所有分片上數據完全可見。

    • 隔離性:MongoDB 提供 snapshot 隔離級別,在事務開始創建一個 WiredTiger snapshot,然后在整個事務過程中,便可以使用這個快照提供事務讀。

    • 持久性:事務使用 write concern 指定 {j: true} 時,MongoDB 會保證事務日志提交才返回,即使發生 crash,也能根據事務日志來恢復;而如果沒有指定 {j: true} 級別,即使事務提交成功了,在故障恢復之后,事務的也可能被回滾掉。

    • 一致性:參考前文提到的 MongoDB 一致性。

    14.2 事務的使用限制

    • 僅 WiredTiger 引擎支持事務。

    • 對集合的創建和刪除操作,不能出現在事務中。

    • 對索引的創建和刪除操作,不能出現在事務中。

    • 不能對系統級別的數據庫和集合進行操作。

    • 默認情況下,事務大小的限制在 16 MB。

    • 默認情況下,事務操作整體不允許超過 60 秒。

    • 事務不能在 session 外運行。

    • 一個 session 只能運行一個事務,多個 session 可以并行運行事務。

    • 不能對 capped collection 進行操作。

    • 不能使用 explain 操作做查詢分析。

    14.3 事務與 read concern

    事務中的操作使用事務級別的 read concern。事務內部忽略在集合和數據庫級別設置的任何 read concern。事務支持設置 read concern 為 local、majority 和 snapshot 其中之一。

    • 當 read concern 為 local 時,可讀取節點可用的最新數據,但數據可能回滾。對于分片群集上的事務,local 不能保證數據是從整個分片的同一快照視圖獲取。

    • 當 read concern 為 majority 時,如果在提交事務時指定了 write concern 為 majority 級別,則返回大多數副本成員已確認的數據(即無法回滾數據)。如果事務未指定 write concern 為 majority 級別,則不保證讀操作可以讀取多數提交的數據。對于分片群集上的事務,不能保證數據是從整個分片的同一快照視圖中獲取。

    • 當 read concern 為 snapshot 時,如果在提交事務時指定了 write concern 為 majority 級別,則從大多數已提交數據的快照中返回數據。如果事務未指定 write concern 為 majority 級別,則不保證讀操作使用了 majority commited 的數據的快照。對于分片群集上的事務,snapshot 跨分片同步。

    14.4 事務與 write concern

    事務使用事務級別的 write concern 來進行寫操作提交,可以通過配置 w 選項設置節點個數,來決定事務寫入是否成功,默認情況下為 1。

    • w:0 表示事務寫入不關注是否成功,默認為成功。

    • w:1 表示事務寫入到主節點就開始往客戶端發送確認寫入成功。

    • w:majority 表示大多數節點成功原則,例如一個復制集 3 個節點,2 個節點成功就認為本次事務寫入成功。

    • w:all 表示所有節點都寫入成功,才認為事務提交成功。

    • j:false 表示寫操作到達內存就算事務成功。

    • j:true 表示寫操作只有記錄到日志文件才算事務成功。

    • wtimeout: 寫入超時時間,過期表示事務失敗。

    15 MongoDB Change Stream

    15.1 變更流使用場景

    MongoDB 3.6 引入了 change stream(變更流)。它的使用場景包括:

    • 數據同步:多個 MongoDB 集群之間的增量數據同步。

    • 審計:對 MongoDB 操作進行審計、監控。

    • 數據訂閱:外部程序訂閱 MongoDB 的數據變更,可離線數據同步、計算或分析等。

    15.2 變更流特點

    change stream 允許外部程序訪問實時數據更改,而不會增加 MongoDB 基礎操作的復雜性,也不會導致 oplog 延遲的風險。應用程序可以使用 change stream 來訂閱單個集合、數據庫或整個集群中的所有數據變更。若要開啟 change stream,必須使用 WiredTiger 存儲引擎。

    change stream 可應用于復制集和分片集。應用于復制集時,可以在復制集中任意一個節點上開啟監聽;應用于分片集時,則只能在 mongos 上開啟監聽。在 mongos 上發起監聽,是利用全局邏輯時鐘提供了整個分片上變更的總體排序,確保監聽事件可以按接收到的順序安全地解釋。mongos 會一直檢查每個分片,查看每個分片是否存在最新的變更。如果多個分片上一直很少出現變更,則可能會對 change stream 的響應時間產生負面影響,因為 mongos 仍必須檢查這些冷分片保持總體有序。

    15.3 變更流監聽事件類型

    從 change stream 中能監聽到的變更事件包括:insert、update、replace、delete、drop、rename、dropDatabase 和 invalidate。

    15.4 變更流故障恢復

    MongoDB 4.0 之后,可以通過指定 startAtOperationTime 來控制從某個特定的時間點開啟監聽,但該時間點必須在所選擇節點的有效 oplog 時間范圍內。change stream 監聽返回的字段中有個 _id 字段,表示的是 resume token,這是唯一標志 change stream 流中的位置的字段。

    如果 change stream 監聽比中止后需要繼續監聽,那么可指定 resumeAfter 恢復訂閱。指定 resumeAfter 為 change stream 中斷處的 _id 字段即可。

    當監聽的集合發生 rename、drop 或 dropDatabase 事件,就會導致 invalidate 事件;當監聽的數據庫出現 dropDatabase 事件,也會導致無效事件。invalidate 事件后 change stream 的游標會被關閉,這時就需要使用 resumeAfter 選項來恢復 change stream 的監聽,在 4.2 版本后也可以通過 startAfter 選項創建新的更改流來恢復監聽。

    15.5 變更流使用限制

    • change stream 無法配置到系統庫或者 system.xxx 表上。

    • change stream 依賴于 oplog,因此中斷時間不可超過 oplog 回收的最大時間窗。

    16 MongoDB 性能問題定位方式

    • 可以為 mongod 實例啟用數據庫分析。數據庫分析器既可以在實例上啟用,也可以在單個數據庫層面上啟用。它收集在實例上執行的 CRUD 操作、游標、命令、配置等詳細信息,并將它收集的所有數據寫到 system.profile 集合。這是一個 capped collection,默認情況下,system.profile 容量大小為 4M。開啟實時數據庫分析往往伴隨著副作用,請謹慎使用。

    • 使用 db.currentOp() 操作。它返回一個文檔,其中包含有關數據庫實例正在進行的操作的信息。

    • 使用 db.serverStatus() 命令。它返回一個文檔,提供數據庫狀態的概述,通過它可以收集有關該實例的統計信息。

    • 使用 explain 來評估查詢性能,例如 cursor.explain() 或 db.collection.explain() 方法可以用來返回關于查詢執行的信息。

    • 借用一些商業工具,比如 MongoDB Ops Manager、Percona 等。

    騰訊程序員視頻號最新視頻

    歡迎點贊

    總結

    以上是生活随笔為你收集整理的MongoDB 基础浅谈的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    中文字幕在线字幕中文 | 婷婷综合导航 | 成 人 黄 色视频免费播放 | 97超碰人人看 | 日本中文字幕观看 | 久久久久亚洲精品国产 | 国产成人一二片 | 国产99久久精品一区二区永久免费 | 99久久精品电影 | 国产玖玖精品视频 | 精品国产一区二区三区久久久久久 | 日本婷婷色 | 欧美一区二区在线看 | 欧美成年黄网站色视频 | 97视频中文字幕 | 国产精品久久久久久久久大全 | av成人免费在线 | 精品国产一区二区三区四区vr | 中文字幕av电影下载 | 亚洲va天堂va欧美ⅴa在线 | 久久亚洲专区 | 人人爽人人爱 | 午夜影院一级片 | 91亚洲激情| 亚洲乱码精品久久久久 | 成人影视免费 | 一区三区在线欧 | 五月婷香| 超碰在线人人艹 | 国产婷婷精品av在线 | avcom在线 | 国产精品一区二区三区四 | av色网站 | 欧美专区日韩专区 | 精品久久久久一区二区国产 | 国产精品成人a免费观看 | 色免费在线 | 黄色在线观看网站 | 精品国产区在线 | 91在线日韩 | 免费视频 三区 | 国产三级午夜理伦三级 | 天天操天天操天天操天天操天天操天天操 | 伊人婷婷 | 97久久精品午夜一区二区 | 碰超在线| 免费在线黄色av | 国产精品v欧美精品v日韩 | 国产一区精品在线 | 一区二区三区在线播放 | 日本黄区免费视频观看 | 国产色视频| 午夜视频免费在线观看 | 最近更新中文字幕 | 国产精品专区h在线观看 | 日韩素人在线观看 | 天天色天天操天天爽 | 亚洲日韩欧美视频 | 激情在线网址 | 国产一区二区精 | 国产精品久久久久aaaa九色 | 91丨九色丨国产丨porny精品 | 国产三级香港三韩国三级 | 日韩免费电影一区二区 | 亚洲欧美激情精品一区二区 | 日本在线观看一区二区三区 | 久久精品国产99国产 | 久久精品4| 国产日韩欧美在线观看视频 | 91色九色| 久久久久麻豆v国产 | 国内精品久久久久影院日本资源 | 日韩电影一区二区在线 | 日韩剧情| 亚洲欧美国内爽妇网 | 精品在线免费视频 | a级片网站 | www..com毛片 | 国产精品18videosex性欧美 | 中文字幕无吗 | 亚洲一级黄色大片 | 色天天久久 | 丁香花在线观看免费完整版视频 | 日本中文字幕网站 | 亚洲精品合集 | 日韩在线视频网址 | 热久久免费视频精品 | 99热超碰| 亚洲综合精品视频 | 国产成人精品综合久久久久99 | 国产精品色视频 | 在线播放日韩av | 欧美另类xxxxx | 久热免费在线观看 | 国产精品99久久久久久宅男 | 91精品视频一区二区三区 | 日韩一级理论片 | 欧美日韩成人一区 | 色天天 | 九九热久久免费视频 | 精品国产视频在线观看 | 99久久精品午夜一区二区小说 | 亚洲国产电影在线观看 | 国产精彩视频一区 | 激情综合亚洲 | 婷婷 综合 色 | 国产欧美日韩精品一区二区免费 | 丁香婷婷色月天 | 国产无套视频 | 99亚洲国产 | 精品一区二区在线免费观看 | 精品久久久99 | 欧美日韩后 | 中文字幕在线观看网 | 亚洲精品黄色在线观看 | 五月婷婷综合在线观看 | 在线亚洲人成电影网站色www | 9999在线 | 91av视频免费在线观看 | 一区三区视频在线观看 | 中文字幕xxxx | 探花在线观看 | 久久久久国产成人精品亚洲午夜 | 蜜臀av网站| 久草电影在线观看 | 日韩中文幕 | 500部大龄熟乱视频 欧美日本三级 | 91麻豆精品国产自产在线游戏 | 久久福利在线 | 国产一级一级国产 | 亚洲日韩中文字幕在线播放 | 亚洲国产精品传媒在线观看 | 日韩理论片在线 | 国产资源av | 在线观看国产中文字幕 | 国产精品久久久久av | 成人天堂网 | 午夜精品福利一区二区三区蜜桃 | 久草在线久| 成人午夜久久 | 久草在线免费在线观看 | 二区三区中文字幕 | 日韩在线高清 | 久久久久国产精品一区二区 | 午夜成人影视 | 国产黄色成人 | 久久理论电影网 | 国产女人免费看a级丨片 | 91久久一区二区 | 日日添夜夜添 | 91在线小视频 | 日韩精品亚洲专区在线观看 | 黄色大片中国 | 欧美日韩啪啪 | 人人爽人人干 | 麻豆成人精品 | 中文字幕在线一区二区三区 | 日韩av午夜在线观看 | 日韩精品一区二区三区三炮视频 | 激情五月婷婷激情 | 99热这里只有精品8 久久综合毛片 | 又黄又爽又色无遮挡免费 | 国产成人精品综合久久久 | 日韩高清一区在线 | 欧美一区二区三区在线播放 | 99热官网 | 干综合网 | 天天草综合网 | 天堂网av在线 | 国产精品完整版 | 亚洲最新视频在线 | av电影免费在线看 | 国产一区在线免费观看视频 | 日韩精品一区二区三区中文字幕 | 欧美日韩一区二区三区不卡 | av在线永久免费观看 | 日韩一二三在线 | 精品国内自产拍在线观看视频 | 国产成人一区二区三区 | www亚洲一区 | 免费观看黄 | 五月婷婷丁香激情 | 国产精品久久久久久久久久久久午夜 | 欧美一区二视频在线免费观看 | 9色在线视频| 欧美日韩国产三级 | 国产日韩精品在线 | av免费播放| 五月天婷婷丁香花 | 中文字幕在线看视频 | 超级碰视频 | 国产黄色片在线免费观看 | 婷婷色在线视频 | 成人精品一区二区三区中文字幕 | 一区二区激情视频 | 日韩免费看 | 免费在线观看日韩欧美 | 日韩久久精品一区二区 | 久久高清精品 | 综合色综合色 | 久操伊人 | 国产精品亚洲片在线播放 | 成年人在线免费看 | 免费精品视频在线 | 精品一区二区三区在线播放 | 久久国产精品成人免费浪潮 | 福利视频网址 | 欧美久久精品 | 丁香高清视频在线看看 | 久久er99热精品一区二区 | 四虎国产精品永久在线国在线 | 午夜精品99久久免费 | 日日操天天操狠狠操 | 国产精品私拍 | 三级视频日韩 | 在线看国产 | 国产精品久久久久亚洲影视 | 91精品国产自产老师啪 | 韩国中文三级 | 中文字幕视频一区 | 国产精品成人久久久 | 久久久久久久久久久久久久免费看 | 国产一级视频在线免费观看 | 亚洲日本va午夜在线影院 | 毛片网在线观看 | 成人av在线网 | 香蕉久久久久久av成人 | 国产精品久久久久久久免费大片 | 国产一区在线视频观看 | 在线观看国产福利片 | 成人av资源 | 女人18片毛片90分钟 | 欧美 亚洲 另类 激情 另类 | www.久久久 | 天天综合天天做 | 人人插人人射 | 国产成人精品综合久久久久99 | 97免费公开视频 | www久久国产| 免费在线黄色av | 久草在线手机视频 | 黄色网址在线播放 | 欧美视屏一区二区 | 黄网站色欧美视频 | 国内精自线一二区永久 | 久久不卡国产精品一区二区 | 国产一级片毛片 | 国产黄色在线观看 | 亚洲人成人天堂h久久 | 热re99久久精品国产66热 | 免费看黄在线网站 | 久久综合免费视频影院 | av一级片网站 | 国产特级毛片aaaaaa高清 | 久久婷婷丁香 | 天天色天天射天天综合网 | 99c视频高清免费观看 | 人人澡超碰碰97碰碰碰软件 | 色婷婷一区| 国产精品99久久久久久人免费 | 国产一区欧美二区 | 国产成人61精品免费看片 | 久久电影国产免费久久电影 | 久久久国产精华液 | 国产精品va最新国产精品视频 | 国产一线二线三线在线观看 | 久久精品国亚洲 | 在线一区电影 | 伊人日日干 | 婷婷九月激情 | 高清有码中文字幕 | 成年人毛片在线观看 | 国产成人久久精品一区二区三区 | 亚洲黄色网络 | 色综合天天综合在线视频 | 天天色棕合合合合合合 | 婷婷亚洲五月色综合 | 日韩在线视频观看免费 | 狠狠干综合 | 免费高清影视 | 99精品在线播放 | 91欧美国产 | 久久精品久久久久电影 | 免费在线电影网址大全 | 欧美日韩中文视频 | 国产裸体视频网站 | 国产人在线成免费视频 | 中文字幕免费久久 | 狠狠操夜夜操 | 一区二区激情视频 | 日韩免费一区二区 | 日本爽妇网 | 日韩av成人 | 国产在线播放一区二区三区 | 久久99网站| 日韩网站在线看片你懂的 | 日本九九视频 | 欧美日韩在线播放 | 欧美a级在线 | wwxxxx日本| 久久久国际精品 | 91麻豆精品国产91久久久无限制版 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 国产色久| 久久影视网 | 经典三级一区 | 婷香五月 | 成人免费观看视频大全 | 国产福利精品视频 | 久久这里只有精品视频99 | 国产成人精品综合 | 这里只有精彩视频 | 在线天堂8√ | 美女网站视频免费都是黄 | 天天在线视频色 | 2019免费中文字幕 | 久色 网 | 高清一区二区 | www.午夜| 国产精品theporn | 99色人 | jizz18欧美18| 日韩艹 | 国模精品一区二区三区 | 国产在线精品国自产拍影院 | 在线黄色国产电影 | 日韩久久一区二区 | 中文字幕在线视频精品 | 91.dizhi永久地址最新 | 久草热久草视频 | 伊人宗合| 国产精品视频你懂的 | 亚洲电影院 | 亚洲欧洲一区二区在线观看 | 伊人网综合在线观看 | 久久国产免费 | 亚洲黄色软件 | 在线看国产 | 国产又粗又猛又爽又黄的视频先 | 亚洲理论影院 | 蜜臀av夜夜澡人人爽人人 | 99精品欧美一区二区 | 超碰人人91 | 欧美精品久久久久久 | 日本久久精 | 超级碰碰碰碰 | 97在线观看免费观看 | 999久久久| 国内视频在线观看 | 午夜视频导航 | 日本精品视频在线 | 99久久精品免费一区 | 国产成人精品区 | 成人av电影在线观看 | 久产久精国产品 | 在线国产日韩 | 亚洲最大av | 欧美日韩亚洲国产一区 | 国产精品久久久av | 欧美成人性战久久 | 韩日精品在线 | 久久精品超碰 | 天天摸天天舔 | 亚洲情婷婷| 天天插天天 | 国产精品一区在线观看 | 正在播放日韩 | 亚洲国产片色 | 欧美污在线观看 | 激情网五月 | 黄色一级性片 | 天天干天天操天天做 | 国产综合福利在线 | 91精品人成在线观看 | 国产亚洲精品久久久久久大师 | 九九热视频在线免费观看 | 国产一卡二卡在线 | 久久免费国产精品1 | 日韩免费av片 | 久久精品99国产国产精 | 亚洲精品www久久久 www国产精品com | 国产 在线 高清 精品 | 最新中文字幕视频 | 福利片免费看 | 91视频首页| 日韩av在线资源 | 精品国产电影一区二区 | 成人资源站 | 中文字幕日韩有码 | 亚州国产精品 | 久久久999| 在线精品视频在线观看高清 | 蜜桃视频精品 | 日本天天色 | 亚洲精品在 | 久久综合成人 | 国产亚洲精品女人久久久久久 | 亚洲aⅴ久久精品 | 亚洲我射av | 国产精品久久久久久久久久久久午 | 久草精品视频在线看网站免费 | 成人av免费电影 | 天天操天天吃 | 免费进去里的视频 | 日韩中文字幕免费视频 | 亚洲精品动漫成人3d无尽在线 | 高清免费在线视频 | 色片网站在线观看 | 午夜久久久久久久久久影院 | 欧亚日韩精品一区二区在线 | 91麻豆精品国产自产在线游戏 | 日韩久久一区 | 国产精品久久久久久久久婷婷 | 天天干天天干天天操 | 久久99免费视频 | 国产精品美女久久久 | 极品国产91在线网站 | 国产精品黄色影片导航在线观看 | 中文字幕在线播放一区 | 丁香激情综合久久伊人久久 | 免费看片在线观看 | free,性欧美 九九交易行官网 | 美女视频是黄的免费观看 | 日韩三区在线观看 | 久久久69| 91网站观看| 伊人看片 | 一级精品视频在线观看宜春院 | 国产黄色片一级 | 国产精品乱码高清在线看 | 国产精品久久久久久a | 日韩视频在线观看视频 | 亚洲高清在线观看视频 | 狠狠色狠狠色终合网 | 天天人人综合 | 亚洲高清视频在线观看 | 国产精品久久久久久久免费观看 | 国产专区一 | av中文字幕在线观看网站 | www免费看片com | 91热| 国产黄色看片 | 中文字幕免费高清在线观看 | 欧美日韩在线精品 | 日韩专区视频 | 在线看国产日韩 | 国产在线观看xxx | 日韩视频免费 | bbw av | 99色视频 | 精品999| 日日夜夜噜噜噜 | 欧美日韩精品久久久 | 日韩免费av在线 | 亚洲国产日韩精品 | 激情视频网页 | 久久毛片网站 | 国产韩国日本高清视频 | 亚洲欧美经典 | 天堂在线成人 | 国产精品久久久久一区二区三区 | 中文字幕精品一区 | 国产一级免费片 | 天天综合网 天天综合色 | 天天做天天爱夜夜爽 | 午夜丰满寂寞少妇精品 | 中文字幕精品视频 | 国产在线一线 | 国产成人三级在线 | 国产中文字幕在线 | 午夜丁香视频在线观看 | 亚洲 欧洲av | 日本在线观看中文字幕无线观看 | 麻豆国产精品视频 | 亚洲日本欧美在线 | 日韩二区精品 | 亚洲精品国产精品国自产 | 夜夜夜草| 国产精品99久久久 | 国产拍揄自揄精品视频麻豆 | 在线免费高清一区二区三区 | www.黄色片网站 | 国产精品久久久久av免费 | 成人av网址大全 | 久久蜜桃av| 欧美一级电影在线观看 | 亚洲精品乱码白浆高清久久久久久 | 久久久综合香蕉尹人综合网 | 久久久精品亚洲 | 狠狠狠狠狠狠干 | 黄色成品视频 | h动漫中文字幕 | 久草久热 | 91污污 | 西西4444www大胆无视频 | 国产日韩在线观看一区 | 日韩欧美精品一区 | 亚洲视频 在线观看 | 亚洲专区在线播放 | 黄色高清视频在线观看 | 国产成人精品午夜在线播放 | 亚洲欧美精品一区二区 | 久久久久久久久久久免费 | 中文字幕在线播放一区二区 | 日韩精品一区二区三区免费视频观看 | 天天色 天天 | 在线观看的黄色 | 久久久www成人免费毛片 | 欧美性护士 | 在线观看中文字幕第一页 | 欧美日韩精品在线观看视频 | 深爱激情久久 | 国产精品18久久久久久vr | av在线a | 免费av片在线| 精品视频www| 亚洲精品国偷自产在线99热 | 国产午夜在线观看视频 | 激情久久小说 | 91av在线视频免费观看 | 色狠狠狠 | 天天综合网 天天 | 国产一级性生活视频 | 日韩最新av在线 | avcom在线 | 18做爰免费视频网站 | 国产精品露脸在线 | 国产成人免费观看 | 99热最新网址 | 麻豆视频www| 91在线www | 久久久久国产精品免费免费搜索 | 国产一区在线视频观看 | 91精品免费在线观看 | 成人免费中文字幕 | 人人舔人人射 | 九九免费观看全部免费视频 | 精品久久久久久亚洲综合网站 | 国产中文字幕亚洲 | 日本黄区免费视频观看 | 97超碰在线人人 | 亚洲人成网站精品片在线观看 | 超碰99人人| 就操操久久 | 欧美激情另类文学 | av片一区二区 | 黄色在线免费观看网址 | 日韩精品免费 | 亚洲成aⅴ人片久久青草影院 | 国产日韩精品一区二区在线观看播放 | 色在线免费视频 | 久热久草在线 | 成人在线免费小视频 | 干干日日 | 精品在线视频观看 | 久草视频看看 | 久草精品在线播放 | 国产黑丝一区二区 | 精品久久久一区二区 | 国产精品美女999 | www.亚洲精品在线 | 久久国产精品99国产 | 国产又粗又猛又黄又爽视频 | 国产精品 中文在线 | 久久国产视屏 | 久久久久久久久亚洲精品 | www色片| 成人av一区二区兰花在线播放 | 国产精品18videosex性欧美 | 久久久久激情电影 | 精一区二区 | 久久久www | 天天综合人人 | 97成人在线观看视频 | 亚洲综合网站在线观看 | 久久久久久中文字幕 | 国产精品毛片网 | 一区精品在线 | 91精品国产91热久久久做人人 | 国产亚洲欧美在线视频 | 五月天天av| 97超碰在线资源 | 色婷婷激婷婷情综天天 | 国产一区网址 | 一区 二区电影免费在线观看 | av超碰在线 | 最近中文字幕免费大全 | 五月在线视频 | 午夜视频免费播放 | 精品一区二区视频 | 亚洲人精品午夜 | 亚洲精品男女 | 伊人久久av | 国产精品h在线观看 | 亚洲涩涩涩 | 六月色| 伊人中文网 | 最近最新中文字幕视频 | 婷婷播播网 | 久久综合中文字幕 | 91成人网页版| www.夜夜骑.com | 日韩高清网站 | 亚洲精品视频在线播放 | 青青河边草免费视频 | 超碰国产在线播放 | 96国产精品 | 91精品国产92久久久久 | 亚洲成熟女人毛片在线 | 狠狠色狠狠色综合日日小说 | 欧美少妇的秘密 | 午夜精品一区二区三区在线观看 | 精品一二三四视频 | 麻豆精品在线视频 | 婷婷精品进入 | 欧洲精品在线视频 | 久久精品久久久精品美女 | 国产一区欧美一区 | 综合天天色| 日本久久精品视频 | 久久久影院| av+在线播放在线播放 | 成人av亚洲 | 久久久蜜桃| 亚洲天堂毛片 | 精品一区二区影视 | 九草视频在线观看 | 欧美日韩在线电影 | 久久久久这里只有精品 | 精品超碰| 精品嫩模福利一区二区蜜臀 | 日韩欧美精选 | 久久久久久久免费观看 | 夜夜澡人模人人添人人看 | 精品不卡视频 | 久草男人天堂 | 91在线精品一区二区 | 正在播放国产精品 | 国产不卡精品视频 | 手机成人在线电影 | www.天天综合 | 免费人成在线观看网站 | 久久精品久久精品 | 久久福利小视频 | 国产在线国偷精品产拍 | 日韩羞羞 | 最近高清中文字幕在线国语5 | 亚洲综合一区二区精品导航 | 国产第一页在线观看 | 三日本三级少妇三级99 | 97成人超碰 | 在线观看岛国 | 免费在线观看av | 色综合激情久久 | 日韩免费在线观看视频 | 精品久久五月天 | 国产精品久久伊人 | 99久久久久久久 | 久久一区91 | 中文字幕永久在线 | 激情五月在线视频 | 日本韩国精品一区二区在线观看 | 人人干97| 精品国产网址 | 精品免费国产一区二区三区四区 | 精品在线视频播放 | 91av电影在线观看 | 国产精品99久久久久久人免费 | 国产99久久久精品 | 中文字幕九九 | 五月婷婷激情综合 | 91香蕉视频黄色 | 国产一二区在线观看 | 视频一区二区在线观看 | 国产乱对白刺激视频不卡 | 国产aaa毛片| 久久99国产精品久久99 | 狠狠色狠狠色综合日日小说 | 少妇精69xxtheporn | 国产精品久久久久影院 | 日本久久久久久久久 | 亚洲精品乱码白浆高清久久久久久 | 欧美成人69av| 亚洲另类视频 | 精品国产三级 | 久久国产午夜精品理论片最新版本 | 青春草免费在线视频 | 国产露脸91国语对白 | 正在播放国产91 | 久久a v视频 | 国产一区二区免费看 | 日韩在线电影一区二区 | 操高跟美女 | 久久黄色免费 | 日本中文在线 | 久久国产精品免费 | 亚洲精品午夜一区人人爽 | 国产精品一区二区av日韩在线 | 国产精品久久片 | 在线观看视频中文字幕 | 69视频永久免费观看 | 天天操天天干天天操天天干 | 欧美精品亚洲二区 | 日本久久久精品视频 | 97超碰人人模人人人爽人人爱 | 亚洲精选视频免费看 | 亚洲国产精品va在线看 | 91在线91| 美女视频黄频 | 91av视频导航 | 色丁香婷婷 | 午夜国产一区 | 欧美激情精品 | 久久久国产精品亚洲一区 | 在线观看视频你懂的 | 成人少妇影院yyyy | 免费视频久久久久 | 久久精品国产免费观看 | 午夜精品久久久久久久99无限制 | 国产精品区免费视频 | 麻豆精品传媒视频 | 高清免费在线视频 | 中文字幕观看视频 | 在线成人小视频 | 午夜久久视频 | 狠狠色噜噜狠狠狠狠2022 | 日韩有码第一页 | 麻豆视频一区 | 久久精品毛片基地 | 成人午夜剧场在线观看 | 精品福利在线观看 | av在线播放快速免费阴 | av网站免费看 | 麻花传媒mv免费观看 | 午夜免费视频网站 | 最近中文字幕免费av | 狠狠躁日日躁狂躁夜夜躁av | 亚洲天堂精品视频在线观看 | 豆豆色资源网xfplay | 国产色小视频 | 91成品人影院 | 一区二区视频电影在线观看 | 中文字幕成人在线观看 | 99免费看片 | 国产美女网站在线观看 | 91精品色| 成人在线电影观看 | 久久久午夜视频 | 精品国产一区在线观看 | 亚洲91精品 | a国产精品 | 日韩在线视频观看免费 | 国产亚洲婷婷免费 | 夜夜躁日日躁狠狠躁 | 成人app在线免费观看 | av成人在线网站 | 婷婷中文字幕在线观看 | 一级黄色片网站 | 精品视频9999| 亚洲黄色成人网 | 日韩av电影国产 | 国产一区二区三区视频在线 | 免费a现在观看 | 天天做天天爱夜夜爽 | 日本性xxxxx 亚洲精品午夜久久久 | 伊人狠狠色丁香婷婷综合 | 成人精品一区二区三区电影免费 | 国产一区二区三区午夜 | 黄色大全视频 | 亚洲精品午夜一区人人爽 | 午夜国产在线观看 | 激情深爱.com | 日日摸日日添日日躁av | 久久综合色影院 | 欧美精品久久久久a | 久久久久欠精品国产毛片国产毛生 | 91av原创| 久久久人| 毛片黄色一级 | 国产亚洲综合性久久久影院 | 国产二区精品 | 欧美在线不卡一区 | 香蕉视频免费看 | 亚洲欧美日韩国产精品一区午夜 | 国产精品 日韩 欧美 | 亚洲精品视频在线观看网站 | 综合色站导航 | 国产精品一区二区三区在线 | 国产精品毛片一区视频播不卡 | 狠狠色伊人亚洲综合成人 | 亚洲免费专区 | 日韩成人高清在线 | aaa黄色毛片 | 涩五月婷婷 | 五月天开心 | 黄色小说免费在线观看 | 国产中文字幕亚洲 | 日日夜夜天天综合 | 午夜aaaa | 国产精品久久久久国产a级 激情综合中文娱乐网 | 日韩精品资源 | 香蕉视频在线播放 | 国产精品手机视频 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 久久久综合精品 | 久久免费播放视频 | 国产精品对白一区二区三区 | 在线观看免费av网 | 五月天丁香亚洲 | 国产成人免费精品 | 欧美夫妻生活视频 | 中文永久字幕 | a视频在线观看 | 精品国模一区二区三区 | 国产精品久久久久久久婷婷 | 四虎精品成人免费网站 | 草免费视频 | av免费在线观看网站 | 国产专区视频在线 | 久久网站最新地址 | 黄色中文字幕在线 | 日av免费 | 久久久精品国产一区二区三区 | 久久婷婷一区二区三区 | 麻豆av一区二区三区在线观看 | 日韩精品在线看 | 亚洲精品成人网 | 不卡的av | 成人av中文字幕在线观看 | 成 人 黄 色 片 在线播放 | 免费看一级特黄a大片 | 国产精品1024 | 国产成人精品免高潮在线观看 | 免费在线播放黄色 | 99久久久免费视频 | 日韩激情视频在线观看 | 国产乱视频 | 91中文字幕在线视频 | 日韩欧美视频免费看 | 日韩久久视频 | 欧美另类sm图片 | 国产精品不卡一区 | 黄色91免费观看 | 3d黄动漫免费看 | 精品一区二区免费在线观看 | 97精品国产97久久久久久免费 | 国产精品日韩精品 | 久久久三级视频 | 在线观看中文字幕2021 | 成人一区在线观看 | 成人av高清在线观看 | 午夜电影av| 久久综合福利 | 亚洲综合狠狠干 | 欧美日韩不卡一区二区三区 | av电影在线观看完整版一区二区 | 成人在线视频一区 | 国产视频2021| 日韩成人高清在线 | 久久99影院| 天天超碰 | 国产一二三在线视频 | 婷婷色九月| 国内精品久久久久 | 九九色视频 | 免费午夜av | 日韩精品久久久久久 | 激情婷婷在线观看 | 色天天综合网 | 黄色大片入口 | 免费午夜视频在线观看 | 国产视频1| av中文天堂在线 | 国产男女无遮挡猛进猛出在线观看 | 天天综合成人 | 亚洲精品影院在线观看 | 国产高清精品在线观看 | 久久夜av | 国产一级片毛片 | 久久精品9 | 日本在线免费看 | 99国产成+人+综合+亚洲 欧美 | 97色狠狠 | 国产精品不卡在线 | 色狠狠操 | 99国产成+人+综合+亚洲 欧美 | 国产不卡片| 91亚洲精品久久久中文字幕 | 99热这里 | 国产精品专区h在线观看 | 人人澡人人模 | 欧美亚洲免费在线一区 | 99色资源| 婷婷午夜| 欧美色图视频一区 | 久久综合久久综合这里只有精品 | 在线你懂 | 国内精品久久久久久久久久久 | 国产精品9区 | 在线 成人 | 五月天久久久久 | 日本二区三区在线 | 超碰97人| 精品国产免费观看 | 色综合人人 | 久久99精品国产一区二区三区 | 又黄又色又爽 | 韩国av在线播放 | 97成人免费视频 | 日日操操| 亚洲h在线播放在线观看h | 精品国产一区二区三区日日嗨 | 九九免费在线观看视频 | 日韩色在线观看 | 99精品视频在线播放免费 | 最近中文字幕在线中文高清版 | 最新一区二区三区 | 亚洲a网| 天天干 天天摸 天天操 | 久久视频在线免费观看 | 色综合天天在线 | 亚洲国产视频直播 | 制服丝袜欧美 | 精品高清视频 | 人人爱人人添 | 91视频在线观看免费 | 黄网站大全 | 手机看片国产日韩 | 欧美一区二区免费在线观看 | 97视频在线观看网址 | v片在线看 | 五月婷婷国产 | 一区二区三区三区在线 | 亚洲春色综合另类校园电影 | 91理论电影 | 在线 国产 日韩 | 国产一级二级三级视频 | 天天躁日日躁狠狠 | 久久久精品小视频 | 精品免费视频 | 欧美日韩久久不卡 | 在线观看黄污 | 波多野结衣日韩 | 韩国一区二区三区视频 | 久久一区二区三区国产精品 | 亚洲国产免费看 | 国产精品com | 免费欧美高清视频 | 偷拍福利视频一区二区三区 | 亚洲国产成人在线播放 | 日本黄色免费电影网站 | 精品国产乱码 | 亚洲在线成人精品 | 中文字幕免费高清av | 国产亚洲人成网站在线观看 | 国产高清在线观看 | 三级黄色片在线观看 | 99久久毛片 | 天天天干夜夜夜操 | 九九热精品视频在线播放 | 黄色毛片大全 | 中文字幕色婷婷在线视频 | 久久老司机精品视频 | 久久久久久久影院 | 天天综合网久久综合网 | 日日夜夜精品免费视频 | 久久成人18免费网站 | 在线播放一区二区三区 | 97在线免费观看视频 | 在线v片| 亚洲免费在线 | 久久久久成人精品 | 国产免费观看久久黄 | 99精品视频一区二区 | 五月婷婷六月丁香 | www.av免费| 久久视频 | 久操97| 亚洲国产精品久久久久 | 欧美在线free| 中文字幕一区av | 日本不卡123区 | 免费av看片 | 久久久久久免费视频 | 日韩电影在线观看中文字幕 | 亚洲第一伊人 | 69av免费视频 | 免费看黄在线看 | 久久视频国产精品免费视频在线 | 又黄又刺激视频 | 久久综合射 | 国产精品毛片一区视频 | 日日狠狠 | 午夜精品视频免费在线观看 | 免费看在线看www777 | 午夜婷婷综合 | 狠狠色丁香婷婷 | 九九涩涩av台湾日本热热 |