使用keyfile部署分片集群

本文档详细介绍了如何使用keyfile进行访问控制,安全地部署MongoDB分片集群。首先创建配置服务器复制集,包括创建数据库文件夹、生成keyfile并启动mongod。接着初始化复制集,并创建用户管理员。然后创建mongos连接到集群,同样配置keyfile,启动并创建用户。最后,将分片添加到集群中,并开启数据库和集合的分片。整个过程强调了keyfile在整个集群中的统一使用和安全性的重要性。

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

Deploy Sharded Cluster with Keyfile Access Control

1. 创建配置服务器复制集

1.1 创建数据库文件夹

mkdir -p /configdb/{conf,data,log}

1.2 生成keyfile文件

openssl rand -base64 756 > /db/conf/keyfile
chmod 400 /db/conf/keyfile

生成后复制到所有节点,集群中所有节点使用同一个keyfile

1.3 编辑配置文件

storage:
  dbPath: "/configdb/data"
  journal:
    enabled: true
systemLog:
  destination: file
  path: "/configdb/log/mongod.log"
  logAppend: true
processManagement:
  fork: true
net:
  bindIp: 192.168.3.103,127.0.0.1
  port: 27020
security:
  keyFile: "/configdb/conf/keyfile"
sharding:
  clusterRole: configsvr
replication:
  replSetName: "config"

1.4 启动mongod

mongod -f /configdb/conf/mongod.conf

1.5 连接到复制集的一个节点

当前还没有用户被创建,只能通过localhost接口连接到 mongo shell,第一个用户被创建后,localhost接口关闭。

6. 初始化复制集

rs.initiate(
  {
    _id: "config",
    configsvr: true,
    members: [
      { _id : 0, host : "192.168.3.103:27020" },
      { _id : 1, host : "192.168.3.104:27020" },
      { _id : 2, host : "192.168.3.105:27020" }
    ]
  }
)

2. 创建配置服务器复制集

2.1 创建数据库文件目录

mkdir -p /sharddb/{conf,data,log}

2.2 keyfile文件

集群中所有节点使用同一个keyfile, 使用上面的keyfile文件

2.3 编辑mongodb配置文件mongod.conf

storage:
  dbPath: "/sharddb/data"
  engine: wiredTiger
  wiredTiger:
    engineConfig:
      cacheSizeGB: 4
    indexConfig:
      prefixCompression: true
  journal:
    enabled: true
systemLog:
  destination: file
  path: "/sharddb/log/mongod.log"
  logAppend: true
processManagement:
  fork: true
net:
  bindIp: 192.168.3.103,127.0.0.1
  port: 27018
security:
  keyFile: "/sharddb/conf/keyfile"
replication:
  oplogSizeMB: 5000
  replSetName: "rs1"
sharding:
  clusterRole: shardsvr

各mongod实例按实际情况修改以上参数

2.4 启动mongod

mongod -f /sharddb/conf/mongod.conf

2.5 连接到复制集的一个节点

当前还没有用户被创建,只能通过localhost接口连接到 mongo shell,第一个用户被创建后,localhost接口关闭。

2.6 初始化复制集

rs.initiate(
  {
    _id : "rs1",
    members: [
      { _id : 0, host : "192.168.3.103:27018" },
      { _id : 1, host : "192.168.3.104:27018" },
      { _id : 2, host : "192.168.3.105:27018" }
    ]
  }
)

2.7 创建分片本地的用户管理员(可选操作)

  1. 第一个用户创建完成后,localhost exception就不可用了,所以第一个用户(例如:userAdminAnyDatabase)必须具有创建用户的权限
  2. 必须在主节点上创建用户
use admin
db.createUser(
  {
    user: "admin",
    pwd: "R00t@123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

2.8 创建分片复制集本地集群管理员用户(可选操作)

集群管理员用户可以修改复制集配置

use admin
db.createUser(
    {
        user: 'cluster_admin',
        pwd: 'R00t@123',
        roles: [
            {role: 'clusterAdmin', db: 'admin'}
        ]
    }
)

3. 创建mongos连接到集群

3.1 创建mongos文件夹

mkdir -p /mongos/{conf,data,log}

3.2 生成keyfile文件

集群中所有节点使用同一个keyfile, 使用上面的keyfile文件

3.3 编辑配置文件

systemLog:
  destination: file
  path: "/mongos/log/mongos.log"
  logAppend: true
processManagement:
  fork: true
net:
  bindIp: 192.168.3.103,127.0.0.1
  port: 27019
security:
  keyFile: "/mongos/conf/keyfile"
sharding:
  configDB: config/192.168.3.103:27020, 192.168.3.104:27020, 192.168.3.105:27020

3.4 启动mongod

mongos -f /mongos/conf/mongos.conf

3.5 连接到集群中一个mongos

当前还没有用户被创建,只能通过localhost接口连接到 mongo shell,第一个用户被创建后,localhost接口关闭。

3.6 在mongos上创建用户管理员

use admin
db.createUser(
  {
    user: "admin",
    pwd: "R00t@123",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

3.6 在mongos上创建集群管理员

use admin
db.createUser(
    {
        user: 'cluster_admin',
        pwd: 'R00t@123',
        roles: [
            {role: 'clusterAdmin', db: 'admin'}
        ]
    }
)

4. 添加分片到集群

以下操作必须用集群管理员操作

4.1 添加分片

sh.addShard('rs1/192.168.3.103:27018')

4.2 为数据库开启分片

sh.enableSharding('test')

4.3 开启集合分片

sh.shardCollection("<database>.<collection>", { <key> : <direction> } )

片键必须是索引,如果集合是空的,会自动建索引

### MongoDB分片集群部署最佳实践 #### 服务器角色分配 为了构建高效稳定的MongoDB分片集群,在六台服务器上的角色应合理分布。通常情况下,这六个节点可以被划分为三个配置服务器(config servers)、两个或更多mongos实例以及至少两个用于实际存储数据的shard节点。 - **Config Servers (CSRS)**: 负责保存关于整个集群状态的信息,包括哪些chunks位于哪个shards上等元数据。建议使用副本集形式提高可靠性。 - **Mongos Instances**: 查询路由器,作为应用程序与后端shards之间的中介层。可依据负载情况适当增加数量以平衡流量压力。 - **Shard Nodes**: 数据承载单元,每组shard最好也设置成副本集模式保障高可用性和容错能力[^1]。 #### 环境准备 确保所有参与机器已安装相同版本的MongoDB软件包——这里指定了`6.0.16`版,并完成基本网络互通测试;另外还需注意防火墙规则开放必要端口如默认的27017/tcp给外部连接请求[^2]。 #### 配置文件调整 针对不同类型的服务组件创建相应的配置文件: 对于**Config Server Replica Set**, 修改/etc/mongod.conf: ```yaml replication: replSetName: "cfgReplSet" sharding: clusterRole: "configsvr" net: bindIp: 0.0.0.0 storage: dbPath: "/data/config/" processManagement: fork: true #后台运行 systemLog: destination: file logAppend: true path: /var/log/mongodb/mongod.log ``` 而对于每一个**Shard Node Replica Set**, 则需编辑对应路径下的conf.d/mongod.conf : ```yaml replication: replSetName: "rs-shardX" # X代表不同的编号区分各组 sharding: clusterRole: "shardsvr" net: port: 27018 #可根据实际情况更改监听端口号 security: keyFile: /etc/mongo-keyfile #启用内部认证机制所需密钥文件 ... ``` 最后是**Mongos Router Service** 的设定, 可放置于任意一台主机内 `/etc/mongos.conf` 中: ```yaml sharding: configDB: cfgReplSet/<cs_host_1>:27019,<cs_host_2>:27019,<cs_host_3>:27019 net: port: 27022 processManagement: fork: true systemLog: destination: file logAppend: true path: /var/log/mongodb/mongos.log ``` 以上配置均假设采用独立磁盘分区存放数据库文件(/data/)及其日志记录位置(/var/log/), 同时启用了进程守护(fork=true) 和追加方式的日志输出(logAppend=true)[^3]. #### 初始化复制集并加入集群 启动各个成员之前先初始化Replica Sets , 对于Config RS来说命令如下: ```bash mongo --host <one_of_the_config_server> <<EOF rs.initiate({ _id : "cfgReplSet", members:[{"_id":0,"host":"<cs_host_1>"},{"_id":1,"host":"<cs_host_2>"},{"_id":2,"host":"<cs_host_3>"}] }) EOF ``` 接着分别对每个Shard执行相似的操作建立各自的RS结构. 当所有的服务都已经正常上线之后就可以通过任一mongos实例来进行最终的Cluster Setup动作了: ```javascript use admin; db.runCommand({addShard:"rs-shard0/nodeA:27018,nodeB:27018"}); //重复上述指令直至所有预定好的shards都被成功添加进来. ``` 此时已经完成了基础架构层面的工作,接下来就是按照业务逻辑设计合适的sharded collection(s),选择恰当的shard key来指导后续的数据分布策略[^4].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值