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 功能,链接)。
REMOVED
MongoDB 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()