MongoDB
MongoDB是现在最为流行的NoSQL数据库之一。在大数据时代,传统的关系型数据库遇到了高并发读写、海量数据高效存储、高可扩展性和高可用性这些难题。以MySQL为例,在数据量很大需要分表分库的时候,它本身不提供分片能力,需要自己另建服务。 而NoSQL就是为了解决这些问题而诞生了的。注: NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
NoSQL有如下优势:
- 大数据量,可以通过廉价服务器存储大量的数据,轻松摆脱传统mysql单表存储量级限制。
- 高性能,NoSQL通过简单的key-value方式获取数据,非常快速。还有NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多。
- 灵活的数据模型,NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
- 高可用,NoSQL在不太影响性能的情况,就可以方便的实现高可用的架构。比如mongodb通过mongos、mongo分片就可以快速配置出高可用配置。
单机版MongoDB
这种配置只适合简易开发时使用,生产使用不行,因为不是高可用的。这里我使用docker快速启动MongoDB服务,MongoDB版本为3.6。
docker-compose.yml
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"]
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),解决方法是自己创建顶级的数据卷
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副本集中主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。这样的机制提高了数据的可用性,并可以保证数据的安全性。
需要注意的一点: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.To 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()
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。