于吉吉的技術博客

          建造高性能門戶網

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            65 隨筆 :: 6 文章 :: 149 評論 :: 0 Trackbacks
               不知不覺房產系統已經使用MongoDB一年多了,記得一年多以前,正是NOSQL被熱炒時,MongoDB更是作為NOSQL中的佼佼者,被炒得火燙,也應該就在當時被這股火燙著了,所以義無反顧的選擇了MongoDB,現在想想當時確實有些沖動了,當時MongoDB的資料還是比較少,更別說中文資料了,后來還出現使用MongoDB成功應用的范例Foursquare的宕機事件?,F在確實應該很感謝MongoDB為我們的系統服務了一年了,在這一年的時間里,確實出現過不少的小問題,特別是在管理操作上,我想這大概也是因為MongoDB在系統維護上不如Mysql那樣有著各種的業界實踐,往往就只能通過管理員自己去摸索。
          下面將在這一年的一些簡單的管理操作做一下記錄


          Starting and Stopping Mongo

          MongoDB啟動
          對了,MongoDB在linux下是無需安裝的,從官網上下載下安裝包后解壓,直接執行mongod,就可以啟動MongoDB服務器,當然mongod還有很多的啟動選擇項,運行mongod --help就可以查看所有的選擇項。

          -f [ --config ] arg   configuration file specifying additional options
          一般來說,啟動選擇項可以直接寫在在mongod后面,也可以指定配置文件,用文件來加載各種啟動項,如
          /home/mongodb/bin/mongod --config /home/mongodb/conf/mongod.conf

          上面是一臺測試機的啟動選擇項。

          dbpath = /home/mongodb/data
              指定數據庫的存儲目錄,如果不設置則以mongodb的根目錄為目錄,當MongoDB啟動之后,在數據庫的存儲目錄下會創建一個mongod.lock文件,它是用來記錄當前的mongod的進程號,同時也用于區分各個mongod的進程實例,所以不同的mongod進程實例是不能用相同的dbpath。
          logpath = /home/mongodb/mongodb.log
              指定日志輸出的路徑,如果沒有設置logappend = true,系統會清除原來的日志記錄,把已有的文件進行覆蓋。
          logappend = true
              日志以追加的方式進行記錄
          bind_ip = 192.168.86.111
              指定對外服務的綁定ip,這里指定內網的ip方式,如果外網無特殊的處理方式是無法進行連接。
          port = 27017
              指定服務器的監聽端口號,默認是27017,如果單個機器要運行多個mongod進程,則需要給每個進程指定不同的端口號。
          fork = true
              指定以守護進程的方式來啟動MongoDB,如果不指定,在啟動mongod命令是加“&”也是可以的。
          auth = true
              啟動mongodb客戶端登錄的認證機制。
          master = true
              指定該機器為主從模式下的主機器。
          配置完配置文件后啟棟mongod,啟動時要盯著日志文件看,因為日志通常會告訴我們一些錯誤或警告的信息,這樣能夠更好的幫助我們了解和避免錯誤。


          這里給出了個提示,使用的是32位的Mongodb,所以MongoDB只是存儲最大為2GB的數據。其實這個跟MongoDB的mmap機制有關,如果是64位則不會存在這種限制。
          請注意一定要盯著日志看
          tail -100f /home/mongodb/mongodb.log

          停止MongoDB
          千萬要強調的是千萬不要使用kill -9去關閉mongod!這樣數據庫會不理一切直接殺死該進程,會使得數據文件損壞。
          穩妥的方法是使用kill -2 pid去關閉mongod,也就是當mongod進程接受到關閉指令后會等待當前運行操作或文件分配等操作完畢后,關閉所有打開的連接,并將緩存的數據刷新到磁盤后才正式關閉。
          最穩妥的方式是使用shutdown命令來結束
          > use admin
          switched to db admin
          > db.shutdownServer();

          Security and Authentication

          打開mongodb.org的Security文檔,第一句話就是 Running Without Security(Trusted Environment),跟我們強調世界上沒有什么百分百安全的環境,最好的安全是放在一個安全的環境中運行,這么無底氣的話語未免也讓人為它的安全擔心,不過事實上MongoDB還是有安全認證模式的,只不過跟mysql對比起來有一點簡陋。

          MongoDB的安全
          MongoDB目前只支持最基本的安全認證,如果我們開啟了安全性檢查,則只有數據庫認證用戶才能進行讀寫操作,當然我們還可以創建讀寫權限用戶和只讀權限用戶,如果我們在admin的數據庫中進行創建用戶,那么admin中的用戶就會被當作超級用戶,超級用戶可以讀寫所有的數據庫,并且還可以進行特殊的管理操作,比如可以再創建其他用戶關閉進程等操作。

          配置MongoDb用戶認證
          根據官網上的例子,我們也來創建一個超級用戶,一個test庫中具有讀寫操作的普通用戶,一個test庫中只有讀操作的普通用戶。

          > use admin
          switched to db admin
          > db.addUser(
          "cyz","abc")
          {
                  
          "_id" : ObjectId("4dba5fe7c6792ae30fea3c31"),
                  
          "user" : "cyz",
                  
          "readOnly" : false,
                  
          "pwd" : "8658a5bf469e005b047560619ef0d51c"
          }
          > use test
          switched to db test
          > db.addUser(
          "cyz001","abc")
          {
                  
          "user" : "cyz001",
                  
          "readOnly" : false,
                  
          "pwd" : "7a597bef551027cc2161d5e0efe4049e"
          }
          > db.addUser(
          "cyz002","abc",true)
          {
                  
          "user" : "cyz002",
                  
          "readOnly" : true,
                  
          "pwd" : "2dde0a3777cd7dd92459a6c3f98afac6"
          }
          這里cyz是在admin庫中創建,屬于超級用戶,可以對所有庫進行操作,在test庫中創建的cyz001和cyz002屬于test庫的操作人員,只能對test庫進行相應操作,記得要為安全驗證生效需要將啟動項auth設置為true。

          查看用戶
          所有的用戶信息都存儲在每個數據庫的db.system.users中,可以使用find()進行查看
          > use admin
          switched to db admin
          > db.system.users.find()
          "_id" : ObjectId("4dba5fe7c6792ae30fea3c31"), "user" : "cyz", "readOnly" : false, "pwd" : 

          "8658a5bf469e005b047560619ef0d51c" }

          其中的pwd是根據用戶名和用戶密碼生成的散列值。

          修改用戶
          不管是添加用戶,修改用戶密碼,修改用戶操作權限都使用addUser()來完成。刪除用戶可以用remove()來實現。
          > db.system.users.find({"user":"cyz001"})

          更多的安全考慮

          剛說了MongoDB的安全認證其實還是簡陋的,所以我們還是有其他很多的安全考慮。
          1.比如說MongoDB傳輸協議是不加密的,如果需要加密的話,我們可以考慮使用ssh隧道或是他們的技術來對客戶端和服務端之間的通訊進行加密。
          2.將MongoDB部署在只有客戶端服務器才能訪問到的環境,比如內網,vpn網絡中,可以使用 bind_ip = 本機或內網 。
          3.如果確實需要將MongoDB暴露在外部環境可以考慮使用IPTABLES等技術進行訪問限制。

          Monitoring and Diagnostics

          官網首先給我們推薦了mongostat監控工具,基本上mongostat可以作為一個外部觀測MongoDB內部狀態指標的工具,并且一秒更新一次,如果出現一些性能問題可以用這里入手進行分析。


          這里的屬性都可以通過mongostat --help進行查看,有幾個列需要解釋一下,可以幫助到我們發生性能問題時比較準備的找到定位。

          faults:這是一個重要的性能指標,顯示你的機器每秒頁面故障的數量,這個是mongoDB映射到虛擬地址空間,而不是物理內存,這個值如果飆高的話,可能意味著你的機器沒有足夠的內存來存儲數據和磁盤的訪問。
          flushes:每秒做了多少次fsync,表面多少次數據被刷新進了磁盤。
          mapped:是指mmap有多少數據量,也就是服務器的內存映射,其中包含了虛擬內存和常駐內存。
          locked:這個值表面全局寫入鎖占用了機器多少時間, 當放生全局寫入鎖時,所有的查詢操作都將等待,直到寫入鎖的解鎖,如果這個鎖飆高有可能是你的程序那部分出現問題。
          idx miss:B樹未命中的比例,這個應該是我們查詢的命中的實時指數,一般在特定查詢中會有用到。
          qr | qw:如果有太多的查詢進行處理,它們就以一個隊列的方式進行,如果這個值飆高的話,那么查詢也會變得很慢,因為后面的隊列必須等待前面的隊列執行完畢,高并發時,一般隊列值會升高。
          另外我們還可以在mongodb shell中進行檢查,使用db.serverStatus()

          基本上db.serverStatus()跟mongostat 差不多,不過它顯示的數據更為具體,它也有一個缺陷就是它的數據是靜態的,不是實時的。

          Http Console
          其實mongodb還提供了一個跟直觀的檢測工具,在默認情況下,啟動mongodb的同時還會啟動一個http的服務器,用網頁展示的信息比前兩個工具來得更加直觀,啟動默認的監聽端口為28017 http://ip:28017


          基本上我們可以看到查詢,復制,鎖等等這些的情況,具體的參數還是上官網looklook,http://www.mongodb.org/display/DOCS/Http+Interface
          當然了,我們還可以使用其他的專業監控軟件進行監控,如nagios,cacti,這些都有mongodb的插件。

          Backups
          MongoDB的備份機制還是不錯的,備份的方式也是很多,這個并不比mysql要差。

          Shutdown and Backup
          關閉服務,直接把dbpath參數的目錄進行備份,只需把所有的文件進行復制到其他地方就可以,不過如果這個備份是在服務啟動時候做的話,有可能備份的文件會被損壞,雖然這種關閉服務的備份很有效也很安全,都效果相當不理想。

          mongodump & mongorestore
          mongodump簡直就是mysqldump的另一版,如果你使用過mysqldump那就再熟悉不過了,mongodbdump可以使用在各個客戶端,對正在運行的mongodb服務做出查詢,然后將所有查到的文本寫入到客戶端的磁盤。



          除了mongodump,MongoDB還提供了從備份中恢復數據的工具mongorestore,mongorestore從mongodump獲取結果,并將備份的數據插入到運行的MongoDB實例。

          ./mongodump --db test --collection user --out - > /home/chenyz/cyz.bson
          ./mongorestore --db test --collection user --directoryperdb /home/chenyz/cyz.bson --drop cyz.bson

          上面的例子中,指定了要備份的db和要備份的collection,--drop表明要在恢復前刪除集合,否則,數據將和現有的集合數據合并。

          主從備份
          上面說的幾種備份數據方式已經很靈活了,但都不及在從服務器上備份來得方便,從服務器的數據幾乎是于主服務器進行同步,涉及到主從方面還有很多,從服務器備份就不放在這里講了。

          修復
          遇到一些停電,或非法關閉mongodb,不合理備份文件的操作,往往會出現文件損毀的提示,幸好,mongodb內置的修復功能會試著去恢復損壞的文件。
          操作很簡單,只需在啟動mongod 加入 --repair啟動項,系統就會將所有的文件導入忽略那些無效的文檔然后進行導入,完成之后,會重新建立索引,數據量大的話需要花費很長的時間,因為所有的文件都需要進行驗證,所有的索引都需要重建,另外修復數據庫還能起到壓縮數據的作用,閑置的空間,碎片在修復后會被重新回收進行使用。

          另外在shell中也可以直接進行repair操作
          > db.repairDatabase()
          {
                  
          "ok" : 1
          }
          posted on 2011-07-30 18:23 陳于喆 閱讀(20571) 評論(2)  編輯  收藏 所屬分類: NoSQL 、MongoDB

          評論

          # re: 淺述MongoDB的管理操作[未登錄] 2012-11-19 14:35 lei
          你好!
          請問如何查看mongodb服務器的端口號?如果我可以連接到服務器。  回復  更多評論
            

          # re: 淺述MongoDB的管理操作 2014-05-14 12:39 孤獨信徒
          db.getMongo(),可以查看連接服務器的地址和端口號 @lei  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 芦山县| 牙克石市| 浮梁县| 永兴县| 额尔古纳市| 建昌县| 册亨县| 留坝县| 绥德县| 九龙坡区| 自治县| 谷城县| 莱西市| 历史| 姚安县| 黄山市| 鸡泽县| 灵山县| 莲花县| 临高县| 峨边| 平南县| 化隆| 尚志市| 张家港市| 陕西省| 增城市| 犍为县| 开阳县| 习水县| 马山县| 蒙自县| 文水县| 扎鲁特旗| 孝昌县| 绥棱县| 东城区| 镇赉县| 沙雅县| 遂宁市| 克山县|