如何學習MongoDB?
MongoDB日趨流行,作為一個開發/運維,如何快速上手MongoDB?或者有哪些推薦的學習MongoDB的方式?
寫在最前:請使用mongodb 3.2或以上版本進行學習,或者直接從3.4開始。另外,百度出來的中文資料,請查看15年及以后的信息,可以少走很多彎路。另外,建議使用linux系統進行學習,方便排錯。
英文比較好的小伙伴:
如果英語不好,建議先花時間學英語
1. 強烈推薦MongoDB官方的教程,MongoDB在線大學,無論開發還是DBA,都可以找到適合自己的視頻教程。因為視頻有英語字幕,聽不懂的同學,多多暫停,看一下字幕都能理解。
每節課結束都有相應的作業,可以自己用來練手。而且作業都會有類似一鍵腳本的東西,幫你配置好需要的實驗環境。完成作業后,會有不少成就感,讓自己可以有學下去的動力。另外,每次作業和最后的考試都通過會有一張結業證書。
最后,MongoDB官方的新員工也是從這里開始學習的,而且課程更新頻率也很高。
2. MongoDB的官方文檔,文檔地址,選擇自己想要看到章節,文檔的內容寫的很詳細,而且有的地方直接提供web shell的環境,讓你實際操作。
3. MongoDB工程師網站,網站地址,這里可以深入看到一些MongoDB原理的內容。此外也推薦看percona公司關于MongoDB的一些博文
看到英語就頭疼的小伙伴:
暫時沒找到較好的基礎視頻教程,IT大咖說上面有MongoDB使用案例的視頻,可以一看,不過不適合初學,需要有一定的基礎。
1. 先從看書開始,強烈推薦《MongoDB實戰 第二版》,因為這本書是3.x版本的,相對來說內容比較新。然后《MongoDB權威指南 第二版》,這本內容蠻多的,不過已經過時了。《MongoDB應用設計模式》關于MongoDB設計適用的書,非常短,值得一看。
2. MongoDB中文社區有部分官方文檔的翻譯。
3. MongoDB中文社區的公眾號及博客,云棲社區MongoDB板塊
mongodb使用場景
Mongodb是最近流行的NOsql數據庫,但一直對其用在什么場景合適而不清楚。主要知道這個數據庫是快速開發很合適。但一直歸屬到大數據板塊,想要咨詢下Mongodb適用的場景有哪些?在大數據板塊充當什么角色哪?
常見應用場景:
1. 最近單的入手就是存log,因為mongodb本身存的就是json,可以很方便的接入各種存儲日志的地方。然后可以做成相關監控報表,比如說APM,NPM等,比如說千尋位置
2. 其他的話要看題主所在的行業了,不同的行業有不同的用法,比如說信息的展示等等
3. 在網游界,MongoDB也非常流行,比如說最近大火的陰陽師,數據庫用的就是MongoDB
大數據方面,MongoDB有以下三個優勢:
1. 自帶sharding,快速得水平擴展,為存儲海量數據帶來便捷
2. 官方提供驅動,可以直接對接hadoop或者spark
客戶場景
1、用在應用服務器的日志記錄,查找起來比文本靈活,導出也很方便。也是給應用練手,從外圍系統開始使用MongoDB。
2、在一些第三方信息的獲取或者抓取,因為MongoDB的schema-less,所有格式靈活,不用為了各種格式不一樣的信息專門設計統一的格式,極大得減少開發的工作。
3、主要用來存儲一些監控數據,No schema 對開發人員來說,真的很方便,增加字段不用改表結構,而且學習成本極低。
4、使用MongoDB做了O2O快遞應用,·將送快遞騎手、快遞商家的信息(包含位置信息)存儲在 MongoDB,然后通過 MongoDB 的地理位置查詢,這樣很方便的實現了查找附近的商家、騎手等功能
特性及優勢
?
行業應用
從目前 阿里云MongoDB云數據庫 上的用戶看,MongoDB 的應用已經滲透到各個領域,比如游戲、物流、電商、內容管理、社交、物聯網、視頻直播等,以下是幾個實際的應用案例。
游戲場景:使用 MongoDB 存儲游戲用戶信息,用戶的裝備、積分等直接以內嵌文檔的形式存儲,方便查詢、更新
物流場景:使用 MongoDB 存儲訂單信息,訂單狀態在運送過程中會不斷更新,以 MongoDB 內嵌數組的形式來存儲,一次查詢就能將訂單所有的變更讀取出來。
社交場景:使用 MongoDB 存儲存儲用戶信息,以及用戶發表的朋友圈信息,通過地理位置索引實現附近的人、地點等功能
物聯網場景:使用 MongoDB 存儲所有接入的智能設備信息,以及設備匯報的日志信息,并對這些信息進行多維度的分析
視頻直播:使用 MongoDB 存儲用戶信息、禮物信息等
如果你還在為是否應該使用 MongoDB,不如來做幾個選擇題來輔助決策:
目前云數據庫 MongoDB 版:支持三節點副本集容災切換、自動備份、一鍵式的數據恢復。支持彈性擴容、提供資源監控
關于mongodb的幾個熱點問題
能提供幾個mongodb的案例嗎?
國外的例子太多,在mongodb的官網上就有,無論是金融、傳統等行業,我這里說一下國內的案例
金融:
非核心業務的話幾乎每家知名企業都在嘗試使用,比如某國有銀行用在了apm系統,平安科技用在了內部系統和日志系統。核心業務的話互聯網金融企業考拉理財的大多數業務都在mongodb上
傳統:
這一塊了解不多,目前知道東方航空用在了下一代旅客服務系統
互聯網:
互聯網使用的企業非常多。媽媽幫的核心系統,小紅書的核心系統,高德的app展示,千尋位置的日志收集分析,Teambition的核心系統,陰陽師的數據庫,360的移動搜索等
Mongodb相對hbase、MySQL來說,有哪些優勢?
這里就簡單說一下題主說的幾個數據庫中,mongodb優勢的地方
vs hbase:
hbase是基于row key存儲寬列的一款nosql,乍一看結構類似mongodb的_id主鍵和可變長的列數量。
具體的原理和區別這里不展開。
mongodb的優勢在于輕量化部署非常簡單,不用像hbase那樣搭一整套hadoop集群,即開即用。hbase更適合離線的海量數據分析
vs mysqlpg:
這兩款都是關系型數據庫,所以放在一起比較。
MongoDB的優勢主要有3個。
1、結構靈活,表結構更改比較自由,不用每次alter的時候付出代價,適合業務快速迭代,而且json原生和大多數的語言有天然的契合。還支持數組,嵌套文檔等數據類型
2、自帶高可用,自動主從切換(副本集)
3、自帶水平分片(分片),內置了路由,配置管理。應用只要連接路由,對應用來說是透明的。
MongoDB是否支持事務?
MongoDB只支持行級的事務,或者說支持原子性,單行的操作要么全部成功,要么全部失敗。
需要事務的話,得自己用代碼實現二次提交作,模擬事務的功能,官方文檔有相關的說明。
https://docs.mongodb.com/manual/tutorial/perform-two-phase-commits/
這里放一個小彩蛋,因為WiredTiger引擎本身支持事務,官方正考慮在MongoDB上實現事務。
MongoDB黑客勒索事件是怎么回事?
這次鬧的沸沸揚揚的黑客事件主要是用戶自己的MongoDB沒有打開用戶驗證,而且把MongoDB保護在公網。打個比方就是你家住在鬧市區,晚上沒人的時候,門還沒鎖,然后就被小偷光顧了。
要解決問題很簡單,首先,千,萬,不,要把MongoDB暴露在公網,如果要外網訪問,無論是vpn還是ssh隧道都行。
此外,打開Mongodb的驗證,這樣所有操作都要用戶名密碼了但是短連接會因為驗證造成資源損耗,這里就自己權衡了。阿里云和騰訊云針對這個問題都做了優化。
MONGODB數據庫備份只能用mongodump嗎?
常用而且通用的方法就是mongodump
備份還有這幾種方法:
1. mongoexport(這個是邏輯備份,備份出json和csv)
2. 做磁盤快照
3. 停機后冷拷貝
Mongo大數據遷移方案,遷移過程中需要注意什么,集群的時候呢?
你的遷移是指怎么遷移?一般來說mongodump來遷移即可。
集群遷移的話,建議直接在目標服務器上面搭建從節點。全部搭建完之后,把新的從節點升級為主節點,再把老機器剔除出集群。
不過如果數據量太大,而且平時數據更改很頻繁的話,初始化同步的過程可能Oplog不夠用。
方案1
先升級到3.4版本,這個版本在初始化同步的時候會抓取oplog
方案2
停機一臺從節點,物理復制到局域網中心機器,當從節點啟動
這臺從節點配置一個大oplog,然后遷移目標端的從節點從這臺oplog從節點同步
MONGODB的水平擴展是什么原理?
MONGODB的水平擴展是依賴什么原理哪?如果由于前期規劃不足,導致需要通過擴容的方式提高MOGODB的能力,在給他水平擴展的時候是否復雜哪?是否將原有數據重新同步?是否可以在線處理哪?
MongoDB的水平擴展主要依賴的原理相當有一個config組件負責管理元數據的位置,然后mongo的路由會從config取得數據所在或者應該在的數據節點位置,從而去對應的數據節點讀寫(路由本身也會有緩存)
我這里只是簡單的說明,具體可以看官方文檔sharding一章節
水平擴展的步驟不算復雜,不用將數據重新同步(但是從單點到副本集還是要做同步的),整個過程可以在線處理(不過3.4開始,在設置為sharding模式的時候需要滾動重啟一下mongod進程,加上shardsvr的配置)
mongodb集群實際應用中如何選擇片鍵和索引?
分片方式有兩種:
1. 范圍分片:這個類似分區表,合適的分片條件可以增加查詢性能,更優的設計可以優化寫入性能。
比如說數據1、2在節點a,數據3、4、5在節點b,數據6、7在節點c
2. hash分片:使數據均勻落在不同的分片節點上,優化寫入性能,但是讀的話需要掃所有節點
好的片鍵需要以下的考量:
1. 片鍵中文檔盡可能的少,避免單chunk過大,這個會導致無法balance
2. 片鍵離散分布,這樣可以在不同的節點寫入(避免自增主鍵或者時間戳單獨的做片鍵,這樣會存在寫入熱點問題)
3. 大多數的查詢的條件要包含你的分片條件
舉一個例子:
一個日志記錄系統,有hostname,timestamp,message等信息,經常會有查詢需求,這里用范圍分片
很多人可能會直接拿timestamp做范圍片鍵,這樣可以覆蓋到常見的時間查詢需求,但是所有寫的請求都落到同一臺,造成熱點問題。而且查hostname的時候會掃描所有節點。
好的方案就是選擇hostname和timestamp做一個聯合的分片條件,一來數據分布更均勻,二來基于主機和時間的查詢也可以優化到。
MongoDB如何進行升級?
這里升級以副本集為例
小版本升級:
非常簡單,直接停機,替換二進制文件,啟動即可。先升級從節點,再升級主節點,避免業務中斷。
大版本升級(不更換存儲引擎):
也是直接替換即可,有的版本(如升級到3.4),想啟動新版本功能,需要執行
db.adminCommand( { setFeatureCompatibilityVersion: “3.4” } )
大版本升級(換存儲引擎):
數據文件需要重做,新建從節點,升級那個從節點的二進制文件,配置使用新的引擎,將數據完整的同步,然后該從節點升級為主節點,其他節點正常升級。
不建議跨大版本升級,否則會有不確定的問題。
最后,官方文檔非常詳細,一步一步的操作都有
https://docs.mongodb.com/manual/release-notes/3.4-upgrade-replica-set/
Mongodb升級報錯?
mongodb副本集從2.6升級到3.0,密碼驗證升級了 報如下錯誤
Failed to authenticate xxx@xxxx with mechanism MONGODB-CR: AuthenticationFailed MONGODB-CR credentials missing in the user document
應該如何解決呢? 是把原來的用戶刪了,用3.0的在創建一個一樣的用戶嗎? 有沒有更好的辦法呢?
原因是因為3.0開始mongodb的認證加密模式從Mongodb-cr改到了sha1
治標方法:
先關閉驗證,然后把
admin庫中system.version表的
{ “_id” : “authSchema”, “currentVersion” : 3 }
那個currentVersion改成3(默認是5),就可以了
治本方法:
1. 升級客戶端的驅動(遲早要升級了,不然不支持新功能)
2. 上面那個currentVersion別動
參考:https://jira.mongodb.org/browse/SERVER-17459
MongoDB在出現負載過高的情況下如何處理?
原來遇到過一次mongodb負載過高的情況,主庫和從庫的負載突然就上來了,CPU占有率都到了100%,這種情況下,如何處理?mongodb是做的副本集,但是主庫和從庫這個時候是負載同時來的。
簡單點看db.currentop,看mongotop和mongostat,currentop相當于當前所有在執行的任務,看一下是在執行什么,有多少數量。也可以去slowlog里面看是否有記錄,然后mongotop和mongostat是用來查看和平時比有什么異常信息。
可能的情況有連接數突然變高,查詢突然變多,有一種查詢沒有索引,建立大表的索引等等。
評論