1. 逻辑结构
Mongodb的存储格式为json格式,存储结构灵活,数据压缩比高。
{
id:101,
name:'john'
}
适用场景:对数据一致性要求不高,数据量级大,数据格式灵活
应用场景:银行流水系统,大数据平台
2. 安装MongoDB
2.1 安装依赖软件
yum install libcurl openssl xz-libs
2.2 关闭大叶内存(THP)
透明大页面(THP)是一种Linux内存管理系统,它通过使用较大的内存页面来减少具有大量内存的计算机上的转换后备缓冲区(TLB)查找的开销。但是,启用THP时,数据库工作负载通常表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。在Linux上运行MongoDB时,应禁用THP以获得最佳性能。
创建服务文件vim /etc/systemd/system/disable-transparent-huge-pages.service
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
[Install]
WantedBy=basic.target
重新加载systemd,并关闭大页内存
systemctl daemon-reload
systemctl start disable-transparent-huge-pages
systemctl enable disable-transparent-huge-pages
检查结果
cat /sys/kernel/mm/transparent_hugepage/enabled
#部分redhat系统需要执行下面的命令
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
2.3 下载安装MongoDB
下载tar包
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.5.tgz
解包后制作软链接
mv <mongodb-install-directory> /usr/local/
ln -s /usr/local/<mongodb-install-directory> /usr/local/mongodb
配置环境变量vim /etc/profile
export PATH=/usr/local/mongodb/bin:$PATH
创建数据和日志目录
mkdir -p /var/lib/mongodb
mkdir -p /var/log/mongodb
mkdir -p /usr/local/mongodb/conf
创建mongod用户
useradd mongod -M -s /usr/sbin/nologin
更改目录权限
chown -R mongod:mongod /var/lib/mongodb
chown -R mongod:mongod /var/log/mongodb
chown -R mongod:mongod /usr/local/mongodb
2.4 编辑MongoDB配置文件
配置文件详解
--系统日志有关
systemLog:
destination: file
path: "/var/log/mongodb/mongodb.log" --日志位置
logAppend: true --日志以追加模式记录
--数据存储有关
storage:
journal:
enabled: true
dbPath: "/var/lib/mongodb" --数据路径的位置
-- 进程控制
processManagement:
fork: true --后台守护进程
pidFilePath: <string> --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中
--网络配置有关
net:
bindIp: <ip> -- 监听地址
port: <port> -- 端口号,默认不配置端口号,是27017
-- 安全验证有关配置
security:
authorization: enabled --是否打开用户名密码验证
------------------以下是复制集与分片集群有关----------------------
replication:
oplogSizeMB: <NUM>
replSetName: "<REPSETNAME>"
secondaryIndexPrefetch: "all"
sharding:
clusterRole: <string>
archiveMovedChunks: <boolean>
---for mongos only
replication:
localPingThresholdMs: <int>
sharding:
configDB: <string>
---
配置文件示例vim /usr/local/mongodb/conf/mongo.conf
systemLog:
destination: file
path: "/var/log/mongodb/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/var/lib/mongodb"
processManagement:
fork: true
net:
port: 27017
bindIp: 127.0.0.1,10.0.0.51
2.5 手工启动mongodb
启动
mongod --dbpath=/var/lib/mongodb --logpath=/var/log/mongodb/mongodb.log --port=27017 --logappend --fork
mongod -f /usr/local/mongodb/conf/mongo.conf
停止
mongod -f /usr/local/mongodb/conf/mongo.conf --shutdown
2.6 使用systemd管理Mongodb
vim /etc/systemd/system/mongod.service
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongod
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongo.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/conf/mongo.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
2.7 登录Mongodb
本地登录
#没有开启认证
mongo
#开启认证
mongo -u 用户名 -p 密码
远程登录
mongo -u 用户名 -p 密码 IP:端口/认证库
2.8 日志切割
修改配置文件/etc/mongod.conf
...
systemLog:
...
logAppend: true
logRotate: reopen
...
配置logrotate
/var/log/mongodb/*log {
create 0664 mongod mongod
daily
dateext
rotate 10
missingok
notifempty
nocompress
sharedscripts
postrotate
/bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid` 2>/dev/null || true
endscript
}
3. MongoDB常用基本操作
3.1 MongoDB默认存在的库
系统库:
- admin:系统预留库,MongoDB系统管理库
- local库:本地预留库,存储关键日志
- config库:MongoDB配置信息库
默认库:
test:登录时默认存在的库
3.2 常用操作
查询所有数据库
show databases/show dbs
查询库中的所有表
show tables/show collections
切换/创建数据库
use admin
查看当前使用的数据库,等于mysql中select database()
db
3.3 命令查看帮助
3.3.1 db对象相关
db.[TAB][TAB]
:按两下TAB,显示db类的所有操作
db.help()
:查询db所有操作的用法
db.表1.[TAB][TAB]
:按两下TAB,显示db下表1的所有操作,表1不用事先创建
db.表1.help()
:显示db下表1的所有操作的用法
3.3.2 rs(replication set)复制集相关
rs.[TAB][TAB]
:按两下TAB,显示rs类的所有操作
rs.help()
:查询rs所有操作的用法
3.3.3 sh(sharding cluster)分片集群相关
sh.[TAB][TAB]
:按两下TAB,显示sh类的所有操作
sh.help()
:查询sh所有操作的用法
3.4 MongoDB对象操作
3.4.1 库的操作
use 库1
:切换/创建数据库
db.dropDatabase()
:删除当前库
3.4.2 集合的操作
对集合进行操作时,无需提前创建集合
db.集合名.insert({id:101,name:"wmz",age:18})
:创建集合,并插入1行json格式数据
db.集合名.insert([{"id":1},{"id":2}])
:创建集合,并插入多行json格式数据
db.集合名.find()
:查询集合的数据
> db.test.find()
{ "_id" : ObjectId("6093b26b23a521588011c703"), "id" : 101, "name" : "wmz", "age" : 18 }
db.集合名.find().pretty()
:查询集合的数据,并优雅显示
> db.test.find().pretty()
{
"_id" : ObjectId("6093b26b23a521588011c703"),
"id" : 101,
"name" : "wmz",
"age" : 18
}
db.集合名.find({id:100})
:条件查询,查询id=100的数据
db.集合名.count()
:查询集合中有多少行数据
for(i=0;i<10000;i++){db.集合名.insert({"uid":i})}
:利用for函数,循环插入10000行数据
db.集合名.drop()
:删除集合
db.集合名.remove({})
:删除集合中的所有记录
db.集合名.totalSize()
:集合中索引+数据压缩存储之后的大小
db.getCollectionInfos({"name":"集合名"})
:显示集合或视图的配置信息,不配置{"name":"集合名"}
则显示全部的配置信息
4. 用户及权限管理
4.1 验证库
建立用户时use到的库,在使用用户时,要加上验证库才能登录
注意事项:
- 对于管理员用户,必须在admin下创建
- 登录时,必须明确指定验证库才能登录
- 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设为验证库
- 如果直接登录到数据库,不进行use,默认的验证库是test,生产中不建议
- 从3.6版本开始,不添加bindIp参数,默认不允许远程登录,只能本地管理员登录
4.2 创建用户语法
use admin
db.createUser(
{
user:"<name>",
pwd:"<cleartext password>",
roles:[
{ role:"<role>",
db:"database" } | "<role>",
...
]
}
)
语法说明:
user:用户名
pwd:密码
roles:
- role:角色名,常用有3种
root
,readWrite
,read
- db:作用对象
4.3 管理员用户创建流程
创建超级管理员:管理所有数据库,必须use admin再去创建
use admin
db.createUser(
{
user:"root",
pwd:"123",
roles:[ { role:"root",db:"admin" } ]
}
)
验证用户
> db.auth('root','123')
1
配置文件中加入以下配置vim /usr/local/mongodb/conf/mongo.conf
注意:一定要在创建完管理员用户后配置,否则会远程登录不上数据库
security:
authorization: enabled
重启mongodb服务
4.4 应用用户创建
创建应用用户:use 到应用库再去创建
use bigsky
db.createUser(
{
user:"app",
pwd:"123",
roles:[ { role:"readWrite",db:"bigsky" } ]
}
)
4.5 登录命令
mongo -u 用户名 -p 密码 IP地址/验证库
mongo -u bigsky -p 123 10.0.0.51/school
4.6 MongoDB中的用户信息查询
use admin
db.system.users.find().pretty()
4.7 删除用户
需要管理员用户进入用户的验证库删除
#登录
mongo -uroot -p123 10.0.0.51/admin
#删除
use bigsky
db.dropUser("app2")
5 MongoDB复制集RS(Replication Set)
5.1 基本原理
基本结构是1主2从结构,自带相互监控投票机制(Raft协议,Mysql的MGR使用的是变种的Paxos协议),具有如下特点:
- 不需要额外的中间件,能够保证数据实时复制及一致性
- 如果主库宕机,复制集内部会进行投票选举,选出新的主库带外服务
- 主库宕机发生切换,会自动通知客户端连接新的主库
演变架构,1主1从1仲裁者,仲裁者不参与数据的同步,只有仲裁投票的功能。
默认登录到Secondary节点不能进行读写操作,需要在Secondary节点上运行
rs.slaveOK()
,从而开启当前登录会话在从节点上的读权限
5.2 Replication Set配置
5.2.1 环境准备
创建多实例目录
mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/log
mkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/log
mkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/log
mkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log
编写配置文件
cat > /mongodb/28017/conf/mongod.conf <<EOF
systemLog:
destination: file
path: "/mongodb/28017/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/28017/data"
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
port: 28017
bindIp: 127.0.0.1,接口IP地址
replication:
oplogSizeMB: 2048
replSetName: my_repl
EOF
cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/mongod.conf
cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/mongod.conf
cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/mongod.conf
sed -i 's/28017/28018/g' /mongodb/28018/conf/mongod.conf
sed -i 's/28017/28019/g' /mongodb/28019/conf/mongod.conf
sed -i 's/28017/28020/g' /mongodb/28020/conf/mongod.conf
启动多实例
mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf
5.2.1.1 配置文件参数解释
#使用wiredTiger存储引擎
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
#复制集相关参数
replication:
#类似于mysql的binlog,日志大小设置
oplogSizeMB: 2048
#复制集的名字
replSetName: my_repl
5.2.2 配置普通复制集
1主2从,从库普通从库
连接mongodb
mongo 127.0.0.1:28017/admin
添加复制集配置,_id
必须和配置文件中的replSetName
字段的值一致,本例是my_repl
config = {_id: "my_repl", members: [
{_id: 0, host: '127.0.0.1:28017'},
{_id: 1, host: '127.0.0.1:28018'},
{_id: 2, host: '127.0.0.1:28019'}
]
}
rs.initiate(config)
查询复制集状态
rs.status()
此时登录的节点已经能够显示所在的复制集和主从状态
5.2.3 配置扩展复制集
1主1从1个arbiter,与普通复制集配置config稍有变化,其余步骤一样
config = {_id: "my_repl", members: [
{_id: 0, host: '127.0.0.1:28017'},
{_id: 1, host: '127.0.0.1:28018'},
{_id: 2, host: '127.0.0.1:28019',"arbiterOnly":true}
]
}
rs.initiate(config)
5.3 Replication Set管理操作
5.3.1 查看复制集状态
rs.status()
查看整个复制集的状态
rs.isMaster()
查看当前是否是主节点
rs.conf()
查看当前复制集的配置信息
5.3.2 添加删除节点
只能在primary节点上操作,将现有节点变更为arbiter,需要先删除节点,再添加为arbiter
rs.remove("ip:port")
删除一个节点
rs.add("ip:port")
新增从节点
rs.addArb("ip:port")
新增仲裁节点
5.4 特殊从节点
介绍:
arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用
5.4.1 配置延时节点
一般延时节点也配置成hidden
cfg=rs.conf()
cfg.members[节点索引].priority=0
cfg.members[节点索引].hidden=true
cfg.members[节点索引].slaveDelay=120
rs.reconfig(cfg)
#用members的节点索引来确定更改的是哪个节点
配置成功后,通过以下命令查询配置后的属性
rs.conf()
5.4.2 恢复普通节点
cfg=rs.conf()
cfg.members[节点索引].priority=1
cfg.members[节点索引].hidden=false
cfg.members[节点索引].slaveDelay=0
rs.reconfig(cfg)
6 MongoDB Sharding Cluster 分片集群
节点功能:
- shard: 存储数据的节点,需要复制集部署
- mongos: 承接用户请求的路由节点,负责将用户的请求分发到后端的shard节点,无需存储数据,需要向Config Server请求Shard集群信息
- config servers: 存储节点元数据和整个集群的配置,路由分片的规则也在整个节点上,需要复制集部署
规划:
10个实例:38017-38026
- configserver:3台构成的复制集(1主2从,不支持arbiter)38018-38020,复制集名字
configsvr
- shard节点:
- sh1:38021-23,1主2从,其中一个节点为arbiter,复制集名字sh1
- sh2:38024-26,1主2从,其中一个节点为arbiter,复制集名字sh2
configserver可以是一个节点,官方建议复制集。configserver不能有arbiter。
3.4版本之后,虽然要求config server为replica set,但是不支持arbiter
- mongos节点
6.1 sh复制集
6.1.1 环境准备
创建多实例目录
mkdir -p /mongodb/38021/conf /mongodb/38021/data /mongodb/38021/log
mkdir -p /mongodb/38022/conf /mongodb/38022/data /mongodb/38022/log
mkdir -p /mongodb/38023/conf /mongodb/38023/data /mongodb/38023/log
mkdir -p /mongodb/38024/conf /mongodb/38024/data /mongodb/38024/log
mkdir -p /mongodb/38025/conf /mongodb/38025/data /mongodb/38025/log
mkdir -p /mongodb/38026/conf /mongodb/38026/data /mongodb/38026/log
编写sh1节点组配置文件
cat > /mongodb/38021/conf/mongod.conf <<EOF
systemLog:
destination: file
path: "/mongodb/38021/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/38021/data"
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
port: 38021
bindIp: 127.0.0.1
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
EOF
cp /mongodb/38021/conf/mongod.conf /mongodb/38022/conf/mongod.conf
cp /mongodb/38021/conf/mongod.conf /mongodb/38023/conf/mongod.conf
sed -i 's/38021/38022/g' /mongodb/38022/conf/mongod.conf
sed -i 's/38021/38023/g' /mongodb/38023/conf/mongod.conf
编写sh2节点组配置文件
cat > /mongodb/38024/conf/mongod.conf <<EOF
systemLog:
destination: file
path: "/mongodb/38024/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/38024/data"
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
port: 38024
bindIp: 127.0.0.1
replication:
oplogSizeMB: 2048
replSetName: sh2
sharding:
clusterRole: shardsvr
processManagement:
fork: true
EOF
cp /mongodb/38024/conf/mongod.conf /mongodb/38025/conf/mongod.conf
cp /mongodb/38024/conf/mongod.conf /mongodb/38026/conf/mongod.conf
sed -i 's/38024/38025/g' /mongodb/38025/conf/mongod.conf
sed -i 's/38024/38026/g' /mongodb/38026/conf/mongod.conf
启动所有节点
mongod -f /mongodb/38021/conf/mongod.conf
mongod -f /mongodb/38022/conf/mongod.conf
mongod -f /mongodb/38023/conf/mongod.conf
mongod -f /mongodb/38024/conf/mongod.conf
mongod -f /mongodb/38025/conf/mongod.conf
mongod -f /mongodb/38026/conf/mongod.conf
6.1.2 复制集创建
复制集sh1
mongo 127.0.0.1:38021
config = {_id: "sh1", members: [
{_id: 0, host: '127.0.0.1:38021'},
{_id: 1, host: '127.0.0.1:38022'},
{_id: 2, host: '127.0.0.1:38023',"arbiterOnly":true}
]
}
rs.initiate(config)
复制集sh2
mongo 127.0.0.1:38024
config = {_id: "sh2", members: [
{_id: 0, host: '127.0.0.1:38024'},
{_id: 1, host: '127.0.0.1:38025'},
{_id: 2, host: '127.0.0.1:38026',"arbiterOnly":true}
]
}
rs.initiate(config)
6.2 config复制集
6.2.1 环境准备
创建多实例目录
mkdir -p /mongodb/38018/conf /mongodb/38018/data /mongodb/38018/log
mkdir -p /mongodb/38019/conf /mongodb/38019/data /mongodb/38019/log
mkdir -p /mongodb/38020/conf /mongodb/38020/data /mongodb/38020/log
编写配置文件
cat > /mongodb/38018/conf/mongod.conf <<EOF
systemLog:
destination: file
path: "/mongodb/38018/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/38018/data"
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
port: 38018
bindIp: 127.0.0.1
replication:
oplogSizeMB: 2048
replSetName: configReplSet
sharding:
clusterRole: configsvr
processManagement:
fork: true
EOF
cp /mongodb/38018/conf/mongod.conf /mongodb/38019/conf/mongod.conf
cp /mongodb/38018/conf/mongod.conf /mongodb/38020/conf/mongod.conf
sed -i 's/38018/38019/g' /mongodb/38019/conf/mongod.conf
sed -i 's/38018/38020/g' /mongodb/38020/conf/mongod.conf
启动节点
mongod -f /mongodb/38018/conf/mongod.conf
mongod -f /mongodb/38019/conf/mongod.conf
mongod -f /mongodb/38020/conf/mongod.conf
6.2.2 复制集创建
mongo 127.0.0.1:38018
config = {_id: "configReplSet", members: [
{_id: 0, host: '127.0.0.1:38018'},
{_id: 1, host: '127.0.0.1:38019'},
{_id: 2, host: '127.0.0.1:38020'}
]
}
rs.initiate(config)
6.3 mongos节点
6.3.1 环境装备
创建目录
mkdir -p /mongodb/38017/conf /mongodb/38017/data /mongodb/38017/log
编写配置文件
cat > /mongodb/38017/conf/mongos.conf <<EOF
systemLog:
destination: file
path: "/mongodb/38017/log/mongos.log"
logAppend: true
net:
port: 38017
bindIp: 127.0.0.1
sharding:
configDB: configReplSet/127.0.0.1:38018,127.0.0.1:38019,127.0.0.1:38020
processManagement:
fork: true
EOF
启动节点
mongos -f /mongodb/38017/conf/mongos.conf
6.4 将sh添加到集群
连接到一个mongos(127.0.0.1:38017),做以下配置
(1)连接到mongos的admin数据库
mongo 127.0.0.1:38017/admin
(2)添加分片
db.runCommand({addshard : "sh1/127.0.0.1:38021,127.0.0.1:38022,127.0.0.1:38023",name:"shard1"})
db.runCommand({addshard : "sh2/127.0.0.1:38024,127.0.0.1:38025,127.0.0.1:38026",name:"shard2"})
(3)列出分片
db.runCommand( { listshards : 1 } )
(4)整体状态查看
sh.status()
7 Shard规则
7.1 Shard功能
chunk:MongoDB存储数据的基本单位是chunk,缺省chunk的大小是64MB,MongoDB会自动拆分&迁移chunk。
chunk拆分:
数据初始会向第1个chunk中存储,当存储量达到64MB时,会分裂为2个32MB的chunk。chunk分裂只在一个shard中进行。
chunk迁移:
Mongos中的balancer进程会自动监控chunk在shard中的分布情况,并进行chunk到其他shard的迁移。
shard key:
collection的分片键,基于一个或多个列(类似一个索引),可以按照分片键进行Range和Hash分片。
- 分片键不可变
- 分片键必须有索引
- 分片键大小限制512bytes
- 分片键由于路由查询
- MongoDB不接受已进行collection级分片的collection上插入无分片键的文档(也不支持空值插入)
7.2 使用Shard功能
7.2.1 Range分片配置及测试
7.2.1.1 激活数据库分片功能
登录mongos
的admin
库
mongo --port 38017 admin
开启数据库的分片功能db.runCommand( { enablesharding : "数据库名称" } )
db.runCommand( { enablesharding : "test" } )
7.2.1.2 指定分片键
对vast
集合创建id
键索引
use test
db.vast.ensureIndex( { id : 1 } )
#参数{ id : 1 }表示索引是升序的,如果为{ id : -1 }表示索引是降序的
开启集合的分片功能
use admin
db.runCommand( { shardcollection : "test.vast",key : { id : 1 } } )
7.2.1.3 集合分片验证
在vast
集合插入数据
use test
for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()})}
查看shard
中的计数
shard1
mongo --port 38021 test
db.vast.count()
shard2
mongo --port 38024 test
db.vast.count()
7.2.2 Hash分片配置及测试
7.2.2.1 激活数据库分片功能
登录mongos
的admin
库
mongo --port 38017 admin
开启数据库的分片功能db.runCommand( { enablesharding : "数据库名称" } )
db.runCommand( { enablesharding : "bigsky" } )
7.2.2.2 指定分片键
对vast
集合创建id
键索引
use bigsky
db.vast.ensureIndex( { id : "hashed" } )
开启集合的分片功能
use admin
sh.shardCollection("bigsky.vast",{id:"hashed"})
7.2.2.3 集合分片验证
在vast
集合插入数据
use bigsky
for(i=1;i<1000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()})}
查看shard
中的计数
shard1
mongo --port 38021 bigsky
db.vast.count()
shard2
mongo --port 38024 bigsky
db.vast.count()
7.3 分片集群信息的查询操作
7.3.1 判断是否Shard集群
use admin
db.runCommand({isdbgrid:1})
7.3.2 列出所有分片信息
use admin
db.runCommand({listshards:1})
7.3.3 列出开启分片功能的库
use config
db.databases.find({"partitioned":true})
7.3.4 查看分片的片键
use config
db.collections.find().pretty()
7.3.5 查看分片的详细信息
sh.status()
7.3.6 删除分片节点(谨慎)
(1)确认balancer是否工作
sh.getBalancerState()
true
(2)删除shard2节点
注意:删除操作一定会立即触发balance
db.runCommand( {removeShard: "shard2"} )
8 Balancer操作
mongos的一个重要功能,自动巡查所有shard节点上的chunk情况,自动做chunk迁移
什么时候工作?
- 自动运行,会检测系统不繁忙的时候做迁移
- 在做节点删除的时候,立即开始迁移工作
- balancer只能在预设定的时间窗口内运行
8.1 开启、关闭Balancer
#关闭
sh.stopBalancer()
#开启
sh.startBalancer()
8.2 自定义Balancer开启的时间段
登录mongos
mongo --port 38017
设置在3:00到5:00开启Balancer
use config
sh.setBalancerState(true)
db.settings.update({_id: "balancer"},{ $set : { activeWindow : {start : "3:00", stop : "5:00"}}},true)
sh.status()
查看结果