MongoDB
Release Notes
MongoDB 3.6 搶先看
2017/11/17 19:28:40
0
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 有)