mongoDB,使用手冊

定位

作爲非關係型數據庫
經常與mysql對比

優點

  • 擴展方便, 沒有表結構的概念,隨意增加字段(可以隨意 但是不要隨意)
  • 單集合事務性能 + 非事務增刪改性能均優於mysql
  • 天生支持橫向擴容 sharding(分片)

缺點

  • 跨集合事務性能低。官方推薦使用嵌套文檔,代替關係型數據庫中的關聯設計。但是設計時要注意不要把增長空間比較大的數據設計爲嵌套文檔, 首先設計上可能不合理,其次增長空間比較大的嵌套文檔,優化和統計查詢起來都比較麻煩。

搭建與配置

搭建參照官方文檔
生產使用注意事項:

  • 優先使用雲服務
  • 自建的話正式環境需要創建副本集,避免單節點崩潰
  • mogno 默認無密碼, 未配置授權時不要綁定外網ip
  1. 副本集

    1. 如果少數成員發生故障,則副本集仍然可以同時執行寫操作和讀操作。
      但是,如果擁有大多數成員的數據中心發生故障,則副本集將變爲只讀。
  2. 分片

    分片至少需要兩個分片才能分發分片的數據。如果您計劃在不久的將來啓用分片,但是在部署時不需要,則單個分片集羣可能會很有用。

    1. 配置
      1. 配置服務器部署爲3個成員副本集
      2. 將每個碎片作爲3個成員副本集進行部署
      3. 部署一個或多個mongos路由器
    2. 啓動順序
      1. configsvr 必須是副本集 配置服務 元數據
      2. shardsvr 必須是副本集
      3. mongos 網關

注意事項

  1. 索引
    1. mongo 不只是mongo, 查詢一定要命中索引
    2. 注意要有效的使用索引, 命中索引的同時,要控制索引的命中範圍,範圍過大等於沒有索引
    3. 創建索引時要指定 background:true, 避免表數據量大卡住數據庫
      # 查看user_mobile_info表索引創建 進度
      db.currentOp({"command.createIndexes":"user_mobile_info"}) 
      
    4. mongo的查詢不會像mysql一樣自動做類型轉換, 查詢時一定要使用對應類型(字符|數字)
    5. 一個字段可以同時存在字符類型和數字類型,使用時增改要特別注意
    6. 合理利用索引的expireAfterSeconds參數
    7. 所有索引都通過spring-data 註解創建,在編程時查看比較直觀
  2. 事物
    1. 4.2版本之後事務支持比較完整,但跨集合事務有性能問題
  3. 磁盤釋放
    1. remove 不會釋放磁盤空間(繼續佔用會重複利用)
    2. drop 會釋放部分磁盤空間
    3. repairDatabase 會重建空間和索引但是!
      1. 會鎖住整個庫
      2. 需要50%+ 的額外空間
      3. 時間較長
      4. 其他同類操作也會鎖住庫 或 表

    庫表內存佔用比較大時空間釋放會很麻煩、所以建立數據庫時一定要做副本集!
    逐個副本 repairDatabase 就沒有什麼問題了

mongodDB故障排查

  1. mongodDB崩潰
    1. 檢查日誌文件排查具體問題(文件路徑在啓動時指定)
    2. 重新啓動,注意指定配置文件
    3. 優先考慮機器內存問題
  2. mognoDB卡頓
    1. 優先考慮索引問題, 以及網絡問題
    2. 可以先從整體來看是寫入還是讀問題,使用mongostat 類似於UNIX / Linux文件系統實用程序vmstat,位於安裝 目錄/bin 目錄下
    3. 通過慢日誌查看具體問題,查看慢日誌
      1. 常用命令
      # 查看慢日誌是否開啓,以及級別和時間(毫秒) 
      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})
      
    4. 通過mongo日誌查看有無異常
    5. 排查系統 網絡 cpu 磁盤 內存 是否存在異常
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章