第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