MongoDB 使用經驗小結
1. Database數量多了之后,mongod的啟動會需要很長的時間,期間進程絕大多數時間處于R(Running or runnable)和D(Uninterruptible sleep) 狀態。這段時間mongod是在做init,會讀取所有Database的namespace文件的header,檢查pdfile version。
2. listDatabases指令(show dbs;)會首先取得所有Database名稱,然后依次打開所有Database的namespace,檢查Database是否為空。是一個非常消耗IO的操作,Database數量多了之后,也會非常慢,應該盡量避免執行listDatabases指令。注:mongodump導出全部Databases和Replica Set(或者Master/Slave)中從庫初始同步時會發送listDatabases指令,這兩個操作應該盡量避免。
3. dbStats 也是一個非常耗資源的操作,要盡量少做。具體它是怎么實現的,為何如此耗資源,由于本人C++水平有限暫時沒有研究出來。
4. 上面說過了,在Replica Set中直接添加一個新的空節點,新節點的initialSync會使它的source產生非常大的IO消耗,嚴重影響性能。因此,添加新節點時要使用 initialSync指定一個不提供線上服務的節點為source。如果沒有提前配置一個hidden的節點,可以直接停掉某個secondary(當然,前提是剩下的節點能夠撐得住線上服務的壓力),然后將此secondary的文件直接復制一份來創建一個新的節點。這個方法也適用于做冷備。具體步驟我會另寫一篇BLOG來介紹。
5. 前幾天和同事交流時得知他們仍然在用Master/Slave方式來做主從,其實現在MongoDB的Replica Set已經非常穩定了,它完全自動的failover是非常爽的,大家可以直接使用Replica Set,拋棄M/S了,正在使用M/S方式的也建議升級到Replica Set.
轉自:http://www.elmerzhang.com/2011/05/mongodb-experience/