mongodb-基础

第1章 关系型与非关系型

NoSQL  not only sql 
NoSQL,指的是非关系型的数据库。
NoSQL有时也称作Not Only SQL的缩写是对不同于传统的关系型数据库的数据库管理系统的统称。 
对NoSQL最普遍的解释是”非关联型的”,强调Key-Value Stores和文档数据库的优点,而不是单纯的RDBMS。 
NoSQL用于超大规模数据的存储。
这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
今天我们可以通过第三方平台可以很容易的访问和抓取数据。
用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。
我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了
NoSQL数据库的发展也却能很好的处理这些大的数据。

第2章 mongo和mysql数据对比

mysql   mongo 
库       库
表       集合
字段  key:value
行       文档 

mysql里的数据:
name        age  job  
oldzhang    28   it 
xiaozhang   28   it
xiaofei     18   student  SZ 

mongo里的数据:
{name:'oldzhang',age:'28',job:'it'},
{name:'xiaozhang',age:'28',job:'it'},
{name:'xiaozhang',age:'28',job:'it',host:'SZ'}

第3章 MongoDB特点

高性能: 
Mongodb提供高性能的数据持久性
尤其是支持嵌入式数据模型减少数据库系统上的I/O操作
索引支持能快的查询,并且可以包括来嵌入式文档和数组中的键

丰富的语言查询:
Mongodb支持丰富的查询语言来支持读写操作(CRUD)以及数据汇总,文本搜索和地理空间索引 

高可用性: 
Mongodb的复制工具,成为副本集,提供自动故障转移和数据冗余

水平可扩展性:
Mongodb提供了可扩展性,作为其核心功能的一部分,分片是将数据分,在一组计算机上

支持多种存储引擎: 
WiredTiger存储引擎和、MMAPv1存储引擎和InMemory存储引擎

第4章 mongo应用场景

游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新

物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。

社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能

物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析

视频直播,使用 MongoDB 存储用户信息、礼物信息等,用户评论

电商场景,使用 MongoDB
商城上衣和裤子两种商品,除了有共同属性,如产地、价格、材质、颜色等外,还有各自有不同的属性集,如上衣的独有属性是肩宽、胸围、袖长等,裤子的独有属性是臀围、脚口和裤长等

第5章 安装部署mongodb

0.下载软件

https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz

1.规划目录

#软件所在目录
/opt/mongodb
#单节点目录
/opt/mongo_27017/{conf,log,pid}
#数据目录
/data/mongo_27017

2.下载并解压

yum install libcurl openssl -y
#wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
tar zxf mongodb-linux-x86_64-rhel70-4.0.14.tgz -C /opt/
cd /opt/
ln -s mongodb-linux-x86_64-rhel70-4.0.14 mongodb

3.创建文件目录以及数据目录

mkdir -p /opt/mongo_27017/{conf,log,pid}
mv /data /data_bak
mkdir -p /data/mongo_27017 

4.创建配置文件

cat >/opt/mongo_27017/conf/mongodb.conf<<EOF
systemLog:
destination: file   
logAppend: true  
path: /opt/mongo_27017/log/mongodb.log

storage:
journal:
  enabled: true
dbPath: /data/mongo_27017
directoryPerDB: true
wiredTiger:
   engineConfig:
      cacheSizeGB: 0.5
      directoryForIndexes: true
   collectionConfig:
      blockCompressor: zlib
   indexConfig:
      prefixCompression: true

processManagement:
fork: true
pidFilePath: /opt/mongo_27017/pid/mongod.pid

net:
port: 27017
bindIp: 127.0.0.1,10.0.0.51
EOF

5.配置文件解释

配置文件注解:
systemLog:
  destination: file #Mongodb 日志输出的目的地,指定一个file或者syslog,如果指定file,必须指定
  logAppend: true #当实例重启时,不创建新的日志文件, 在老的日志文件末尾继续添加
  path: /opt/mongo_27017/logs/mongodb.log #日志路径

storage:
  journal: #回滚日志
    enabled: true
  dbPath: /data/mongo_27017 #数据存储目录
  directoryPerDB: true #默认,false不适用inmemoryengine
  wiredTiger:
    engineConfig:
      cacheSizeGB: 1 #将用于所有数据缓存的最大小
      directoryForIndexes: true #默认false索引集合storage.dbPath存储在数据单独子目录
    collectionConfig:
      blockCompressor: zlib
    indexConfig:
      prefixCompression: true

processManagement: #使用处理系统守护进程的控制处理
  fork: true #后台运行
  pidFilePath: /opt/mongo_27017/pid/mongod.pid #创建 pid 文件

net:
  port: 27017 #监听端口
  bindIp: 127.0.0.1,10.0.0.51 #绑定ip

6.启动mongo

/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf

7.检查是否启动

ps -ef|grep mongo
netstat -lntup|grep mongo

8.进入mongo

/opt/mongodb/bin/mongo

第6章 配置登录mongo

1.写入环境变量

echo 'export PATH=/opt/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile

2.登录

mongo

3.关闭

方法1:推荐
mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown

方法2: 只能是使用localhost方式登陆
mongo
use admin
db.shutdownServer()

方法3: system管理
见下面的优化3

第7章 优化告警

1.内存不足

** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt

解决方法:

方法1: 加大机器内存
方法2: 调小配置文件里的缓存大小 cacheSizeGB: 0.5 

2.没有开启访问控制

** WARNING: Access control is not enabled for the database.
Read and write access to data and configuration is unrestricted.

解决方法:

开启安全账户功能,见用户认证章节

3.不建议以root身份运行

** WARNING: You are running this process as the root user, which is not recommended.

解决方法:

方法1: 创建普通用户mongo,然后切换到mongo用户启动
方法2: 使用system方式登陆,指定运行用户为普通用户mongo

mongo的system启动文件:

cat >/usr/lib/systemd/system/mongod.service<<EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=mongo
Group=mongo
ExecStart=/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf
ExecStartPre=/usr/bin/chown -R mongo:mongo /opt/mongo_27017/
ExecStartPre=/usr/bin/chown -R mongo:mongo /data/mongo_27017/

PermissionsStartOnly=true
PIDFile=/opt/mongo_27017/pid/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target
EOF

创建普通用户mongo

pkill mongo
groupadd mongo -g 777
useradd mongo -g 777 -u 777 -M -s /sbin/nologin
id mongo

重新启动mongo

systemctl daemon-reload 
systemctl start mongod.service
ps -ef|grep mongo
mongo

4.关闭大内存页

** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
We suggest setting it to 'never'
** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
We suggest setting it to 'never'

解决方法:改完要重启

echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag

5.数据目录磁盘不是XFS格式

** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

解决方法:

把磁盘格式转成XFS

6.rlimits太低

** WARNING: soft rlimits too low. rlimits set to 7266 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.

解决方法:

cat > /etc/profile<<EOF
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 64000
ulimit -m unlimited
ulimit -u 64000
EOF

生效配置:

source /etc/profile

验证:

systemctl stop mongod
systemctl start mongod
mongo 

7.关闭监控服务体验

---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

解决方法:

db.disableFreeMonitoring()

第8章 mongo数据库指令介绍

1.默认数据库说明

test:登录时默认存在的库
admin库:系统预留库,MongoDB系统管理库
local库:本地预留库,存储关键日志
config库:MongoDB配置信息库

2.查看数据库命令

show databases/show dbs         #查看有哪些库
show tables/show collections    #查看当前所在的库下有哪些集合
use admin                       #切换到不同的库
db                              #查看当前在哪个库下

3.mongo特别的地方

1.mongo默认登陆的时候是在test库下
2.mongo不需要提前创建库和表,直接use切换就是创建库,直接插入数据就会创建表
3.使用use切换到的库,如果没有任何数据,实际上并不会真正创建,是个虚的库,所以show dbs并不会显现

4.shell窗口执行mongo命令

mongo --port 28017 --eval  "show dbs"
echo "show dbs"|mongo --port 28017

第9章 mongo操作命令

0.注意

mongo命令严格区分大小写

1.插入命令

1.1 插入单条

db.user_info.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"zhangya","age":27,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"yazhang","age":28,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区"})
db.user_info.insert({"name":"xiaozhang","age":28,"ad":"北京市朝阳区","sex":"boy"})

1.2 插入多条

db.inventory.insertMany( [
    { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" },
    { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" },
    { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" },
    { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" },
    { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" }
]);

2.查询命令

2.1 查询一条

db.user_info.findOne()

2.2 查询所有

db.user_info.find()

2.3 查询符合条件

db.user_info.find({"age":28})
select * from user_info where age = 28;

2.4 只返回想要的字段(来自雷神的提问)

db.user_info.find({"name":"json"},{name:1,_id:0})

2.5 查询嵌套的条件

db.inventory.find( { "size.uom": "in" } )
db.inventory.find( 
    { 
        "size.uom": "in" 
    } 
)

2.6 逻辑查询:and

db.inventory.find( { "size.uom": "cm" ,"status" : "A"} )
db.inventory.find( 
    { 
        "size.uom": "cm" ,
        "status" : "A"
    } 
)

2.7 逻辑查询 或

https://docs.mongodb.com/manual/reference/operator/query-comparison/
db.inventory.find(
    {
        $or:[
                {status:"D"},
                {qty:{$lt:30}}
            ]
    }
)

2.8 逻辑查询+或+and+正则表达式

db.inventory.find({status:"A",$or:[{qty:{$lt:30}},{item:/^p/}]})
db.inventory.find( 
    {
        status: "A",
        $or: [ 
                { qty: { $lt: 30 } }, 
                { item: /^p/ } 
             ]
    } 
)

db.inventory.find( 
    {
        status: "A",
        $or: [ 
                { qty: { $gt: 30 } }, 
                { item: /^p/ } 
             ]
    } 
)

3.更新数据

3.1 更改匹配条件的单条数据

db.inventory.find({ "item" : "paper" })
db.inventory.updateOne{ "item" : "paper" },{$set: {  "size.uom" : "cm",  "status" : "P" }})
db.inventory.updateOne(
    { "item" : "paper" },
    {
      $set: {  
                "size.uom" : "cm",  
                "status" : "P" 
            }
    }
)

3.2 更改匹配条件的多条数据

db.inventory.find({ "qty" : { $lt: 50 } })
db.inventory.updateMany(
    { "qty" : { $lt: 50 } },
    {
       $set: 
            { 
                "size.uom" : "mm", 
                "status": "P" 
            }
    }
)

3.3 添加字段

db.user_info.find({ "age" : 27})
db.user_info.updateMany(
    { "age" : 27},
    {
       $set: 
            { 
                "pet" : "cat"
            }
    }
)

4.索引

4.1 查看执行计划

db.user_info.find({"age":{ $lt: 30 }})
db.user_info.find({"age":{ $lt: 30 }}).explain()

4.2 创建索引

db.user_info.createIndex({ age: 1 },{background: true})

4.3 查看索引

db.user_info.getIndexes()

4.4 再次查看执行计划

db.user_info.find({"age":{ $lt: 30 }}).explain()

4.5 关键词

"stage" : "IXSCAN"
"indexName" : "age_1"

4.6 删除索引

db.user_info.dropIndex("age_1")

4.7 其他索引类型

COLLSCAN – Collection scan
IXSCAN – Scan of data in index keys
FETCH – Retrieving documents
SHARD_MERGE – Merging results from shards
SORT – Explicit sort rather than using index orde

5.删除

5.1 先查找需要删除的数据

db.inventory.find({"status":"P"})

5.2 删除单条

db.inventory.deleteOne({"status":"P"})

5.3 删除多个

db.inventory.deleteMany({"status":"P"})

5.4 删除索引

db.user_info.dropIndex("age_1")

5.5 删除集合

show dbs
db 
show tables
db.inventory.drop()

5.6 删除库

show dbs
db 
db.dropDatabase()

第10章 mongo工具

1.命令介绍

mongo         #登陆命令
mongod        #启动命令
mongodump     #全备导出,压缩格式
mongorestore  #恢复
mongoexport   #备份导出,可读的json格式
mongoimport   #恢复
mongos        #集群分片
mongotop      #查看mongo的运行状态
mongostat     #查看mongo的运行状态

2.mongostat使用说明:

默认一秒打印一次
使用-n参数可以只打印一次
mongostat -n 1

3.mongostat各字段解释说明:

insert/s : 官方解释是每秒插入数据库的对象数量,如果是slave,则数值前有*,则表示复制集操作
query/s : 每秒的查询操作次数
update/s : 每秒的更新操作次数
delete/s : 每秒的删除操作次数
getmore/s: 每秒查询cursor(游标)时的getmore操作数
command: 每秒执行的命令数,在主从系统中会显示两个值(例如 3|0),分表代表 本地|复制 命令
注: 一秒内执行的命令数比如批量插入,只认为是一条命令(所以意义应该不大)
dirty: 仅仅针对WiredTiger引擎,官网解释是脏数据字节的缓存百分比
used:仅仅针对WiredTiger引擎,官网解释是正在使用中的缓存百分比
flushes:
For WiredTiger引擎:指checkpoint的触发次数在一个轮询间隔期间
For MMAPv1 引擎:每秒执行fsync将数据写入硬盘的次数
注:一般都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。flush开销是很大的,如果频繁的flush,可能就要找找原因了
vsize: 虚拟内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
res:  物理内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
注:这个和你用top看到的一样, vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,去查查是否有别的程序狂吃内存。

qr: 客户端等待从MongoDB实例读数据的队列长度
qw:客户端等待从MongoDB实例写入数据的队列长度
ar: 执行读操作的活跃客户端数量
aw: 执行写操作的活客户端数量
注:如果这两个数值很大,那么就是DB被堵住了,DB的处理速度不及请求速度。看看是否有开销很大的慢查询。如果查询一切正常,确实是负载很大,就需要加机器了
netIn:MongoDB实例的网络进流量
netOut:MongoDB实例的网络出流量
注:此两项字段表名网络带宽压力,一般情况下,不会成为瓶颈
conn: 打开连接的总数,是qr,qw,ar,aw的总和
注:MongoDB为每一个连接创建一个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接数的启动参数,maxIncomingConnections,阿里工程师建议在5000以下,基本满足多数场景

4.小实验:

一个终端写入测试数据:

use oldboy
for(i=1;i<10000;i++){ db.hash.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }

一个终端使用mongotop观察
一个终端使用mongostat观察

第11章 创建用户和角色

https://docs.mongodb.com/manual/core/authorization/

0.与用户相关的命令

db.auth() 将用户验证到数据库。
db.changeUserPassword() 更改现有用户的密码。
db.createUser() 创建一个新用户。
db.dropUser() 删除单个用户。
db.dropAllUsers() 删除与数据库关联的所有用户。
db.getUser() 返回有关指定用户的信息。
db.getUsers() 返回有关与数据库关联的所有用户的信息。
db.grantRolesToUser() 授予用户角色及其特权。
db.removeUser() 已过时。从数据库中删除用户。
db.revokeRolesFromUser() 从用户中删除角色。
db.updateUser() 更新用户数据。

1.在未开启用户访问控制的实例下创建管理员账户

mongo db01:27017
use admin
db.createUser(
  {
    user: "myUserAdmin",
    pwd: "123456", 
    roles: [ { role: "userAdminAnyDatabase", db: "admin" }, "readWriteAnyDatabase" ]
  }
)

2.查看创建的用户

db.getUsers()

3.配置文件添加权限认证参数

vim /opt/mongo_27017/conf/mongodb.conf 
security:     
  authorization: enabled

4.重启mongo

systemctl restart mongod.service

5.使用admin用户登录

mongo --authenticationDatabase "admin" -u "myUserAdmin" -p

6.创建其他用户

use test
db.createUser(
  {
    user: "mysun",
    pwd:  "123456",
    roles: [ { role: "readWrite", db: "readWrite" },
             { role: "read", db: "read" } ]
  }
)

7.使用管理员账户创建测试数据

use readWrite
db.write.insertOne({"name":"cookzhang"})

use read
db.read.insertOne({"name":"cookzhang"})

8.退出admin,使用mysun用户登录

mongo --authenticationDatabase "test" -u "mysun" -p             
show dbs

use readWrite
show tables
db.write.insertOne({"name":"json"}) #正常写入
db.write.find()

use read
show tables
db.read.find()
db.read.insertOne({"name":"bobo"})  #应该报错

9.修改用户权限

mongo --authenticationDatabase "admin" -u "myUserAdmin" -p     
use test
db.updateUser(
  'mysun',
  { 
    pwd: "123456",
    roles: [ { role: "readWrite", db: "readWrite" },
             { role: "readWrite", db: "read" } ,
             { role: "readWrite", db: "test" }]
             
  }
)
db.getUsers()

10.测试账户修改后的权限

mongo --authenticationDatabase "test" -u "mysun" -p 
show dbs

use readWrite
show tables
db.write.insertOne({"name":"json"}) #正常写入
db.write.find()

use read
show tables
db.read.find()
db.read.insertOne({"name":"bobo"})  #正常写入

11.删除用户

mongo --authenticationDatabase "admin" -u "myUserAdmin" -p 
use test
db.getUsers()
db.dropUser("mysun")
db.getUsers()

第12章 mongo副本集配置

https://docs.mongodb.com/manual/replication/

1.副本集的角色

主节点     负责读写 
副本节点   同步主节点 shell下连接默认不可读 
仲裁节点   不是必须的,不存储数据,也不参与竞选,只投票

2.选举的机制

大多数投票原则,要想选出新的主节点,存活的节点数必须是副本集的一半以上数量

3.创建节点目录和数据目录

mkdir -p /opt/mongo_2801{7,8,9}/{conf,log,pid}  
mkdir -p /data/mongo_2801{7,8,9}

4.创建配置文件

cat >/opt/mongo_28017/conf/mongodb.conf <<EOF
systemLog:
 destination: file   
 logAppend: true  
 path: /opt/mongo_28017/log/mongodb.log

storage:
 journal:
   enabled: true
 dbPath: /data/mongo_28017
 directoryPerDB: true
 wiredTiger:
    engineConfig:
       cacheSizeGB: 0.5 
       directoryForIndexes: true
    collectionConfig:
       blockCompressor: zlib
    indexConfig:
       prefixCompression: true

processManagement:
 fork: true
 pidFilePath: /opt/mongo_28017/pid/mongod.pid

net:
 port: 28017
 bindIp: 127.0.0.1,10.0.0.51

replication:
   oplogSizeMB: 1024 
   replSetName: dba
EOF

5.复制配置文件到其他节点

cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28018/conf/
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28019/conf/

6.替换端口号

sed -i 's#28017#28018#g' /opt/mongo_28018/conf/mongodb.conf 
sed -i 's#28017#28019#g' /opt/mongo_28019/conf/mongodb.conf 

7.启动所有节点

mongod -f /opt/mongo_28017/conf/mongodb.conf
mongod -f /opt/mongo_28018/conf/mongodb.conf
mongod -f /opt/mongo_28019/conf/mongodb.conf

8.初始化集群

mongo --port 28017
config = {
            _id : "dba", 
            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) 

9.主库插入数据

mongo --port 28017
db.user_info.insertOne({"name":"json","age":27,"ad":"北京市朝阳区"})
db.user_info.insertOne({"name":"bobo","age":27,"ad":"北京市朝阳区"})
db.user_info.insertOne({"name":"lei","age":28,"ad":"北京市朝阳区"})
db.user_info.insertOne({"name":"bug","age":28,"ad":"北京市朝阳区"})
db.user_info.insertOne({"name":"bobo","age":28,"ad":"北京市朝阳区","sex":"null"})

10.副本节点登录查看数据

mongo --port 28018
rs.slaveOk()
show dbs
show tables
db.user_info.find()

11.设置副本可读

方法1:临时生效

rs.slaveOk()

方法2:写入启动文件

echo "rs.slaveOk()" > ~/.mongorc.js

第13章 副本集权重调整

1.模拟故障转移

mongod -f /opt/mongo_28017/conf/mongodb.conf --shutdown
mongod -f /opt/mongo_28017/conf/mongodb.conf

2.查看当前副本集配置

rs.conf()

3.设置权重

myconfig=rs.conf()
myconfig.members[0].priority=100
rs.reconfig(myconfig)

4.主节点主动降级

rs.stepDown()

5.恢复成默认的权重

myconfig=rs.conf()
myconfig.members[0].priority=1
rs.reconfig(myconfig)

第14章 增加新节点和删除旧节点

1.创建新节点并启动

mkdir -p /opt/mongo_28010/{conf,log,pid}  
mkdir -p /data/mongo_28010
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28010/conf/
sed -i 's#28017#28010#g' /opt/mongo_28010/conf/mongodb.conf 
mongod -f /opt/mongo_28010/conf/mongodb.conf
mongo --port 28010

2.集群添加节点

mongo --port 28017
rs.add("10.0.0.51:28010")

3.新节点查看信息

mongo --port 28010

4.删除节点

rs.remove("10.0.0.51:28010")

第15章 仲裁节点

1.创建新节点并启动

mkdir -p /opt/mongo_28011/{conf,log,pid}  
mkdir -p /data/mongo_28011
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28011/conf/
sed -i 's#28017#28011#g' /opt/mongo_28011/conf/mongodb.conf 
mongod -f /opt/mongo_28011/conf/mongodb.conf
mongo --port 28010

2.将仲裁节点加入集群

mongo --port 28017
rs.addArb("10.0.0.51:28011")

3.登陆仲裁节点查看

mongo --port 28011

4.模拟故障转移

结论:可以坏2台

第16章 mongo备份与恢复

1.工具介绍

mongodump/mongorestore  
mongoexport/mongoimport  

2.应用场景

定时备份/全量备份 mongodump/mongorestore  bson gzip
分析数据/迁移数据 mongoexport/mongoimport json csv

3.mongodump-备份单节点数据

全备数据-mongodump

mongodump --port 28017 -o mongo_backup

只备份某个库

mongodump --port 28017 -d test -o mongo_backup 

只备份某个库下某个集合

mongodump --port 28017 -d bobo -c bobo -o mongo_backup 

4.mongodump-备份整个副本集

mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup
mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup --gzip

5.mongorestore-恢复数据

mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --dir=./mongo_backup --drop
mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --dir=./mongo_backup --drop --gzip

6.mongoexport-导出数据

mongoexport -d test -c user_info --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup/user_info.json

mongoexport -d test -c user_info --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010  --type=csv --fields=name,age,ad -o mongo_backup/user_info.csv

7.mongoimport-恢复数据

mongoimport -d test -c user_info --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup/user_info.json --drop

mongoimport -d test -c user_info --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --type=csv --headerline mongo_backup/user_info.csv

第17章 mysql数据迁移到mongo

1.mysql自定义分隔符导出成csv格式

select * from world.city into outfile '/var/lib/mysql/city.csv' fields terminated by ',';

2.修改CSV格式并添加字段

ID,Name,CountryCode,District,Population

3.mongo导入修改后的csv格式

mongoimport -d world -c city --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010  --type=csv --headerline city.csv

4.CSV数据导入ES场景

老大发给他几个CSV格式的文件,让运维导入到ES里

解决步骤:
1.先把csv导入到mongo里

mongoimport -d world -c city --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010  --type=csv --headerline city.csv

2.把mongo数据导出成json

mongoexport -d world -c city --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup/city.json

3.把json导入到es
使用esdump工具将json文件导入到ES里。

第18章 模拟误删除恢复数据

1.模拟场景

小波早上10点误删除数据库

1
2
3
全备
4
5
6
drop database

2.准备测试数据

use backup
db.backup.insertMany( [
    { "id": 1},
    { "id": 2},
    { "id": 3},
]);

3.全备数据

rm -rf mongo_backup
mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --oplog -o mongo_backup

4.增加新数据

db.backup.insertMany( [
    { "id": 4},
    { "id": 5},
    { "id": 6},
]);

5.模拟误删除数据

use backup
db.dropDatabase()

6.备份oplog

mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -d local -c oplog.rs -o mongo_backup

7.查找误删除时间点

use local
db.oplog.rs.find({"ns":"backup.$cmd"}).pretty()

8.找到误删除的时间点

"ts" : Timestamp(1584408504, 1)

9.截断oplog的drop时间点,然后恢复

cd mongo_backup
cp local/oplog.rs.bson oplog.bson
rm -rf local

mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --oplogReplay --oplogLimit="1584408504" mongo_backup --drop

第19章 第二个误删场景:

1.误删2个库的场景

test back
1     a
2     b
3     c
全备

dorp  test
4     d
5     e

dorp  back
6     f
紧急备份

2.整体思路

1.先恢复test库,然后还原
2.再恢复backup库

1.恢复test思路:

test 
1    
2    
3    
全备
dorp  test
4   
5   
6 

恢复全备

mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup_20200316

导出test:

mongoexport -d test -c test --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup_test_ok/test.json

2.恢复backup库:

back
a
b
c
全备      20200316

d
e
dorp  back

f

1.导出当前的oplog到全备里:

mongodump --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019 -d local -o mongo_backup_20200316
cd mongo_backup_20200316
cp local/oplog.rs.bson oplog.bson 
rm -rf local

2.查找时间戳:

use local
db.oplog.rs.find({"ns":"backup.$cmd"}).pretty()
db.oplog.rs.find({"op":"i","ns":"backup.backup"}).pretty()

1584427733 e 
1584427746 drop 
1584427763 f 

3.恢复到drop时间戳之前:

mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 --oplogReplay --oplogLimit="1584427746" mongo_backup_20200316 

4.导出backup数据:

mongoexport -d backup -c backup --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 -o mongo_backup_backup_ok/backup.json

5.恢复全备:

mongorestore --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup_20200316 --drop

3.恢复test:

mongoimport -d test -c test --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup_test_ok/test.json

4.恢复backup:

mongoimport -d backup -c backup --host=dba/10.0.0.51:28017,10.0.0.51:28018,10.0.0.51:28019,10.0.0.51:28010 mongo_backup_backup_ok/backup.json

14.补充:如果时间戳有多条记录,如何恢复指定的时间的操作的方法

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

推荐阅读更多精彩内容

  • MongoDB 非关系型数据库 三,关系数据库的重要概念 1)关系模型:关系(二位表)来表达数据及数据之间的联系 ...
    dushuzhong阅读 716评论 0 0
  • MySQL体系结构 库:database 表:table 列:column 行:row MongoDB体系结构 库...
    我要笑阅读 298评论 0 1
  • 成功启动MongoDB后,再打开一个命令行窗口输入mongo,就可以进行数据库的一些操作。 输入help可以看到基...
    溪桥路转阅读 1,003评论 0 0
  • MongoDB介绍 MongoDB是一个基于分布式文件存储的开源文档数据库。由C++语言编写。旨在为WEB应用提供...
    小厨笔记阅读 1,246评论 0 2
  • MongoDB简介 MongDB是一个高性能,开源,无模式的文档型NosQL数据库。 主要功能特性: 1.文件存储...
    情话_2ee5阅读 402评论 0 2