MongoDB 核心技术
官方网址
https://www.mongodb.com/
二进制安装部署
(centos)关闭大页内存机制
root用户下,在vi /etc/rc.local最后添加如下代码
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then echo never > /sys/kernel/mm/transparent_hugepage/enabled fi if test -f /sys/kernel/mm/transparent_hugepage/defrag; then echo never > /sys/kernel/mm/transparent_hugepage/defrag fi
临时生效,不用重启机器
echo never > /sys/kernel/mm/transparent_hugepage/enabled echo never > /sys/kernel/mm/transparent_hugepage/defrag
其他系统关闭参照官方文档:
- https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
为什么要关闭?
Transparent Huge Pages (THP) is a Linux memory management system
that reduces the overhead of Translation Lookaside Buffer (TLB)
lookups on machines with large amounts of memory by using larger memory pages.
However, database workloads often perform poorly with THP,
because they tend to have sparse rather than contiguous memory access patterns.
You should disable THP on Linux machines to ensure best performance with MongoDB.
mongodb安装
(1)创建所需用户和组
useradd mongod passwd mongod
(2)创建mongodb所需目录结构
mkdir -p /mongodb/conf mkdir -p /mongodb/log mkdir -p /mongodb/data
(3)下载上传并解压软件到指定位置/application
解压:
tar xvf mongodb-linux-x86_64-rhel70-3.2.16.tgz
拷贝bin目录下bin程序到/mongodb/
cp -a /application/mongodb-linux-x86_64-rhel70-3.6.12/bin/ /mongodb/
(4)设置目录结构权限
chown -R mongod:mongod /mongodb
(5)设置用户环境变量
su - mongod vi .bash_profile export PATH=/mongodb/bin:$PATH source .bash_profile
(6)启动mongodb
su - mongod mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
(7)登录mongodb
[mongod@server2 ~]$ mongo
注:连接之后会有warning,需要修改(使用root用户)
vim /etc/security/limits.conf #* - nofile 65535
reboot重启生效
使用配置文件(YAML模式)
-- NOTE: YAML does not support tab characters for indentation: use spaces instead. --系统日志有关 systemLog: destination: file path: "/mongodb/log/mongodb.log" --日志位置 logAppend: true --日志以追加模式记录 --数据存储有关 storage: journal: enabled: true dbPath: "/mongodb/data" --数据路径的位置 -- 进程控制 processManagement: fork: true --后台守护进程 pidFilePath: <string> --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中 --网络配置有关 net: bindIp: <ip> -- 监听地址,如果不配置这行是监听在0.0.0.0 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> --- ......... ++++++++++++++++++++++
配置文件例子,在mongod用户下执行
vim /mongodb/conf/mongo.conf logpath=/mongodb/log/mongodb.log dbpath=/mongodb/data port=27017 logappend=true fork=true
重启
mongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf
使用YAML 文件
cat > /mongodb/conf/mongo.conf <<EOF systemLog: destination: file path: "/mongodb/log/mongodb.log" logAppend: true storage: journal: enabled: true dbPath: "/mongodb/data/" processManagement: fork: true net: port: 27017 EOF
重启
mongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf
systemd 管理(root)
cat > /etc/systemd/system/mongod.service <<EOF [Unit] Description=mongodb After=network.target remote-fs.target nss-lookup.target [Service] User=mongod Type=forking ExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongo.conf --shutdown PrivateTmp=true [Install] WantedBy=multi-user.target EOF
加载unit service
systemctl daemon-reload
系统管理命令(客户端连接还要在mongo用户下)
[root@db01 ~]# systemctl restart mongod [root@db01 ~]# systemctl stop mongod [root@db01 ~]# systemctl start mongod
用户管理
验证库,建立用户时use到的库,在使用用户时,要加上验证库才能登陆。
对于管理员用户,必须在admin下创建.
-
1. 建用户时,use到的库,就是此用户的验证库
-
2. 登录时,必须明确指定验证库才能登录
-
3. 通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库
-
4. 如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.
基本语法说明:
-
user:用户名
-
pwd:密码
-
role:角色名
-
db:作用对象
-
role:root, readWrite,read
用户管理例子
(1)创建超级管理员:管理所有数据库(必须use admin再去创建)
use admin db.createUser( { user: "root", pwd: "root123", roles: [ { role: "root", db: "admin" } ] } )
验证用户
db.auth('root','root123')
配置文件中,加入以下配置
vi /mongodb/conf/mongo.conf auth=true
重启mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf
登录验证
mongo -uroot -proot123 127.0.0.1/admin mongo -uroot -proot123 admin
查看用户:
use admin db.system.users.find().pretty()
(2)创建对app数据库,读、写权限的用户app01 *****
超级管理员用户登陆
mongo -uroot -proot123 admin
选择一个验证库
use app
创建用户
db.createUser( { user: "app01", pwd: "app01", roles: [ { role: "readWrite" , db: "app" } ] } )
app用户登录
mongo -uapp01 -papp01 127.0.0.1/app
(3)创建app数据库读写权限的用户并对test数据库具有读权限
use app db.createUser( { user: "app03", pwd: "app03", roles: [ { role: "readWrite", db: "app" }, { role: "read", db: "test" }]} )
(4)查询mongodb中的用户信息
mongo -uroot -proot123 127.0.0.1/admin db.system.users.find().pretty()
(5)删除用户(root身份登录,use到验证库)
# mongo -uroot -proot123 127.0.0.1/admin use app db.dropUser("app01")
MongoDB复制集RS(ReplicationSet)******
基本原理
基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知
客户端程序,主库已经发生切换了。应用就会连接到新的主库。
Replication Set配置过程详解
规划
- 三个以上的mongodb节点(或多实例)
环境准备
多个端口:
- 28017、28018、28019、28020
多套目录:
su - mongod 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: bindIp: 10.0.0.7,127.0.0.1 port: 28017 replication: oplogSizeMB: 2048 replSetName: my_repl EOF
多个实例配置文件修改
\cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/ \cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/ \cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/ sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i
启动多个实例备用
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
端口检查
netstat -lnp|grep 280
配置复制集
mongo --port 28017 admin config = {_id: 'my_repl', members: [ {_id: 0, host: '10.0.0.7:28017'}, {_id: 1, host: '10.0.0.7:28018'}, {_id: 2, host: '10.0.0.7:28019'}] } # 复制集初始化 rs.initiate(config)
查询复制集状态
rs.status();
输出信息如下
"members" : [ { "_id" : 0, "name" : "10.0.0.7:28017", "health" : 1, "state" : 1, "stateStr" : "PRIMARY", # 主库 "uptime" : 789, "optime" : { "ts" : Timestamp(1584257164, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2020-03-15T07:26:04Z"), "syncingTo" : "", "syncSourceHost" : "", "syncSourceId" : -1, "infoMessage" : "", "electionTime" : Timestamp(1584256953, 1), "electionDate" : ISODate("2020-03-15T07:22:33Z"), "configVersion" : 1, "self" : true, "lastHeartbeatMessage" : "" }, { "_id" : 1, "name" : "10.0.0.7:28018", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 232, "optime" : { "ts" : Timestamp(1584257164, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1584257164, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2020-03-15T07:26:04Z"), "optimeDurableDate" : ISODate("2020-03-15T07:26:04Z"), "lastHeartbeat" : ISODate("2020-03-15T07:26:13.769Z"), "lastHeartbeatRecv" : ISODate("2020-03-15T07:26:14.352Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "10.0.0.7:28017", "syncSourceHost" : "10.0.0.7:28017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1 }, { "_id" : 2, "name" : "10.0.0.7:28019", "health" : 1, "state" : 2, "stateStr" : "SECONDARY", "uptime" : 232, "optime" : { "ts" : Timestamp(1584257164, 1), "t" : NumberLong(1) }, "optimeDurable" : { "ts" : Timestamp(1584257164, 1), "t" : NumberLong(1) }, "optimeDate" : ISODate("2020-03-15T07:26:04Z"), "optimeDurableDate" : ISODate("2020-03-15T07:26:04Z"), "lastHeartbeat" : ISODate("2020-03-15T07:26:13.769Z"), "lastHeartbeatRecv" : ISODate("2020-03-15T07:26:14.385Z"), "pingMs" : NumberLong(0), "lastHeartbeatMessage" : "", "syncingTo" : "10.0.0.7:28017", "syncSourceHost" : "10.0.0.7:28017", "syncSourceId" : 0, "infoMessage" : "", "configVersion" : 1 } ],
至此停掉主库28017,会从其他3个成员中投票选择一个成为主库,重新启动28017后会成为从库
1主1从1个arbiter(需要把实例关掉从新配置)
mongo -port 28017 admin config = {_id: 'my_repl', members: [ {_id: 0, host: '10.0.0.7:28017'}, {_id: 1, host: '10.0.0.7:28018'}, {_id: 2, host: '10.0.0.7:28019',"arbiterOnly":true}] } rs.initiate(config)
复制集管理操作
查看复制集状态
//查看整体复制集状态 rs.status(); // 查看当前是否是主节点 rs.isMaster(); //查看复制集配置信息 rs.conf();
添加删除节点
rs.remove("ip:port"); // 删除一个节点 rs.add("ip:port"); // 新增从节点 rs.addArb("ip:port"); // 新增仲裁节点
小案例把一个节点改为添加仲裁节点(Arb)
rs.remove("ip:port"); // 删除一个节点 rs.addArb("ip:port"); // 新增仲裁节点
特殊从节点
介绍
arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务
hidden节点:隐藏节点,不参与选主,也不对外提供服务。
delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)
一般情况下会将delay+hidden一起配置使用
配置延时节点(一般延时节点也配置成hidden)
cfg=rs.conf() cfg.members[2].priority=0 cfg.members[2].hidden=true cfg.members[2].slaveDelay=120 rs.reconfig(cfg) cfg=rs.conf()
取消以上配置
cfg=rs.conf() cfg.members[2].priority=1 cfg.members[2].hidden=false cfg.members[2].slaveDelay=0 rs.reconfig(cfg)
配置成功后,通过以下命令查询配置后的属性
rs.conf();
副本集其他操作命令
查看副本集的配置信息 admin> rs.conf() 查看副本集各成员的状态 admin> rs.status() ++++++++++++++++++++++++++++++++++++++++++++++++ --副本集角色切换(不要人为随便操作) admin> rs.stepDown() 注: admin> rs.freeze(300) //锁定从,使其不会转变成主库 freeze()和stepDown单位都是秒。 +++++++++++++++++++++++++++++++++++++++++++++ 设置副本节点可读:在副本节点执行 admin> rs.slaveOk() eg: admin> use app switched to db app app> db.createCollection('a') { "ok" : 0, "errmsg" : "not master", "code" : 10107 } 查看副本节点(监控主从延时) admin> rs.printSlaveReplicationInfo() source: 192.168.1.22:27017 syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST) 0 secs (0 hrs) behind the primary OPlog日志(备份恢复章节)
MongoDB Sharding Cluster 分片集群环境搭建
规划
10个实例:38017-38026 (1)configserver:38018-38020 3台构成的复制集(1主两从,不支持arbiter)38018-38020(复制集名字configsvr) (2)shard节点: sh1:38021-23 (1主两从,其中一个节点为arbiter,复制集名字sh1) sh2:38024-26 (1主两从,其中一个节点为arbiter,复制集名字sh2) (3) mongos: 38017
Shard节点配置过程
目录创建
mkdir -p /mongodb/38021/conf /mongodb/38021/log /mongodb/38021/data mkdir -p /mongodb/38022/conf /mongodb/38022/log /mongodb/38022/data mkdir -p /mongodb/38023/conf /mongodb/38023/log /mongodb/38023/data mkdir -p /mongodb/38024/conf /mongodb/38024/log /mongodb/38024/data mkdir -p /mongodb/38025/conf /mongodb/38025/log /mongodb/38025/data mkdir -p /mongodb/38026/conf /mongodb/38026/log /mongodb/38026/data
修改配置文件
第一个分片
cat > /mongodb/38021/conf/mongodb.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: bindIp: 10.0.0.7,127.0.0.1 port: 38021 replication: oplogSizeMB: 2048 replSetName: sh1 sharding: clusterRole: shardsvr processManagement: fork: true EOF cp /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf/ cp /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf/ sed 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf -i sed 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i
第二个分片
cat > /mongodb/38024/conf/mongodb.conf<<EOF systemLog: destination: file path: /mongodb/38024/log/mongodb.log logAppend: true storage: journal: enabled: true dbPath: /mongodb/38024/data directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 1 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true net: bindIp: 10.0.0.7,127.0.0.1 port: 38024 replication: oplogSizeMB: 2048 replSetName: sh2 sharding: clusterRole: shardsvr processManagement: fork: true EOF cp /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/ cp /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/ sed 's#38024#38025#g' /mongodb/38025/conf/mongodb.conf -i sed 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i
启动所有节点,并搭建复制集
mongod -f /mongodb/38021/conf/mongodb.conf mongod -f /mongodb/38022/conf/mongodb.conf mongod -f /mongodb/38023/conf/mongodb.conf mongod -f /mongodb/38024/conf/mongodb.conf mongod -f /mongodb/38025/conf/mongodb.conf mongod -f /mongodb/38026/conf/mongodb.conf
查看6个实例是否启动
ps -ef | grep 380
搭建复制集(1)
mongo --port 38021 admin config = {_id: 'sh1', members: [ {_id: 0, host: '10.0.0.7:38021'}, {_id: 1, host: '10.0.0.7:38022'}, {_id: 2, host: '10.0.0.7:38023',"arbiterOnly":true}] } rs.initiate(config)
搭建复制集(2)
mongo --port 38024 admin config = {_id: 'sh2', members: [ {_id: 0, host: '10.0.0.7:38024'}, {_id: 1, host: '10.0.0.7:38025'}, {_id: 2, host: '10.0.0.7:38026',"arbiterOnly":true}] } rs.initiate(config)
config节点配置
目录创建
mkdir -p /mongodb/38018/conf /mongodb/38018/log /mongodb/38018/data mkdir -p /mongodb/38019/conf /mongodb/38019/log /mongodb/38019/data mkdir -p /mongodb/38020/conf /mongodb/38020/log /mongodb/38020/data
修改配置文件
cat > /mongodb/38018/conf/mongodb.conf <<EOF systemLog: destination: file path: /mongodb/38018/log/mongodb.conf 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: bindIp: 10.0.0.7,127.0.0.1 port: 38018 replication: oplogSizeMB: 2048 replSetName: configReplSet sharding: clusterRole: configsvr processManagement: fork: true EOF cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/ cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/ sed 's#38018#38019#g' /mongodb/38019/conf/mongodb.conf -i sed 's#38018#38020#g' /mongodb/38020/conf/mongodb.conf -i
启动节点
mongod -f /mongodb/38018/conf/mongodb.conf mongod -f /mongodb/38019/conf/mongodb.conf mongod -f /mongodb/38020/conf/mongodb.conf
并配置复制集
mongo --port 38018 admin config = {_id: 'configReplSet', members: [ {_id: 0, host: '10.0.0.7:38018'}, {_id: 1, host: '10.0.0.7:38019'}, {_id: 2, host: '10.0.0.7:38020'}] } rs.initiate(config)
注:configserver 可以是一个节点,官方建议复制集。configserver不能有arbiter。新版本中,要求必须是复制集。
注:mongodb 3.4之后,虽然要求config server为replica set,但是不支持arbiter
mongos节点配置
创建目录
mkdir -p /mongodb/38017/conf /mongodb/38017/log
配置文件
cat >/mongodb/38017/conf/mongos.conf<<EOF systemLog: destination: file path: /mongodb/38017/log/mongos.log logAppend: true net: bindIp: 10.0.0.7,127.0.0.1 port: 38017 sharding: configDB: configReplSet/10.0.0.7:38018,10.0.0.7:38019,10.0.0.7:38020 processManagement: fork: true EOF
启动mongos
mongos -f /mongodb/38017/conf/mongos.conf
分片集群操作
连接到其中一个mongos(10.0.0.51),做以下配置
(1)连接到mongs的admin数据
# su - mongod $ mongo 10.0.0.7:38017/admin
(2)添加分片
db.runCommand( { addshard : "sh1/10.0.0.7:38021,10.0.0.7:38022,10.0.0.7:38023",name:"shard1"} ) db.runCommand( { addshard : "sh2/10.0.0.7:38024,10.0.0.7:38025,10.0.0.7:38026",name:"shard2"} )
(3)列出分片
mongos> db.runCommand( { listshards : 1 } )
(4)整体状态查看
mongos> sh.status();
RANGE分片配置及测试
激活数据库分片功能
mongo --port 38017 admin use admin db.runCommand( { enablesharding : "test" } )
指定分片建对集合分片
范围片键,创建索引
use test db.vast.ensureIndex( { id: 1 } )
开启分片
use admin db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
集合分片验证
use test for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); } db.vast.stats()
分片结果测试
shard1分片
mongo --port 38021 db.vast.count();
shard2分片
mongo --port 38025 db.vast.count();
Hash分片例子
对oldboy库下的vast大表进行hash
创建哈希索引
(1)对于oldboy开启分片功能
mongo --port 38017 admin use admin db.runCommand( { enablesharding : "oldboy" } )
(2)对于oldboy库下的vast表建立hash索引
use oldboy db.vast.ensureIndex( { id: "hashed" } )
(3)开启分片
use admin sh.shardCollection( "oldboy.vast", { id: "hashed" } )
(4)录入10w行数据测试
use oldboy for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
(5)hash分片结果测试
mongo --port 38021 use oldboy db.vast.count();
mongo --port 38024 use oldboy db.vast.count();
分片集群的查询及管理
进入 mongo
mongo --port 38017 admin
判断是否Shard集群
admin> db.runCommand({ isdbgrid : 1})
列出所有分片信息
admin> db.runCommand({ listshards : 1})
列出开启分片的数据库
admin> use config config> db.databases.find( { "partitioned": true } ) 或者: config> db.databases.find() //列出所有数据库分片情况
查看分片的片键
config> db.collections.find().pretty()
查看分片的详细信息
admin> db.printShardingStatus() 或 admin> sh.status() *****
删除分片节点(谨慎)
(1)确认blance是否在工作
mongos> sh.getBalancerState()
(2)删除shard2节点(谨慎)
注意:删除操作一定会立即触发blancer
mongos> db.runCommand( { removeShard: "shard2" } )
balancer操作
介绍
mongos的一个重要功能,自动巡查所有shard节点上的chunk的情况,自动做chunk迁移
什么时候工作?
-
1、自动运行,会检测系统不繁忙的时候做迁移
-
2、在做节点删除的时候,立即开始迁移工作
-
3、balancer只能在预设定的时间窗口内运行 *****
有需要时可以关闭和开启blancer(备份的时候)
mongos> sh.stopBalancer() mongos> sh.startBalancer()
自定义 自动平衡进行的时间段
- https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window
连接到 mongos 上操作
mongo --port 38017 admin use config sh.setBalancerState( true ) db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )
查看balance活跃时间
sh.getBalancerWindow()
sh.status()
关于集合的balancer(了解下)
关闭某个集合的balance sh.disableBalancing("students.grades") 打开某个集合的balancer sh.enableBalancing("students.grades") 确定某个集合的balance是开启或者关闭 db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
备份恢复
备份恢复工具介绍
-
(1)** mongoexport/mongoimport
-
(2)***** mongodump/mongorestore
备份工具区别在哪里
mongoexport/mongoimport 导入/导出的是JSON格式或者CSV格式
-
1、异构平台迁移 mysql <---> mongodb
-
2、同平台,跨大版本:mongodb 2 ----> mongodb 3
mongodump/mongorestore 导入/导出的是BSON格式。
- 日常备份恢复时使用
导出工具mongoexport
Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。
可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。
mongoexport具体用法如下所示
-
-h:指明数据库宿主机的IP
-
-u:指明数据库的用户名
-
-p:指明数据库的密码
-
-d:指明数据库的名字
-
-c:指明collection的名字
-
-f:指明要导出那些列
-
-o:指明到要导出的文件名
-
-q:指明导出数据的过滤条件
-
--authenticationDatabase admin
单表备份至json格式
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
注:备份文件的名字可以自定义,默认导出了JSON格式的数据
单表备份至csv格式,要指定列名
如果我们需要导出CSV格式的数据,则需要使用----type=csv参数
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log --type=csv -f uid,name,age,date -o /mongodb/log.csv
导入工具mongoimport
Mongodb中的mongoimport工具可以把一个特定格式文件中的内容导入到指定的collection中。该工具可以导入JSON格式数据,也可以导入CSV格式数据。具体使用如下所示:
参数说明
-
-h:指明数据库宿主机的IP
-
-u:指明数据库的用户名
-
-p:指明数据库的密码
-
-d:指明数据库的名字
-
-c:指明collection的名字
-
-f:指明要导入那些列
-
-j, 并发的线程数
1.恢复json格式表数据到log1
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json
2恢复csv格式的文件到log2
csv格式的文件头行,有列名字
--headerline:指明第一行是列名,不需要导入
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log2 --type=csv --headerline --file /mongodb/log.csv
csv格式的文件头行,没有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log3 --type=csv -f id,name,age,date --file /mongodb/log1.csv
异构平台迁移案例
world数据库下city表进行导出,导入到mongodb
(1)mysql开启安全路径
vim /etc/my.cnf --->添加以下配置 secure-file-priv=/tmp /etc/init.d/mysqld restart
导出格式为csv
select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
添加第一行列名信息
vim /tmp/city.csv ID,Name,CountryCode,District,Population
在mongodb中导入备份
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c city --type=csv -f ID,Name,CountryCode,District,Population --file /tmp/city1.csv
mongodump和mongorestore基本使用
mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备
份时对数据库进行了写入操作,则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。
mongodump用法如下
-
-h:指明数据库宿主机的IP
-
-u:指明数据库的用户名
-
-p:指明数据库的密码
-
-d:指明数据库的名字
-
-c:指明collection的名字
-
-o:指明到要导出的文件名
-
-q:指明导出数据的过滤条件
-
-j, 并发数,默认4
-
--oplog 备份的同时备份oplog
全库备份
mkdir /mongodb/backup mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
备份world库
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/
备份oldboy库下的log集合
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup/
压缩备份
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -o /mongodb/backup/ --gzip mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup/ --gzip mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c vast -o /mongodb/backup/ --gzip
恢复world库
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world
恢复oldguo库下的t1集合
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c t1 --gzip /mongodb/backup.bak/oldboy/log1.bson.gz
drop表示恢复的时候把之前的集合drop掉(危险)
mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy
mongodump和mongorestore高级企业应用(--oplog)
注意:这是replica set或者master/slave模式专用,单机中是没有这个参数的
oplog介绍
在replica set中oplog是一个定容集合(capped collection),它的默认大小是磁盘空间的5%(可以通过--oplogSizeMB参数修改).
位于local库的db.oplog.rs,有兴趣可以看看里面到底有些什么内容。
其中记录的是整个mongod实例一段时间内数据库的所有变更(插入/更新/删除)操作。
当空间用完时新记录自动覆盖最老的记录。
其覆盖范围被称作oplog时间窗口。需要注意的是,因为oplog是一个定容集合,
所以时间窗口能覆盖的范围会因为你单位时间内的更新次数不同而变化
想要查看当前的oplog时间窗口预计值,可以使用以下命令:
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
所有的增删改查操作都是记录到oplog表中
op
-
"i": insert
-
"u": update
-
"d": delete
-
"c": db cmd 表或者库删除
查询所有插入的日志
db.oplog.rs.find().pretty({"op":"i"})
查看复制集信息
rs.printReplicationInfo()
size复制集大小2048,超过会覆盖,所以要设置大点,定时备份
(1)实现热备,在备份时使用--oplog选项
- 作用介绍:--oplog 会记录备份过程中的数据变化。会以oplog.bson保存下来
mongodump --port 28017 --oplog -o /mongodb/backup
恢复
mongorestore --port 28017 --oplogReplay /mongodb/backup
oplog高级应用
背景:每天0点全备,oplog恢复窗口为48小时
某天,上午10点world.city 业务表被误删除
恢复思路:
-
0、停应用
-
2、找测试库
-
3、恢复昨天晚上全备
-
4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库
-
5、将误删除表导出,恢复到生产库
模拟原始数据
mongo --port 28017 use wo for(var i = 1 ;i < 20; i++) { db.ci.insert({a: i}); }
全备:
rm -rf /mongodb/backup/* mongodump --port 28017 --oplog -o /mongodb/backup --oplog功能:在备份同时,将备份过程中产生的日志进行备份
文件必须存放在/mongodb/backup下,自动命令为oplog.bson
再次模拟数据
db.ci1.insert({id:1}) db.ci2.insert({id:2})
上午10点:删除wo库下的ci表
db.ci.drop() show tables;
备份现有的oplog.rs表
mongodump --port 28017 -d local -c oplog.rs -o /mongodb/backup
截取oplog并恢复到drop之前的位置
更合理的方法:登陆到原数据库
[mongod@db03 local]$ mongo --port 28017 my_repl:PRIMARY> use local db.oplog.rs.find({op:"c"}).pretty();
获取到oplog误删除时间点位置:
- "ts" : Timestamp(1563958129, 1),
恢复备份+应用oplog
[mongod@db03 backup]$ cd /mongodb/backup/local/ [mongod@db03 local]$ ls oplog.rs.bson oplog.rs.metadata.json [mongod@db03 local]$ cp oplog.rs.bson ../oplog.bson rm -rf /mongodb/backup/local/ mongorestore --port 28018 --oplogReplay --oplogLimit "1563958129:1" --drop /mongodb/backup/
分片集群的备份思路
1、你要备份什么? config server shard 节点 单独进行备份 2、备份有什么困难和问题 (1)chunk迁移的问题 人为控制在备份的时候,避开迁移的时间窗口 (2)shard节点之间的数据不在同一时间点。 选业务量较少的时候 Ops Manager