綜述:
# 停掉數據庫,直接刪除本地數據,然后啟動mongo數據庫,啟動之后存在一個同步的過程,會非常耗時。
# startup2:表示正在初始化並同步數據。
副本集的每個成員都有一個狀態,反映了它在集合中的配置情況。
數字 | 名稱 | 狀態描述 |
---|---|---|
0 | STARTUP | 還不是任何集合的活動成員。所有的成員啟動在該狀態。在STARTUP狀態mongod解析副本集配置文檔。 |
1 | PRIMARY | 處於PRIMARY狀態的成員是唯一能接受寫操作的成員。 |
2 | SECONDARY | 處於SECONDARY狀態的成員復制數據存儲。數據可用於讀,盡管可能比較舊。 |
3 | RECOVERING | 可以選舉。成員要么實施啟動自檢測,或完成回滾或重新同步的轉換。處於維修模式時:db.adminCommand({"replSetMaintenance":true}) |
5 | STARTUP2 | 成員加入了集合,正運行初始化同步。 |
6 | UNKNOWN | 成員的狀態,正如從集合的另一個成員中所看到的,未知。 |
7 | ARBITER | 仲裁不復制數據,而僅僅參與選舉。 |
8 | DOWN | 該成員,正如從集合的立即你跟一個成員所見,不可達。(not reachable/healthy),執行: db.shutdownServer() |
9 | ROLLBACK | 該成員正在實施回滾。數據不可讀。 |
10 | REMOVED | 成員曾今在副本集但隨后被移除。 |
舉例:
glc-test:SECONDARY> use admin switched to db admin glc-test:SECONDARY> db.shutdownServer() server should be down... 2020-11-26T15:57:35.265+0800 I NETWORK [js] trying reconnect to xxx:28042 failed 2020-11-26T15:57:35.267+0800 I NETWORK [js] reconnect xxx:28042 failed failed 2020-11-26T15:57:35.270+0800 I NETWORK [js] trying reconnect to xxx:28042 failed 2020-11-26T15:57:35.271+0800 I NETWORK [js] reconnect xxx:28042 failed failed > ^C 2020-11-26T15:57:45.250+0800 I NETWORK [js] trying reconnect to xxx:28042 failed 2020-11-26T15:57:45.251+0800 I NETWORK [js] reconnect xxx:28042 failed failed 2020-11-26T15:57:45.252+0800 I QUERY [js] Failed to end session { id: UUID("0dbe7d46-7f64-4af4-9a82-346be3b0d8fe") } due to SocketException: socket exception [CONNECT_ERROR] server [couldn't connect to server xxx:28042, connection attempt failed: SocketException: Error connecting to xxx:28042 (ip:28042) :: caused by :: Connection refused] { "_id" : 4, "name" : "xxx:28042", "health" : 0, "state" : 8, "stateStr" : "(not reachable/healthy)", "uptime" : 0, "optime" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "optimeDurable" : { "ts" : Timestamp(0, 0), "t" : NumberLong(-1) }, "optimeDate" : ISODate("1970-01-01T00:00:00Z"), "optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"), "lastHeartbeat" : ISODate("2020-11-26T07:58:56.535Z"), "lastHeartbeatRecv" : ISODate("2020-11-26T07:57:32.974Z"), "pingMs" : NumberLong(1), "lastHeartbeatMessage" : "Error connecting to xxx:28042 (ip:28042) :: caused by :: Connection refused", "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "configVersion" : -1 }
PRIMARY:
處於PRIMARY狀態的成員接受寫操作。
一個副本集每次最多只有一個主成員。在一次選舉后,一個SECONDARY狀態成員成為主成員。處於PRIMARY狀態的成員有資格選舉。
SECONDARY:
處於SECONDARY狀態的成員復制主成員的數據集合,並可以被配置為接受讀操作。輔助成員有資格在選舉中投票,如果主成員不可用,會被選舉為PRIMARY狀態。
ARBITER
處於ARBITER狀態的成員不復制數據,也不接受寫操作。它們有資格選舉,僅僅存在於選舉中決勝負。如果集合要么有大量的成員,並能夠參與決勝選舉,否則副本集應該只有一個成員處於ARBITER狀態。在任何副本集中最多只有一個仲裁被配置。
其他狀態
STARTUP:
副本集的每個成員以STARTUP狀態啟動。Mongod然后加載成員的副本集配置,成員的狀態轉化為STARTUP2。在STARTUP狀態的成員沒有資格選舉,因為它們不被人為是任何副本集的成員。
STARTUP2
一旦mongod加載成員配置完成,副本集的每個成員就進入STARTUP2狀態,在此時它開始成員副本集的一個活動成員。成員然后決定是否需要初始化同步。如果一個成員開始初始化同步,成員保持STARTUP2狀態直到所有數據拷貝完成所有索引創建完成。之后,成員轉換為RECOVERING狀態。
RECOVERING:
當副本集成員不准備接受讀取時,它進入RECOVERING狀態。RECOVERING狀態發生在正常操作期間,不必顯示一個錯誤條件。處於RECOVERING狀態的成員有資格在選舉中投票,但是沒有資格進入PRIMARY狀態。
在復制足夠的數據給客戶端所需讀取數據的一致性視圖,成員便從RECOVERING狀態轉為SECONDARY狀態。在RECOVERING和SECONDARY狀態之間的唯一區別是,RECOVERING阻止客戶端讀取,SECONDARY運行讀取。SECONDARY狀態並不保證主成員數據陳舊化。
注:關於負載,一個輔助成員可能會遠遠落后於副本集的其他成員,以至於它可能需要重新同步數據到副本集。當這種情況發生時,成員進入RECOVERING狀態,並需要手工干預。
錯誤狀態
處於錯誤狀態的成員不能選舉。
UNKNOWN:
從沒交流狀態信息到副本集的成員會處於UNKNOWN狀態。
DOWN:
丟失到副本集連接的成員被集合的剩余成員看作為DOWN狀態。
REMOVED:
從副本集移除的成員進入REMOVED狀態。當成員進入REMOVED狀態,日志將會標記replset REMOVED消息事件。
ROLLBACK:
當副本集在選舉中替換掉主成員,舊的主成員可能包含不會復制到輔助成員的文檔。在這種情況下,舊的主成員反轉這些寫操作。在回滾期間,成員將保持ROLLBACK狀態。
FATAL:
處於FATAL狀態的成員觸發了一個不可恢復錯誤。成員必需關閉並重啟,可能還需要重新同步。
###################################################