MongoDB副本集
关于副本集的理论我就不介绍了。下面说下如何实现副本集的操作。
前提
- 首先就是要安装MongoDB服务器了。我建议按照我之前写的这篇文章进行安装。
- 准备三台以上的服务器。然后同时安装MongoDB。我们三台服务器的IP分别是(10.55.160.91,10.55.160.92,10.55.160.93)
部署一个副本集
修改配置文件。
首先我们打开配置文件。1
vim /etc/mongod.conf
找到
bindIp: 127.0.0.1
这行,我们需要对这行进行注释。变成如下这样:1
#bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces.
因为这个
bindIp
代表只允许本机进行连接,然后不允许其他服务器进行连接,那么,下面就没有办法继续执行了。找到
#replication:
这行我们将其注释去掉,然后下面增加一行,变成下面这样:1
2replication:
replSetName: testreplSetName
表示副本集组的名字(test
是我自己写的,你们也可以写你们自己的喜欢的名字),比如,我们要将三台服务器进行关联,那么我们就要将三台服务器都设置为相同的名字。然后如果三台服务器的MongoDB都已经启动了,那么就执行以下命令:
1
service mongod restart
如果没有启动就执行以下命令:
1
service mongod start
链接到任意一台服务器。
我选择的是链接到10.55.160.91
。也就是我现在正在操作的这一台服务器。然后登录:1
mongo
初始化副本集。
初始化副本集,我们需要使用rs.initiate()
方法。
我现在需要添加的是三台服务器,我们可以执行以下方法:1
2
3
4
5
6
7
8
9rs.initiate({
_id: "test",
version: 1,
members: [
{ _id: 0, host : "10.55.160.91:27017" },
{ _id: 1, host : "10.55.160.92:27017" },
{ _id: 2, host : "10.55.160.93:27017" }
]
})当返回值显示为如下的时候,就代表成功了:
1
{ "ok" : 1 }
这样就完成了,是不是很简单。哈哈。
然后你就发现你的输入命令的标题就变了。变成如下这样了:
1 | test:OTHER> |
不管它,我们继续执行操作,执行rs.status()
,查看当前状态。
1 | rs.status() |
查看返回值:
1 | { |
我们主要是看members
字段里面的stateStr
的值。
很幸运,我当前执行命令的服务器被推举为主服务器。
如果你们现在服务器显示当前的服务器的状态是:SECONDARY
。表示该服务器是从服务器,我们需要查看哪台服务器为主服务器,也就是"stateStr" : "PRIMARY"
。我们需要在主服务器才进行进行操作,当然,也有强行在从服务器进行操作的办法。这里先不说。
这样我们就可以在主服务器进行操作了。比如存储数据。
添加成员
比如现在又有了一台服务器(10.55.160.94)需要加入到这个副本集中。我们可以使用rs.add()
进行添加服务器。
首先我们还是别忘了修改配置文件的步骤。。。。。。修改完成配置文件之后重启Mongod,然后在主服务器执行如下命令:
1 | rs.add("10.55.160.94:27017") |
在执行该命令之后,可能会出现主服务器的选择,我们要注意主服务器是否已经变成了别的服务器。我们可以使用rs.status()
查看新的主服务器是什么。
1 | { |
修改服务器的优先级
比如我们新添加的服务器(10.55.160.94),这个服务器的配置较高。我希望优先让它成为主服务器。我们可以通过如下方式进行修改:
首先我们可以通过rs.conf
来查看是第几个游标。
1 | rs.conf() |
返回值如下:
1 | { |
我们可以看到它的游标是第3个(从0开始计算)。
我们可以这样进行修改:
1 | cfg = rs.conf() |
过了一会,我们就看到主服务器变成(10.55.160.94)了。
1 | { |
添加仲裁者服务器
仲裁者服务器只参与投票,而不是进行数据的存储。别忘了定义副本集名称。
我们可以使用rs.addArb()
来进行添加一台新的服务器(10.55.160.95)为仲裁服务器。
命令如下:
1 | rs.addArb('10.55.160.95') |
返回{ "ok" : 1 }
就正常执行了。这时我们通过rs.status()
来看一下服务器的状态。
1 | { |
我们可以看到IP为10.55.160.95
这台服务器,它的stateStr
的值是ARBITER
。这个就代表是仲裁者的角色。
移除成员
移除成员我们使用rs.remove()
方法就可以了。
比如我们要移除10.55.160.93。我们可以使用如下命令:
1 | rs.remove('10.55.160.93:27017') |
我们可以使用rs.status()
查看一下返回值:
1 | { |
发现10.55.160.93这个服务器已经从副本集中消失了。
更换副本集成员
我们可以使用如下办法进行快速更换成员:
1 | cfg = rs.conf() |
我们看之前被替换走的成员,它的状态已经变成这样了:
1 | { |