MongoDB是如今最爲流行的NoSQL數據庫之一。在大數據時代,傳統的關係型數據庫遇到了高併發讀寫、海量數據高效存儲、高可擴展性和高可用性這些難題。以MySQL爲例,在數據量很大須要分表分庫的時候,它自己不提供分片能力,須要本身另建服務。 而NoSQL就是爲了解決這些問題而誕生了的。注: NoSQL(NoSQL = Not Only SQL ),意即"不單單是SQL"。
NoSQL有以下優點:mysql
這種配置只適合簡易開發時使用,生產使用不行,由於不是高可用的。這裏我使用docker快速啓動MongoDB服務,MongoDB版本爲3.6。sql
version: '3' services: mongo1: image: mongo:3.6 environment: - MONGO_INITDB_ROOT_USERNAME=test - MONGO_INITDB_ROOT_PASSWORD=IIm7A5C5GqRWqnLg network_mode: "host" volumes: - ./mongo_data:/data/db - ./mongod.conf:/etc/mongo/mongod.conf - ./log:/var/log/mongodb command: ["--config", "/etc/mongo/mongod.conf"]
systemLog: destination: file path: /var/log/mongodb/mongo.log logAppend: false storage: dbPath: /data/db indexBuildRetry: true journal: enabled: true net: port: 40031 bindIp: 0.0.0.0 maxIncomingConnections: 65536
docker-compose.yml中network_mode: "host"是讓容器直接使用宿主機網絡,配置文件中net下port是指定MongoDB服務監聽的端口,storage下dbPath指定數據存儲目錄,開啓journal是由於journal文件用於數據庫異常退出時恢復數據(默認開啓)。
windows上會遇到MongoDB沒法啓動的問題(WiredTiger提示Operation not permitted),解決方法是本身建立頂級的數據卷mongodb
version: '3' services: mongo1: image: mongo:3.6 environment: - MONGO_INITDB_ROOT_USERNAME=test - MONGO_INITDB_ROOT_PASSWORD=IIm7A5C5GqRWqnLg network_mode: "host" volumes: - mongo_data:/data/db - ./mongod.conf:/etc/mongo/mongod.conf - ./log:/var/log/mongodb command: ["--config", "/etc/mongo/mongod.conf"] volumes: mongo_data:
高可用的一個作法就是作主從,MongoDB給的方案就是副本集
(對於分佈式存儲有分片集合
,以後會寫)。MongoDB副本集中主服務器負責整個副本集的讀寫,副本集按期同步數據備份,一但主節點掛掉,副本節點就會選舉一個新的主服務器,這一切對於應用服務器不須要關心。這樣的機制提升了數據的可用性,並能夠保證數據的安全性。
docker
須要注意的一點:MongoDB官方已經不建議使用主從模式了,替代方案是採用副本集的模式(4.0更是移除了master-slave功能,連接)。數據庫
REMOVEDMongoDB 4.0 removes support for master-slave replication. Before you
can upgrade to MongoDB 4.0, if your deployment uses master-slave
replication, you must upgrade to a replica set.windowsTo convert your master-slave replication, see Convert a Master-Slave
Deployment to a Replica Set.安全
搭建以前咱們須要在mongod.conf
加入replication配置項服務器
systemLog: destination: file path: /var/log/mongodb/mongo.log logAppend: false storage: dbPath: /data/db indexBuildRetry: true journal: enabled: true net: port: 40031 bindIp: 0.0.0.0 maxIncomingConnections: 65536 replication: replSetName: myset
在3臺主機上分別啓動MongoDB服務,啓動成功後在某臺主機上登入MongoDB,執行rs.initiate()
初始化副本集,會有以下輸出網絡
{ "info2" : "no configuration specified. Using a default configuration for the set", "me" : "mongo1:40031", "ok" : 1 }
可經過rs.conf()查看當前副本集的配置信息。架構
經過rs.add("ip:port")
來增長節點,要移除節點的話,可使用rs.remove("ip:port")
查看查看副本集的狀態能夠用rs.status()
,若是你想查看複製延遲,可使用 db.printSlaveReplicationInfo()