MongoDB单机, 主从, 分布式部署

本文详细介绍MongoDB的各种部署方式,包括单机部署、主从部署及分片部署,并分享了作者的一些实践经验。文中还介绍了如何搭建分布式MongoDB集群,以及如何进行故障恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MongoDB是最易用的NoSQL,比较适合取代MySQL做一些存储,不过不是强一致性的。本文介绍一下MongoDB各种部署方式,并分享一些感受。前两部分“单机部署”和“主从部署”是“分片部署”的基础。


MongoDB单机部署

启动下载来的MongoDB包的bin目录下的mongod.exe即可打开MongoDB服务,可以添加的基本配置是:

./mongod.exe --dbpath ~/db/data --port 127.0.0.1:10000 --logpath ~/db/log

默认的端口是27017。启动的时候必须有一个data目录,让mongod读写数据。写入数据后,data目录里的文件如图:


.lock文件如果在下次启动时候还存在,需要删除才能成功启动。"article"和"config"是数据库名字,可以特别注意一下每个文件块的大小(16M, 32M, 64M, 128M)。


MongoDB主从部署

主从配置是MongoDB特色之一,使之具备了容错,故障恢复等性能。主节点要声明"master",从节点们要声明"slave"和"--source"。最简单的主从配置如下:

./mongod.exe --dbpath ~/db/master --port 10000 --master
./mongod.exe --dbpath ~/db/slave --port 10001 --slave --source localhost:10001
从节点直接从主节点同步数据,从节点之间不互相同步。容错性更强的部署是一个主从集群,互相都能成为“主节点”,叫做Replica Set。在Replica Set里会有一个活跃节点和若干个备份节点。配置的时候,整个Replica Set要取个名字,然后每台都要指明一个或几个伙伴:

./mongod.exe --dbpath ~/db/node1 --port 10001 --replSet setname/localhost:10002
./mongod.exe --dbpath ~/db/node2 --port 10002 --replSet setname/localhost:10001

./mongod.exe --dbpath ~/db/node3 --port 10003 --replSet setname/localhost:10001

谁成为活跃节点取决于优先级,优先级默认是1,也可以启动mongod进行设置(不具体介绍了),总之是内部的选举机制。


MongoDB分片部署

介绍完以上,组合起来就可以搭建一个比较强壮的分布式MongoDB集群。分片类似分布式,MongoDB以新增分片的方式,扩展自己的容量,并且能给读写负载均衡。

1. 每一个启动的mongod都是实际存放数据的地方,都能作为别人的sharding

2. 分片部署需要一个mongos,起路由分发的作用;需要一个配置服务器和若干个分片服务器(都是mongod)

3. 单机的时候,应用连接的是mongod;分布式的时候,应用连接的是mongos。

最简单的分片部署是单个的配置服务器,一个config(即mongod),一个mongos,几个sharding(即mongod):

./mongod.exe --dbpath ~/db/config --port 20000
./mongos.exe --configdb 127.0.0.1:20000 --port 30000
./mongod.exe --dbpath ~/db/shard1 --port 10001
./mongod.exe --dbpath ~/db/shard2 --port 10002
如果有时候启动不了某个mongod,可能和端口有关。在windows下,这样一个集群会打开很多shell窗口。这种情况下,还是三个独立的mongd,要打开上面的mongos,输入命令加入sharding片:

> use admin
> db.runCommand({addshard : "localhost:10001", allowLocal : true})
> db.runCommand({addshard : "localhost:10002", allowLocal : true})

> db.runCommand({"enablesharding" : "dbname"})

还要设置片建,以提供负载均衡的依据:

> db.runCommand({"shardcollection" : "dbname.collection", "key" : {"_id":1}})
dbname.collection是自己的数据库的数据集。设置的"key"需要已经建立索引。

mongos下还有一些查看分片情况的命令,方便集群的管理和监控,可以自己体验下:

> db.shards.find()
> db.chunks.find()
> db.printShardingStatus()
也可以通过runCommand的其他命令添加新的片,删除已有的片,而且添加的片可以是旧的mongod。

测试开发的时候像上面这样的一组可能够了,真正健壮的集群可能要具备下面三个条件:

1. 多个配置服务器config1, config2, config3(可以都经过一个mongos来路由)

2. 每个sharding都是Replica Set

3. 每一台物理物理服务器承担若干个不同的进程(mongos, shards, config)

就像下面这种图呈现的一样:


我们可以这样理解mongos, shards, config三样东西:

1.shards是一些实际存数据的可以单独使用的db,他们能分配给任何config server,而且添加删除都很方便。

2. 每个shard里有若干个地位平等的mongods,所以每个是一个Replica Set(副本集)

3. 一个config手下带领好几个shards,目的是负载和扩容,他们之间需要mongos来路由

4.mongos是一个路由,可以路由一个或多个config servers,不需要很大的分配空间

5. 每一个客户端的应用,每一张数据库表,最好对应一个config server和一个mongos

以上内容里的"--port" 部分改为IP:port就可以分布式环境了。比较合理的节省物理服务器的配置方法可以像下图这样:


不把所有鸡蛋扔一个篮子里。


(全文完)


### Redis 单机与集群架构设计 Redis 的单机和集群架构分别适用于不同的场景需求。以下是两种架构的设计特点和支持情况: #### 1. **单机架构** 单机架构是最简单的部署方式,适合小型应用或测试环境。在这种模式下,所有的数据存储在一个实例上。 - 数据存储完全集中于一台服务器。 - 不涉及分布式特性,因此性能受限于单一机器的硬件能力[^1]。 ```bash redis-server /etc/redis.conf ``` 通过上述命令可以快速启动一个单机版的 Redis 实例。 --- #### 2. **集群架构** 集群架构用于满足高并发、大数据量的需求。它通过分片技术将数据分布在多个节点上,从而提升系统的扩展性和可用性。 - 使用 `--cluster create` 命令创建一个多主多从结构的集群。 - 节点间的数据分布由哈希槽(hash slot)机制决定,共有 16384 个哈希槽。 - 主从复制确保了数据冗余,提高了系统的可靠性和容灾能力。 ```bash redis-cli --cluster create --cluster-replicas 1 \ 192.168.75.129:6379 192.168.75.129:6380 \ 192.168.75.131:6379 192.168.75.131:6380 \ 192.168.75.132:6379 192.168.75.132:6380 ``` 此命令会构建一个三主三从的 Redis 集群,其中每个主节点都有一个对应的从节点作为备份。 --- ### MongoDB 单机与集群架构设计 MongoDB 提供多种部署选项来适应不同规模的应用程序需求。 #### 1. **单机架构** 单机部署简单易行,通常用于开发阶段或者低负载生产环境中。 - 所有数据库操作都在同一台物理设备上执行。 - 缺乏自动化的故障恢复功能,一旦发生宕机则可能导致服务中断[^2]。 ```bash mongod --dbpath=/data/db/ ``` 这是典型的 MongoDB 单机启动命令。 --- #### 2. **集群架构** 为了提高可伸缩性和可靠性,MongoDB 支持副本集(Replica Set)、分片(Sharding)等多种集群形式。 ##### (1)**副本集** - 至少包含三个成员:一个主节点和两个次节点。 - 如果主节点失效,则选举新的主节点接管工作负荷。 ##### (2)**分片** - 将大型集合划分为更小的部分,并分配到不同的 shard 上。 - 查询路由器 mongos 处理客户端请求并将结果返回给用户。 ```javascript sh.enableSharding("test"); sh.shardCollection("test.collection", { "_id": "hashed" }); ``` 这些指令展示了如何启用分片以及基于 `_id` 字段设置散列索引来实现数据分区。 --- ### RabbitMQ 单机与集群架构设计 RabbitMQ 是一种消息中间件,在大规模分布式系统中有广泛应用价值。 #### 1. **单机架构** 对于轻量级应用场景来说,单机版本已经能够很好地胜任任务处理职责。 - 只需安装 Erlang 和 RabbitMQ Server 并调整相应配置即可完成初始化过程[^4]。 ```ini [networking] default_user = guest default_pass = guest ``` 这是一个基础的 RabbitMQ 配置片段示例。 #### 2. **集群架构** 当业务增长超出单节点承载范围时,就需要考虑采用集群解决方案。 - 确保所有参与方共享相同的 `.erlang.cookie` 文件内容以便相互认证通信关系正常建立起来。 - 运行特定脚本让额外加入的新成员正式成为整体网络的一员之后再验证当前状况良好无误为止。 ```bash rabbitmqctl stop_app rabbitmqctl join_cluster rabbit@node1 rabbitmqctl start_app ``` 以上步骤描述了一个典型情况下新节点融入已有队列组的过程概述说明文档里提到过相关内容部分摘录如下所示。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值