MongoDB副本集故障转移



我们有一个mongodb副本集,它有两个实例(127.0.0.1:27017-主实例,127.0.0.1:2701-辅助实例)和一个仲裁器(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#代码自动从主实例切换到辅助实例。

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

选举需要几秒钟的时间,在此期间没有可向其发送写操作的主要驱动程序。在没有主要驱动程序的情况下,驱动程序会做什么?当连接到一个不再可用的节点时,它如何保持相同的连接?

关键是,应用程序在故障转移过程中会出现错误,您的应用程序需要能够处理这些错误。当主应用程序失败时,MongoDB/驱动程序无法神奇地让所有事情都像在任何情况下都没有发生一样正常工作。在选择了新的初选后,司机会自动切换到新的初选,然后看起来什么都没发生。

最新更新