Skip to content

创建副本集

复制简介

之前我们使用的一直是单台服务器,一个 mongod 服务器进程。
如果只是用作学习和开发,这是可以的,但是如果用到生产环境中,风险会很高: 如果服务器崩溃了或者不可访问了怎么办?
数据库至少会有一段时间不可用。
如果是硬件出了问题,可能需要将数据转移到另一个机器上。
在最坏的情况下,磁盘或者网络问题可能会导致数据损坏或者数据不可访问。

使用复制可以将数据副本保存到多台服务器上,建议在所有的生产环境中都要使用。
使用 MongoDB 的复制功能,即使一台或多台服务器出错,也可以保证应用程序正常运行和数据安全。

在 MongoDB 中,创建一个副本集之后就可以使用复制功能了。
副本集是一组服务器,其中有一个主服务器(primary),用于处理客户端请求;还有多个备份服务器(secondary),用于保存主服务器的数据副本。
如果主服务器崩溃了,备份服务器会自动将其中一个成员升级为新的主服务器。

使用复制功能时,如果有一台服务器宕机了,仍然可以从副本集的其他服务器上访问数据。
如果服务器上的数据损坏或者不可访问,可以从副本集的某个成员中创建一份新的数据副本。

建立副本集

使用 --nodb 选项启动一个 mongo shell,这样可以启动 shell 但是不连接到任何 mongod,这里不使用这个:

1
2
3
$ mongo
MongoDB shell version v4.2.1
>

通过执行下面的命令就可以创建一个副本集

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
> replicaSet = new ReplSetTest({"nodes": 3})

...
"name" : "__unknown_name__",
    "useHostName" : true,
    "host" : "zhaoyangzhendeMacBook-Pro.local",
    "oplogSize" : 40,
    "useSeedList" : false,
    "keyFile" : undefined,
    "protocolVersion" : undefined,
    "waitForKeys" : undefined,
    "nodeOptions" : {
        "n0" : undefined,
        "n1" : undefined,
        "n2" : undefined
    },
    "nodes" : [ ],
    "ports" : [
        20000,
        20001,
        20002
    ]
}

这行代码可以创建一个包含三个服务器的副本集: 一个主服务器和两个备份服务器。
但是,在执行下面两个命令之前 mongod 服务器不会真正启动

1
replicaSet.startSet()