架構概述
MongoDB部署架構分爲單機、可複製集、分片集羣,單機適合學習使用;分片集羣比較複雜、運維難度高,在數據量達到一定瓶頸的時候才考慮使用,要慎重選擇;可複製集是非常適合用於生產環境的一種架構
本文講解的是可複製集架構的原理和搭建
可複製集原理
可複製集是跨多個MongDB服務器(節點)分佈和維護數據的方法。
mongoDB可以把數據從一個節點複製到其他節點並在修改時進行同步,集羣中的節點配置爲自動同步數據
舊方法叫做主從複製,mongoDB 3.0以後推薦使用可複製集
可複製集優點:
- 避免數據丟失,保障數據安全,提高系統安全性(最少3節點,最大50節點)
- 自動化災備機制,主節點宕機後通過選舉產生新主機,提高系統健壯性(7個選舉節點上限)
- 讀寫分離,負載均衡,提高系統性能
- 生產環境推薦的部署模式
架構圖:
- oplog(操作日誌):保存操作記錄、時間戳,該日誌極其重要!!!
- 數據同步:從節點與主節點保持長輪詢
- 首先從節點查詢本機oplog最新時間戳
- 然後從節點查詢主節點oplog晚於此時間戳的所有文檔
- 最後從節點加載這些文檔,並根據log執行寫操作
- 阻塞複製:與writeconcern相關
- 情況一:不需要同步到從節點的策略(如: acknowledged、Unacknowledged 、w1),數據同步都是異步的
- 情況二:其他writeconcern情況都是同步的,因爲都需要等待從節點確認完畢後才結束整個寫流程
- 心跳機制:成員之間會每2s 進行一次心跳檢測(ping操作),發現故障後進行選舉和故障轉移
- 選舉制度:主節點故障後,其餘節點根據優先級和bully算法選舉出新的主節點,在選出主節點之前,集羣服務是隻讀的,不對外提供寫服務
備註:oplog是蓋子集合,大小是可以調整的,64爲系統中默認是所在硬盤可用空間的5%,具體說明參考:官方文檔說明
可複製集環境搭建
-
環境準備
這裏只在一臺機器上搭建三個節點,生產上一定要用3臺
IP:192.168.31.41
MongoDB版本:mongodb-linux-x86_64-rhel70-3.4.20.tgz
-
安裝好3個MongoDB節點,安裝教程參考我的另一篇博客:MongoDB在CentOS7下的yum方式和壓縮包方式安裝
master 192.168.31.41 27030
slave1 192.168.31.41 27031
slave2 192.168.31.41 27032
-
3個MongoDB的配置文件mongodb.conf加入如下相同的配置
replication: replSetName: configRS #集羣名稱 oplogSizeMB: 500 #oplog集合大小,單位MB,一定不能設置太小,根據具體機器磁盤進行設置
這裏列出master節點的配置文件全部內容,和slave1、slave2配置文件的不同之處在於端口和相關路徑的配置,其他都一致:
storage: dbPath: "/usr/local/mongodb/replica/master/data" journal: enabled: true directoryPerDB: true engine: wiredTiger wiredTiger: engineConfig: cacheSizeGB: 1 journalCompressor: snappy directoryForIndexes: false collectionConfig: blockCompressor: snappy indexConfig: prefixCompression: true systemLog: destination: file path: "/usr/local/mongodb/replica/master/log/mongodb.logs" net: port: 27030 http: RESTInterfaceEnabled: true processManagement: fork: false replication: replSetName: configRS oplogSizeMB: 500
-
創建啓動腳本
cd /usr/local/mongodb/replica mkdir logs vim start-replica-mongo.sh #輸入如下內容 nohup ./master/bin/mongod -f ./master/bin/mongodb.conf > ./logs/master.log 2>&1 & nohup ./slave1/bin/mongod -f ./slave1/bin/mongodb.conf > ./logs/slave1.log 2>&1 & nohup ./slave2/bin/mongod -f ./slave2/bin/mongodb.conf > ./logs/slave2.log 2>&1 & #保存後授權執行權限 chmod u+x start-replica-mongo.sh
-
啓動
./start-replica-mongo.sh
-
在master節點上運行初始化命令
cd /usr/local/mongodb/replica/master/bin mongo 127.0.0.1:27030 # _id表示集羣名稱,members表示master主機 rs.initiate({ _id: "configRS", version: 1, members: [{ _id: 0, host : "192.168.31.41:27030" }]}); # 有多少個slave就執行多少次add rs.add("192.168.31.41:27031"); rs.add("192.168.31.41:27032");
-
從節點上執行rs.slaveOk()【注意:這裏有個小坑】
目前只能在主節點上查詢出數據,但如果想在副節點上查詢到數據需運行rs.slaveOk()
注意:每次使用命令行的方式登錄從機的時候都要在從機執行rs.slaveOk()命令,否則是無法查詢的!!!
cd /usr/local/mongodb/replica/master/bin mongo 127.0.0.1:27031 rs.slaveOk(); exit mongo 127.0.0.1:27032 rs.slaveOk(); exit
-
主節點負責寫入,從節點負責同步數據和負載均衡查詢,現在測試一下吧,從主節點新增數據
cd /usr/local/mongodb/replica/master/bin mongo 127.0.0.1:27030 use dalomao db.users.insertOne({"username":"張三"})
然後登陸slave1和slave2查看是否有數據
-
可以在每個節點運行rs.status()或isMaster()命令查看複製集狀態,如:
mongo 127.0.0.1:27031 rs.isMaster()
-
停止命令如下
cd /usr/local/mongodb/replica vim stop-replica-mongo.sh #輸入如下內容 nohup ./master/bin/mongod --shutdown -f ./master/bin/mongodb.conf > ./logs/master.log 2>&1 & nohup ./slave1/bin/mongod --shutdown -f ./slave1/bin/mongodb.conf > ./logs/slave1.log 2>&1 & nohup ./slave2/bin/mongod --shutdown -f ./slave2/bin/mongodb.conf > ./logs/slave2.log 2>&1 & #保存後授權執行權限 chmod u+x stop-replica-mongo.sh