2011-07-11
MongoDBでReplicaSetにメンバーを追加/削除する方法と、その注意点
MongoDBで、ReplicaSetにメンバーを追加/削除する方法は、Adding a New Set Memberにある通りです。
rs.add("node1:27018");
で追加したり、
rs.remove("node1:27018");
で削除したり。
追加する際は
- 既存データを物理的にコピーしてきて戻す方法
- カラの状態から同期を取る方法
があります。
1000万件程度であれば、1.でも数分で終わる模様。数億件以上ある場合は、2.で戻した方が作業が早いかもしれません。
注意点1
その際に気をつける点は、local.*のファイルはコピーしてこないこと。local以外のコレクションに対応するファイルだけコピーしてきて、あとは起動後にrs.add()すればOKです。local.*がいると、データの整合が取れなくなって「still initiating」って状態で止まってしまいます。これやっちゃってハマりました・・・orz
ちなみに、その場合でも一度サーバを止めてlocal.*ファイルを全部削除して起動し直せばOKみたいです。
注意点2
あともう一つ注意する点は、メンバーのvotesの数の合計が偶数にならないこと。MongoDB sharding and replication with (only) 3 servers - Part 2: One Replica-Setに以下のように説明されています。
The members of a set will elect their master just as well as we do with our politicians. The master has to get more than half of the available votes. Problem: Imagine a set with four members. What happens if two vote for node A to get master and the two others vote for node B?
Neither A nor B will get master, because no node got more than half of the available votes.
Therefore the number of votes in a replica set has to be odd-numbered. You can reach this by easily add one more node as a new slave to the set - simultaneously increasing database availability. But if you don't have the resources for an additional node, there are two other possibilities:
1. Add an arbiter, which is a mongod process and a member of the set, but only exists to solve majority problems (http://www.mongodb.org/display/DOCS/Adding+an+Arbiter)
2. Change the number of votes the members have, so the number is unequal.
PRIMARYになるためには、全体のvotes数の過半数より多い票を獲得しなければならないため、votes数が偶数になってしまうと、残りのvotes数が半数になった時点でPRIMARYがいなくなってしまいます。例えば、
| ノード名 | votes |
|---|---|
| node1 | 1 |
| node2 | 1 |
| node3 | 1 |
| node4 | 1 |
となると、上記のうち2台が死んだ時点でvotesの数が過半数の2となってしまい、PRIMARYがいなくなってしまいます。PRIMARYがいなくなるということは、ReplicaSetの構成変更も出来なくなるので、死んだ2台のうちいずれかを起動するまでは何も出来ません。
| ノード名 | votes |
|---|---|
| node1 | 2 |
| node2 | 1 |
| node3 | 1 |
| node4 | 1 |
であれば、仮にnode3/node4が死んでも、残りのvotes数は3なので、node1/node2のいずれかはPRIMARYでいられます(node1が死んでしまうと、あと1台しか死ぬことは出来ませんが)。この辺はArbiterで調整したり。
自分は、
| ノード名 | votes |
|---|---|
| node1 | 1 |
| node2 | 1 |
| node3 | 1 |
に対して
| ノード名 | votes |
|---|---|
| node1 | 1 |
| node2 | 1 |
| node3 | 1 |
| node4 | 1 |
| node5 | 1 |
| node6 | 1 |
と新たに3つのノードを追加したところ、追加した3つが前述した理由で起動できない状態となっていたため、既存ノードからPRIMARYがいなくなってしまいました。
| ノード名 | votes | State |
|---|---|---|
| node1 | 1 | SECONDARY |
| node2 | 1 | SECONDARY |
| node3 | 1 | SECONDARY |
| node4 | 1 | still initiating |
| node5 | 1 | still initiating |
| node6 | 1 | still initiating |
追加した3つのノードを起動することも出来ず、PRIMARYがいないのでrs.remove()でノードを消すこともできず、完全に詰んだ状態に・・・orz
local.*を消せばよかったみたいですが、このときには気付かなかったので、node1/node2/node3を取得していたバックアップから復元して対応しました。
- 123 https://www.google.co.jp/
- 61 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCgQFjAA&url=http://d.hatena.ne.jp/matsukaz/20110711/1310381034&ei=7qttT8bxFuL2mAXW1dnCBg&usg=AFQjCNGtDQgZ-YNNLPypHrLXonyUElurbA&sig2=VM-bkrbKN_HLORnFL0Bb9Q
- 36 http://www.google.co.jp/url?sa=t&source=web&cd=1&ved=0CBgQFjAA&url=http://d.hatena.ne.jp/matsukaz/20101228/1293519349&rct=j&q=jsp テンプレート&ei=9FccToX4INDimAWu76z3Bw&usg=AFQjCNEk1EmFGVGPBX4PChTnMO
- 21 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CEQQFjAD&url=http://d.hatena.ne.jp/matsukaz/20110711/1310381034&ei=AJs4T_q-HsPPmAWBiaCGAg&usg=AFQjCNGtDQgZ-YNNLPypHrLXonyUElurbA
- 21 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=5&cts=1331175788782&ved=0CE4QFjAE&url=http://d.hatena.ne.jp/matsukaz/20110711/1310381034&ei=QSFYT9-uBubRmAWyub3IDw&usg=AFQjCNGtDQgZ-YNNLPypHrLXonyUElurbA&sig2=_7X4KKYO3jgj9rhiNLJAi
- 20 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&cts=1331704275158&ved=0CDEQFjAB&url=http://d.hatena.ne.jp/matsukaz/20110711/1310381034&ei=7jFgT5KFG6nqmAXFyIWZCA&usg=AFQjCNGtDQgZ-YNNLPypHrLXonyUElurbA&sig2=6dhWAMbDCKN-znPDdae98
- 15 http://t.co/5ivfEbeJ
- 12 http://www.google.co.jp/url?sa=t&rct=j&q=mongodb replicaset 追加&source=web&cd=1&ved=0CCsQFjAA&url=http://d.hatena.ne.jp/matsukaz/20110711/1310381034&ctbs=lr:lang_1ja&ei=wJSvToGGDoSemQXxhq2GAg&usg=AFQjCNGtDQgZ-YNNLPypHrLXon
- 11 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=31&ved=0CC0QFjAAOB4&url=http://d.hatena.ne.jp/matsukaz/20110711/1310381034&ei=IkFxT63JI6XZmAWDo9S3Dw&usg=AFQjCNGtDQgZ-YNNLPypHrLXonyUElurbA&sig2=aA2b2lsOr1CDy-K0-P2ZXA
- 10 http://www.google.co.jp/search?client=safari&rls=en&q=OptiBay&ie=UTF-8&oe=UTF-8&redir_esc=&ei=YL4cTv_XPMf3mAXA2YDJBw
