簡體   English   中英

MongoDB副本集故障轉移

[英]MongoDB Replica Set Failover

我們有一個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#代碼自動從主服務器切換到輔助服務器。

假設您向主數據庫發送了確認寫入,然后在部分完成寫入之后但在完成並確認寫入完成之前,用軌道離子大炮炸了主寫入。 在這種情況下,您應該如何“自動從主要切換到次要”? 這種連接和操作意味着什么?

選舉需要花費幾秒鍾的時間,在此期間沒有要發送寫入內容的主對象。 沒有主駕駛員時駕駛員會做什么? 當連接轉到不再可用的節點時,如何保持相同的連接?

關鍵是,故障轉移期間應用程序中的錯誤是預料之中的,您的應用程序需要能夠處理它們。 當主數據庫發生故障時,MongoDB /驅動程序無法神奇地使一切正常運行,就像在所有情況下都沒有發生任何事情一樣。 選擇新的主驅動程序后,驅動程序將自動切換到新的主驅動程序,然后好像什么也沒發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM