2013-05-09 72 views
8

作爲我們mongo集羣的一部分,我們有一個隱藏節點,供分析人員用於報告。他們的查詢與我們的主應用程序優化的查詢有很大不同。不同副本集成員的不同索引

我們可以通過添加某些索引來顯着提高查詢的性能,這些索引的計算相對昂貴,並佔用大量內存。這些索引不應該被我們的主要和次要成員上運行的任何查詢使用,所以在主要副本集成員上花費時間和內存來計算和保留內存中的報告索引似乎有點愚蠢。

有沒有辦法創建一個索引,以便它只存在於一個副本集成員上?有沒有辦法告訴我的主要和次要節點不計算或存儲我知道他們不會使用的索引?

回答

9

是 - 您可以使用用於在副本集中創建新索引的策略變體,而無需停機。這將要求隱藏成員在索引創建時脫機。

這裏是鏈接的策略:http://docs.mongodb.org/manual/tutorial/build-indexes-on-replica-sets/#procedure

在你的情況,你將需要隱藏的成員離線在獨立模式,重新啓動(刪除--replSet選項,並使用不同的端口號)。成員隔離後,您可以調整索引(刪除不需要的索引並添加新索引)。索引完成創建後,使用舊端口和--replSet選項重新啓動該成員。

隱藏的成員將重新同步到副本集,並且您已全部設置。

+0

有趣。我的問題是,我絕對不想將索引傳播回主服務器。他們會太劇烈地降低寫入性能。 – captncraig 2013-05-09 23:58:54

+2

他們不會。索引只在創建時從主要索引傳播到次要索引。由於這是一個隱藏的成員,它永遠不會是主要的,索引永遠不會被傳播。您必須從副本集中刪除該成員,否則它是隻讀的,並會拒絕創建索引。成員創建後,會很樂意維護它。 – 2013-05-10 00:17:47

+0

索引不會傳播到主要或任何其他輔助。這些更改只能從其他服務器的主要oplog中提取。從技術上說 – 2013-05-10 00:19:46