2

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副本集中主服务器负责整个副本集的读写,副本集定期同步数据备份,一但主节点挂掉,副本节点就会选举一个新的主服务器,这一切对于应用服务器不需要关心。这样的机制提高了数据的可用性,并可以保证数据的安全性。
v2-04c282f930f066a800d342dbf84e136c_r.jpg

需要注意的一点: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()


ufdf
6.7k 声望407 粉丝