MongoDB副本集搭建

13次阅读

共计 2674 个字符,预计需要花费 7 分钟才能阅读完成。

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

正文完
 0