前言
MongoDB 是一款非关系型数据库,广泛应用于现代 Web 应用程序的数据存储和处理。在高并发、大数据场景下,MongoDB 集群能够提供更高的性能和可靠性。
本文将详细介绍 MongoDB 高性能集群的部署和运维,包括集群架构、节点配置、数据分片、副本集、安全设置等方面的内容,旨在帮助读者更好地理解和使用 MongoDB 集群,并提供一些实用的指导意义。
MongoDB 集群架构
MongoDB 集群由多个节点组成,节点分为三种类型:路由节点、分片节点和副本集节点。各节点的作用如下:
- 路由节点(mongos):负责接收客户端请求,并将请求路由到相应的分片节点上。
- 分片节点(mongod):存储数据分片,并处理客户端请求。
- 副本集节点(mongod):存储数据副本,并提供故障转移和数据恢复功能。
MongoDB 集群的架构如下图所示:
MongoDB 节点配置
每个 MongoDB 节点都需要配置一些参数,以保证集群的稳定性和性能。以下是常用的节点配置参数:
路由节点配置
- configdb:指定配置数据库的地址和端口号,格式为
host:port,多个地址用逗号分隔。 - bind_ip:指定路由节点绑定的 IP 地址,多个地址用逗号分隔。
- port:指定路由节点监听的端口号。
- chunkSize:指定数据块的大小,单位为 MB,默认为 64 MB。
分片节点配置
- shardServerType:指定节点类型为分片节点。
- bind_ip:指定分片节点绑定的 IP 地址,多个地址用逗号分隔。
- port:指定分片节点监听的端口号。
- dbpath:指定数据存储路径。
- logpath:指定日志文件路径。
- oplogSize:指定操作日志的大小,单位为 MB,默认为 1024 MB。
副本集节点配置
- replSet:指定副本集的名称。
- bind_ip:指定副本集节点绑定的 IP 地址,多个地址用逗号分隔。
- port:指定副本集节点监听的端口号。
- dbpath:指定数据存储路径。
- logpath:指定日志文件路径。
- oplogSize:指定操作日志的大小,单位为 MB,默认为 1024 MB。
MongoDB 数据分片
MongoDB 数据分片是将数据划分为多个块(chunk),并将这些块分布到不同的分片节点上,以实现数据的水平扩展和负载均衡。
数据分片的过程如下:
- 配置一个或多个分片节点,并将其加入集群。
- 创建一个或多个数据库,并启用分片功能。
- 在数据库中创建一个或多个集合,并将集合分片。
- MongoDB 将数据均匀地分配到不同的分片节点上。
以下是数据分片的示例代码:
// www.javascriptcn.com code example
// 连接到路由节点
const conn = new Mongo('mongodb://localhost:27017');
// 获取数据库
const db = conn.getDB('mydb');
// 启用分片功能
sh.enableSharding('mydb');
// 创建集合
db.createCollection('mycollection');
// 将集合分片
sh.shardCollection('mydb.mycollection', { _id: 1 });MongoDB 副本集
MongoDB 副本集是多个副本集节点的集合,其中一个节点为主节点,其他节点为从节点。主节点负责读写操作,从节点负责数据复制和故障转移。
副本集的优点如下:
- 提高数据可靠性:即使主节点宕机,从节点也可以接管服务。
- 提高读取性能:从节点可以处理大部分读取请求,减轻主节点的负载。
- 提高数据安全性:数据复制到多个节点,即使某个节点遭受攻击,数据也可以从其他节点恢复。
以下是副本集的示例代码:
// www.javascriptcn.com code example
// 连接到副本集节点
const conn = new Mongo('mongodb://localhost:27017');
// 设置副本集名称
rs.initiate({ _id: 'myrs' });
// 添加从节点
rs.add('localhost:27018');
// 添加仲裁节点
rs.addArb('localhost:27019');MongoDB 安全设置
MongoDB 集群的安全设置包括用户认证、访问控制列表和 SSL 加密等。以下是安全设置的示例代码:
用户认证
// www.javascriptcn.com code example
// 创建管理员用户
const admin = db.getSiblingDB('admin');
admin.createUser({
user: 'admin',
pwd: 'admin123',
roles: [{ role: 'root', db: 'admin' }]
});
// 创建普通用户
const db = conn.getDB('mydb');
db.createUser({
user: 'user',
pwd: 'user123',
roles: [{ role: 'readWrite', db: 'mydb' }]
});
// 启用认证
db.getSiblingDB('admin').auth('admin', 'admin123');
db.getSiblingDB('mydb').auth('user', 'user123');访问控制列表
// www.javascriptcn.com code example
// 创建访问控制列表
const admin = db.getSiblingDB('admin');
admin.createRole({
role: 'myrole',
privileges: [
{ resource: { db: 'mydb', collection: 'mycollection' }, actions: ['find'] }
],
roles: []
});
// 分配角色
db.grantRolesToUser('user', [{ role: 'myrole', db: 'mydb' }]);SSL 加密
// 启用 SSL 加密
mongod --sslMode requireSSL --sslPEMKeyFile /path/to/key.pem --sslCAFile /path/to/ca.pem
// 连接到 SSL 节点
const conn = new Mongo('mongodb://localhost:27017', { ssl: true });结语
本文介绍了 MongoDB 高性能集群的部署和运维,包括集群架构、节点配置、数据分片、副本集、安全设置等方面的内容。希望读者能够从中获得一些实用的指导意义,更好地理解和使用 MongoDB 集群。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/67d4dab8a941bf7134910dc3