NoSQL-lesson14-MongoDB核心技术-运维篇

第一章:逻辑结构

Mongodb 逻辑结构                        MySQL逻辑结构库database                                库集合(collection)                          表文档(document)                            数据行选择之所以称之为选择,肯定是痛苦的!------->oldguo

第二章:安装部署

1、系统准备

(1)redhat或centos6.2以上系统(2)系统开发包完整(3)ip地址和hosts文件解析正常(4)iptables防火墙&SElinux关闭(5)关闭大页内存机制########################################################################root用户下在vi /etc/rc.local最后添加如下代码if test -f /sys/kernel/mm/transparent_hugepage/enabled; then  echo never > /sys/kernel/mm/transparent_hugepage/enabledfiif test -f /sys/kernel/mm/transparent_hugepage/defrag; then  echo never > /sys/kernel/mm/transparent_hugepage/defragfi        cat  /sys/kernel/mm/transparent_hugepage/enabled        cat /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.############################################################################

2、mongodb安装

创建所需用户和组

useradd mongodpasswd mongod

创建mongodb所需目录结构

mkdir -p /mongodb/confmkdir -p /mongodb/logmkdir -p /mongodb/data

上传并解压软件到指定位置

[root@db01data]# cd/data[root@db01data]# tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz[root@db01data]#  cp-r/data/mongodb-linux-x86_64-rhel70-3.6.12/bin//mongodb

设置目录结构权限

chown -R mongod:mongod /mongodb

设置用户环境变量

su - mongodvi .bash_profileexport PATH=/mongodb/bin:$PATHsource .bash_profile

启动mongodb

mongod--dbpath=/mongodb/data--logpath=/mongodb/log/mongodb.log--port=27017--logappend--fork

登录mongodb

[mongod@server2~]$ mongo

使用配置文件

YAML模式NOTE:YAMLdoes not support tab charactersforindentation:use spaces instead.--系统日志有关  systemLog:destination:file          path:"/mongodb/log/mongodb.log"--日志位置  logAppend:true--日志以追加模式记录--数据存储有关  storage:journal:enabled:truedbPath:"/mongodb/data"--数据路径的位置--进程控制  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>---

++++++++++++++++++++++

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

  bindIp: 10.0.0.51,127.0.0.1

EOF

mongod -f /mongodb/conf/mongo.conf --shutdown

mongod -f /mongodb/conf/mongo.conf 

mongodb的关闭方式

mongod -f mongo.conf  --shutdown

mongodb 使用systemd管理

[root@db01~]# cat > /etc/systemd/system/mongod.service <<EOF[Unit]Description=mongodbAfter=network.target remote-fs.target nss-lookup.target[Service]User=mongodType=forkingExecStart=/mongodb/bin/mongod--config/mongodb/conf/mongo.confExecReload=/bin/kill-sHUP$MAINPIDExecStop=/mongodb/bin/mongod--config/mongodb/conf/mongo.conf--shutdownPrivateTmp=true[Install]WantedBy=multi-user.targetEOF[root@db01~]# systemctl restart mongod[root@db01~]# systemctl stop mongod[root@db01~]# systemctl start mongod

3、mongodb常用基本操作

3.0  mongodb 默认存在的库

test:登录时默认存在的库管理MongoDB有关的系统库admin库:系统预留库,MongoDB系统管理库local库:本地预留库,存储关键日志config库:MongoDB配置信息库show databases/show dbsshow tables/show collectionsuse admin db/selectdatabase()

3.1 命令种类

db 对象相关命令

db.[TAB][TAB]db.help()db.oldboy.[TAB][TAB]db.oldboy.help()

rs 复制集有关(replication set):

rs.[TAB][TAB]rs.help()

sh 分片集群(sharding cluster)

sh.[TAB][TAB]sh.help()

4. mongodb对象操作

mongo        mysql库----->库集合----->表文档----->数据行

4.1 库的操作

> use test>db.dropDatabase()  { "dropped" : "test", "ok" : 1 }

4.2 集合的操作

app>db.createCollection('a'){"ok":1}app>db.createCollection('b')方法2:当插入一个文档的时候,一个集合就会自动创建。use oldboydb.test.insert({name:"zhangsan"})db.stu.insert({id:101,name:"zhangsan",age:20,gender:"m"})show tables;db.stu.insert({id:102,name:"lisi"})db.stu.insert({a:"b",c:"d"})db.stu.insert({a:1,c:2})

4.3 文档操作

数据录入:for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":newDate()})}查询数据行数:>db.log.count()全表查询:>db.log.find()每页显示50条记录:>DBQuery.shellBatchSize=50;按照条件查询>db.log.find({uid:999})以标准的json格式显示数据>db.log.find({uid:999}).pretty(){"_id":ObjectId("5cc516e60d13144c89dead33"),"uid":999,"name":"mongodb","age":6,"date":ISODate("2019-04-28T02:58:46.109Z")}删除集合中所有记录app>db.log.remove({})

查看集合存储信息

app>db.log.totalSize()//集合中索引+数据压缩存储之后的大小   

5. 用户及权限管理

5.1 注意

验证库:建立用户时use到的库,在使用用户时,要加上验证库才能登陆。对于管理员用户,必须在admin下创建.1.建用户时,use到的库,就是此用户的验证库2.登录时,必须明确指定验证库才能登录3.通常,管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库4.如果直接登录到数据库,不进行use,默认的验证库是test,不是我们生产建议的.5.从3.6版本开始,不添加bindIp参数,默认不让远程登录,只能本地管理员登录。

5.2 用户创建语法

use admin db.createUser{    user: "",    pwd: "",    roles: [      { role: "",    db: "" } | "",    ...    ]}基本语法说明:user:用户名pwd:密码roles:    role:角色名    db:作用对象 role:root, readWrite,read  验证数据库:mongo -u oldboy -p 123 10.0.0.53/oldboy

5.3  用户管理例子

创建超级管理员:管理所有数据库(必须useadmin再去创建)$ mongouseadmindb.createUser({user:"root",pwd:"root123",roles:[{role:"root",db:"admin"}]})

验证用户

db.auth('root','root123')

配置文件中,加入以下配置

security:  authorization: enabled

重启mongodb

mongod -f /mongodb/conf/mongo.conf --shutdown mongod -f /mongodb/conf/mongo.conf

登录验证

mongo-uroot-proot123  adminmongo-uroot-proot12310.0.0.53/admin或者mongouseadmindb.auth('root','root123')

查看用户:

use admindb.system.users.find().pretty()

创建应用用户

use oldboy

db.createUser({user: "app01",

        pwd: "app01",

        roles: [{role:"readWrite",db:"oldboy"}]})mongo  -uapp01 -papp01 app

查询mongodb中的用户信息

mongo-uroot-proot12310.0.0.53/admindb.system.users.find().pretty()

5.4 删除用户(root身份登录,use到验证库)

删除用户db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})mongo -uroot -proot123 10.0.0.53/adminuse oldboy1db.dropUser("app02")

5.5 用户管理注意事项

1. 建用户要有验证库,管理员admin,普通用户是要管理的库2. 登录时,注意验证库mongo -uapp01 -papp01 10.0.0.51:27017/oldboy3. 重点参数net:  port: 27017  bindIp: 10.0.0.51,127.0.0.1security:  authorization: enabled

6. MongoDB复制集RS(ReplicationSet)

6.1 基本原理

基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)  Paxos(mysql MGR 用的是变种))如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知客户端程序,主库已经发生切换了。应用就会连接到新的主库。

6.2  Replication Set配置过程详解

6.2.1  规划

三个以上的mongodb节点(或多实例)

6.2.2 环境准备

多个端口:

28017、28018、28019、28020

多套目录:

su - mongod mkdir -p /mongodb/28017/conf /mongodb/28017/data /mongodb/28017/logmkdir -p /mongodb/28018/conf /mongodb/28018/data /mongodb/28018/logmkdir -p /mongodb/28019/conf /mongodb/28019/data /mongodb/28019/logmkdir -p /mongodb/28020/conf /mongodb/28020/data /mongodb/28020/log

多套配置文件

/mongodb/28017/conf/mongod.conf/mongodb/28018/conf/mongod.conf/mongodb/28019/conf/mongod.conf/mongodb/28020/conf/mongod.conf

配置文件内容

cat>/mongodb/28017/conf/mongod.conf<<EOFsystemLog:destination:file  path:/mongodb/28017/log/mongodb.log  logAppend:truestorage:journal:enabled:truedbPath:/mongodb/28017/data  directoryPerDB:true#engine:wiredTiger  wiredTiger:engineConfig:cacheSizeGB:1directoryForIndexes:truecollectionConfig:blockCompressor:zlib    indexConfig:prefixCompression:trueprocessManagement:fork:truenet:bindIp:10.0.0.51,127.0.0.1port:28017replication:oplogSizeMB:2048replSetName:my_replEOF\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-ised's#28017#28019#g'/mongodb/28019/conf/mongod.conf-ised's#28017#28020#g'/mongodb/28020/conf/mongod.conf-i

启动多个实例备用

mongod -f /mongodb/28017/conf/mongod.confmongod -f /mongodb/28018/conf/mongod.confmongod -f /mongodb/28019/conf/mongod.confmongod -f /mongodb/28020/conf/mongod.confnetstat -lnp|grep 280

6.3 配置普通复制集:

1主2从,从库普通从库mongo --port 28017 adminconfig = {_id: 'my_repl', members: [                          {_id: 0, host: '10.0.0.51:28017'},                          {_id: 1, host: '10.0.0.51:28018'},                          {_id: 2, host: '10.0.0.51:28019'}]          }                  rs.initiate(config) 查询复制集状态rs.status();

6.4 1主1从1个arbiter

mongo -port 28017 adminconfig = {_id: 'my_repl', members: [                          {_id: 0, host: '10.0.0.51:28017'},                          {_id: 1, host: '10.0.0.51:28018'},                          {_id: 2, host: '10.0.0.51:28019',"arbiterOnly":true}]          }                rs.initiate(config)

6.5 复制集管理操作

6.5.1 查看复制集状态

rs.status();//查看整体复制集状态rs.isMaster();// 查看当前是否是主节点rs.conf();//查看复制集配置信息

6.5.2 添加删除节点

rs.remove("ip:port");// 删除一个节点rs.add("ip:port");// 新增从节点rs.addArb("ip:port");// 新增仲裁节点例子:添加 arbiter节点1、连接到主节点[mongod@db03~]$ mongo--port28018admin2、添加仲裁节点my_repl:PRIMARY>rs.addArb("10.0.0.53:28020")3、查看节点状态my_repl:PRIMARY>rs.isMaster(){"hosts":["10.0.0.53:28017","10.0.0.53:28018","10.0.0.53:28019"],"arbiters":["10.0.0.53:28020"],rs.remove("ip:port");// 删除一个节点例子:my_repl:PRIMARY>rs.remove("10.0.0.53:28019");{"ok":1}my_repl:PRIMARY>rs.isMaster()rs.add("ip:port");// 新增从节点例子:my_repl:PRIMARY>rs.add("10.0.0.53:28019"){"ok":1}my_repl:PRIMARY>rs.isMaster()

6.5.3 特殊从节点

image.png

image.png

介绍:

arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务hidden节点:隐藏节点,不参与选主,也不对外提供服务。delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)一般情况下会将delay+hidden一起配置使用

配置延时节点(一般延时节点也配置成hidden)

cfg=rs.conf() cfg.members[2].priority=0cfg.members[2].hidden=truecfg.members[2].slaveDelay=120rs.reconfig(cfg)    取消以上配置cfg=rs.conf() cfg.members[2].priority=1cfg.members[2].hidden=falsecfg.members[2].slaveDelay=0rs.reconfig(cfg)    配置成功后,通过以下命令查询配置后的属性rs.conf();

6.5.4 副本集其他操作命令

查看副本集的配置信息admin>rs.conf()查看副本集各成员的状态admin>rs.status()++++++++++++++++++++++++++++++++++++++++++++++++--副本集角色切换(不要人为随便操作)admin>rs.stepDown()注:admin>rs.freeze(300)//锁定从,使其不会转变成主库freeze()和stepDown单位都是秒。+++++++++++++++++++++++++++++++++++++++++++++设置副本节点可读:在副本节点执行admin>rs.slaveOk()eg:admin>useappswitched to db appapp>db.createCollection('a'){"ok":0,"errmsg":"not master","code":10107}查看副本节点(监控主从延时)admin>rs.printSlaveReplicationInfo()source:192.168.1.22:27017syncedTo:Thu May26201610:28:56GMT+0800(CST)0secs(0hrs)behind the primaryOPlog日志(备份恢复章节)

7. MongoDB Sharding Cluster 分片集群

7.1 规划

10个实例:38017-38026(1)configserver:38018-380203台构成的复制集(1主两从,不支持arbiter)38018-38020(复制集名字configsvr)(2)shard节点:sh1:38021-23    (1主两从,其中一个节点为arbiter,复制集名字sh1)sh2:38024-26    (1主两从,其中一个节点为arbiter,复制集名字sh2)(3)mongos:38017

7.2 Shard节点配置过程

7.2.1 目录创建:

mkdir -p /mongodb/38021/conf  /mongodb/38021/log  /mongodb/38021/datamkdir -p /mongodb/38022/conf  /mongodb/38022/log  /mongodb/38022/datamkdir -p /mongodb/38023/conf  /mongodb/38023/log  /mongodb/38023/datamkdir -p /mongodb/38024/conf  /mongodb/38024/log  /mongodb/38024/datamkdir -p /mongodb/38025/conf  /mongodb/38025/log  /mongodb/38025/datamkdir -p /mongodb/38026/conf  /mongodb/38026/log  /mongodb/38026/data

7.2.2 修改配置文件:

第一组复制集搭建:21-23(1主 1从 1Arb)

cat>/mongodb/38021/conf/mongodb.conf<<EOFsystemLog:destination:file  path:/mongodb/38021/log/mongodb.log    logAppend:truestorage:journal:enabled:truedbPath:/mongodb/38021/data  directoryPerDB:true#engine:wiredTiger  wiredTiger:engineConfig:cacheSizeGB:1directoryForIndexes:truecollectionConfig:blockCompressor:zlib    indexConfig:prefixCompression:truenet:bindIp:10.0.0.51,127.0.0.1port:38021replication:oplogSizeMB:2048replSetName:sh1sharding:clusterRole:shardsvrprocessManagement:fork:trueEOF\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-ised's#38021#38023#g'/mongodb/38023/conf/mongodb.conf-i

第二组节点:24-26(1主1从1Arb)

cat>/mongodb/38024/conf/mongodb.conf<<EOFsystemLog:destination:file  path:/mongodb/38024/log/mongodb.log    logAppend:truestorage:journal:enabled:truedbPath:/mongodb/38024/data  directoryPerDB:truewiredTiger:engineConfig:cacheSizeGB:1directoryForIndexes:truecollectionConfig:blockCompressor:zlib    indexConfig:prefixCompression:truenet:bindIp:10.0.0.51,127.0.0.1port:38024replication:oplogSizeMB:2048replSetName:sh2sharding:clusterRole:shardsvrprocessManagement:fork:trueEOF\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-ised's#38024#38026#g'/mongodb/38026/conf/mongodb.conf-i

7.2.3 启动所有节点,并搭建复制集

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  ps -ef |grep mongodmongo --port 38021use  adminconfig = {_id: 'sh1', members: [                          {_id: 0, host: '10.0.0.51:38021'},                          {_id: 1, host: '10.0.0.51:38022'},                          {_id: 2, host: '10.0.0.51:38023',"arbiterOnly":true}]          }rs.initiate(config)  mongo --port 38024  use adminconfig = {_id: 'sh2', members: [                          {_id: 0, host: '10.0.0.51:38024'},                          {_id: 1, host: '10.0.0.51:38025'},                          {_id: 2, host: '10.0.0.51:38026',"arbiterOnly":true}]          }  rs.initiate(config)

7.3 config节点配置

7.3.1 目录创建

mkdir -p /mongodb/38018/conf  /mongodb/38018/log  /mongodb/38018/datamkdir -p /mongodb/38019/conf  /mongodb/38019/log  /mongodb/38019/datamkdir -p /mongodb/38020/conf  /mongodb/38020/log  /mongodb/38020/data

7.3.2修改配置文件:

cat>/mongodb/38018/conf/mongodb.conf<<EOFsystemLog:destination:file  path:/mongodb/38018/log/mongodb.conf  logAppend:truestorage:journal:enabled:truedbPath:/mongodb/38018/data  directoryPerDB:true#engine:wiredTiger  wiredTiger:engineConfig:cacheSizeGB:1directoryForIndexes:truecollectionConfig:blockCompressor:zlib    indexConfig:prefixCompression:truenet:bindIp:10.0.0.51,127.0.0.1port:38018replication:oplogSizeMB:2048replSetName:configReplSetsharding:clusterRole:configsvrprocessManagement:fork:trueEOF\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-ised's#38018#38020#g'/mongodb/38020/conf/mongodb.conf-i

7.3.3启动节点,并配置复制集

mongod -f /mongodb/38018/conf/mongodb.conf mongod -f /mongodb/38019/conf/mongodb.conf mongod -f /mongodb/38020/conf/mongodb.conf mongo --port 38018use  admin config = {_id: 'configReplSet', members: [                          {_id: 0, host: '10.0.0.51:38018'},                          {_id: 1, host: '10.0.0.51:38019'},                          {_id: 2, host: '10.0.0.51:38020'}]          }rs.initiate(config)    注:configserver 可以是一个节点,官方建议复制集。configserver不能有arbiter。新版本中,要求必须是复制集。注:mongodb 3.4之后,虽然要求config server为replica set,但是不支持arbiter

7.4 mongos节点配置:

7.4.1创建目录:

mkdir -p /mongodb/38017/conf  /mongodb/38017/log

7.4.2配置文件:

cat>/mongodb/38017/conf/mongos.conf<<EOFsystemLog:destination:file  path:/mongodb/38017/log/mongos.log  logAppend:truenet:bindIp:10.0.0.51,127.0.0.1port:38017sharding:configDB:configReplSet/10.0.0.51:38018,10.0.0.51:38019,10.0.0.51:38020processManagement:fork:trueEOF

7.4.3启动mongos

mongos -f /mongodb/38017/conf/mongos.conf

7.5 分片集群添加节点

连接到其中一个mongos(10.0.0.51),做以下配置(1)连接到mongs的admin数据库# su - mongod$ mongo10.0.0.51:38017/admin(2)添加分片db.runCommand({addshard:"sh1/10.0.0.51:38021,10.0.0.51:38022,10.0.0.51:38023",name:"shard1"})db.runCommand({addshard:"sh2/10.0.0.51:38024,10.0.0.51:38025,10.0.0.51:38026",name:"shard2"})(3)列出分片mongos>db.runCommand({listshards:1})(4)整体状态查看mongos>sh.status();

7.6 使用分片集群

7.6.1 RANGE分片配置及测试

1、激活数据库分片功能

mongo --port 38017 admin

admin>  ({enablesharding:"数据库名称"})

eg:

admin> db.runCommand({enablesharding:"test"})

2、指定分片键对集合分片

### 创建索引

use test

> db.vast.ensureIndex({id:1})

### 开启分片

use admin

> db.runCommand({shardcollection : "test.vast",key :{id:1}})

3、集合分片验证

admin> use testtest> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }test> db.vast.stats()

4、分片结果测试

shard1:mongo --port 38021db.vast.count();shard2:mongo --port 38024db.vast.count();

7.6.2 Hash分片例子:

对oldboy库下的vast大表进行hash创建哈希索引(1)对于oldboy开启分片功能mongo--port38017adminuseadminadmin>db.runCommand({enablesharding:"oldboy"})(2)对于oldboy库下的vast表建立hash索引useoldboyoldboy>db.vast.ensureIndex({id:"hashed"})(3)开启分片useadminadmin>sh.shardCollection("oldboy.vast",{id:"hashed"})(4)录入10w行数据测试useoldboyfor(i=1;i<100000;i++){db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":newDate()});}(5)hash分片结果测试mongo--port38021useoldboydb.vast.count();mongo--port38024useoldboydb.vast.count();

7.7 分片集群的查询及管理

7.7.1 判断是否Shard集群

admin> db.runCommand({isdbgrid:1})

7.7.2 列出所有分片信息

admin> db.runCommand({listshards:1})

7.7.3 列出开启分片的数据库

admin>use configconfig>db.databases.find({"partitioned":true})或者:config>db.databases.find()//列出所有数据库分片情况

7.7.4 查看分片的片键

config>db.collections.find().pretty(){"_id":"test.vast","lastmodEpoch":ObjectId("58a599f19c898bbfb818b63c"),"lastmod":ISODate("1970-02-19T17:02:47.296Z"),"dropped":false,"key":{"id":1},"unique":false}

7.7.5 查看分片的详细信息

admin> sh.status()

7.7.6 删除分片节点(谨慎)

(1)确认blance是否在工作

sh.getBalancerState()

(2)删除shard2节点(谨慎)

mongos> db.runCommand({removeShard:"shard2"})注意:删除操作一定会立即触发blancer。

7.8 balancer操作

7.8.1 介绍

mongos的一个重要功能,自动巡查所有shard节点上的chunk的情况,自动做chunk迁移。什么时候工作?1、自动运行,会检测系统不繁忙的时候做迁移2、在做节点删除的时候,立即开始迁移工作3、balancer只能在预设定的时间窗口内运行有需要时可以关闭和开启blancer(备份的时候)mongos> sh.stopBalancer()mongos> sh.startBalancer()

7.8.2 自定义 自动平衡进行的时间段

https://docs.mongodb.com/manual/tutorial/manage-sharded-cluster-balancer/#schedule-the-balancing-window// connect to mongosuse configsh.setBalancerState(true)db.settings.update({_id:"balancer"},{$set:{activeWindow:{start:"3:00",stop:"5:00"}}},true)sh.getBalancerWindow()sh.status()关于集合的balancer(了解下)关闭某个集合的balancesh.disableBalancing("students.grades")打开某个集合的balancersh.enableBalancing("students.grades")确定某个集合的balance是开启或者关闭db.getSiblingDB("config").collections.findOne({_id:"students.grades"}).noBalance;

8. 备份恢复

8.1 备份恢复工具介绍:

(1)**  mongoexport/mongoimport(2)***** mongodump/mongorestore

8.2 备份工具区别在哪里?

应用场景总结:mongoexport/mongoimport:json csv1、异构平台迁移  mysql<--->mongodb2、同平台,跨大版本:mongodb2---->mongodb3mongodump/mongorestore日常备份恢复时使用.

8.3 导出工具mongoexport

mongoexport具体用法如下所示:$ mongoexport --help  参数说明:-h:指明数据库宿主机的IP-u:指明数据库的用户名-p:指明数据库的密码-d:指明数据库的名字-c:指明collection的名字-f:指明要导出那些列-o:指明到要导出的文件名-q:指明导出数据的过滤条件--authenticationDatabase admin1.单表备份至json格式mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json注:备份文件的名字可以自定义,默认导出了JSON格式的数据。2. 单表备份至csv格式如果我们需要导出CSV格式的数据,则需要使用----type=csv参数: mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log --type=csv -f uid,name,age,date  -o /mongodb/log.csv

8.4 导入工具mongoimport

$ mongoimport--help参数说明:-h:指明数据库宿主机的IP-u:指明数据库的用户名-p:指明数据库的密码-d:指明数据库的名字-c:指明collection的名字-f:指明要导入那些列-j,--numInsertionWorkers=<number>  number of insert operations to run concurrently                                                  (defaults to 1)

//并行

数据恢复:

1.恢复json格式表数据到log1

mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json

2.恢复csv格式的文件到log2

上面演示的是导入JSON格式的文件中的内容,如果要导入CSV格式文件中的内容,则需要通过--type参数指定导入格式,具体如下所示:

错误的恢复

注意:

(1)csv格式的文件头行,有列名字

mongoimport  -uroot -proot123 --port 27017 --authenticationDatabase admin  -d oldboy -c log2 --type=csv --headerline --file  /mongodb/log.csv

(2)csv格式的文件头行,没有列名字

mongoimport  -uroot -proot123 --port 27017 --authenticationDatabase admin  -d oldboy -c log3 --type=csv -f id,name,age,date --file  /mongodb/log.csv

--headerline:指明第一行是列名,不需要导入。

8.5 异构平台迁移案例

mysql  -----> mongodb  world数据库下city表进行导出,导入到mongodb(1)mysql开启安全路径vim /etc/my.cnf  --->添加以下配置secure-file-priv=/tmp--重启数据库生效/etc/init.d/mysqld restart(2)导出mysql的city表数据source /root/world.sqlselect * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';(3)处理备份文件desc world.city  ID          | int(11)  | NO  | PRI | NULL    | auto_increment || Name        | char(35) | NO  |    |        |                || CountryCode | char(3)  | NO  | MUL |        |                || District    | char(20) | NO  |    |        |                || Populationvim /tmp/city.csv  ----> 添加第一行列名信息ID,Name,CountryCode,District,Population(4)在mongodb中导入备份mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d world  -c city --type=csv -f ID,Name,CountryCode,District,Population --file  /tmp/city1.csvuse worlddb.city.find({CountryCode:"CHN"});-------------world共100张表,全部迁移到mongodbselect table_name ,group_concat(column_name) from columns where table_schema='world' group by table_name;select * from world.city into outfile '/tmp/world_city.csv' fields terminated by ',';select concat("select * from ",table_schema,".",table_name ," into outfile '/tmp/",table_schema,"_",table_name,".csv' fields terminated by ',';")from information_schema.tables where table_schema ='world';导入:提示,使用infomation_schema.columns + information_schema.tablesmysql导出csv:select * from test_info  into outfile '/tmp/test.csv'  fields terminated by ','    ------字段间以,号分隔optionally enclosed by '"'   ------字段用"号括起escaped by '"'          ------字段中使用的转义符为"lines terminated by '\r\n';  ------行以\r\n结束mysql导入csv:load data infile '/tmp/test.csv'  into table test_info    fields terminated by ','  optionally enclosed by '"' escaped by '"'  lines terminated by '\r\n';

8.6 mongodump和mongorestore

8.6.1介绍

mongodump能够在Mongodb运行时进行备份,它的工作原理是对运行的Mongodb做查询,然后将所有查到的文档写入磁盘。但是存在的问题时使用mongodump产生的备份不一定是数据库的实时快照,如果我们在备份时对数据库进行了写入操作,则备份出来的文件可能不完全和Mongodb实时数据相等。另外在备份时可能会对其它客户端性能产生不利的影响。

8.6.2 mongodump用法如下:

$ mongodump--help参数说明:-h:指明数据库宿主机的IP-u:指明数据库的用户名-p:指明数据库的密码-d:指明数据库的名字-c:指明collection的名字-o:指明到要导出的文件名-q:指明导出数据的过滤条件-j,--numParallelCollections=number of collections todumpinparallel(4bydefault)--oplog  备份的同时备份oplog

8.6.3 mongodump和mongorestore基本使用

全库备份

mkdir /mongodb/backupmongodump  -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup

备份world库

$ mongodump-uroot-proot123--port27017--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--port27017--authenticationDatabase admin-d oldguo-o/mongodb/backup/--gzip mongodump-uroot-proot123--port27017--authenticationDatabase admin-o/mongodb/backup/--gzip$ mongodump-uroot-proot123--port27017--authenticationDatabase admin-d app-c vast-o/mongodb/backup/--gzip

恢复world库

$ mongorestore-uroot-proot123--port27017--authenticationDatabase admin-d world1/mongodb/backup/world

恢复oldguo库下的t1集合

[mongod@db03oldboy]$ mongorestore-uroot-proot123--port27017--authenticationDatabase admin-d world-c t1--gzip/mongodb/backup.bak/oldboy/log1.bson.gz

drop表示恢复的时候把之前的集合drop掉(危险)

$ mongorestore-uroot-proot123--port27017--authenticationDatabase admin-d oldboy--drop/mongodb/backup/oldboy

8.7 mongodump和mongorestore高级企业应用(--oplog)

注意:这是replica set或者master/slave模式专用--oplog use oplog for taking a point-in-time snapshot

8.7.1 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    use local  db.oplog.rs.find().pretty()"ts" : Timestamp(1553597844, 1),"op" : "n""o"  :"i": insert"u": update"d": delete"c": db cmdtest:PRIMARY> rs.printReplicationInfo()configured oplog size:  1561.5615234375MB <--集合大小log length start to end: 423849secs (117.74hrs) <--预计窗口覆盖时间oplog first event time:  Wed Sep 09 2015 17:39:50 GMT+0800 (CST)oplog last event time:  Mon Sep 14 2015 15:23:59 GMT+0800 (CST)now:                    Mon Sep 14 2015 16:37:30 GMT+0800 (CST)

8.7.2 oplog企业级应用

(1)实现热备,在备份时使用--oplog选项注:为了演示效果我们在备份过程,模拟数据插入(2)准备测试数据[mongod@db01 conf]$ mongo--port28018use oldboyfor(vari=1;i<100;i++){db.foo.insert({a:i});}my_repl:PRIMARY>db.oplog.rs.find({"op":"i"}).pretty()oplog 配合mongodump实现热备mongodump--port28018--oplog-o/mongodb/backup作用介绍:--oplog 会记录备份过程中的数据变化。会以oplog.bson保存下来恢复mongorestore--port28018--oplogReplay/mongodb/backup

8.8 oplog高级应用

背景:每天0点全备,oplog恢复窗口为48小时某天,上午10点world.city 业务表被误删除。恢复思路:    0、停应用    2、找测试库    3、恢复昨天晚上全备    4、截取全备之后到world.city误删除时间点的oplog,并恢复到测试库    5、将误删除表导出,恢复到生产库恢复步骤:模拟故障环境:1、全备数据库模拟原始数据mongo --port 28017use wofor(var i = 1 ;i < 20; i++) {    db.ci.insert({a: i});}全备:rm -rf /mongodb/backup/*mongodump --port 28018 --oplog -o /mongodb/backup--oplog功能:在备份同时,将备份过程中产生的日志进行备份文件必须存放在/mongodb/backup下,自动命令为oplog.bson再次模拟数据db.ci1.insert({id:1})db.ci2.insert({id:2})2、上午10点:删除wo库下的ci表10:00时刻,误删除db.ci.drop()show tables;3、备份现有的oplog.rs表mongodump --port 28018 -d local -c oplog.rs  -o /mongodb/backup4、截取oplog并恢复到drop之前的位置更合理的方法:登陆到原数据库[mongod@db03 local]$ mongo --port 28018my_repl:PRIMARY> use localdb.oplog.rs.find({op:"c"}).pretty();{    "ts" : Timestamp(1553659908, 1),    "t" : NumberLong(2),    "h" : NumberLong("-7439981700218302504"),    "v" : 2,    "op" : "c",    "ns" : "wo.$cmd",    "ui" : UUID("db70fa45-edde-4945-ade3-747224745725"),    "wall" : ISODate("2019-03-27T04:11:48.890Z"),    "o" : {        "drop" : "ci"    }}获取到oplog误删除时间点位置:"ts" : Timestamp(1553659908, 1) 5、恢复备份+应用oplog[mongod@db03 backup]$ cd /mongodb/backup/local/[mongod@db03 local]$ lsoplog.rs.bson  oplog.rs.metadata.json[mongod@db03 local]$ cp oplog.rs.bson ../oplog.bson rm -rf /mongodb/backup/local/ mongorestore --port 38021  --oplogReplay --oplogLimit "1553659908:1"  --drop  /mongodb/backup/

8.9 分片集群的备份思路(了解)

1、你要备份什么?

config server

shard 节点

单独进行备份

2、备份有什么困难和问题

(1)chunk迁移的问题

    人为控制在备份的时候,避开迁移的时间窗口

(2)shard节点之间的数据不在同一时间点。

    选业务量较少的时候     


Ops Manager

作者:MySQL_oldguo

链接:https://www.jianshu.com/p/cf7416f4a036

来源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容