- 安装docker
- 安装mongodb https://www.mongodb.com/docs/manual/installation/
- 部署切片集群 https://www.mongodb.com/docs/manual/tutorial/deploy-shard-cluster/
- 使用keyfile部署切片集群 https://www.mongodb.com/docs/manual/tutorial/deploy-sharded-cluster-with-keyfile-access-control/
要避免因 IP 地址变更而更新配置,请使用 DNS 主机名而非 IP 地址。在配置副本集成员或分片集群成员时,使用 DNS 主机名而非 IP 地址尤为重要。
openssl rand -base64 756 > keyfile/key
chmod 400 keyfile/key
Dockerfile
FROM mongo:latest
ADD keyfile /data/keyfile
RUN chmod 400 /data/keyfile/key
RUN chown -R mongodb:mongodb /data/keyfile
make build
compose文件: mongo_server/docker-compose.yaml
将创建
- config_1
- config_2
- config_3
- shard_1_1
- shard_1_2
- shard_1_3
- shard_2_1
- shard_2_2
- shard_2_3
- mongos_1 27117
- mongos_2 27118
make install
通过本地主机接口将 mongosh 连接到一个 mongod 实例。您必须在与 mongod 实例相同的物理机器上运行 mongosh。
登录 config_1
mongosh mongodb://localhost
使用 rs.initiate() 方法和配置文档启动副本集:
rs.initiate(
{
_id: "config_rs",
configsvr: true,
members: [
{ _id : 0, host : "config_1:27017" },
{ _id : 1, host : "config_2:27017" },
{ _id : 2, host : "config_3:27017" }
]
}
)
查看
rs.status()
通过本地主机接口将 mongosh 连接到一个 mongod 实例。您必须在与 mongod 实例相同的物理机器上运行 mongosh。
登录 shard_1_1
mongosh mongodb://localhost
使用 rs.initiate() 方法和配置文档启动副本集:
rs.initiate(
{
_id: "shard1_rs",
members: [
{ _id : 0, host : "shard_1_1:27017" },
{ _id : 1, host : "shard_1_2:27017" },
{ _id : 2, host : "shard_1_3:27017" }
]
}
)
登录 shard_2_1
mongosh mongodb://localhost
使用 rs.initiate() 方法和配置文档启动副本集:
rs.initiate(
{
_id: "shard2_rs",
members: [
{ _id : 0, host : "shard_2_1:27017" },
{ _id : 1, host : "shard_2_2:27017" },
{ _id : 2, host : "shard_2_3:27017" }
]
}
)
重要 创建第一个用户后,本地主机异常就不再可用。 第一个用户必须拥有创建其他用户的特权,如具备 userAdminAnyDatabase 的用户。这样可以确保在自管理部署中的本地主机异常关闭后,您可以创建更多用户。 如果至少一个用户没有创建用户的权限,一旦本地主机异常关闭,您可能无法使用创建或修改具有新特权的用户,因此无法访问必要的操作。 使用 db.createUser() 方法添加用户。该用户应在 admin 数据库中至少拥有 userAdminAnyDatabase 角色。 您必须连接到主节点才能创建用户。
登录 mongos_1
db.getSiblingDB("admin").createUser(
{
user: "admin",
pwd: passwordPrompt(),
roles: [
{ role: 'readWriteAnyDatabase', db: 'admin' },
{ role: 'dbAdminAnyDatabase', db: 'admin' },
{ role: 'clusterAdmin', db: 'admin' },
{ role: 'userAdminAnyDatabase', db: 'admin' }
]
}
)
登录 shard_1_1
db.getSiblingDB("admin").createUser(
{
user: "admin",
pwd: passwordPrompt(),
roles: [
{ role: 'readWriteAnyDatabase', db: 'admin' },
{ role: 'dbAdminAnyDatabase', db: 'admin' },
{ role: 'clusterAdmin', db: 'admin' },
{ role: 'userAdminAnyDatabase', db: 'admin' }
]
}
)
要继续,您必须连接到 mongos,并以分片集群的集群管理员用户身份进行身份验证。 若要将每个分片添加到集群,请使用 sh.addShard() 方法。如果分片是副本集,请指定副本集的名称,然后指定该副本集的节点。在生产部署中,所有分片都应是副本集。 以下操作将单个分片副本集添加到该集群中:
sh.addShard("shard1_rs/shard_1_1:27017,shard_1_2:27017,shard_1_3:27017")
sh.addShard("shard2_rs/shard_2_1:27017,shard_2_2:27017,shard_2_3:27017")
db.getSiblingDB("admin").updateUser("admin",
{
roles: [
{ role: 'readWriteAnyDatabase', db: 'admin' },
{ role: 'dbAdminAnyDatabase', db: 'admin' },
{ role: 'clusterAdmin', db: 'admin' },
{ role: 'userAdminAnyDatabase', db: 'admin' }
]
}
)
shardCollection https://www.mongodb.com/docs/manual/reference/method/sh.shardCollection/
sh.shardCollection(namespace, key, unique, options)
sh.shardCollection("<database>.<collection>", { <field1>: <1|"hashed">, ... } )
将创建
- config
- shard1
- shard2
- mongos 27117
make min
rs.initiate(
{
_id: "config_rs",
configsvr: true,
members: [
{ _id : 0, host : "config:27017" }
]
}
)
rs.initiate(
{
_id: "shard1_rs",
members: [
{ _id : 0, host : "shard1:27017" }
]
}
)
rs.initiate(
{
_id: "shard2_rs",
members: [
{ _id : 0, host : "shard2:27017" }
]
}
)
sh.addShard("shard1_rs/shard1:27017")
sh.addShard("shard2_rs/shard2:27017")