共计 5948 个字符,预计需要花费 15 分钟才能阅读完成。
前言
为了在测试环境部署新我的项目,决定应用 docker 搭建一条 mongo 集群数据。
筹备
三台测试环境服务器
ip | 操作系统 |
---|---|
192.168.188.7 | centos7 |
192.168.188.129 | centos7 |
192.168.188.144 | centos7 |
<!–more–>
部署
========== 以下每台都执行 ========================
=========== 装置过程 =================
镜像
docker pull mongo:4.0.10
查看版本:
地址如下:https://hub.docker.com
网络
docker network create --subnet=10.20.0.0/24 mongodbnet
文件夹
mkdir -p /usr/local/mongo/configsvr
mkdir -p /usr/local/mongo/shard1
mkdir -p /usr/local/mongo/shard2
mkdir -p /usr/local/mongo/shard3
mkdir -p /usr/local/mongo/mongos
Config-Server 配置文件
vim /usr/local/mongo/configsvr/mongod.conf
#### 内容:
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
bindIp: 0.0.0.0
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: cfg
sharding:
clusterRole: configsvr
Mongos 配置文件
vim /usr/local/mongo/mongos/mongos.conf
#### 内容:
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongos.log
net:
port: 27020
bindIp: 0.0.0.0
processManagement:
fork: true
timeZoneInfo: /usr/share/zoneinfo
sharding:
configDB: cfg/192.168.188.7:27019,192.168.188.129:27019,192.168.188.144:27019
Shard-Server 配置文件 1
vim /usr/local/mongo/shard1/mongod.conf
#### 内容
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
bindIp: 0.0.0.0
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: shard1
sharding:
clusterRole: shardsvr
Shard-Server 配置文件 2
vim /usr/local/mongo/shard2/mongod.conf
#### 内容
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
bindIp: 0.0.0.0
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: shard2
sharding:
clusterRole: shardsvr
Shard-Server 配置文件 3
vim /usr/local/mongo/shard3/mongod.conf
#### 内容
storage:
dbPath: /data/db
journal:
enabled: true
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
net:
bindIp: 0.0.0.0
processManagement:
timeZoneInfo: /usr/share/zoneinfo
replication:
replSetName: shard3
sharding:
clusterRole: shardsvr
启动 Docker 容器 Config-Server 容器 (每台服务器执行一次):
docker run -d --restart=always --name=cfg_1 -p 27019:27019 --network=mongodbnet -v /usr/local/mongo/configsvr:/etc/mongodb mongo:4.0.10 -f /etc/mongodb/mongod.conf
启动 3 * 3 个 Shard-Server 容器:阐明:分片服务器启动后默认是以 27018 作为端口。
启动第一个分片 – shard1
docker run -d --restart=always --name=shard1_1 -p 27018:27018 --network=mongodbnet -v /usr/local/mongo/shard1:/etc/mongodb mongo:4.0.10 -f /etc/mongodb/mongod.conf
启动第二个分片 – shard2
docker run -d --restart=always --name=shard2_1 -p 27028:27018 --network=mongodbnet -v /usr/local/mongo/shard2:/etc/mongodb mongo:4.0.10 -f /etc/mongodb/mongod.conf
启动第三个分片 – shard3
docker run -d --restart=always --name=shard3_1 -p 27038:27018 --network=mongodbnet -v /usr/local/mongo/shard3:/etc/mongodb mongo:4.0.10 -f /etc/mongodb/mongod.conf
启动 3 个 mongos 服务器 阐明:这里也应用了 mongo 镜像,然而须要开启 mongos 过程,mongod 过程并不需要用到
docker run -d --restart=always --name=mongos_1 -p 27017:27017 -p 27020:27020 --network=mongodbnet -v /usr/local/mongo/mongos:/etc/mongodb mongo:4.0.10
集群
进入其中一个容器配置 Config-Server 正本集:
docker exec -it cfg_1 /bin/bash
# 容器中
mongo --port 27019
# Mongo Shell 中
rs.initiate({
"_id":"cfg",
"members":[
{
"_id":0,
"host":"192.168.188.7:27019"
},
{
"_id":1,
"host":"192.168.188.129:27019"
},
{
"_id":2,
"host":"192.168.188.144:27019"
}
]
})
进入其中一个容器配置 Shard-Server1 正本集:
# 宿主机
docker exec -it shard1_1 /bin/bash
# 容器中
mongo --port 27018
# Mongo Shell 中
rs.initiate({
"_id":"shard1",
"members":[
{
"_id":0,
"host":"192.168.188.7:27018"
},
{
"_id":1,
"host":"192.168.188.129:27018"
},
{
"_id":2,
"host":"192.168.188.144:27018"
}
]
})
进入其中一个容器配置 Shard-Server2 正本集:
# 宿主机
docker exec -it shard2_1 /bin/bash
# 容器中
mongo --port 27018
# Mongo Shell 中
rs.initiate({
"_id":"shard2",
"members":[
{
"_id":0,
"host":"192.168.188.7:27028"
},
{
"_id":1,
"host":"192.168.188.129:27028"
},
{
"_id":2,
"host":"192.168.188.144:27028"
}
]
})
进入其中一个容器配置 Shard-Server3 正本集:
# 宿主机
docker exec -it shard3_1 /bin/bash
# 容器中
mongo --port 27018
# Mongo Shell 中
rs.initiate({
"_id":"shard3",
"members":[
{
"_id":0,
"host":"192.168.188.7:27038"
},
{
"_id":1,
"host":"192.168.188.129:27038"
},
{
"_id":2,
"host":"192.168.188.144:27038"
}
]
})
进入 mongos 容器中,启动 mongos 过程(此处能够改良一下,主动运行 mongos 过程)
# 宿主机
docker exec -it mongos_1 /bin/bash
# 容器中
mongos -f /etc/mongodb/mongos.conf
#能够就在其中一个 mongos 容器中应用 mongo shell 连贯 mongos 过程配置分片集群
# 连贯 mongos,端口号与 mongos 配置文件中设定统一
mongo -port 27020
# 将分片退出集群
sh.addShard("shard1/192.168.188.7:27018,192.168.188.129:27018,192.168.188.144:27018")
sh.addShard("shard2/192.168.188.7:27028,192.168.188.129:27028,192.168.188.144:27028")
sh.addShard("shard3/192.168.188.7:27038,192.168.188.129:27038,192.168.188.144:27038")
# 对数据库开启分片性能
sh.enableSharding("cvmc")
#切换数据库并建设一张测试表才会真的创立数据库
use cvmc
db.message.insert({"mid":"test"})
#创立一个索引能力开启汇合分片
db.message.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
use admin
# 对数据库中汇合开启分片,并指定片键
sh.shardCollection("cmvc.message",{"mid":1})
# sh.shardCollection("[dbName.collectionName]",{[keyName]:1})
# 查看分片状态
sh.status()
mongo 一些常用命令
索引
1. 根底索引
在字段 age 上创立索引,1(升序);-1(降序):
db.users.ensureIndex({age:1})
_id 是创立表的时候主动创立的索引,此索引是不可能删除的。当零碎已有大量数据时,创立索引就是个十分耗时的活,咱们能够在后盾执行,只需指定“backgroud:true”即可。
db.t3.ensureIndex({age:1} , {backgroud:true})
2. 文档索引
索引能够任何类型的字段,甚至文档:
db.factories.insert({ name: "wwl", addr: { city: "Beijing", state: "BJ"} } );
// 在 addr 列上创立索引
db.factories.ensureIndex({ addr : 1} );
// 上面这个查问将会用到咱们刚刚建设的索引
db.factories.find({ addr: { city: "Beijing", state: "BJ"} } );
// 然而上面这个查问将不会用到索引,因为查问的程序跟索引建设的程序不一样
db.factories.find({ addr: { state: "BJ" , city: "Beijing"} } );
3. 组合索引
跟其它数据库产品一样,MongoDB 也是有组合索引的,上面咱们将在 addr.city 和 addr.state 上建设组合索引。当创立组合索引时,字段前面的 1 示意升序,-1 示意降序,是用 1 还是用 -1 次要是跟排序的时候或指定范畴内查问 的时候无关的。
db.factories.ensureIndex({ "addr.city" : 1, "addr.state" : 1} );
// 上面的查问都用到了这个索引
db.factories.find({ "addr.city" : "Beijing", "addr.state" : "BJ"} );
db.factories.find({ "addr.city" : "Beijing"} );
db.factories.find().sort( { "addr.city" : 1, "addr.state" : 1} );
db.factories.find().sort( { "addr.city" : 1} );
4. 惟一索引
只需在 ensureIndex 命令中指定”unique:true”即可创立惟一索引。例如,往表 t4 中插入 2 条记录时候报错。
db.t4.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
5. 强制应用索引
hint 命令能够强制应用某个索引。
db.t5.find({age:{$lt:30}}).hint({name:1, age:1}).explain()
6. 删除索引
// 删除 t3 表中的所有索引
db.t3.dropIndexes()
// 删除 t4 表中的 firstname 索引
db.t4.dropIndex({firstname: 1})
本文由博客群发一文多发等经营工具平台 OpenWrite 公布