定位
作爲非關係型數據庫
經常與mysql對比
優點
- 擴展方便, 沒有表結構的概念,隨意增加字段(可以隨意 但是不要隨意)
- 單集合事務性能 + 非事務增刪改性能均優於mysql
- 天生支持橫向擴容 sharding(分片)
缺點
- 跨集合事務性能低。官方推薦使用嵌套文檔,代替關係型數據庫中的關聯設計。但是設計時要注意不要把增長空間比較大的數據設計爲嵌套文檔, 首先設計上可能不合理,其次增長空間比較大的嵌套文檔,優化和統計查詢起來都比較麻煩。
搭建與配置
搭建參照官方文檔
生產使用注意事項:
- 優先使用雲服務
- 自建的話正式環境需要創建副本集,避免單節點崩潰
- mogno 默認無密碼, 未配置授權時不要綁定外網ip
-
副本集
- 如果少數成員發生故障,則副本集仍然可以同時執行寫操作和讀操作。
但是,如果擁有大多數成員的數據中心發生故障,則副本集將變爲只讀。
- 如果少數成員發生故障,則副本集仍然可以同時執行寫操作和讀操作。
-
分片
分片至少需要兩個分片才能分發分片的數據。如果您計劃在不久的將來啓用分片,但是在部署時不需要,則單個分片集羣可能會很有用。
- 配置
- 將配置服務器部署爲3個成員副本集
- 將每個碎片作爲3個成員副本集進行部署
- 部署一個或多個mongos路由器
- 啓動順序
- configsvr 必須是副本集 配置服務 元數據
- shardsvr 必須是副本集
- mongos 網關
- 配置
注意事項
- 索引
- mongo 不只是mongo, 查詢一定要命中索引
- 注意要有效的使用索引, 命中索引的同時,要控制索引的命中範圍,範圍過大等於沒有索引
- 創建索引時要指定 background:true, 避免表數據量大卡住數據庫
# 查看user_mobile_info表索引創建 進度 db.currentOp({"command.createIndexes":"user_mobile_info"})
- mongo的查詢不會像mysql一樣自動做類型轉換, 查詢時一定要使用對應類型(字符|數字)
- 一個字段可以同時存在字符類型和數字類型,使用時增改要特別注意
- 合理利用索引的expireAfterSeconds參數
- 所有索引都通過spring-data 註解創建,在編程時查看比較直觀
- 事物
- 4.2版本之後事務支持比較完整,但跨集合事務有性能問題
- 磁盤釋放
- remove 不會釋放磁盤空間(繼續佔用會重複利用)
- drop 會釋放部分磁盤空間
- repairDatabase 會重建空間和索引但是!
- 會鎖住整個庫
- 需要50%+ 的額外空間
- 時間較長
- 其他同類操作也會鎖住庫 或 表
庫表內存佔用比較大時空間釋放會很麻煩、所以建立數據庫時一定要做副本集!
逐個副本 repairDatabase 就沒有什麼問題了
mongodDB故障排查
- mongodDB崩潰
- 檢查日誌文件排查具體問題(文件路徑在啓動時指定)
- 重新啓動,注意指定配置文件
- 優先考慮機器內存問題
- mognoDB卡頓
- 優先考慮索引問題, 以及網絡問題
- 可以先從整體來看是寫入還是讀問題,使用mongostat 類似於UNIX / Linux文件系統實用程序vmstat,位於安裝 目錄/bin 目錄下
- 通過慢日誌查看具體問題,查看慢日誌
- 常用命令
# 查看慢日誌是否開啓,以及級別和時間(毫秒) PRIMARY> db.getProfilingStatus() { "was" : 1, "slowms" : 200 } #查看級別 0 – 不開啓 1 – 記錄慢命令 (默認爲>100ms) 2 – 記錄所有命令 PRIMARY> db.getProfilingLevel() 1 # 設置級別和時間 PRIMARY> db.setProfilingLevel(1,200) { "was" : 2, "slowms" : 100, "ok" : 1 } # 案例(排除了某些表的慢日誌結果,並按耗時大小排序(毫秒)) db.system.profile.find( { millis : { $gt : 100 }, ns:{$nin:["imoney.accountCheck","imoney.accountPay"]} } ).sort({millis:-1})
- 通過mongo日誌查看有無異常
- 排查系統 網絡 cpu 磁盤 內存 是否存在異常