MongoDB 4.2——从应用程序连接副本集

MongoDB——副本集与分片 MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。复制还允许您从硬件故障和服务中断中恢复数据。什么是复制1保障数据的安全性2数据高可用性 (24*7)3灾难恢复4无需停机维护(如备份,重建索引,压缩)5分布式读取数据6MongoDB复制原理7mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。 阅读详情

1、客户端到副本集的连接行为

MongoDB 的客户端开发库(也叫“驱动程序”​)用于管理与 MongoDB 服务器端的通信,无论服务器端是单机的MongoDB 实例还是副本集。对于副本集,默认情况下,驱动程序会连接到主节点,并将所有流量都路由到此节点。应用程序可以像与单机服务器通信一样执行读写操作,同时副本集会在后台悄悄地处理热备份。

连接副本集与连接单机服务器非常类似。在驱动程序中使用 MongoClient 类(或等价类)​,并提供一个种子列表供驱动程序连接。种子列表就是服务器地址列表。种子是应用程序将读取和写入数据的副本集成员。你不需要列出种子列表中的所有成员(尽管这样做也可以)​。当驱动程序连接到种子服务器时,它可以从其中发现其他成员。一个连接字符串通常看起来像下面这样:

"mongodb://server-1:27017,server-2:27017,server-3:27017"

如果想提供更强的容错能力,那么也可以使用 DNS 种子列表连接格式来指定应用程序连接到副本集的方式。使用DNS 的优点是可以轮流更改 MongoDB 副本集成员所在的服务器,而无须重新配置客户端(特指连接字符串)​。

所有 MongoDB 驱动程序都遵守服务器发现和监控(SDAM)规范。驱动程序会持续监视副本集的拓扑结构,以检测应用程序对集合中成员的访问能力是否有变化。此外,驱动程序会监视副本集,以维护关于哪个成员是主节点的信息。

副本集的目的是使数据在面对网络分区或服务器停止运行时具有高可用性。在一般情况下,副本集通过选择一个新的主节点来响应这类故障,以便应用程序继续读写数据。如果一个主节点发生故障,则驱动程序会自动找到新的主节点(只要有一个主节点被选举出来)​,并将请求尽快路由到新的主节点。不过,当没有可达的主节点时,应用程序将无法执行写操作。

在选举过程中,主节点可能会短暂地不可用。如果没有可达成员能够成为主节点,则主节点可能长时间不可用。默认情况下,驱动程序在此期间不会处理任何请求——无论读或写。如果应用程序需要,则可以配置驱动程序将读请求路由至从节点。

用户希望驱动程序对其隐藏整个选举过程(主节点退位,新的主节点被选举出来)​。然而,由于一些原因,没有驱动程序能够以这种方式处理故障转移。首先,驱动程序只能在一段时间内隐藏缺少主节点的情况。其次,驱动程序经常因为操作失败而发现主节点已停止运行,这意味着驱动程序不知道主节点在停止运行之前是否处理了该操作。这是一个不可避免的分布式系统问题,因此当它出现时,需要一种策略来处理它。如果很快选出一个主节点,那么应该在新的主节点上重新尝试该操作吗?是否要假设最后一次请求已经被旧的主节点处理了?是否要检查新的主节点已经同步了这个操作?

事实证明,正确的策略是最多重试一次。要解释清楚这一点,需要先看一下都有哪些策略可供选择。归结起来就是:不重试、在重试一定次数后放弃或者最多只重试一次。我们还需要考虑错误的类型,这可能是问题的根源。在尝试对副本集进行写操作的过程中,可能会遇到 3 种类型的错误:短暂的网络错误、持续的中断(网络或服务器)或由服务器拒绝的错误命令(比如未授权)引起的错误。下面针对每种类型的错误来看一下重试的选择。

为了便于讨论,这里简单地以一个对递增计数器的写操作作为示例。如果应用程序试图增加计数器,但没有从服务器得到响应,我们就不知道服务器是否收到了消息并执行了更新。因此,对于一个短暂的网络错误,如果遵循不重试这个写操作的策略,则可能会发生计数过少现象。对于持续中断或命令错误,不重试是正确的策略,因为无论重试多少写操作都不会产生预期的结果。

对于短暂的网络错误而言,如果遵循重试一定次数的策略,则可能会发生计数过多现象(在第一次尝试成功的情况下)​。对于持续中断或命令错误,多次重试只会浪费资源。

再来看一下仅重试一次的策略。对于短暂的网络错误,可能会发生计数过多现象。对于持续的中断或命令错误,这是正确的策略。然而,如果可以确保操作是幂等的会如何?无论做一次还是多次,幂等操作都会有相同的结果。利用幂等操作,在发生网络错误时重试一次最有可能正确处理所有 3 种类型的错误。

从 MongoDB 3.6 开始,服务器端以及所有 MongoDB 驱动程序都支持可重试写选项。有关如何使用此选项的详细信息,请参阅驱动程序文档。对于可重试写,驱动程序将自动遵循“最多重试一次”策略。命令错误会返回给应用程序,让客户端进行处理。网络错误会在适当的延迟后重试一次,这个延迟应该能适应一般情况下的主节点选举。当可重试写选项打开时,服务器端会为每个写操作维护唯一的标识符,因此可以确定驱动程序何时试图重试一个已经成功的命令。它会简单地返回一条消息表示写入成功,从而克服短暂的网络故障所引起的问题,而不会再次进行写入。

2、在写入时等待复制

根据应用程序的需要,你可能希望服务器端在将所有写操作复制到副本集大多数成员之后再进行确认。在一些罕见的情况下,当一个副本集的主节点发生故障,并且新选出的主节点(之前为从节点)没能复制到旧主节点的最后一次写操作时,这些写操作会在旧主节点恢复时进行回滚。这些回滚数据可以被恢复,但需要人为进行干预。对于许多应用程序来说,有少量回滚的写操作不是问题。例如,在一个博客应用程序中,回滚掉某位读者的一两条评论几乎不会造成什么危害。

然而,对于其他一些应用程序,应该避免所有的写操作回滚。假设应用程序向主节点发送了一个写操作请求,之后它收到了已经写入成功的确认,但是在所有从节点还未复制该写入之前,主节点就崩溃了。应用程序认为能够访问到该写操作,但实际上副本集的当前成员并没有这次写入的副本。

在某个时刻,一个从节点可能被选为主节点并开始接收新的写入。当之前的主节点恢复时,会发现它有一些不存在于新主节点上的写操作。为了纠正这一点,它会撤销与当前主节点的操作序列不匹配的任何写操作。这些操作不会丢失,而是会被写入特殊的回滚文件中,这些文件必须手动应用于当前的主节点。MongoDB 不能自动应用这些写操作,因为它们可能与崩溃后发生的其他写操作冲突。因此,这些写操作会消失,直到管理员有机会将回滚文件应用于当前的主节点​。

如果对写入大多数成员有要求,则可以防止这种情况的出现:如果应用程序得到了写入成功的确认,那么新的主节点必须拥有该写入的副本(要被选为主节点,成员必须拥有最新的数据)​。如果应用程序没有收到来自服务器端的确认信息或收到了错误信息,那么它会知道需要进行重试,因为在主节点崩溃之前,写操作没有传播到副本集的大多数成员。

因此,如果要保证无论副本集出现什么情况写操作都可以被持久化,那么必须确保每个写操作都传播到副本集的大多数成员。可以通过使用 writeConcern 实现这一点。

从 MongoDB 2.6 开始,writeConcern 就被集成进了写操作中。例如,在 JavaScript 中,可以像下面这样使用writeConcern:

try {
    db.products.insertOne(
        { "_id": 10, "item": "envelopes", "qty": 100, type: "Self-Sealing" },
        { writeConcern: { "w" : "majority", "wtimeout" : 100 } }
    );
} catch (e) {
    print (e);
}

驱动程序中的特定语法会因编程语言的不同而不同,但语义都是一样的。这个例子将写关注指定为了 “majority”。一旦成功,服务器端将回复如下消息:

{ "acknowledged" : true, "insertedId" : 10 }

但在这个写操作被复制到副本集的大多数成员之前,服务器端不会发出响应。只有这样,应用程序才会收到这个写操作成功的确认。如果在指定的超时时间之内没有写入成功,则服务器端将回复一条错误消息:

WriteConcernError({
    "code" : 64,
    "errInfo" : {
        "wtimeout" : true
    },
    "errmsg" : "waiting for replication timed out"
})

“majority” 写关注以及副本集选举协议确保了在主节点的选举中,只有那些拥有经过确认的写操作的从节点才能被选为主节点。通过这种方式,可以保证不会发生回滚。还可以对超时选项进行调节,以便在应用程序层检测并标记任何长时间运行的写操作。

"w"的其他选项

“majority” 并不是唯一的 writeConcern 选项。MongoDB 还允许将 “w” 指定为任意的数字,如下所示:

db.products.insertOne(
    { "_id": 10, "item": "envelopes", "qty": 100, type: "Self-Sealing" },
    { writeConcern: { "w" : 2, "wtimeout" : 100 } }
);

这个命令会一直等待,直到写操作被复制到两个成员(主节点和一个从节点)中。

注意,“w” 的值包含了主节点。如果希望将写操作传播到n 个从节点,则应该将 “w” 设置为 n+1(以包括主节点)​。设置 “w” : 1 相当于没有传入 “w” 选项,因为这样只会检查主节点上的写入是否成功。

直接使用数字的缺点在于,如果副本集的配置发生了更改,则必须修改应用程序。

3、自定义复制保证规则

写入副本集的大多数成员被认为是“安全”的。然而,有些副本集可能有更复杂的要求:你可能希望确保写操作被复制到每个数据中心的至少一台服务器或大多数的非隐藏节点上。副本集允许你创建可以传递给 “getLastError” 的自定义规则,以确保写操作被复制到所需的任何服务器组合上。

3.1、保证复制到每个数据中心的一台服务器上

相比数据中心内部,数据中心之间的网络故障更为常见,而且相对于多个数据中心同等数量的服务器的停止运行,整个数据中心都停止运行的可能性更高。因此,你可能需要一些特定于数据中心的写操作逻辑。在确认成功之前确保写操作到达了每一个数据中心。这意味着,如果之后数据中心掉线了,那么每个其他数据中心至少有一个本地数据副本。

要实现这种机制,首先应按数据中心对成员进行分类。可以通过在副本集配置中添加一个 “tags” 字段来做到这一点:

> var config = rs.config()
> config.members[0].tags = {"dc" : "us-east"}
> config.members[1].tags = {"dc" : "us-east"}
> config.members[2].tags = {"dc" : "us-east"}
> config.members[3].tags = {"dc" : "us-east"}
> config.members[4].tags = {"dc" : "us-west"}
> config.members[5].tags = {"dc" : "us-west"}
> config.members[6].tags = {"dc" : "us-west"}

“tags” 字段是一个对象,每个成员可以有多个标签。如果位于 “us-east” 数据中心的是一台“高质量”服务器,那么就需要一个 “tags” 字段,比如 {“dc”: “us-east”,“quality” : “high”}。

第二步是添加自己的规则,可以通过在副本集配置中创建一个 “getLastErrorModes” 字段来实现。“getLastErrorModes” 这个名称是遗留下来的,因为在 MongoDB 2.6 之前,应用程序使用一个名为"getLastError" 的方法来对写关注进行指定。在副本集配置中,对于 “getLastErrorModes”,每个规则的形式都是 {“name” : {“key” : number}}。“name” 是规则的名称,它应该以客户端能够理解的方式描述规则所做的事情,因为在调用 getLastError 时会用到这个名称。在本例中,我们称这个规则为 “eachDC” 或更抽象的名称,比如 “user-level safe”。

“key” 字段就是标签的键,因此在本例中是 “dc”。number 是满足此规则所需的分组的数量。在本例中,number 是 2(因为我们希望写操作被复制到 "us-east"和 “us-west” 中的至少各一台服务器上)​。number 表示的意思是“number 个分组中,每组至少一台服务器”​。

如下所示,将 “getLastErrorModes” 添加到副本集配置中,并重新执行配置来创建规则:

> config.settings = {}
> config.settings.getLastErrorModes = [{"eachDC" : {"dc" : 2}}]
> rs.reconfig(config)

“getLastErrorModes” 位于副本集配置的 “settings” 子对象中,它包含了一些副本集级别的可选设置。

现在可以对写操作应用这条规则:

db.products.insertOne(
    { "_id": 10, "item": "envelopes", "qty": 100, type: "Self-Sealing" },
    { writeConcern: { "w" : "eachDC", wtimeout : 1000 } }
);

注意,规则在某种程度上对应用程序开发者是透明的:应用程序不需要知道 “eachDC” 中的哪些服务器要使用这个规则,并且可以在不修改应用程序的情况下对规则进行变更。可以添加新的数据中心或更改副本集成员,而应用程序不需要知道这些改变。

3.2、保证写操作被复制到大多数非隐藏节点

通常情况下,隐藏成员在某种程度上是“二等公民”​:发生故障时不会转移到隐藏节点,它们也无法执行任何读操作。因此,你可能只关心非隐藏成员是否接收到了写操作,并让隐藏成员自己对剩下的工作进行处理。

假设有 5 个成员,从 host0 到 host4,其中 host4 是隐藏成员。我们希望确保写操作被同步到大多数非隐藏成员上,即至少是 host0、host1、host2 和 host3 中的 3个。要为此创建规则,首先要为非隐藏成员设置标签:

> var config = rs.config()
> config.members[0].tags = [{"normal" : "A"}]
> config.members[1].tags = [{"normal" : "B"}]
> config.members[2].tags = [{"normal" : "C"}]
> config.members[3].tags = [{"normal" : "D"}]

没有为隐藏成员 host4 设置标签。

接下来,为这些服务器中的大多数添加如下规则:

> config.settings.getLastErrorModes = [{"visibleMajority" : {"normal" : 3}}]
> rs.reconfig(config)

这样命令会一直等待,直到至少 3 个非隐藏成员拥有这条写入数据。

3.3、创建其他保证规则

可以没有限制地创建各种规则。记住,创建自定义复制规则有两个步骤。

  • 通过分配键–值对来对成员设置标签。键用于描述分类,比如,可能会有像 “data_center”、“region” 或"serverQuality" 这样的键,而值决定了服务器属于某个分类中的哪个组。例如,对于键 “data_center”,可能会有一些服务器的标签为 “us-east”,一些服务器的标签为 “us-west”,以及一些服务器的标签为 “aust”。
  • 根据创建的分类来创建规则。规则总是采用 {“name”: {“key” : number}} 的形式,表示在返回成功之前,number 个分组的至少一台服务器上必须有这个写操作的数据。例如,可以创建一个规则 {“twoDCs” :{“data_center” : 2}},表示在写操作成功之前,被设置标记的两个数据中心中各至少有一台服务器需要确认此写操作。

然后就可以在 getLastErrorModes 中使用这个规则了。

尽管规则的理解和设置都比较复杂,但它是一种非常强大的副本集配置方式。除非有相当特殊的复制需求,否则使用 “w” : “majority” 是非常安全的。

4、将读请求发送到从节点

默认情况下,驱动程序会将所有请求路由到主节点。这通常正是你想要的,但可以通过设置驱动程序的读偏好(read preference)来配置其他选项。读偏好允许你指定查询应该发送到的服务器端的类型。

将读请求发送到从节点通常不是一个好主意。虽然这在某些特定的情况下是有意义的,但通常应该将所有请求发送到主节点。如果你正在考虑将读请求发送到从节点,那么请确保在此之前已非常仔细地权衡利弊。本节会介绍为什么将读请求发送到从节点是一个糟糕的想法,以及在什么情况下这样做是有意义的。

4.1、一致性考虑

对一致性读取要求非常高的应用程序不应该从从节点读取数据。

通常从节点落后于主节点的时间在几毫秒之内。然而,这一点是无法保证的。有时,由于负载、错误配置、网络错误等原因,从节点可能会延迟几分钟、几小时甚至几天。客户端驱动程序无法知道从节点的数据有多新,因此可能会将查询发送到一个远远落后的从节点。可以向客户端的读请求隐藏从节点,但这是一个手动过程。因此,如果应用程序需要读取最新的数据,那么就不应该从从节点读取。

如果应用程序需要读取它自己的写操作(比如,先插入一个文档,然后再查询并找到它)​,那么就不应该将读操作发送到从节点(除非写操作使用前面讲到的 “w” 等待复制到所有从节点)​。否则,应用程序可能成功执行了写操作,然后尝试读取数据,却无法找到这个值(因为读请求被发送到了尚未复制到此数据的从节点)​。客户端发出请求的速度可能会快于复制操作执行的速度。

要始终将读请求发送到主节点,就需要将读偏好设置为primary(或者不进行设置,因为 primary 是默认值)​。如果没有主节点,那么查询就会出错。这意味着如果主节点停止运行,应用程序就不能执行查询。然而,如果应用程序在故障转移或网络分区期间可以对停止运行的情况进行处理,或者读取陈旧数据是不可接受的,那么这当然是一个可以接受的选项。

4.2、负载考虑

许多用户会将读请求发送到从节点以分配负载。如果服务器端每秒只能处理 10 000 次查询,而你需要处理的查询有 30 000 次,那么可以设置几个从节点,让它们承担一些负载。然而,这是一种危险的扩展方式,因为很容易意外地出现系统过载,而且一旦发生很难恢复过来。

假设你遇到了刚才描述的情况:每秒读取 30 000 次。你决定创建一个拥有 4 个成员的副本集(其中一个成员被配置为没有投票权,以防止在选举中发生平票的情况)来处理这个问题:每个从节点都低于其最大负载,并且系统运行良好。

直到其中一个从节点崩溃了。

现在,剩下的每个成员都在处理 100% 的负载。如果需要恢复刚刚崩溃的成员,则可能需要从其他服务器复制数据,而这会导致剩余的服务器不堪重负。服务器过载通常会使它的执行速度变慢,进一步降低副本集的处理能力,迫使其他成员承担更多的负载,这样就陷入了恶性循环。

过载还会导致复制的速度变慢,使得剩余的从节点落后于主节点。突然间,你的副本集中有的成员崩溃了,有的成员发生了滞后,所有成员都过载了,没有任何回旋的余地。

如果你很清楚一台服务器可以承受多大的负载,那你可能会觉得自己可以更好地进行应对:使用 5 台服务器,而不是 4 台,这样就不会因为一台服务器停止运行而出现副本集过载的情况。然而,即使你的计划非常完美(并且只有预期数量的服务器停止运行)​,仍然需要处理其他服务器负载过大的情况。

一个更好的选择是使用分片来分配负载。第 14 章会讨论如何设置分片。

4.3、由从节点读取数据的场景

在某些情况下,将应用程序的读请求发送到从节点是合理的。例如,你可能希望应用程序在主节点发生故障时仍然能够执行读操作(并且你不关心这些读取到的数据是否陈旧)​。这是将读请求分配给从节点的最常见的场景:当失去主节点时,副本集会进入一个临时的只读模式。这种读偏好叫作 primaryPreferred。

从从节点读取数据的一个常见理由是读取延迟更低。可以指定 nearest 作为读偏好,基于从驱动程序到副本集成员的平均 ping 时间,将请求路由到延迟最低的成员。如果应用程序需要在多个数据中心以低延迟访问相同的文档,那么这是唯一的方法。然而,如果你的文档和位置的相关性更大(一个数据中心的应用程序服务器需要低延迟访问某些数据,而另一个数据中心的应用程序服务器需要低延迟访问其他数据)​,那么这应该通过分片来完成。注意,如果应用程序需要低延迟读和低延迟写,则必须使用分片:副本集只允许在主节点上进行写操作(无论主节点在什么位置)​。

如果从落后的从节点读取数据,则必须要牺牲一致性。另外,如果希望等待写操作复制到所有的成员,则需要牺牲写入速度。

如果应用程序确实能够接受陈旧的数据,那么可以使用secondary 或 secondaryPreferred 作为读偏好。secondary 总是将读请求发送给从节点。如果没有可用的从节点,则会出现错误,而不是将读请求发送给主节点。它可以用于不关心数据的陈旧程度并且希望仅将主节点用于写操作的应用程序。如果对数据的新旧程度有要求,则不建议使用这种方式。

如果有从节点可用,则 secondaryPreferred 会将读请求发送到从节点。如果没有从节点可用,那么请求将被发送到主节点。

有时候,读负载与写负载有很大的不同,比如,正在读取的数据与正在写入的数据是完全不同的。为了进行离线处理,你可能需要很多索引,而又不希望将这些索引创建在主节点上。在这种情况下,可以设置一个具有与主节点不同索引的从节点。如果想以这种方式使用从节点,那么就需要让驱动程序直接连接到从节点,而不是使用副本集连接。

应该根据应用程序的需求来考虑哪些选项更合适。你也可以将这些选项组合在一起:如果某些读请求必须从主节点读取数据,则对它们使用 primary 选项;如果另一些读请求不要求数据是最新的,那么可以对它们使用primaryPreferred;如果某些请求的低延迟需求大过一致性需求,那么对它们使用 nearest。

mongoDB副本集和分片 搭建MongoDB可采取复用主机的方式,两分片式集群部署,有4个数据节点,至少需要4台服务器。 阅读详情

相关推荐

MongoDB的副本集及分片综合应用

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。副本集就是为了解决mongodb的可靠性, MongoDB复制是将数据同步在多个服务器的过程。复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性。复制还允许您从硬件故障和服务中断中恢复数据。

pengp_123的博客 1120

MongoDB系列之连接副本集与副本集管理

var config = rs . config() // 设置节点标签表示北京、上海数据中心 config . members [ 0 ] . tags = {"dc" : "bj" } // 第一次时设置{} config . settings = {} // 2表示在2个分组中,每组至少写入一台服务器 config . settings . getLastErrorModes = {现在可以在可操作中应用这条规则。

算法小生 1532

MongoDB副本集+使用Mongotemplate连接

文章目录创建MongoDB副本集安装配置生成key启动MongoDB创建集群使用Springboot Mongotemplate连接副本集操作 创建MongoDB副本集 MongoDB副本集实现故障自动切换至少需要以下配置为: 1.一个主节点,两个从节点 2.一个主节点,一个从节点一个仲裁节点。 如果只有一主一从节点,故障时无法选举出主节点从而实现切换。 安装 在三台服务器上安装MongoDB,同...

Uyuhz 2377

MongoDB副本集(Replica Sets)搭建教程

mongodb副本集的搭建教程

19:30的博客 1万+

Mongodb本机部署副本集

目录知识储备1.为什么我们需要搭建副本集模式呢?2.副本集成员构架应用目标实践步骤写在最后 知识储备 1.为什么我们需要搭建副本集模式呢? MongoDB独立模式可以简单且快速的构建MongoDB数据库系统,然而独立模式存在弊端,即一旦MongoDB发生宕机,将会面临数据丢失的风险,这在生产环境中是不允许发生的,此时我们可以利用MongoDB提供的高可用机制,即复制。 MongoDB支持两种复制类型:传统的主/从复制和副本集,副本集可以理解为传统主/从复制的一种复杂形 式 , 支持自动故障恢复功能 , 拥有

ANDEL2001的博客 2336

项目回顾一:《高速多端口共享缓存模块》

本帖子仅为了回顾一下一年前自己动手完成的第一个数字ic设计项目的历程,为复试做一下准备,完成的这个sramc模块花了整整四个月的时间,从0到12个模块的代码产出以及模块的验证,虽然没有拿奖,也没有进入复赛,设计过程中使用的技术手段和算法也不太成熟,但这这是一个值得记录的过程!

weixin_60261760的博客 1255

搭建 mongodb 副本集,很详细

在项目中使用事务报错,折腾了好久发现单体的 mongodb 不支持事务,需要副本集,在搭建的过程也踩了很多坑,这里做个记录。

studio_1的博客 2685

薛定谔 | 先导化合物优化与相互作用可视化

当获得针对某个靶点的先导分子后,想要在此基础上进行化学结构修饰。为了提升化学改造的成功率可以采用本教程方法进行结构虚拟改造/优化。每用薛定谔处理一个新任务,第一步必须创建新的project以方便日后管理。选项卡中修改工作路径(可以方便地找到输出文件)

药研猿的博客 2144

MongoDB副本集详解与搭建

MongoDB中的副本集(Replica Set)是一组维护相同数据集的mongod服务。 副本集可提供冗余和高可用性,是所有生产部署的基础。也可以说,副本集类似于有自动故障恢复功能的主从集群。

huangjhai的博客 5954

Python3 ACM模式输入输出全攻略:从牛客网到华为机试的实战技巧

本文详细解析了Python3在ACM模式下的输入输出处理技巧,针对牛客网、华为机试等在线评测系统。文章从input()函数本质出发,总结了六种高频输入模式的处理模板,并提供了链表、二叉树等数据结构的I/O实战方案,最后给出性能优化与常见避坑指南,帮助开发者高效应对算法笔试。

zero1的博客 998

Gazebo仿真环境下的强化学习实现

实际上利用Gazebo进行强化学习无非是环境获取上的不同,Gazebo的环境控制需要使用ROS服务进行控制,状态可以通过Gazebo进行获取,同时某些必要数据需要从话题中获取,最重要的是组织获取 的数据(通过话题等)与控制Gazebo的仿真步骤之间的组合。强化学习的手段与传统算法无异,强化学习方法最重要的是要确定动作空间、状态空间、奖励空间,这三个空间是work的前提。在笔者自己的环境中,将获取里程计的话题以及获取激光点的数据替换成为了自己的本机的仿真环境匹配的话题。

Moresweet 猫甜 6450

MongoDB之副本集配置

MongoDB主从复制 主从复制是 MongoDB 最早使用的复制方式, 该复制方式易于配置,并且可以支持任意数量的从节点服务器,与使用单节点模式相比有如下优点: 在从服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。 可配置读写分离,主节点负责写操作,从节点负责读操作,将读写压力分开,提高系统的稳定性。 MongoDB 的主从复制至少需要两个服务器或者节点。其中一个...

pengjunlee的博客 8万+

ThinkPHP 8.1 + think-swoole 4.1 实战:5分钟搞定WebSocket聊天室(附完整代码)

本文详细介绍了如何使用ThinkPHP 8.1和think-swoole 4.1快速构建高并发WebSocket聊天室。通过5分钟实战教程,开发者可以轻松实现用户列表、消息广播等核心功能,支持2000+并发连接,适用于客服系统、在线协作等实时通信场景。

ol789012345的博客 126

MongoDB副本集

目录 一.副本集概述 副本集的功能: 二.副本集成员 1.主结点 2.副本结点 3.仲裁结点 三.部署副本集 1.安装副本集 2.启动副本集 3.关闭防火墙 4.副本集初始化 5.添加副本集 6.查看副本集成员状态 一.副本集概述 副本集的功能: (1)数据冗余:副本集可以确保副本结点与主结点数据的更新,以防止单个数据库的服务宕机造成数据丢失的问题。这些副本结点可以和主结点位于同一个数据中心或处于安全考虑分布于其他数据中心 (2)自动故障转移:副本集没有固定...

m0_57979544的博客 7796

Python | 处理CMIP6 NC数据,以tas为例

各位同学,一般在文章最后一章我们可能会做不同气候情景下变量的未来时空变化特征,类似上图。从cmip6下载的nc数据常需要转换格式、裁剪到研究区和重采样等,本期代码可以解决这类问题。

qq_48539301的博客 1384

构建高效的LLM应用测试框架

《构建高效的LLM应用测试框架》 关键词:LLM,测试框架,应用测试,效率优化,测试原理 摘要:本文将深入探讨构建高效LLM应用测试框架的必要性、方法与步骤,旨在为开发者提供一套系统化、可操作的测试解决方案,从而提升LLM

AI天才研究院 1048

MongoDB副本集部署完整教程

MongoDB副本集部署完整教程

Five的博客 3976

大厂面试级C#上位机完整项目(终极版):工业级Modbus协议封装 + 标准多线程采集 + 全链路异常处理

(Modbus统一通信接口)、(采集服务接口)职责:定义所有核心操作的标准接口,屏蔽底层差异(RTU/TCP、串口/TCP),面向接口编程的核心体现。新增协议/采集方式,只需实现接口,核心代码零改动。/// 自定义Modbus通信异常类 - 大厂标准,区分通信异常和其他异常/// 包含异常信息+内部异常,可溯源完整错误堆栈,面试必写本次项目是对标大厂工控上位机岗位的终极版实战项目,所有代码、架构、设计都遵循大厂标准,覆盖了面试官考察的所有核心考点✅ 纯手写Modbus协议,体现你对协议底层的吃透。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 858

以副本集方式连接MongoDB副本集

MongoDB副本集通过维护多份数据副本来保证数据的高可用。相当于主备方式的数据冗余,其提供了自动故障转移的主从复制集群,其中复制集没有固定的主节点,当一个主机的故障后从节点会重新“选举”出一个新的主节点,从而提高的系统的可用性。MongoDB副本集只有Primary节点具有写数据的能力,当副本集中Primary节点宕机,或者副本集本身轮转升级时,副本集会触发选举,选出一个新的primary,原P...

深海微澜 8620

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

MongoDB副本集部署(windows)

节点启动可能会遇到问题,主要检查端口是否被占用,和路径配置问题。若都没问题则考虑以管理员身份启动cmd。说明:第一个“_id”为副本集名称,“priority”为优先级,数字越大,优先级越高。本教程演示mongodb4.4 副本集部署(一主两从,伪分布式)维持服务不要关闭,进入任何一个节点内。(明明是主节点,但却显示从节点)每一个节点(实例)都创建对应的。1.切换到admin数据库。说明副本集群部署成功。

jangxin的博客 2237

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

MongoDB副本集搭建、连接php

文章目录PHP连接MongoDBMongoDB副本集介绍MongoDB副本集搭建MongoDB副本集测试 PHP连接MongoDB php连接MongoDB需要安装拓展包有两种,分别是mongo.so和mongodb.so,mongo.so比较老(最新版本是2017.9.5的,目前已停止更新),主要用于php5.x版本,两个拓展包都可以在pecl网站(https://pecl.php.net)下载...

FUYY'S BLOG 1449

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

如何建立MongoDB副本集(4种方法)

在这篇文章中,我们将深入探讨MongoDB复制副本集的各个突出方面,比如它的功能和机制,仅举几例。

WPHunter的编程技术资料库! 2581

MongoDb副本集详解及搭建

mongodb副本集Mongodb副本集一. 副本集成员(1) 主节点(Primary)(2) 次节点(Secondary)(3) 仲裁节点(Arbiter)二. 副本Oplog(1) Oplog简介(2) Oplog大小(3) Oplog日志解析 Mongodb副本集 一. 副本集成员 (1) 主节点(Primary) 主节点是副本集中写操作的唯一成员。Mongodb在主节点上应用写操作,然后主节点的oplog上记录操作。次要成员复制此日志,并将操作应用于其数据集。 副本集的所有成员都可以接受读取操作。

qq_40861391的博客 7925

compass界面连接MongoDB副本集

第12讲

xiaoliuxxs 1747

MongoDB的副本集

MongoDB中的副本集

qq_44300280的博客 7507
上一篇: MongoDB 4.2——副本集的组成
下一篇: MongoDB 4.2——管理
吴声子夜歌
博客等级 码龄9年 2688粉丝 2268原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值