MongoDB副本集故障转移

时间:2015-04-07 13:31:18

标签: mongodb

我们有一个mongodb副本集,有两个实例(127.0.0.1:27017 - 主要,127.0.0.1:27018-次要)和一个仲裁(127.0.0.1:27019)。当我通过使用rs.stepDown(60)从主服务器退出时,它应该成为辅助服务器,辅助服务器应该成为主服务器实例,并且所有写入操作都应该在辅助实例中发生(主服务器在降级后执行)。但在下台后,我收到异常“无法将数据写入传输连接:远程主机强行关闭现有连接。”。

App.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 个答案:

答案 0 :(得分:1)

假设您向主要发送一个确认写入,然后在部分完成写入之后但在完成写入并确认写入完成之前,主要由轨道离子加工炮炸。您应该如何自动从初级切换到次级&#34;在这种情况下?这种联系和操作意味着什么?

选举需要几秒钟才会发生,在此期间没有主要发送写入。司机在没有小学的情况下做了什么?当连接进入一个不再可用的节点时,它如何保持相同的连接?

关键是,故障转移期间应用程序的错误是预期的,您的应用程序需要能够处理它们。当主要发生故障时,MongoDB /驱动程序无法在所有情况下神奇地使一切正常运行。选择新的主要人员后,司机将自动切换到新的主要人员,然后看起来好像什么也没发生。