MongoDB 4.0
一、安装部署mongoDB的分片集
1、下载4.0安装包
wget -c https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.8.tgz
2、解压安装包到/opt下
tar xf mongodb-linux-x86_64-4.0.8.tgz -C /opt/
对目录进行移动改名为mongodb
cd /opt/
mv mongodb-linux-x86_64-4.0.8/ mongodb
3、建立数据目录和日志目录
cd mongodb
mkdir db logs
4、添加环境变量
把以下内容追加到 /etc/profile
export PATH=/opt/mongodb/bin:$PATH"
激活文件的变量
source /etc/profile
5、系统优化,关闭透明大页面
把以下内容加入/etc/rc.d/rc.local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
设置内核参数,避免疯狂交换
echo 0 > /proc/sys/vm/zone_reclaim_mode 关闭zone_reclaim模式,可以从其他zone或NUMA节点回收内存(临时修改,重启失效)
sysctl -w vm.zone_reclaim_mode=0 永久设置
设置vm.swappiiness为1,禁用交换虚拟内存
vi /etc/sysctl.conf
vm.swappiness=1
6、启动配置节点
vi /opt/mongodb/bin/config.conf
dbpath=/opt/mongodb/db/
logpath=/opt/mongodb/logs/config.log
logappend=true
port=20000
replSet=shard_b
fork=true
directoryperdb=true
#keyFile=/opt/mongodb/mongodb.key
#auth=true
bind_ip=0.0.0.0
pidfilepath=/opt/mongodb/mongodb.pid
configsvr=true
maxConns=2000
启动节点
mongod -f config.conf
登陆任意一个配置节点
mongo --port 20000
use admin
config={_id:'shard_b',members:[{_id:0,host:'192.168.17.142:20000},{_id:1,host:'192.168.17.143:20000'},{_id:2,host:'192.168.17.144:20000'}]};
rs.initiate(config)
rs.status()
7、启动数据节点
vi /opt/mongodb/bin/shard_a.conf
dbpath=/opt/mongodb/db/
logpath=/opt/mongodb/logs/shard_a.log
logappend=true
port=10000
fork=true
replSet=shard_a
directoryperdb=true
#keyFile=/opt/mongodb/mongodb.key
#auth=true
bind_ip=0.0.0.0
pidfilepath=/opt/mongodb/mongodb.pid
shardsvr=true
profile=1
journal=true
maxConns=2000
启动节点
mongod -f shard__a.conf
登陆任意一个数据节点
mongo --port 10000
use admin
config={_id:"shard_a",members:[{_id:0,host:"192.168.17.138:10000",priority:2},{_id:1,host:"192.168.17.139:10000",priority:1},{_id:2,host:"192.168.17.140:10000",arbiterOnly:true}]}
rs.initiate(config)
rs.status()
8、启动路由节点
vi /opt/mongodb/bin/mongos.confdb
logpath=/opt/mongodb/logs/shard_a.log
logappend=true
port=30000
fork=true
#keyFile=/opt/mongodb/mongodb.key
bind_ip=0.0.0.0
pidfilepath=/opt/mongodb/mongodb.pid
configdb=shard_b/192.168.17.142:20000,192.168.17.143:20000,192.168.17.144:20000
maxConns=1000
启动节点
mongod -f mongos.conf
登陆节点
mongo --port 30000
use admin
添加数据节点
sh.addShard("shard_a/192.168.17.138:10000")
查看群集状态
sh.status()
9、可根据需要启用数据库分片(当单台机器或复制集上的某种资源成为瓶颈,同时基于成本考虑无法添加的时候。)
sh.enableSharding("库名")
创建表和索引
db.表名.createIndex({索引})
启用表分片
sh.shardCollection("库名.表名","索引")
10、增加安全认证机制keyfile
openssl rand -base64 745 > /opt/mongodb/mongodb.key #生成key
chmod 600 /opt/mongodb/mongodb.key #修改文件权限为600
(1)将该key值放到集群每个节点上,保持一致权限设置为600
(2)修改每个个节点(除mongos节点)配置文件的keyfile参数
keyFile=/opt/mongodb/mongodb.key
(3)重启进入(按照路由节点->配置节点->分片节点的顺序关闭,然后按逆序开启)
pkill mongod
mongod -f shard.conf
mongod -f config.conf
mongos -f mongos.conf
7、创建集群用户
先创建管理员账户
db.createUser({user:"admin",pwd:"12312a",roles:[{role:"root",db:"admin"}]})
对管理员进行身份验证
use admin
db.auth("admin","12312a")
8、时间同步
ntpdate pool.ntp.org
二、
如果mongo shell不接受集合名称,则可以用db.getCollection()语法代替。
可以设置DBQuery.shellBatchSize=10来更改mongo shell批量大小为10条
show dbs 显示当前服务器上所有数据库
use db 切换数据库到db,如果数据库不存在,则创建数据库
show collections 显示当前数据库所有集合
show profile 显示最近的耗费1毫秒或更长时间的五个操作
show roles #查看当前数据库的所有角色,包括用户定义和内置角色
Date () #以字符串返回日期
show users 当前数据库的所有用户
show log #显示日志
db.collection.find().pretty() 格式化显示collection的内容
db.dropDatabase() 删除当前数据库
db.collection.insert() 插入单个或多个文档到集合
db.auth("user","pwd") #进行身份验证
db.wu.updateOne({"name":"小米"},{$set:{"name":"小兰}}) #将小米那个文档更新为小兰
db.biao.deleteOne({"name":"小米"}) 从biao表删除匹配到”name:小米“的一条文档
db.collection.deleteMany({"name":"小米"}) 从集合删除匹配到”name:小米“的所有文档
db.biao.remove({"name":"小米"}) 删除匹配到”name:小米“的所有文档或一条文档
db.collection.drop() 删除集合
db.collection.createIndex(索引) 创建索引
db.wu.insertMany([{"name":"小绿","age":34},{"name":"小米","age":24}]) 往wu集合里添加两条文档(如果没有该文档,则创建集合)
db.collection.find() #显示该表的所有文档
db.wu.find({"name":"小兰"}) 显示“name:小兰”的那个文档
db.wu.find({"name":"小红"},{age:true}) 查找集合中“name:小红”的“age”的选项
db.wu.find().sort({age:1}) 按age的正序来查看wu集合
db.wu.find().limit(2) 看看wu集合的前两行
db.wu.find().skip(1) 跳过第一行查看wu集合
db.collection.find().sort({"age":-1}) 查看collection的内容按age的逆序显示
db.wu.count() 统计wu集合有几个文档
db.wu.find({age:24}).count() 统计wu集合age:24的有几个文档
db.getLastError() 返回错误信息
db.wu.renameCollection("统计表") 把集合wu改名为统计表
db = connect("192.168.17.138:10000/admin") 连接到192.168.17.138的10000端口的admin库
db.biao.find({"age":{$in:[24,34]}}) 查找biao里的age等于24或34的文档
db.biao.find({$or:[{"name":"小米"},{"age":{$gt:30}}]}) 查找biao集合里name:小米的文档或age大于30的文档
$eq 匹配等于指定值的值;$gt匹配大于指定值的值;$gte匹配大于或等于指定值的值;$in匹配数组中指定的任何值;$lt匹配小于指定值的值;$lte匹配小于或等于指定值的值;$ne匹配所有不等于指定值的值;$nin不匹配数组中指定的任何值
db.inventory.find({"size.h":{$lt:15}}) 查找inventory文档中的size字段中的h字段小于15的所有文档
db.biao.replaceOne({"name":"小周"},{"name":"小紫","age":35}) 把biao集合的”name:小周“的文档替换为”"name":"小紫","age":35“
db.collection.bulkWrite( ) 可以在()写入进行多条操作
db.biao.ensureIndex({"age":1}) 为biao集合按顺序创建索引age(1:指定按升序创建索引;-1:指定降序来创建索引)
db.biao.ensureIndex({"age":1},{background:true}) 为biao集合按顺序创建索引age,background:true参数让创建工作在后台执行(加参数unique:true指定创建唯一索引)
db.revokeRolesFromUser("admin",[{role:"userAdminAnyDatabase",db:"admin"}]) 撤销用户admin的权限
db.grantRolesToUser("admin",[{role:"readWrite",db:"admin"}]) 修改admin用户的权限为在admin库用户读写权限
db.changeUserPassword("admin","123456") 更改admin的密码为123456
db.getUser("admin") 查看用户admin的角色等信息
use products db.getRole( "read", { showPrivileges: true } 查看在products库中的read角色被授与的权限
db.createRole({role:"dropsytemviewsAnyDatabase",privileges:[{actions:["dropCollection"],resource:{db:"",collection:"system.views"}}],roles:[]}) 创建一个新角色以删除system.views的集合在任何数据库中(resource即资源;actions即权限操作;privilege即权限;cluster:true 表示的是全局资源)
db.revokePrivilegesFromRole("dropsytemviewsAnyDatabase",[{resource:{db:"",collection:"system.views"},actions:["dropCollection"]}]) 把dropsytemviewsAnyDatabase角色权限回收
db.dropRole("dropsytemviewsAnyDatabase") 删除dropsytemviewsAnyDatabase角色
db.createUser({user:"admin",pwd:"123123"roles:[{role:"root",db:"admin"}]}) 创建admin用户,内建角色为root,指定认证库为admin
db.dropUser("admin") 删除用户admin
sh.disableBalancing("集合") 禁用集合的平衡器
sh.enableBalancing("集合") 启动集合的平衡器
sh.isBalancerRunning() 检查balancer(平衡器)是否正在运行
sh.getBalancerState() 检查平衡器状态
use config
db.settings.update( {_id:"balancer"},{$set:{activeWindow:{start:"00:00",stop:"06:00"}}},{upsert:true} ) 配置服务器副本集中的平衡器的开始时间为00:00和停止时间为06:00
sh.stopBalancer() 禁用平衡器
sh.setBalancerState(true) 启动平衡器
while(sh.isBalancerRunning()){print("waiting...");sleep(1000);} 验证有没有正在进行的迁移
db.adminCommand({balancerStop:1}) 从驱动程序禁用平衡器
db.adminCommand({balancerStart:1}) 从驱动程序启动平衡器
db.settings.update( {"_id":"balancer"}, {$set:{"_waitForDelete":true}}, {upsert:true} ) 使删除阶段阻止下一个块迁移的开始
db.settings.update({"_id":"balancer","_waitForDelete":true},{$unset:{"_waitForDelete":""}} ) 恢复为默认行为,在开始下一个块迁移之前,平衡器不会等待正在进行的迁移的删除阶段完成
db.adminCommand({movechunk:"deng.biao",find:{"name":"小红"},to:"mongodb-shard"}) 在数据库deng的集合biao里片键名为"name":"小红"的块迁移并命名为mongodb-shard
db.serverStatus().connections 查看连接数
db.stats() 查看数据库空间使用情况(默认bytes单位)
db.stats(1073741824) 查看数据库空间使用情况以G为单位
db.fsyncLock() 刷新写入磁盘并锁定数据库以防止进一步写入
db.fsyncUnlock() 解除数据库的写入锁定
db.adminCommand("connPoolStats") 查看连接池相关统计信息
rs.freeze(60) 在60s内该机器无法成为主
rs.stepDown([120]) 让该机器成为从节点且120s内不会成为主
mongo admin --port 10000 --eval "db.shutdownServer()" -u root -p 123123 --authenticationDatabase admin 在命令行停止mongodb服务
mongod -dbpath /opt/mongodb/db/ --shutdown 在命令行指定数据目录进行停止服务
db.shutdownServer() 在admin数据库停止mongo DB的服务
三、解决linux和NUMA的cpu带来的疯狂交换问题
lscpu 查看cpu的类型(NUMA等)参数
numactl --hardware 查看每节点(核)的内存使用情况
1、numactl --interleave=all 加这个参数启动可以使得mongo DB需要内存时,可以在所有的节点上交叉分配,有效地平衡每个节点的内存量。
2、echo 0 > /proc/sys/vm/zone_reclaim_mode 禁用proc配置中的zone_reclaim
四、工具组件
1、mongodump mongodb数据备份工具
语法:mongodump -h dbhost -d dbname -o dbdirectory
-h :mongo DB所在服务器地址,也可以指定端口或加参数--port指定
-d:需要备份的数据库实例
-o:备份的数据库存放位置
-u:验证用户
-p:验证用户密码
-c:集合名
--authenticationDatabase:验证的数据库
示例:
mongodump -d deng -c biao -h 192.168.17.141:30000 -u root -p 123123 --authenticationDatabase admin -o /tmp
2、mongorestore mongodb数据恢复工具
语法:mongorestore -h dbhost -d dbname --directoryperdb dbdirectory
-h:Mongo DB所在服务器地址
-d: 需要恢复的数据库实例
--dir:备份数据(bson文件)所在位置
--drop:恢复的时候,先删除当前数据,然后恢复备份的数据。
示例:
mongorestore -h 127.0.0.1:30000 -u root -p 123123 --authenticationDatabase admin -d deng -c bia --dir /tmp/deng/biao.bson --drop
3、mongoimport mongodb数据导入工具
-h:指明数据库宿主机
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明数据库的集合名
-f:指明要导入那些列
--type:指明要导入的文件格式
--file:指明要导入的文件
--headerline:指明第一行是列名,不需要导入(当为json文件时不需要该参数)
示例:
mongoimport -d deng -c biao -u root -p 123123 --file /tmp/deng/biao.metadata.json --authenticationDatabase admin -h 127.0.0.1:30000
4、mongoexport mongodb数据导出工具
-h:指明数据库宿主机
-u:指明数据库的用户名
-p:指明数据库的密码
-d:指明数据库的名字
-c:指明数据库的集合名
-o:指明到要导出的文件名
-q:指明导出数据的过滤条件
示例:
mongoexport -d deng -c biao -u root -p 123123 --authenticationDatabase admin -o students.dat -h 127.0.0.1:30000
5、bsondump 将bson格式的文件转储为json格式的数据
--bsonFile:路径到bson文件转出到json
示例:
bsondump --outFile biao.json biao.bson
6、mongostat mongodb自带的状态检测工具
-i:非滚动状态下的交互式显示状态
-n:要打印的统计行数
-o:要显示的字段
示例:
deng]# mongostat -u root -p 123123 --authenticationDatabase admin -h 127.0.0.1:30000 -o insert -n 2
输出字段说明:
insert:每秒插入数据库的对象数。如果后跟*,则数据是复制操作
query:每秒查询操作的数量
update:每秒更新操作的数量
delete:每秒删除的数量
getmore:每秒获得更多操作的数量
command:每秒的命令数
flushes:对于WiredTiger存储引擎,是指在每个轮询间隔之间触发的WiredTiger检查点的数量。
mapped:以兆字节为单位映射的数据总量,上次mongostat呼叫时的总数据量
vsize:上次mongostat调用时进程使用的虚拟内存量
res:上次mongostat调用时进程使用的驻留内存量(兆字节)
faults:每秒页面错误的数量
qrw:客户端查询排队长度(读|写)
arw:活跃客户端量(读|写)
netIn:mongoDB实例接受的网络流量
netout:mongoDB实例发送的网络流量
conn:打开连接的总数
7、mongotop 跟踪一个mongodb的实例,查看哪些大量的时间花费在读取和写入数据
-n:要打印的统计行数
示例:
mongotop -u root -p 123123 --authenticationDatabase admin -h 192.168.17.138:10000 -n 1
输出字段说明:
ns:包含数据库命名空间
db:包含数据库名称
total:mongod花费的时间工作在这个命名空间提供总额
read:提供了大量的时间,这个mongod花费在执行读操作
write:提供这个命名空间进行写操作话费的时间
8、mongo 客户端命令行工具
9、mongofiles GridF管理工具,可实现二进制文件的存取
10、mongoreplay mongoDB的流量捕获和重访工具
11、install_compass mongoDB的compass的安装脚本
最大的BSON文档大小为16兆字节,mongo DB支持不超过100级的文档嵌套。
一般批量提交的BSON文件的大小为48MB。
数据库名称在mongo DB中不区分大小写,不能包含/ \ 。” $ 这些字符和空字符,而且必须少于64个字符
集合名称应以下划线或字母开头,不能用$ "" system.前缀和空字符开头。集合名最大为120字节。
文档的字段名称不能包含有null字符,不能以$开头。
单个集合的索引不能超过64个,索引字段不能超过128个字符,复合索引中的字段不能超过32个
linux中mongoDB默认最大连接数是819
为提高性能,可以把数据目录和日志目录的读写放到不同存储设备上。
一般使用RAID10磁盘系统
为系统分配虚拟内存,可以阻止OOM Killer杀死mongod进程
在从库运行db.getMongo().setSlaveOk();就可以使得从库支持读取,从而使得读写分离。
调整ulimt值(文件打开数量的限制,默认是1024),查看ulimit -n;设置是vi /etc/security/limits.conf下添加soft nofile 65535 和hard nofile 65535
文件句柄值,设置是vi /proc/sys/fs/file-max
内核pid limit,设置是vi /proc/sys/kernel/pid_max
每个进程的最大线程数,设置vi /proc/sys/kernel/threads-max
每个进程的最大内存映射区域数,设置vi /proc/sys/vm/max_map_count
浙公网安备 33010602011771号