Database-Design
副本集問題 - 一個主實例和兩個輔助實例
在 AWS ubuntu 16.04 上執行,主要是本地 vm 上的本地 ubuntu 16.04。
在查看日誌時,我注意到每當一個輔助節點上線以讓輔助節點同步時,主節點就會切換到輔助節點,然後它會切換回主節點。
有沒有辦法阻止它?這似乎令人擔憂,因為我已經在輔助實例上將優先級設置為 0。我需要在任何時候都可以寫入訪問權限 - 我不能讓它切換到輔助設備,以防其中一個輔助設備發生故障並且必須重新連接。
這是配置的樣子:
rs.config() { "_id" : "dbname", "version" : 11, "protocolVersion" : NumberLong(1), "members" : [ { "_id" : 0, "host" : "Primary", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 1, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 1, "host" : "Secondary", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 }, { "_id" : 2, "host" : "Secondary", "arbiterOnly" : false, "buildIndexes" : true, "hidden" : false, "priority" : 0, "tags" : { }, "slaveDelay" : NumberLong(0), "votes" : 1 } ], "settings" : { "chainingAllowed" : true, "heartbeatIntervalMillis" : 2000, "heartbeatTimeoutSecs" : 10, "electionTimeoutMillis" : 10000, "catchUpTimeoutMillis" : -1, "catchUpTakeoverDelayMillis" : 30000, "getLastErrorModes" : { }, "getLastErrorDefaults" : { "w" : 1, "wtimeout" : 0 }, "replicaSetId" : ObjectId("someid") } }
這裡也是主要的完整日誌
2018-02-01T09:20:02.984-0800 I CONTROL [initandlisten] MongoDB 開始:pid=19294 port=27017 dbpath=/srv/mongodb/db0 64-bit host=ubuntu-cheftest 2018-02-01T09:20:02.984-0800 I CONTROL [initandlisten] db 版本 v3.6.2 2018-02-01T09:20:02.985-0800 I CONTROL [initandlisten] git 版本:489d177dbd0f0420a8ca04d39fd78d0a2c539420 2018-02-01T09:20:02.985-0800 I CONTROL [initandlisten] OpenSSL 版本:OpenSSL 1.0.2g 2016 年 3 月 1 日 2018-02-01T09:20:02.985-0800 I CONTROL [initandlisten] 分配器:tcmalloc 2018-02-01T09:20:02.985-0800 I CONTROL [initandlisten] 模組:無 2018-02-01T09:20:02.985-0800 I CONTROL [initandlisten] 建構環境: 2018-02-01T09: 20: 02.985-0800 我控制 [initandlisten] distmod: ubuntu1604 2018-02-01T09:20:02.985-0800 我控制 [initandlisten] distarch: x86_64 2018-02-01T09:20:02.985-0800 我控制 [initandlisten] target_arch: x86_64 2018-02-01T09:20:02.985-0800 I CONTROL [initandlisten] 選項:{ net:{ bindIp:“127.0.0.1,192.168.6.39”,埠:27017 },複製:{ replSet:“mdblid”},儲存: { dbPath: "/srv/mongodb/db0" } } 2018-02-01T09:20:02.985-0800 I - [initandlisten] 在 /srv/mongodb/db0 中檢測到由“wiredTiger”儲存引擎創建的數據文件,因此將活動儲存引擎設置為“wiredTiger”。 2018-02-01T09: 20: 02.985-0800 我儲存 [initandlisten] 2018-02-01T09:20:02.985-0800 I STORAGE [initandlisten] ** 警告:強烈建議使用 XFS 文件系統和 WiredTiger 儲存引擎 2018-02-01T09: 20: 02.985-0800 I STORAGE [initandlisten] ** 見 http://dochub.mongodb.org/core/prodnotes-filesystem 2018-02-01T09:20:02.985-0800 I STORAGE [initandlisten]wiredtiger_open config:create,cache_size=488M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast) ,log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),statistics_log=(wait=0),verbose=(recovery_progress), 2018-02-01T09:20:03.677-0800 I STORAGE [initandlisten] WiredTiger 消息 [1517505603:677241][19294:0x7f156a0f69c0],txn-recover:主恢復循環:從 71/8704 開始 2018-02-01T09:20:03.882-0800 I STORAGE [initandlisten] WiredTiger 消息 [1517505603:882098][19294:0x7f156a0f69c0],txn-recover:恢復日誌 71 到 72 2018-02-01T09:20:03.991-0800 I STORAGE [initandlisten] WiredTiger 消息 [1517505603:991545][19294:0x7f156a0f69c0],txn-recover:恢復日誌 72 到 72 2018-02-01T09:20:04.136-0800 I STORAGE [initandlisten] 啟動 WiredTigerRecordStoreThread local.oplog.rs 2018-02-01T09:20:04.136-0800 I STORAGE [initandlisten] size storer 報告 oplog 包含 4572 條記錄,總計 503638 字節 2018-02-01T09:20:04.136-0800 I STORAGE [initandlisten] 掃描 oplog 以確定在何處放置截斷標記 2018-02-01T09: 20: 04.149-0800 我控制 [initandlisten] 2018-02-01T09:20:04.149-0800 I CONTROL [initandlisten] ** 警告:未為數據庫啟用訪問控制。 2018-02-01T09:20:04.150-0800 I CONTROL [initandlisten] ** 對數據和配置的讀寫訪問不受限制。 2018-02-01T09:20:04.150-0800 I CONTROL [initandlisten] ** 警告:您正在以 root 使用者身份執行此程序,不建議這樣做。 2018-02-01T09: 20: 04.150-0800 我控制 [initandlisten] 2018-02-01T09: 20: 04.150-0800 我控制 [initandlisten] 2018-02-01T09:20:04.150-0800 我控制 [initandlisten] ** 警告:/sys/kernel/mm/transparent_hugepage/enabled 是“始終”。 2018-02-01T09:20:04.150-0800 I CONTROL [initandlisten] ** 我們建議將其設置為“從不” 2018-02-01T09: 20: 04.150-0800 我控制 [initandlisten] 2018-02-01T09:20:04.150-0800 我控制 [initandlisten] ** 警告:/sys/kernel/mm/transparent_hugepage/defrag 是“始終”。 2018-02-01T09:20:04.150-0800 I CONTROL [initandlisten] ** 我們建議將其設置為“從不” 2018-02-01T09: 20: 04.150-0800 我控制 [initandlisten] 2018-02-01T09:20:04.205-0800 I FTDC [initandlisten] 使用目錄“/srv/mongodb/db0/diagnostic.data”初始化全時診斷數據擷取 2018-02-01T09:20:04.208-0800 I REPL [initandlisten] 沒有 oplog 條目申請恢復。AppliedThrough 和 checkpointTimestamp 都為空。 2018-02-01T09:20:04.209-0800 I NETWORK [initandlisten] 等待埠 27017 上的連接 2018-02-01T09:20:04.239-0800 W NETWORK [replexec-0] 無法連接到 172.31.28.232:27017,在(輪詢後檢查套接字是否有錯誤),原因:連接被拒絕 2018-02-01T09:20:04.269-0800 W NETWORK [replexec-0] 無法連接到 172.31.24.194:27017,在(輪詢後檢查套接字是否有錯誤),原因:連接被拒絕 2018-02-01T09:20:04.269-0800 I REPL [replexec-0] 新副本集配置正在使用:{ _id:“mdblid”,版本:11,protocolVersion:1,成員:[ { _id:0,主機: "192.168.6.39:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 1.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 2, host: "mongo3:27017" , arbiterOnly: false, buildIndexes: true, hidden: false, priority: 0.0, tags: {}, slaveDelay: 0, votes: 1 }, { _id: 3, host: "mongo2:27017", arbiterOnly: false, buildIndexes: true, hidden: false, priority: 0.0, tags: {}, slaveDelay: 0, votes: 1 }], settings: {chainingAllowed: true, heartbeatIntervalMillis: 2000, heartbeatTimeoutSecs: 10,electionTimeoutMillis: 10000, catchUpTimeoutMillis: -1, catchUpTakeoverDelayMillis : 30000, getLastErrorModes: {}, getLastErrorDefaults: { w: 1, wtimeout:0},replicaSetId:ObjectId('5a68d17b6bae4407d0183a21')}} 2018-02-01T09:20:04.269-0800 I REPL [replexec-0] 此節點在配置中為 192.168.6.39:27017 2018-02-01T09:20:04.269-0800 I REPL [replexec-0] 從 STARTUP 過渡到 STARTUP2 2018-02-01T09:20:04.269-0800 I REPL [replexec-0] 啟動複製儲存執行緒 2018-02-01T09:20:04.270-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo2:27017 2018-02-01T09:20:04.273-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo3:27017 2018-02-01T09:20:04.274-0800 我 REPL [replexec-0] 過渡到從 STARTUP2 恢復 2018-02-01T09:20:04.274-0800 I REPL [replexec-0] 啟動複製獲取執行緒 2018-02-01T09:20:04.274-0800 I REPL [replexec-0] 啟動複製應用程序執行緒 2018-02-01T09:20:04.274-0800 I REPL [replexec-0] 啟動複製報告執行緒 2018-02-01T09:20:04.278-0800 我 REPL [rsSync] 從 RECOVERING 過渡到 SECONDARY 2018-02-01T09:20:04.303-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 無法連接到 mongo2:27017 - HostUnreachable:連接被拒絕 2018-02-01T09:20:04.303-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 由於連接操作失敗,將所有池連接丟棄到 mongo2:27017 2018-02-01T09:20:04.304-0800 I REPL_HB [replexec-1] 到 mongo2:27017 的心跳(requestId:1)錯誤,響應狀態:HostUnreachable:連接被拒絕 2018-02-01T09:20:04.304-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 無法連接到 mongo3:27017 - HostUnreachable:連接被拒絕 2018-02-01T09:20:04.304-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 由於連接操作失敗,將所有池連接丟棄到 mongo3:27017 2018-02-01T09:20:04.304-0800 I REPL_HB [replexec-0] 到 mongo3:27017 的心跳(requestId:3)錯誤,響應狀態:HostUnreachable:連接被拒絕 2018-02-01T09:20:04.304-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo2:27017 2018-02-01T09:20:04.304-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo3:27017 2018-02-01T09:20:04.334-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 無法連接到 mongo2:27017 - HostUnreachable:連接被拒絕 2018-02-01T09:20:04.334-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 由於連接操作失敗,將所有池連接丟棄到 mongo2:27017 2018-02-01T09:20:04.334-0800 I REPL_HB [replexec-1] 到 mongo2:27017 的心跳(requestId:5)錯誤,響應狀態:HostUnreachable:連接被拒絕 2018-02-01T09:20:04.334-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 無法連接到 mongo3:27017 - HostUnreachable:連接被拒絕 2018-02-01T09:20:04.334-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 由於連接操作失敗,將所有池連接丟棄到 mongo3:27017 2018-02-01T09:20:04.334-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo2:27017 2018-02-01T09:20:04.334-0800 I REPL_HB [replexec-2] 到 mongo3:27017 的心跳(requestId:7)錯誤,響應狀態:HostUnreachable:連接被拒絕 2018-02-01T09:20:04.335-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo3:27017 2018-02-01T09:20:04.365-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 無法連接到 mongo3:27017 - HostUnreachable:連接被拒絕 2018-02-01T09:20:04.365-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 由於連接操作失敗,將所有池連接丟棄到 mongo3:27017 2018-02-01T09:20:04.365-0800 I REPL_HB [replexec-0] 到 mongo3:27017 的心跳(requestId:11)錯誤,響應狀態:HostUnreachable:連接被拒絕 2018-02-01T09:20:04.365-0800 I REPL [replexec-0] 成員 mongo3:27017 現在處於 RS_DOWN 狀態 2018-02-01T09:20:04.365-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 無法連接到 mongo2:27017 - HostUnreachable:連接被拒絕 2018-02-01T09:20:04.365-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 由於連接操作失敗,將所有池連接丟棄到 mongo2:27017 2018-02-01T09:20:04.365-0800 I REPL_HB [replexec-2] 到 mongo2:27017 的心跳(requestId:9)錯誤,響應狀態:HostUnreachable:連接被拒絕 2018-02-01T09:20:04.366-0800 I REPL [replexec-2] 成員 mongo2:27017 現在處於 RS_DOWN 狀態 2018-02-01T09:20:05.656-0800 I NETWORK [listener] 連接從 172.31.28.232:56742 #1 接受(現在打開 1 個連接) 2018-02-01T09:20:05.686-0800 I NETWORK [conn1] 結束連接 172.31.28.232:56742(現在打開 0 個連接) 2018-02-01T09:20:05.718-0800 I NETWORK [listener] 連接從 172.31.28.232:56746 #2 接受(現在打開 1 個連接) 2018-02-01T09:20:05.719-0800 I NETWORK [conn2] 從 172.31.28.232:56746 收到客戶端元數據 conn: { driver: { name: "NetworkInterfaceASIO-Replication", version: "3.6.2" }, os: { 類型:“Linux”,名稱:“Ubuntu”,架構:“x86_64”,版本:“16.04”} } 2018-02-01T09:20:07.782-0800 I NETWORK [listener] 連接從 172.31.24.194:39638 #3 接受(現在打開 2 個連接) 2018-02-01T09:20:07.812-0800 I NETWORK [conn3] 端連接 172.31.24.194:39638(現在打開 1 個連接) 2018-02-01T09:20:07.846-0800 I NETWORK [listener] 從 172.31.24.194:39642 #4 接受連接(現在打開 2 個連接) 2018-02-01T09:20:07.847-0800 I NETWORK [conn4] 從 172.31.24.194:39642 收到客戶端元數據 conn: { driver: { name: "NetworkInterfaceASIO-Replication", version: "3.6.2" }, os: { 類型:“Linux”,名稱:“Ubuntu”,架構:“x86_64”,版本:“16.04”} } 2018-02-01T09:20:09.365-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo2:27017 2018-02-01T09:20:09.365-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo3:27017 2018-02-01T09:20:09.426-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 成功連接到 mongo2:27017,耗時 61 毫秒(1 個連接現在打開到 mongo2:27017) 2018-02-01T09:20:09.427-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 成功連接到 mongo3:27017,耗時 62 毫秒(1 個連接現在打開到 mongo3:27017) 2018-02-01T09:20:09.456-0800 I REPL [replexec-2] 成員 mongo3:27017 現在處於 SECONDARY 狀態 2018-02-01T09:20:09.459-0800 I REPL [replexec-1] 成員 mongo2:27017 現在處於 SECONDARY 狀態 2018-02-01T09:20:15.302-0800 I REPL [replexec-1] 開始選舉,因為我們在過去 10000 毫秒內沒有看到 PRIMARY 2018-02-01T09:20:15.302-0800 我 REPL [replexec-1] 進行一次預選,看看我們是否能當選。目前任期:41 2018-02-01T09:20:15.332-0800 I REPL [replexec-0] VoteRequester(term 41 dry run) 收到了 mongo3:27017 的讚成票;響應消息:{ term: 41, voteGranted: true, reason: "", ok: 1.0, operationTime: Timestamp(1517505592, 1), $clusterTime: { clusterTime: Timestamp(1517505592, 1), signature: { hash: BinData( 0, 0000000000000000000000000000000000000000), keyId: 0 } } } 2018-02-01T09:20:15.332-0800 I REPL [replexec-0] 試執行成功,在第 42 學期競選 2018-02-01T09:20:15.333-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 由於連接狀態不佳,正在結束與主機 mongo2:27017 的連接;與該主機的 0 個連接保持打開狀態 2018-02-01T09:20:15.334-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo2:27017 2018-02-01T09:20:15.365-0800 I REPL [replexec-1] VoteRequester(term 42) 收到了來自 mongo3:27017 的讚成票;響應消息:{ term: 42, voteGranted: true, reason: "", ok: 1.0, operationTime: Timestamp(1517505592, 1), $clusterTime: { clusterTime: Timestamp(1517505592, 1), signature: { hash: BinData( 0, 0000000000000000000000000000000000000000), keyId: 0 } } } 2018-02-01T09:20:15.365-0800 I REPL [replexec-1] 選舉成功,在第 42 學期擔任主要角色 2018-02-01T09:20:15.365-0800 我 REPL [replexec-1] 從 SECONDARY 過渡到 PRIMARY 2018-02-01T09:20:15.366-0800 I REPL [replexec-1] 進入主要追趕模式。 2018-02-01T09:20:15.366-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 連接到 mongo2:27017 2018-02-01T09:20:15.395-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 成功連接到 mongo2:27017,耗時 61 毫秒(現在打開 2 個連接到 mongo2:27017) 2018-02-01T09:20:15.426-0800 I REPL [replexec-0] 趕上成為主要後通過心跳知道的最新優化時間。 2018-02-01T09:20:15.426-0800 I REPL [replexec-0] 退出主要追趕模式。 2018-02-01T09:20:15.434-0800 I ASIO [NetworkInterfaceASIO-Replication-0] 成功連接到 mongo2:27017,耗時 67 毫秒(現在打開 2 個連接到 mongo2:27017) 2018-02-01T09:20:17.282-0800 我 REPL [rsSync] 過渡到主要完成;現在允許數據庫寫入 2018-02-01T09:20:18.849-0800 I NETWORK [listener] 連接從 172.31.24.194:39646 #5 接受(現在打開 3 個連接) 2018-02-01T09:20:18.850-0800 I NETWORK [conn5] 從 172.31.24.194:39646 收到客戶端元數據 conn: { driver: { name: "NetworkInterfaceASIO-RS", version: "3.6.2" }, os: { 類型:“Linux”,名稱:“Ubuntu”,架構:“x86_64”,版本:“16.04”} } 2018-02-01T09:20:18.970-0800 I NETWORK [listener] 連接從 172.31.24.194:39648 #6 接受(現在打開 4 個連接) 2018-02-01T09:20:18.971-0800 I NETWORK [conn6] 從 172.31.24.194:39648 收到客戶端元數據 conn: { driver: { name: "NetworkInterfaceASIO-RS", version: "3.6.2" }, os: { 類型:“Linux”,名稱:“Ubuntu”,架構:“x86_64”,版本:“16.04”} }
鑑於您目前的副本集配置,這種行為是預期的。
為了被選舉(並保持)主要,副本集成員必須與大多數投票副本集成員具有連接性。
您的配置有兩個成員,他們有
priority 0
並且不能被選為主要成員,因此只有一個主要候選人(成員_id:0
)。但是,副本集中的所有成員都在投票,因此選舉主節點所需的多數是配置的副本集成員的 2/3。根據您從首選成員提供的日誌資訊作為主要成員,副本集成員狀態時間線如下所示:
- 啟動成員並
_id: 0
為數據文件執行 WiredTiger 一致性檢查。mongod
從副本集 STARTUP(讀取配置)到 STARTUP2(啟用複制執行緒)的轉換。- STARTUP2 完成,成員短暫轉換到 RECOVERING 狀態,然後是 SECONDARY 狀態,現在它已準備好根據上次保存的副本集配置連接到副本集的其他成員。
- 與其他成員的網路連接不可用(
Connection refused
),因此該成員轉換為 SECONDARY 狀態並將副本集的其他成員標記為不可達:Member mongo2:27017 is now in state RS_DOWN
。由於配置的 3 個成員中只有 1 個投票成員可用,因此無法選舉主成員,因此該成員將保持為 SECONDARY 並且不會提議選舉。- 解決網路連接問題後,現在可以確定副本集其他成員的狀態
Member mongo2:27017 is now in state SECONDARY
:- 副本集現在在足夠多的成員之間具有連接性以開始選舉。還提到了選舉的原因:
Starting an election, since we've seen no PRIMARY in the past 10000ms
。- 選舉成功 (
election succeeded, assuming primary role in term 42
) 並且該成員從 SECONDARY 狀態轉換為 PRIMARY 狀態。我需要在任何時候都可以寫入訪問權限 - 我不能讓它切換到輔助設備,以防其中一個輔助設備發生故障並且必須重新連接。
副本集的預設配置是為自動故障轉移而設計的:如果目前主節點與大多數副本集成員隔離,則可以選擇新的主節點以繼續寫入可用性。
如果您不希望自動故障轉移,請將輔助節點的投票設置為 0:
var conf=rs.conf() conf.members[1].votes = 0 conf.members[2].votes = 0 rs.reconfig(conf)
在副本集配置中只有一個投票成員,主節點現在可以自行選舉,而不管其他副本集成員的連接性或健康狀況如何。
此配置有一些明顯的警告:
- 由於您只有一個投票節點,因此
w:majority
寫入關注點等同於w:1
並且只會請求主節點的確認。- 如果主節點與其他副本集成員保持斷開連接很長時間,則輔助節點可能會變得陳舊並需要完全重新同步。您可以通過增加每個副本集成員的複制 oplog 的大小來緩解這種情況,以便提供適當的緩衝區。