当前位置: 首页 > 知识库问答 >
问题:

MongoDB副本集故障转移

缪宪
2023-03-14

我们有一个mongodb副本集,其中包含两个实例(127.0.0.1:27017-主要,127.0.0.1:27018-次要)和一个仲裁器(127.0.0.1:27019)。当我使用rs.steppdown(60)从主实例中退出时,它应该成为辅助实例,辅助实例应该成为主实例,所有写操作都应该在辅助实例中发生(退出后的主实例)。但在卸任后,我遇到了一个异常“无法将数据写入传输连接:远程主机强制关闭了一个现有连接”。

应用程序。Config有以下键:

<appSettings>
    <add key="mongoServerIP" value="127.0.0.1" />
    <add key="mongoServerPort" value="27017"/>
    <!--<add key="dbname" value="PSLRatingEngine"/>-->
    <add key="MongoDbDatabaseName" value="PSLRatingEngine" />
    <add key="testcollectionname" value="Test"/>
</appSettings>

C#代码:

    using MongoDB.Driver;
    using System;
    using System.Collections.Generic;
    using System.Configuration;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace ReplicaSetTest
    {
        class Program
        {
            static void Main(string[] args)
            {
    string mongoserverip = ConfigurationManager.AppSettings["mongoServerIP"].ToString();

    int port =   Convert.ToInt32(ConfigurationManager.AppSettings["mongoServerPort"].ToString());

   string dbname = ConfigurationManager.AppSettings["MongoDbDatabaseName"].ToString();

 string customercollectionname = ConfigurationManager.AppSettings["testcollectionname"].ToString();
            try
            {
                MongoServerSettings settings = new MongoServerSettings();
               settings.Server = new MongoServerAddress(mongoserverip, port);


                    // Create server object to communicate with our server
                    MongoServer server = new MongoServer(settings);
                    // Get our database instance to reach collections and data
                    var db = server.GetDatabase(dbname);
                    // Get user collection reference
                    var collection = db.GetCollection(customercollectionname);
                    int i = 0;
                    while(true)
                    {

                        Employee emp = new Employee();
                        emp.EmpId = i + 1000;
                        Random r = new Random();
                        emp.Age =  r.Next(20, 70);
                        emp.Salary = r.NextDouble() * 100000;
                        emp.Name = "emp" + i;
                        emp.Dept = "Engineering";
                        collection.Insert<Employee>(emp);
                        i++;
                    }   
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }
    }

请让我知道,如果副本集的主实例发生任何变化,我如何通过C#代码自动从主实例切换到辅助实例。

共有1个答案

公良英资
2023-03-14

假设您向主设备发送一个确认写入,然后主设备在部分完成写入后,但在完成并确认写入完成之前,被轨道离子炮炸毁。在这种情况下,您应该如何“自动从主设备切换到辅助设备”?这对连接和操作意味着什么?

选举需要几秒钟的时间,在选举期间没有可供写信的初选。在没有主控灯的情况下,驾驶员会做什么?当连接转到不再可用的节点时,它如何保持相同的连接?

关键是,故障转移期间应用程序可能会出现错误,您的应用程序需要能够处理这些错误。当主服务器出现故障时,MongoDB/驱动程序无法神奇地让一切正常工作,就像所有情况下都没有发生一样。在新的初选选出后,司机会自动切换到新的初选,然后就好像什么都没发生过一样。

 类似资料:
  • 对于复制,我们设置Server1作为主服务器,设置server2作为次服务器...一切正常。 期望:当server1停机时,次要的server2不会自动变成主要的。它仍然是次要的。server2也有可能自动成为主服务器。 情况2:MongoDB复制是否需要3台强制服务器,以便当server1宕机时,server2将自动成为主要服务器,server3将保持次要服务器。(这很管用)

  • 我正在尝试用6台机器实现一个Redis集群。我有一个由六台机器组成的流浪集群: 运行redis服务器 我编辑了上述所有服务器的/etc/redis/redis.conf文件,添加了这个 然后我在六台机器中的一台上运行了这个程序; Redis集群已启动并运行。我通过在一台机器上设置值手动检查它显示在其他机器上。 我的问题是,当我关闭或停止任何一台主机上的redis server时,整个集群都会停止运

  • 因此,如果我理解正确的话,在检测并重新启动失败代理的环境中运行Artemis代理集群将提供与运行每个活动服务器都与备份配对的集群相同的语义(以及类似的可用性)。对吗?

  • 我注意到,当连接的Artemis节点宕机时,连接到节点2-4的客户机不会故障转移到其他3个可用的主节点,基本上不会发现其他节点。即使在原始节点恢复之后,客户端仍然无法建立连接。我从一个单独的堆栈溢出帖子中看到,不支持主到主故障转移。这是否意味着对于每个主节点,我也需要创建一个从节点来处理故障转移?这是否会导致两个实例点失败,而不是集群中有许多节点? 在一个单独的基本测试中,使用一个主从两个节点的集

  • 目前,我正在使用ActiveMQ,并计划将系统迁移到ActiveMQ Artemis。目前,我有3个生产者和3个消费者,只有一个ActiveMQ服务器/代理。

  • 故障自动转移是指在 TiDB 集群的某些节点出现故障时,TiDB Operator 会自动添加一个节点,保证 TiDB 集群的高可用,类似于 K8s 的 Deployment 行为。 由于 TiDB Operator 基于 StatefulSet 来管理 Pod,但 StatefulSet 在某些 Pod 发生故障时不会自动创建新节点来替换旧节点,所以,TiDB Operator 扩展了 Stat