摘要
- 本文内容基于mongodb4.2.3
- 本文基于本地安装,也就是ip相同,端口不同
- 3个shard复制集(3台),1个config复制集(3台),2个router
安装MongoDB
下载地址 : https://www.mongodb.com/download-center
下载后解压即可,可以将bin目录配置到$PATH中
目录设计
├── config
│ ├── node1
│ │ ├── db
│ │ ├── logs
│ │ └── mongod.conf
│ ├── node2
│ │ ├── db
│ │ ├── logs
│ │ └── mongod.conf
│ └── node3
│ ├── db
│ ├── logs
│ └── mongod.conf
├── keyfile.key
├── router
│ ├── node1
│ │ ├── logs
│ │ └── mongos.conf
│ └── node2
│ ├── logs
│ └── mongos.conf
├── shard1
│ ├── node1
│ │ ├── db
│ │ ├── logs
│ │ └── mongod.conf
│ ├── node2
│ │ ├── db
│ │ ├── logs
│ │ └── mongod.conf
│ └── node3
│ ├── db
│ ├── logs
│ └── mongod.conf
├── shard2
│ ├── node1
│ │ ├── db
│ │ ├── logs
│ │ └── mongod.conf
│ ├── node2
│ │ ├── db
│ │ ├── logs
│ │ └── mongod.conf
│ └── node3
│ ├── db
│ ├── logs
│ └── mongod.conf
└── shard3
├── node1
│ ├── db
│ ├── logs
│ └── mongod.conf
├── node2
│ ├── db
│ ├── logs
│ └── mongod.conf
└── node3
├── db
├── logs
└── mongod.conf
端口分配
shard1 28011~28013
shard2 28021~28023
shard3 28031~28033
config 29011~29013
router 29021~29022
配置文件
shard
以shard1为例,三个node下都有mongod.conf,要注意替换文件路径和端口
systemLog:
destination: file
path: "/Users/hanqf/myservice_dir/mongodb-mongos/shard1/node1/logs/mongo.log" #注意修改路径
logAppend: true
storage:
journal:
enabled: true
dbPath: "/Users/hanqf/myservice_dir/mongodb-mongos/shard1/node1/db" #注意修改路径
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 28011 #注意修改端口
setParameter:
enableLocalhostAuthBypass: true
replication:
replSetName: "shard1" #复制集名称
sharding:
clusterRole: shardsvr #作为分片服务
security:
authorization: "enabled"
keyFile: /Users/hanqf/myservice_dir/mongodb-mongos/keyFile.key #密钥文件,用于集群内部认证
config
systemLog:
destination: file
path: "/Users/hanqf/myservice_dir/mongodb-mongos/config/node1/logs/mongo.log" #注意修改路径
logAppend: true
storage:
journal:
enabled: true
dbPath: "/Users/hanqf/myservice_dir/mongodb-mongos/config/node1/db" #注意修改路径
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 29011 #注意修改端口
setParameter:
enableLocalhostAuthBypass: true
replication:
replSetName: "config" #复制集名称
sharding:
clusterRole: configsvr #作为配置服务
security:
authorization: "enabled"
keyFile: /Users/hanqf/myservice_dir/mongodb-mongos/keyFile.key #密钥文件,用于集群内部认证
router
systemLog:
destination: file
path: "/Users/hanqf/myservice_dir/mongodb-mongos/router/node1/logs/mongos.log" #注意修改路径
logAppend: true
processManagement:
fork: true
net:
bindIp: 0.0.0.0
port: 29021 #注意修改端口
setParameter:
enableLocalhostAuthBypass: true
replication:
localPingThresholdMs: 15
sharding:
configDB: config/127.0.0.1:29011,127.0.0.1:29012,127.0.0.1:29013 #关联配置服务
security:
keyFile: /Users/hanqf/myservice_dir/mongodb-mongos/keyFile.key #密钥文件,用于集群内部认证
keyFile
cd /Users/hanqf/myservice_dir/mongodb-mongos
openssl rand -base64 741 > keyFile.key
chmod 400 mongodb-keyfile
配置config复制集
启动
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/config/node1/mongod.conf
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/config/node2/mongod.conf
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/config/node3/mongod.conf
登录及配置
#登录任意一台config
mongo --host 127.0.0.1:29011
>rs.initiate(
{
_id: "config",
configsvr: true,
members: [
{ _id : 0, host : "127.0.0.1:29011" },
{ _id : 1, host : "127.0.0.1:29012" },
{ _id : 2, host : "127.0.0.1:29013" }
]
}
);
#创建超级管理员,此时要求登录的是主库
>rs.isMaster() #验证是否主库
>use admin
>db.createUser(
{
user: "root",
pwd: "password",
roles: [ { role: "root", db: "admin" } ]
}
);
验证用户是否可以登录
mongo --host 127.0.0.1:29011
>use admin
>db.auth("root","password")
配置shard复制集
启动shard1服务
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard1/node1/mongod.conf
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard1/node2/mongod.conf
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard1/node3/mongod.conf
登录及配置
#登录任意一台config
mongo --host 127.0.0.1:28011
>rs.initiate(
{
_id: "shard1",
members: [
{ _id : 0, host : "127.0.0.1:28011" },
{ _id : 1, host : "127.0.0.1:28012" },
{ _id : 2, host : "127.0.0.1:28013" }
]
}
);
#创建超级管理员,此时要求登录的是主库
>rs.isMaster() #验证是否主库
>use admin
>db.createUser(
{
user: "root",
pwd: "password",
roles: [ { role: "root", db: "admin" } ]
}
);
启动shard2服务
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard2/node1/mongod.conf
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard2/node2/mongod.conf
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard2/node3/mongod.conf
登录及配置
#登录任意一台config
mongo --host 127.0.0.1:28021
>rs.initiate(
{
_id: "shard2",
members: [
{ _id : 0, host : "127.0.0.1:28021" },
{ _id : 1, host : "127.0.0.1:28022" },
{ _id : 2, host : "127.0.0.1:28023" }
]
}
);
#创建超级管理员,此时要求登录的是主库
>rs.isMaster() #验证是否主库
>use admin
>db.createUser(
{
user: "root",
pwd: "password",
roles: [ { role: "root", db: "admin" } ]
}
);
启动shard3服务
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard3/node1/mongod.conf
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard3/node2/mongod.conf
mongod --config /Users/hanqf/myservice_dir/mongodb-mongos/shard3/node3/mongod.conf
登录及配置
#登录任意一台config
mongo --host 127.0.0.1:28031
>rs.initiate(
{
_id: "shard3",
members: [
{ _id : 0, host : "127.0.0.1:28031" },
{ _id : 1, host : "127.0.0.1:28032" },
{ _id : 2, host : "127.0.0.1:28033" }
]
}
);
#创建超级管理员,此时要求登录的是主库
>rs.isMaster() #验证是否主库
>use admin
>db.createUser(
{
user: "root",
pwd: "password",
roles: [ { role: "root", db: "admin" } ]
}
);
启动router服务
mongos --config /Users/hanqf/myservice_dir/mongodb-mongos/router/node1/mongos.conf
mongos --config /Users/hanqf/myservice_dir/mongodb-mongos/router/node2/mongos.conf
分片配置
登录任意router
mongo --host 127.0.0.1:29021
>use admin
>db.auth("root","password")
>sh.addShard( "shard1/127.0.0.1:28011,127.0.0.1:28012,127.0.0.1:28013")
>sh.addShard( "shard2/127.0.0.1:28021,127.0.0.1:28022,127.0.0.1:28023")
>sh.addShard( "shard3/127.0.0.1:28031,127.0.0.1:28032,127.0.0.1:28033")
#查看集群状态
>sh.status()
#创建数据库用户,客户端可以使用该用户连接mongo路由
>use springboot
>db.createUser(
{
user: "springboot",
pwd: "123456",
roles: [ { role: "dbOwner", db: "springboot" } ]
}
);
#指定要分片的数据库
>sh.enableSharding("springboot")
#指定集合的分片规则
#这里表示指定springboot库下的user集合的_id字段(也就是主键,每个集合都有这个字段)按hash散列进行分片,{ id : 1 }表示按字段id进度范围分片,这里id必须是整型
#要分片存储的集合都需要指定分片规则,分片规则一经创建不可修改,只能删除集合再重新设置
>sh.shardCollection("springboot.user", { _id : "hashed" } )
>use springboot
#查询user的集合状态
>db.user.stats()
注意
- 正式环境注意权限控制,使客户端只能连接router
- 可以创建任意多个router
- springboot连接方式:
spring.data.mongodb.uri=mongodb://springboot:[email protected]:29021,127.0.0.1:29022/springboot?authSource=springboot