MongoDB副本集搭建

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


Salamander
上帝在我很小的时候送给我了两个苹果,一个红苹果,一个蓝苹果。红苹果代表疯狂,蓝苹果代表思考
6.7k 声望
407 粉丝
0 条评论
推荐阅读
Java AtomicInteger类使用
这个问题发生的原因是++counter不是一个原子性操作。当要对一个变量进行计算的时候,CPU需要先从内存中将该变量的值读取到高速缓存中,再去计算,计算完毕后再将变量同步到主内存中。这在多线程环境中就会遇到问...

pigLoveRabbit2阅读 2.3k

MongoDB 插入时间与更新时间(create_time/update_time)
MongoDB 在数据库层面不能像 MySQL 一样设置自动创建 create_time/update_time,自动更新 update_time

qbit阅读 14k评论 2

Mongodb 关联表查询
之前使用SQL语法来查询oracle、sqlserver、mysql表之间的关联,但是到mongodb之后完全无从下手,写法完全不一样,于是到网上查询mongodb关联表查询的写法,于是参考代码自己试着写了下,但是发现有好多问题,比如...

Awbeci2阅读 3.9k评论 1

MongoDB 客户端连接选项
基于 MongoDB Java Driver 3.8.1 的客户端配置选项,其它驱动大同小异。descriptionjava.lang.String客户端的描述。该描述用于日志记录和 JMX 等位置。默认为 null。applicationNamejava.lang.StringServer Versi...

千猫阅读 4k

[Carefree MongoDB] Spring Boot MongoDB 自动化配置
最近在制作一个 spring boot 小应用时使用了 MongoDB,鉴于官方库的简陋配置,决定自己造个轮子,源码发布在 GitHub Carefree MongoDB,jar 已在中央仓库发布,可以直接引用。

千猫阅读 2.5k

MongoDB 4.4 扩展为副本集(qbit)
前言有一台单实例 MongoDB 服务器已经运行半年了,需要将其扩展为副本集3 台服务器的操作系统均为 Ubuntu 20.043 台服务器的 MongoDB 版本均为 4.4扩展示意图操作步骤备份 mongo0 上的数据修改配置文件 /etc/mong...

qbit阅读 2.1k

2022,「倾城之链」运营第 6 年感记
转眼间,距离「倾城之链」诞生之时,已有六年之久。如今(2022.10.25),倾城收录网站已突破 1000 款,值此之时,有必要督促自己深入思考,不仅是「倾城」过往的总结、未来之设想,更要确立后续业余项目方向、乃...

jeffjade1阅读 606

封面图
6.7k 声望
407 粉丝
宣传栏