Attention To, Convert To Capped Collection
生活随笔
收集整理的這篇文章主要介紹了
Attention To, Convert To Capped Collection
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
假設3個節點的replica Set,其中有一個collection包含索引已經50GB了,所在的數據庫分區空間剩余不足50GB。 需要將這個collection轉換成cappedCollection。 需要注意哪些? 先來看看轉換操作的特點: 1. 首先convertToCapped操作包含了以下內容, "cloneCollectionAsCapped" : "$yourCollection", "toCollection" : ".tmp.convertToCapped.$yourCollection", "size" : $定義的大小 其實是先創建好cappedCollection,然后克隆數據。
2. convertToCapped操作還是一個寫鎖操作,非常危險。 convertToCapped: write-lock { convertToCapped:<fromCollectionName>, size:<sizeInBytes> }
結合這兩點,我們應該注意啥呢? 1. 避免直接在PRIMARY節點操作. 可以選擇先將其中的一個SECONDARY節點從replicaSet去除, 轉換好在加進來并且轉換為PRIMARY角色。 2. 由于是拷貝的操作,所以需要有足夠的剩余空間,但是顯然這里剩余空間是不夠的,所以需要先騰出足夠的空間來做轉換操作。(可能需要重建庫才能縮減存儲空間) 3. cappedCollection在_ID上是不建索引的,并且事先建立索引也將影響拷貝速度,所以建議先將索引全部刪除再開始轉換操作。
另外需要注意的是,節點拆除之后,被拆除的節點需要進入非replicaSet啟動模式,否則啟動后不能做寫操作。例如注釋掉兩行: # replSet=blss # autoresync=true 再次加入replicaSet之后,啟動的時候需要將注釋去掉,并且加入啟動參數 :? --replSet blss/192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx? replSet這里要寫全,否則新加入的節點會認為自己的配置文件里面沒有自己,無法加入到replicaSet. PRIMARY節點報錯 :? { "_id" : 2, "name" : "192.168.xxx.xxx:xxxx", "health" : 0, "state" : 6, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : { "t" : 0, "i" : 0 }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2011-11-01T23:53:44Z"), "errmsg" : "still initializing" } 新加入中的節點報錯 :? Wed Nov ?2 07:50:20 [startReplSets] replSet caught exception in startReplSets thread: replSet error self not present in the configur ation
【其他參考】 30G的collection,轉cappedCollection. 耗時73688秒,還沒有轉結束。 > db.currentOp() { "inprog" : [ { "opid" : 24, "active" : true, "waitingForLock" : false, "secs_running" : 73688, "op" : "query", "ns" : "blss..tmp.convertToCapped.$myCollection", "query" : { "cloneCollectionAsCapped" : "$myCollection", "toCollection" : ".tmp.convertToCapped.$myCollection", "size" : 30000000000 }, "client" : "0.0.0.0:0", "desc" : "conn" } ] }
2. convertToCapped操作還是一個寫鎖操作,非常危險。 convertToCapped: write-lock { convertToCapped:<fromCollectionName>, size:<sizeInBytes> }
結合這兩點,我們應該注意啥呢? 1. 避免直接在PRIMARY節點操作. 可以選擇先將其中的一個SECONDARY節點從replicaSet去除, 轉換好在加進來并且轉換為PRIMARY角色。 2. 由于是拷貝的操作,所以需要有足夠的剩余空間,但是顯然這里剩余空間是不夠的,所以需要先騰出足夠的空間來做轉換操作。(可能需要重建庫才能縮減存儲空間) 3. cappedCollection在_ID上是不建索引的,并且事先建立索引也將影響拷貝速度,所以建議先將索引全部刪除再開始轉換操作。
另外需要注意的是,節點拆除之后,被拆除的節點需要進入非replicaSet啟動模式,否則啟動后不能做寫操作。例如注釋掉兩行: # replSet=blss # autoresync=true 再次加入replicaSet之后,啟動的時候需要將注釋去掉,并且加入啟動參數 :? --replSet blss/192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx,192.168.xxx.xxx:xxxx? replSet這里要寫全,否則新加入的節點會認為自己的配置文件里面沒有自己,無法加入到replicaSet. PRIMARY節點報錯 :? { "_id" : 2, "name" : "192.168.xxx.xxx:xxxx", "health" : 0, "state" : 6, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : { "t" : 0, "i" : 0 }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2011-11-01T23:53:44Z"), "errmsg" : "still initializing" } 新加入中的節點報錯 :? Wed Nov ?2 07:50:20 [startReplSets] replSet caught exception in startReplSets thread: replSet error self not present in the configur ation
【其他參考】 30G的collection,轉cappedCollection. 耗時73688秒,還沒有轉結束。 > db.currentOp() { "inprog" : [ { "opid" : 24, "active" : true, "waitingForLock" : false, "secs_running" : 73688, "op" : "query", "ns" : "blss..tmp.convertToCapped.$myCollection", "query" : { "cloneCollectionAsCapped" : "$myCollection", "toCollection" : ".tmp.convertToCapped.$myCollection", "size" : 30000000000 }, "client" : "0.0.0.0:0", "desc" : "conn" } ] }
總結
以上是生活随笔為你收集整理的Attention To, Convert To Capped Collection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LB 负载均衡的层次结构
- 下一篇: java.sql.SQLExceptio