随着互联网的发展,大数据的处理逐渐成为了一个新的热点。而数据库便是一个很重要的环节。而在数据库中,MongoDB 作为一种 NoSQL 数据库,广受前端工程师的喜爱,凭借着其的高可扩展性、高吞吐量、灵活的数据结构,已经成为了不少公司的首选。
但是,在使用过程中,有一种情况是无法避免的,那就是出现宕机。针对宕机后如何保证系统能够高可用、高稳定性,这就需要我们考虑数据库容灾的方案。
MongoDB 容灾方案的基本组成
MongoDB 提供了多种的容灾方式,比如说:副本集,分片集群等。而副本集,是 MongoDB 最为常用的容灾方式。在副本集中,存在至少三个 MongoDB 实例,其中一个主服务器,其他均为从服务器。
副本集技术实现
MongoDB 的副本集技术能够实现两个效果:数据备份和高可用。这种技术实现的流程如下:
选举主服务器:在集群中通过先到先得的方式选举一个主服务器,其他的实例均为从服务器。
数据同步:主服务器插入数据后,自动地将数据同步到从服务器中。
自动故障切换:如果主服务器出现宕机,从服务器中会选举一个新的主服务器取代宕机的主服务器进行数据的读取和写入。
自动恢复:当主服务器从宕机中恢复后,其会重新成为主服务器,而其他的从服务器则会将数据进行更新。
在 MongoDB 中,如果您想通过副本集实现容灾,那么您需要进行如下步骤:
第一步:启动 MongoDB 实例
在启动 MongoDB 实例时,需要加入 --replSet
参数,并传递其所属副本集的名称。如下代码所示:
mongod --port 27017 --replSet rs0
第二步:初始化副本集
在启动完 MongoDB 实例后,需要对其进行初始化,以便在其成为副本集的一部分。
首先,需要连接 MongoDB 实例。mongo 命令就是用于此目的,因为它允许您与数据库交互。例如:
mongo --port 27017
在连接到 MongoDB 实例后,需要创建一个 JavaScript 对象,该对象包含副本集名称以及该副本集中 MongoDB 实例的主机名和端口号。如下代码所示:
var config = { _id: "rs0", members: [ {_id: 0, host: "localhost:27017"}, {_id: 1, host: "localhost:27018"}, {_id: 2, host: "localhost:27019"} ] };
该代码表示一个副本集 _id
为 rs0,包含了三个实例, 分别为:localhost:27017, localhost:27018, localhost:27019。
然后,需要调用 rs.initiate() 函数来初始化副本集。例如:
rs.initiate(config)
此时,副本集便已初始化完毕。
第三步:添加副本集成员
想要实现副本集容灾,需要一个主服务器和多个从服务器。因此,需要将其他 MongoDB 实例添加到副本集当中。
假设您需要添加一个新的从服务器。那么,您需要与该从服务器进行连接,并将其加入到副本集中。例如:
mongo --port 27018 rs.add("localhost:27018")
其中,rs.add()
函数用于将当前连接添加到副本集中。
如何验证副本集容灾
我们可以使用 rs.isMaster() 函数来验证副本集容灾是否成功。该函数将返回一个 JSON 对象,其中包含了有关当前 MongoDB 实例的信息,如主机名、端口、配置参数等。
例如,在副本集 rs0 中,我们运行 rs.isMaster() 函数,会返回如下 JSON 对象:
{ "ismaster" : true, "secondary" : false, "hosts" : ["localhost:27017", "localhost:27018", "localhost:27019"], ... }
此时,我们可以通过查看返回的 JSON 中内容来验证该副本集容灾是成功的。
副本集容灾总结
MongoDB 的副本集技术能够实现两个效果:数据备份和高可用。而副本集容灾的流程分为三个步骤:启动 MongoDB 实例、初始化副本集、添加副本集成员。通过使用副本集容灾,能够保证系统能够高可用、高稳定性。
需要注意的是,副本集不是万无一失的,当数据库出现了严重的故障时,您还需要使用其他方式来支持业务连贯性,比如设立云备份或定时拍快照等。
参考
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6529e2877d4982a6ebc465ce