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()