2012-12-23 35 views
0

在這個簡單的程序中,我想在主節點崩潰時重新連接到副本集。但它不起作用:如果主節點崩潰,這個程序將立即終止而沒有任何輸出,並返回141.我不知道爲什麼。什麼是重新連接副本集合的正確方法?如何在主節點崩潰時重新連接到副本集?

#include <stdio.h> 
#include <mongo.h> 

int insertVal(mongo *conn, int val) { 
    bson op[1]; 
    bson_init(op); 
    bson_append_int(op, "val", val); 
    bson_finish(op); 

    int status = mongo_insert(conn, "test.vals", op, NULL); 

    bson_destroy(op); 
    return status; 
} 

int main() 
{ 
    mongo conn[1]; 
    mongo_replset_init(conn, "test"); 
    mongo_replset_add_seed(conn, "localhost", 27017); 
    mongo_replset_add_seed(conn, "localhost", 27018); 
    mongo_replset_add_seed(conn, "localhost", 27019); 
    int status = mongo_replset_connect(conn); 
    if (status != MONGO_OK) { 
    return 1; 
    } 

    for (int i = 0; i < 1000 * 1000; ++i) { 
     status = insertVal(conn, i); 
     if (status != MONGO_OK) { 
      printf("%d\n", status); 
      --i; 
      mongo_reconnect(conn); 
     } 
    } 

    mongo_destroy(conn); 
    return 0; 
} 

回答

0

你不需要做數據庫管理操作,例如mongo_reconnect(conn);自己,也可能造成與MongoDB的衝突。

請參閱Document這裏。 「Mongodb Replica集具有自動故障轉移功能,如果主要設備脫機或無響應,並且大部分原始設置成員仍然可以互相連接,則該設備將選擇一個新的主設備」。

+0

我試圖刪除'mongo_reconnect(conn)',但問題沒有改變。 – user805627

+2

我認爲你根本不需要檢查副本集的狀態,因爲mongodb會自行處理。 – coderLMN

+0

我同意金招。如果你正在做很多工作,你可能需要處理的唯一事情可能是等待一兩秒鐘,而Mongo重新選擇一個新的小學。不知道這是否需要,但需要考慮。根據我的經驗,選擇一個新的小學並不是即時的。 – ryan1234

相關問題