|
Replica sets automatically negotiate which member of the set is primary and which are secondaries. If you want a certain member to be primary, there are a couple ways to force this. v2.0+In v2.0+, you can set the priority of the preferred primary to be higher than the priorities of the other nodes. For example, if we had members A, B, and C and A is the current primary and we want B to be primary, we could give B a higher priority like so:
> config = rs.conf()
{
"_id" : "foo",
"version" : 1,
"members" : [
{
"_id" : 0,
"host" : "A",
},
{
"_id" : 1,
"host" : "B",
},
{
"_id" : 2,
"host" : "C",
}
]
}
> config.version++
> // the default priority is 1
> config.members[1].priority = 2
> rs.reconfig(config)
Assuming B is synced to within 10 seconds of A, A will step down, B (and C) will catch up to where A is, and B will be elected primary. If B is far behind A, A will not step down until B is within 10 seconds of its optime. This minimizes the amount of time there will be no primary on failover. If you do not care about how long the set is primary-less, you can force A to step down by running:
> db.adminCommand({replSetStepDown:1000000, force:1})
B will sync until it is caught up with A and then become primary. Older versionsIf you want to force a node to be primary at a given point in time, use the replSetFreeze and replSetStepdown commands (v1.8+). If we have members A, B, and C, and A is current primary, and we want B to become primary, we would send freeze to C so that it does not attempt to become primary, and then stepDown to A. See the Commands page for more information. $ mongo --host C > // first check that everyone is healthy and in the states we expect: > rs.status() > // C : not eligible to be primary for 120 seconds > rs.freeze(120) > exit $ mongo --host A > // A : step down as primary and ineligible to be primary for 120 seconds > rs.stepDown(120) > // B will now become primary. for this to work B must be up to date. Note that during transitions of primary, there is a short window when no node is primary. Command replSetStepDown
> db.adminCommand( { replSetStepDown : <seconds> } )
Step down as primary. Will not try to reelect self for the specified time period (1 minute if no numeric secs value specified). (If another member with same priority takes over in the meantime, that member will stay primary.) Note: seconds parameter is new to v1.8. Old versions default to 60 seconds regardless of param value. Command replSetFreezev1.8+
> db.adminCommand( { replSetFreeze : <seconds> } )
'freeze' state of member to the extent we can do that. What this really means is that this node will not attempt to become primary until the time period specified expires. You can call again with {replSetFreeze:0} to unfreeze sooner. A process restart unfreezes the member also. |

PLEASE POST QUESTIONS IN THE USER GROUPS FORUM. Post non-question comments and helpful hints here.
blog comments powered by Disqus