我们有一个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#代码自动从主要切换到次要。
答案 0 :(得分:1)
假设您向主要发送一个确认写入,然后在部分完成写入之后但在完成写入并确认写入完成之前,主要由轨道离子加工炮炸。您应该如何自动从初级切换到次级&#34;在这种情况下?这种联系和操作意味着什么?
选举需要几秒钟才会发生,在此期间没有主要发送写入。司机在没有小学的情况下做了什么?当连接进入一个不再可用的节点时,它如何保持相同的连接?
关键是,故障转移期间应用程序的错误是预期的,您的应用程序需要能够处理它们。当主要发生故障时,MongoDB /驱动程序无法在所有情况下神奇地使一切正常运行。选择新的主要人员后,司机将自动切换到新的主要人员,然后看起来好像什么也没发生。