MongoDB Release Notes

MongoDB 3.6 搶先看

莊興旺 2017/11/17 19:28:40
1056

MongoDB 3.6 搶先看


簡介

介紹 MongoDB 3.6 新增功能和改進部分

作者

莊興旺


MongoDB 3.6 搶先看

前言

距離 10/19 (四) 在納斯達克首次公開募股不到一個月,MongoDB 一如往常於年底發布新版本。
今年是在 11/8 (三) Announcing MongoDB 3.6,目前是 rc4,正式版本預期 12 初就會正式上線。
因此,就讓小編先為各位看官, 翻譯介紹有哪些新功能和改進項目。

Security

預設綁定本機 (Default Bind to Localhost)

  • 從 3.6 開始,執行檔 mongod 和 mongos 預設綁定本機。
    註. 從 2.6 開始,原本只有透過 RPM 和 DEB (軟體套件管理系統)安裝的 MongoDB Instances,才會預設綁定本機。
加強安全性 ( Additional Security Enhancements)
  • 在使用 TLS/SSL 加密的時候,添加了 opensslCipherConfig 參數,可以設定 cipher string,決定將使用哪種類型的加密演算法。
  • 如果開啟身分驗證 (authentication),用戶只能對自己建立的 cursor 執行 getMore 指令。
  • db.createUser() 和 db.updateUser() 增加 authenticationRestrictions  參數。
    當 DB 用戶連線時, 限制 Client 或 Server 端的 IP。
  • restore 角色(role),增加 convertToCapped 操作(action)。

Aggregation

加強 $lookup  ( More Expressive $lookup)
  • 增加 let 和 pipeline 參數,支持 (1) 多組 join 條件  (2) 非關聯子查詢。
新的聚合階層 (New Aggregation Stages)
  • $listSessions
  • $listLocalSessions
  • $currentOp
新的聚合操作符 (New Aggregation Operators)
  • $arrayToObject
  • $objectToArray
  • $mergeObjects
  • $dateFromString
  • $dateFromParts
  • $dateToParts
新的聚合幫手 (New Aggregation Helper)
  • 增加 db.aggregate() 方法,用在 "管理/診斷" 的管道上,聚合一些非 Collection 指令的回傳結果。
    eg. $currentOp, $listLocalSessions
新的聚合變數 (New Aggregation Variable)
  • REMOVE 變數,用在 $cond 操作符,根據條件排除某些欄位。
新的聚合選項 (New Options)
db. coll.aggreagate() 新增下列可選項目
  • hint 指定索引 (不支持 $lookup, $graphLookup 階段)
  • comment 增加註解,有利於 profiler, currentOp, logs 追蹤此次操作。
支持時區 (Support for Time Zones)
  • 日期相關操作符,增加支持 timezone 欄位。

Array Update Operator Enhancements

篩選陣列中的元素 (arrayFilters)
  • 主要是 findAndModify 和 update 指令,及其對應的 collection 方法等,可以透過 arrayFilters 操作符,過濾出 Array 欄位中,符合條件的元素做修改。
同時更新陣列中的多個元素 (Multi-Element Array Updates)
新增定位操作符來處理在 Array欄位中的更新操作。
  • $[] 表示所有的元素
  • $[<identifier>] 代表符合條件的元素,搭配 arrayFilters 做元素更新。
反向定位 Array 中的位置做 push (Negative Array Index Position for push)
  • update 指令中的 push 操作,加強 $position 修飾符功能 (輸入負數),使其從 Array 尾端開始計數,決定 push 元素位置。

Sessions

支持 sessions(會話) 中的 causaul consistency (因果一致性),表示當讀取和確認寫入的操作有因果關係時,用戶程序能啟動一個會話,將有關聯的操作放在此會話中。並必須保證在此會話中,有關聯的操作只能由一個線程依序執行 。
 
新增會話指令 (Sessions Commands)
  • endSessions
  • killAllSessions
  • killAllSessionsByPattern
  • killSessions
  • refreshSessions
  • startSession
mongo Shell 的改變 (mongo Shell Changes)
讓 mongo shell 的 sessions,將 retryable writes 作為預設:
  • mongo 執行檔多了命令行選項 --retryWrites
mongo shell 裡的 Mongo() 連線物件,新增方法如下:
  • Mongo.isCausalConsistency()
  • Mongo.startSession()
  • Various Session methods
  • Various SessionOptions methods
聚合階層 (Aggregation Stages)
  • 新增聚合管道階層,前面提過的 $listSessions, $listLocalSessions 操作符。
指令選項 (Command Options)
適用所有 Database Commands
  • lsid
  • txnNumber
限於寫操作指令 (insert, update, delete)
  • stmtIds
參數 (Parameters)
新增 mongod, mongos 啟動時,session 相關參數
  • logicalSessionRefreshMinutes
  • localLogicalSessionTimeoutMinutes (測試階段)

JSON Schema

  • 新增 $jsonSchema 操作符,透過 JSON Schema 來支持文檔驗證 (document validation),搭配 db.createCollection() 的 validator 選項使用。
    此資料格式不向下相容,因此須執行 db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } ) ,才能啟用此功能。

Replica Sets

  • 棄用副本集協議版本0 (pv0)
  • 新增 replSetResizeOplog 指令,使用 WiredTiger Engine 的副本集,可動態調整 oplog 的大小,無須重啟 db instances。
  • 新增 catchUpTakeoverDelayMillis 配置選項。預設為 30 秒,當 Secondary 進度較新時,等待 Primary 追趕較新的操作。
    當超過此配置時間,並符合下列條件,此 Secondary 將發動選舉 (推薦自己為新的 Primary):
    1. Secondary 的操作仍比 Primary 新
    2. 是所有可用節點中,擁有最新的操作。
    3. Primary 正在追趕它的操作。
  • 當 Secondary 優先程度高於 Primary 時,且操作時間相差不超過 10 秒,則 Secondary 將發動選舉。
    此時根據 catchUpTimeoutMillis 配置時間,將新選出的 Primary 同步其他成員較新的操作 (此時新 Primary 無法執行寫操作)。
    此配置時間設置越長,則減少其他成員 rollback 筆數,但增加 failover 時間。
  • 副本集協議版本 (pv1),仲裁者(arbiter)發現健康地 Primary,其優先程度高於候選人,將投反對票 (vote no)。
  • 增加 oplogInitialFindMaxSeconds 參數,調整副本集成員在資料初始同步期間,等待 find 指令結束的時間上限。

Sharded Clusters

  • mongos 增加 ShardingTaskExecutorPoolMaxConnecting 參數,設定 TaskExecutor 到某一 mongod instance 的連接數。
    此數值不可大於 ShardingTaskExecutorPoolMaxSize 數值,若違反,將以後者為準。
    註:TaskExecutor 可視為任務調度器,由 mongos 向 shard 發送請求,將請求丟給調度器,然後等待任務完成。

General Enhancements

集合識別碼 (Collection Identifier)
  • 當集合創建時,會分配一個通用唯一識別碼 (UUID),而且不能被改變。 
新的操作符 (New Operators)
新增下列查詢操作符:
  • $jsonSchema (前面提過)
  • $expr 讓 find() 使用聚合表達式
刪除操作符 (Removed Operators)
  • 刪除從 2.4 版棄用的 $pushAll
索引 (Indexes)
  • 索引可以覆蓋嵌套文檔中字段的查詢
  • 多鍵索引可以覆蓋對非陣列欄位的查詢
  • 創建索引時,將不支持 *(星號) 命名
指令 (Commands)
  • 增加 listDatabases 指令的選項:
    * nameOnly 為真,只返回資料庫名稱。
    * filter 過濾符合條件的資料庫資訊。
  • 修改 validate 指令欄位 full 的效果,只有當 full 為真,WiredTiger 儲存引擎,才會強制建立 checkpoint,刷新所有記憶體內的資料到硬碟,檢查硬碟內的資料。
  • system.profile 中,update 和 delete 的條目,包含完整執行時 update/delete 文檔內容。
  • dropDatabase 指令會等待多數副本集成員刪除所有集合後,才回報成功。
  • 對副本集或分片叢集,執行 db.runCommand 和 db.adminCommand,返回文檔多了 operationTime 和 $clusterTime 資訊。
線協議和壓縮 (Wire Protocol and Compression)
  • 新增 OP_MSG (wire protocol opcode)
  • 網路傳輸支持 zlib 壓縮函式庫。
    註. mongod, mongos, mongo shell 都有 --networkMessageCompressors 選項,資料傳輸的兩端都需啟動相同的壓縮方式,否則訊息將不會壓縮。
    註. 根據通訊發起端的壓縮清單排序優先,eg. mongo 使用 zlib, snappy, mongod 使用 snappy, zlib,則使用 zlib 壓縮。
  • mongod, mongos, mongo shell 將預設使用 snappy 壓縮函示庫。
讀關注 (Read Concern)
  • 預設啟用 "majority" 讀關注,棄用 --enableMajorityReadConcern 參數 (失效)
  • 新增 afterClusterTime 選項,只有當 level 為 "majority" / " local" 時適用。
診斷捕獲 (FTDC)
  • mongos 記錄診斷資訊到系統日誌 (原本只有 mongod 有)
莊興旺