目录
1、Mongo集群优势
1.1 高可用性
1.2 水平扩展性
1.3 高性能
1.4 灵活的架构设计
1.5 数据安全
1.6 管理与监控
2、下载指定操作系统版本包
3、部署和验证工作
3.1 准备配置文件及依赖
3.2 启动第一个节点
3.3 部署更多的节点
3.4 初始化副本集
3.5 设置管理员账户和密码
3.6 验证集群功能
4、常见问题
MongoDB因为使用比较方便,在研发或测试团队用的比较普遍,有时候可能因为成本和预算等原因,短期无法在云上买集群资源,只能在物理机器上部署,考虑一般机器部署的服务和使用的同学都比较多,单节点故障容错率较低,因此一般建议是部署集群模式,否则一台机器故障,可能导致服务不可用或数据丢失。下文简单介绍了Mongo集群优势、部署方法、常见问题。
1、Mongo集群优势
1.1 高可用性
- 复制集实现故障转移:MongoDB 通过复制集(Replica Set)提供了高可用性。复制集包含一个主节点(Primary)和多个从节点(Secondary),当主节点发生故障时,从节点可以自动提升为主节点,确保服务不中断。
- 读写分离:可以配置从节点处理读请求,降低主节点的负载,提高整体可用性。
1.2 水平扩展性
- 分片(Sharding)支持大规模数据集:
- MongoDB 的分片功能允许将数据分布在多个服务器上,以便处理更大的数据集。
- 分片支持自动均衡,确保各分片数据量和访问负载保持均衡。
- 无单点瓶颈:通过增加节点,集群可以无限制扩展存储和计算能力,适合高增长的业务场景。
1.3 高性能
- 并行处理:多个节点可以同时处理请求,利用分片和复制集的架构,支持更高的吞吐量。
- 内存优先:MongoDB 使用内存映射机制,对于频繁访问的数据,性能优势明显。
- 灵活的分片键:合理选择分片键可以优化查询性能,减少节点间的网络流量。
1.4 灵活的架构设计
- 动态模式:MongoDB 以文档为中心的存储方式,不需要预定义模式(Schema),可以快速响应业务需求的变化。
- 弹性伸缩:支持在运行时扩展和收缩集群,无需停机。
- 地理分布:通过分片键设计和配置,可以根据地理位置分布数据,提高本地访问速度。
1.5 数据安全
- 数据冗余:复制集通过多副本存储,提供数据冗余,防止单点故障导致数据丢失。
- 数据一致性:通过写入确认机制(Write Concern),可以实现不同级别的数据一致性。
1.6 管理与监控
- 自动化管理:MongoDB 提供工具如
MongoDB Atlas
和Ops Manager
,帮助快速部署和管理集群。 - 实时监控:支持实时监控查询性能、节点状态和集群活动,便于发现和解决问题。
2、下载指定操作系统版本包
下载地址:MongoDB Atlas Database | Multi-Cloud Database Service | MongoDB,如下图所示,按需下载即可。
3、部署和验证工作
3.1 准备配置文件及依赖
以解压后bin文件夹所在的目录为根目录,建议使用配置文件方式启动。为了让目录结构更清晰,可以手动新建一些目录和文件:./logs日志文件夹、数据文件夹./data/db、配置文件./conf/config.yaml。
除了基本的配置,那集群之间各节点的如何通信的呢?这个就涉及到keyFile文件的生成。
在MongoDB集群中,使用keyFile进行鉴权是一种常见的方法,它确保只有持有相同keyFile的节点能够相互通信和验证身份。
假设我们的文件名为key_file,可以执行如下命令生成keyFile,目录根据实际需要指定就行。
openssl rand -base64 756 > key_file
设置keyFile权限:
- 出于安全考虑,keyFile必须对MongoDB用户可读,并且其他用户不可读。你可以使用chmod命令将keyFile的权限设置为600(或400,但600更常见,因为它允许文件所有者读写文件,但不允许其他用户访问)。
- 未设置时./logs/mongod.log日志可能会报错:"msg":"Error creating service context","attr":{"error":"Location5579201: Unable to acquire security key[s]"}}
chmod 600 /path/to/your/key_file
最后完整的./conf/config.yaml文件内容示例如下,注意将/path/to/your/dir改为你自己的地址。
systemLog:
destination: file
path: /path/to/your/dir/logs/mongod.log
logAppend: true
storage:
dbPath: /path/to/your/dir/data/db
wiredTiger: # 最大缓存大小为50G,可选设置
engineConfig:
cacheSizeGB: 50.0
net:
bindIp: 0.0.0.0
port: 8017
replication: # 副本集名称
replSetName: mongoClusterTest
processManagement:
fork: true
security:
authorization: enabled
keyFile: /path/to/your/dir/data/key_file # 各节点相互通信和验证身份
3.2 启动第一个节点
./bin/mongod --fork -f ./conf/config.yaml
预期成功会输出:
% ./bin/mongod --fork -f ./conf/config.yaml
about to fork child process, waiting until server is ready for connections.
forked process: 84352
child process started successfully, parent exiting
此时我们已经成功启动了一个节点。
3.3 部署更多的节点
部署第二个、第三个或更多的节点方法和第一个节点类似,注意版本和配置文件保持一样即可。注意给key_file加权限。
chmod 600 /path/to/your/key_file
为了演示方便,假设现在我们在同一台机器成功启动了另外2个节点,端口分别为8018、8019,实际部署时建议在不同机房的机器。
3.4 初始化副本集
在部署机器上通过MongoDB Shell连接其中一个节点,比如第一个:
./bin/mongo --port 8017
如果没有./mongo,可以手动下载mongo shell工具,如果远程连接需要指定--host,也就是mongo部署的机器信息。
在 MongoDB Shell 中执行以下命令,初始化副本集,注意_id需要和配置文件中的replSetName字段值保持一致。
rs.initiate({
_id: "mongoClusterTest", // 副本集名称,需与配置文件一致
members: [
{ _id: 0, host: "127.0.0.1:8017" },
{ _id: 1, host: "127.0.0.1:8018" },
{ _id: 2, host: "127.0.0.1:8019" }
]
});
预期成功后信息如下:
检查副本集状态, 使用以下命令查看详细信息,确保所有节点的状态为 PRIMARY
或 SECONDARY
。
rs.conf();
rs.status();
3.5 设置管理员账户和密码
按需常见即可,可以设置数据库级别的权限。下面给出管理员用户的账户和密码示例。管理员用户负责管理整个 MongoDB 集群的权限。以下是创建管理员用户的步骤:
1、以无身份验证模式连接 MongoDB
连接到primary主节点的 MongoDB(默认无身份验证时)。设置了后,后面连接时需要指定账户和密码。
2、切换到 admin
数据库
use admin;
3、创建管理员用户
假设账户名为zhangsan,密码为abc123456,按需来改就行。
db.createUser({
user: "zhangsan",
pwd: "abc123456", // 替换为强密码
roles: [ { role: "root", db: "admin" } ]
});
成功操作后的返回信息示例为:
3.6 验证集群功能
为了方便手动操作,我们可以结合一些可视化的工具来操作,比如:Studio 3T。
- 连接信息,输入节点信息和账户密码。
- 连接成功后可以看到集群各节点的信息。
- 如果没问题了就可以右键创建数据库、表,测试数据的增删改查。
4、常见问题
1、报错『ERROR: child process failed, exited with error number 1』退出。
答:可以通过less ./logs/mongod.log查看日志。
2、缓存设置可以结合实际情况设置,比如最大限制为50G,默认为系统可用资源的一半左右。
答:在配置文件中的设置示例。
3、连接方式建议换成集群形式,不推荐使用单节点连接,因为集群节点重启可能会引起重新选举primary节点。手动重新选举有很多方式,可以参考:
强制重新选举(Step Down):
MongoDB提供了rs.stepDown()方法,使当前primary节点放弃主节点角色,重新触发选举过程。新的primary节点会在剩余secondary节点中根据优先级选出。
rs.stepDown()
此命令需要在primary节点执行。执行后,当前primary节点会立即转换为secondary,且一段时间内不能重新竞选为primary。