1、什么時候使用Mongodb?
我的數(shù)據(jù)量是有億萬級或者需要不斷擴容
需要2000-3000以上的讀寫每秒
新應用、需求會變、數(shù)據(jù)模型無法確定
我需要整合多個外部數(shù)據(jù)源
我的系統(tǒng)需要99.999%高可用
我的系統(tǒng)需要大量的地理位置查詢
我的系統(tǒng)需要提供最小的latency
我要管理的主要數(shù)據(jù)對象 < 10
2、Mongodb特點
MongoDB與關系型數(shù)據(jù)庫的最大區(qū)別:沒有固定的行列組織數(shù)據(jù)結構
高性能:
Mongodb提供高性能的數(shù)據(jù)持久性
尤其是支持嵌入式數(shù)據(jù)模型減少數(shù)據(jù)庫系統(tǒng)上的I/O操作
索引支持能快的查詢,并且可以包括來嵌入式文檔和數(shù)組中的鍵
豐富的語言查詢:
Mongodb支持豐富的查詢語言來支持讀寫操作(CRUD)以及數(shù)據(jù)匯總,文本搜索和地理空間索引
高可用性:
Mongodb的復制工具,成為副本集,提供自動故障轉移和數(shù)據(jù)冗余
水平可擴展性:
Mongodb提供了可擴展性,作為其核心功能的一部分,分片是將數(shù)據(jù)分,在一組計算機上
支持多種存儲引擎:
WiredTiger存儲引擎和、MMAPv1存儲引擎和InMemory存儲引擎
3、mongodb應用場景
游戲場景,使用 MongoDB 存儲游戲用戶信息,用戶的裝備、積分等直接以內(nèi)嵌文檔的形式存儲,方便查詢、更新
物流場景,使用 MongoDB 存儲訂單信息,訂單狀態(tài)在運送過程中會不斷更新,以 MongoDB 內(nèi)嵌數(shù)組的形式來存儲,一次查詢就能將訂單所有的變更讀取出來。
社交場景,使用 MongoDB 存儲存儲用戶信息,以及用戶發(fā)表的朋友圈信息,通過地理位置索引實現(xiàn)附近的人、地點等功能
物聯(lián)網(wǎng)場景,使用 MongoDB 存儲所有接入的智能設備信息,以及設備匯報的日志信息,并對這些信息進行多維度的分析
視頻直播,使用 MongoDB 存儲用戶信息、禮物信息等,用戶評論
電商場景,使用 MongoDB
商城上衣和褲子兩種商品,除了有共同屬性,如產(chǎn)地、價格、材質、顏色等外,還有各自有不同的屬性集,如上衣的獨有屬性是肩寬、胸圍、袖長等,褲子的獨有屬性是臀圍、腳口和褲長等
4、邏輯結構
Mongodb 邏輯結構 MySQL邏輯結構
庫database 庫
集合(collection) 表
文檔(document) 數(shù)據(jù)行
選擇之所以稱之為選擇,肯定是痛苦的!
------->oldguo
5、系統(tǒng)準備
(1)redhat或centos6.2以上系統(tǒng)
(2)系統(tǒng)開發(fā)包完整
(3)ip地址和hosts文件解析正常
(4)iptables防火墻&SElinux關閉
(5)關閉大頁內(nèi)存機制
# 如何關閉大頁內(nèi)存機制?
linux系統(tǒng)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
[root@kvm ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@kvm ~]# echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 其他系統(tǒng)關閉參照官方文檔:
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.
6、MongoDB安裝
# 創(chuàng)建所需用戶和組
useradd mongod
passwd mongod
# 創(chuàng)建mongodb所需目錄結構
mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data
# 上傳并解壓軟件到指定位置
[root@db01 data]# cd /data
[root@db01 data]# tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz
[root@db01 data]# cp -r /data/mongodb-linux-x86_64-rhel70-3.6.12/bin/* /mongodb/bin
# 設置目錄結構權限
chown -R mongod:mongod /mongodb
# 設置用戶環(huán)境變量
su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile
# 啟動mongodb
su - mongod
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
# 登錄mongodb
[mongod@server2 ~]$ mongo
7、使用配置文件
YAML模式
NOTE:
YAML does not support tab characters for indentation: use spaces instead.
--系統(tǒng)日志有關
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式記錄
--數(shù)據(jù)存儲有關
storage:
journal:
enabled: true
dbPath: "/mongodb/data" --數(shù)據(jù)路徑的位置
-- 進程控制
processManagement:
fork: true --后臺守護進程
pidFilePath: <string> --pid文件的位置,一般不用配置,可以去掉這行,自動生成到data中
--網(wǎng)絡配置有關
net:
bindIp: <ip> -- 監(jiān)聽地址
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 //關閉mongodb
mongod -f /mongodb/conf/mongo.conf //啟動
8、使用systemctld管理mongodb
# 在root用戶下
exit/su - root
# systemctld腳本
[root@db01 ~]# 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
[root@db01 ~]# systemctl restart mongod
[root@db01 ~]# systemctl stop mongod
[root@db01 ~]# systemctl start mongod
9、mongodb常用操作
9.1 mongodb默認存在的庫
test:登錄時默認存在的庫
管理MongoDB有關的系統(tǒng)庫
admin庫:系統(tǒng)預留庫,MongoDB系統(tǒng)管理庫
local庫:本地預留庫,存儲關鍵日志
config庫:MongoDB配置信息庫
show databases/show dbs
show tables/show collections
use admin
db/select database()
9.2 命令種類
# db 對象相關命令
db //查看當前庫
db.[TAB][TAB]
db.help()
db.oldboy.help()
db.status() //查看集合和大小
# rs 復制集有關(replication set):
rs.[TAB][TAB]
rs.help()
# sh 分片集群(sharding cluster)
sh.[TAB][TAB]
sh.help()
9.2 mongodb對象操作
mongo mysql
庫 -----> 庫
集合 -----> 表
文檔 -----> 數(shù)據(jù)行
# 庫的操作
> use test
>db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
# 集合的操作
app> db.createCollection('a')
{ "ok" : 1 }
app> db.createCollection('b')
方法2:當插入一個文檔的時候,一個集合就會自動創(chuàng)建。
use oldboy
db.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})
db.log.drop() //刪除log集合
db.log.renameCollection("log1") //集合改名,log改為log1
# 文檔操作
數(shù)據(jù)錄入:
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}
查詢數(shù)據(jù)行數(shù):
> db.log.count()
全表查詢;默認顯示20行,輸入it顯示下一行
> db.log.find()
> db.log.findone() //查詢第一行
每頁顯示50條記錄:
> DBQuery.shellBatchSize=50;
按照條件查詢
> db.log.find({uid:999})
以標準的json格式顯示數(shù)據(jù)
> 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({})
查詢?nèi)サ舢斍凹现心沉械闹貜蛿?shù)據(jù)
db.log.distinct("name")
集合中索引+數(shù)據(jù)壓縮存儲之后的大小,字節(jié)單位
db.log.totalSize()
10、用戶及權限管理
- 驗證庫: 建立用戶時use到的庫,在用戶遠程登錄時,要加上驗證庫才能登陸。
對于管理員用戶,必須在admin下創(chuàng)建.
- 建用戶時,use到的庫,就是此用戶的驗證庫
- 用戶遠程登錄時,必須明確指定驗證庫才能登錄
- 通常,管理員用戶的驗證庫是admin,普通用戶的驗證庫一般是所管理的庫設置為驗證庫
- 如果直接登錄到數(shù)據(jù)庫,不進行use,默認的驗證庫是test,不是我們生產(chǎn)建議的.
- 從3.6 版本開始,不添加bindIp參數(shù),默認不讓遠程登錄,只能本地管理員登錄。
10.1 用戶創(chuàng)建語法
# 基本語法說明:
use admin //進入要賦權的庫
db.createUser
{
user: "<name>", //用戶名
pwd: "<cleartext password>", //密碼
roles: [ //權限/角色
{ role: "<role>", //權限類型,通常role類型:root(超級管理員), readWrite,read
db: "<database>" } , //有權限的庫,如果一個用戶管理多個庫,加個逗號接著寫有權限的庫
{ role: "<role>",db: "<database>" }
...
]
}
# 用戶管理例子
創(chuàng)建超級管理員:管理所有數(shù)據(jù)庫(必須use admin再去創(chuàng)建)
use admin //進入要賦權的庫
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ] //admin是管理庫,給admin庫授權相當于是給全局授權
}
)
mongo -uroot -proot123 admin
# 創(chuàng)建應用用戶
use oldboy //進入要賦權的庫
db.createUser(
{
user: "app01",
pwd: "app01",
roles: [ { role: "readWrite" , db: "oldboy" } ]
}
)
mongo -uapp01 -papp01 app
# 驗證用戶
db.auth('root','root123')
# 配置文件中,加入以下配置
security:
authorization: enabled
# 重啟mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown
mongod -f /mongodb/conf/mongo.conf
# 登錄驗證
mongo -uroot -proot123 admin
mongo -uroot -proot123 10.0.0.53/admin
或者
mongo
use admin
db.auth('root','root123')
# 查詢mongodb中的用戶信息
mongo -uroot -proot123 10.0.0.53/admin
db.system.users.find().pretty()
# 刪除用戶(root管理員身份登錄,use到驗證庫)
mongo -uroot -proot123 10.0.0.53/admin
use oldboy1
db.dropUser("app02")
# 用戶管理注意事項
1. 建用戶要有驗證庫,管理員admin,普通用戶是要管理的庫
2. 登錄時,注意驗證庫
mongo -uapp01 -papp01 10.0.0.51:27017/oldboy
3. 重點參數(shù)
net:
port: 27017
bindIp: 10.0.0.51,127.0.0.1
security:
authorization: enabled
11、MongoDB復制集RS(ReplicationSet)
11.1 基本原理
基本構成是1主2從的結構,自帶互相監(jiān)控投票機制(Raft(MongoDB) Paxos(mysql MGR 用的是變種)分布式協(xié)議)
如果發(fā)生主庫宕機,復制集內(nèi)部會進行投票選舉,選擇一個新的主庫替代原有主庫對外提供服務。同時復制集會自動通知
客戶端程序,主庫已經(jīng)發(fā)生切換了。應用就會連接到新的主庫。
至少三個節(jié)點,也可以是一主一從一Arbiter結構,Arbiter節(jié)點不復制數(shù)據(jù),只負責投票;
復制集RS能保證所有節(jié)點數(shù)據(jù)一致性;基于raft協(xié)議,所有節(jié)點之間自動進行心跳檢測,宕機后進行選舉,自動切換,剩余主機自動構建主從關系,節(jié)點恢復自動自愈。
在mongodb中,一個節(jié)點只能出現(xiàn)在一個復制集中,不能出現(xiàn)級聯(lián)狀態(tài)。
11.2 Replication Set配置過程詳解
# 規(guī)劃
三個以上的mongodb節(jié)點(或多實例)
# 環(huán)境準備
# 多個端口
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
# 多套配置文件
/mongodb/28017/conf/mongod.conf
/mongodb/28018/conf/mongod.conf
/mongodb/28019/conf/mongod.conf
/mongodb/28020/conf/mongod.conf
# 配置文件內(nèi)容
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 //緩沖區(qū)大小
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 10.0.0.51,127.0.0.1
port: 28017
replication: //復制集相關的專用配置
oplogSizeMB: 2048 //日志大小,日志存放在表里,默認磁盤空間5%
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
# 啟動多個實例備用
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
11.3 配置復制集
# 1主2從,從庫普通從庫
mongo --port 28017 admin
config = {_id: 'my_repl', members: [
{_id: 0, host: '10.0.0.8:28017'},
{_id: 1, host: '10.0.0.8:28018'},
{_id: 2, host: '10.0.0.8:28019'}]
}
rs.initiate(config) //構建集群,括號里為復制集名
# 1主1從1個arbiter結構
mongo -port 28017 admin
config = {_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)
# 查詢復制集狀態(tài)
rs.status(); //查看整體復制集狀態(tài)
rs.isMaster(); // 查看當前是否是主節(jié)點
rs.conf(); //查看復制集配置信息
11.4 添加刪除節(jié)點
rs.remove("ip:port"); // 刪除一個節(jié)點
rs.add("ip:port"); // 新增從節(jié)點
rs.addArb("ip:port"); // 新增仲裁節(jié)點
例子:
添加 arbiter節(jié)點
1、連接到主節(jié)點
[mongod@db03 ~]$ mongo --port 28018 admin
2、刪除一個節(jié)點
3、添加仲裁節(jié)點
my_repl:PRIMARY> rs.addArb("10.0.0.53:28020")
4、查看節(jié)點狀態(tài)
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"); // 刪除一個節(jié)點
例子:
my_repl:PRIMARY> rs.remove("10.0.0.53:28019");
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
rs.add("ip:port"); // 新增從節(jié)點
例子:
my_repl:PRIMARY> rs.add("10.0.0.53:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
11.4 特殊從節(jié)點
- 介紹
arbiter節(jié)點:主要負責選主過程中的投票,但是不存儲任何數(shù)據(jù),也不提供任何服務
hidden節(jié)點:隱藏節(jié)點,不參與選主,也不對外提供服務。
delay節(jié)點:延時節(jié)點,數(shù)據(jù)落后于主庫一段時間,因為數(shù)據(jù)是延時的,也不應該提供服務或參與選主,所以通常會配合hidden(隱藏)
一般情況下會將delay+hidden一起配置使用
# 配置延時節(jié)點(一般延時節(jié)點也配置成hidden)
cfg=rs.conf()
cfg.members[2].priority=0 //不進行投票;中括號內(nèi)為節(jié)點索引,從0開始,非_id號碼
cfg.members[2].hidden=true //不參與業(yè)務
cfg.members[2].slaveDelay=120 //延時從庫
rs.reconfig(cfg)
取消以上配置
cfg=rs.conf()
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[2].slaveDelay=0
rs.reconfig(cfg)
配置成功后,通過以下命令查詢配置后的屬性
rs.conf();
11.5 副本集其它操作命令
查看副本集的配置信息
admin> rs.conf()
查看副本集各成員的狀態(tài)
admin> rs.status()
++++++++++++++++++++++++++++++++++++++++++++++++
--副本集角色切換(不要人為隨便操作)
admin> rs.stepDown()
注:
admin> rs.freeze(300) //鎖定從,使其不會轉變成主庫
freeze()和stepDown單位都是秒。
+++++++++++++++++++++++++++++++++++++++++++++
設置副本節(jié)點可讀:在副本節(jié)點執(zhí)行
admin> rs.slaveOk()
eg:
admin> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }
查看副本節(jié)點(監(jiān)控主從延時)
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日志(備份恢復章節(jié))
12、MongoDB Sharding Cluster 分片集群
mongodb分布式架構:路由、配置(節(jié)點信息、分布策略)、數(shù)據(jù)存儲節(jié)點(shard節(jié)點)組成
配置節(jié)點是復制集結構,只能是一主兩從,不能有arbiter節(jié)點
路由節(jié)點是mongos
shard節(jié)點是復制集結構
4個物理節(jié)點,配置節(jié)點一主兩從分配到3臺物理節(jié)點
12.1 Shard節(jié)點配置過程
規(guī)劃
10個實例:38017-38026
(1)configserver:38018-38020
3臺構成的復制集(1主兩從,不支持arbiter)38018-38020(復制集名字configsvr)
(2)shard節(jié)點:
sh1:38021-23 (1主兩從,其中一個節(jié)點為arbiter,復制集名字sh1)
sh2:38024-26 (1主兩從,其中一個節(jié)點為arbiter,復制集名字sh2)
(3) mongos:
38017
目錄創(chuàng)建
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
修改配置文件
第一組復制集搭建:21-23(1主 1從 1Arb)
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.8,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
第二組節(jié)點:24-26(1主1從1Arb)
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.8,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
啟動所有節(jié)點,并搭建復制集
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 mongod
mongo --port 38021 admin
config = {_id: 'sh1', members: [
{_id: 0, host: '10.0.0.8:38021'},
{_id: 1, host: '10.0.0.8:38022'},
{_id: 2, host: '10.0.0.8:38023',"arbiterOnly":true}]
}
rs.initiate(config)
mongo --port 38024 admin
config = {_id: 'sh2', members: [
{_id: 0, host: '10.0.0.8:38024'},
{_id: 1, host: '10.0.0.8:38025'},
{_id: 2, host: '10.0.0.8:38026',"arbiterOnly":true}]
}
rs.initiate(config)
12.2 Config節(jié)點配置
# 目錄創(chuàng)建
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.8,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
# 啟動節(jié)點,并配置復制集
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.8:38018'},
{_id: 1, host: '10.0.0.8:38019'},
{_id: 2, host: '10.0.0.8:38020'}]
}
rs.initiate(config)
注:configserver 可以是一個節(jié)點,官方建議復制集。configserver不能有arbiter。
新版本中,要求必須是復制集。
注:mongodb 3.4之后,雖然要求config server為replica set,但是不支持arbiter
12.3 mongos最后一個節(jié)點配置
# 創(chuàng)建目錄
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.8,127.0.0.1
port: 38017
sharding:
configDB: configReplSet/10.0.0.8:38018,10.0.0.8:38019,10.0.0.8:38020
processManagement:
fork: true
EOF
# 啟動mongos
mongos -f /mongodb/38017/conf/mongos.conf
# 分片集群添加節(jié)點
連接到其中一個mongos(10.0.0.51),做以下配置
(1)連接到mongs的admin數(shù)據(jù)庫
# su - mongod
mongo 10.0.0.8:38017/admin
(2)添加分片,將shard信息加入集群
db.runCommand( { addshard : "sh1/10.0.0.8:38021,10.0.0.8:38022,10.0.0.8:38023",name:"shard1"} )
db.runCommand( { addshard : "sh2/10.0.0.8:38024,10.0.0.8:38025,10.0.0.8:38026",name:"shard2"} )
(3)列出分片
mongos> db.runCommand( { listshards : 1 } )
(4)整體狀態(tài)查看
mongos> sh.status();
12.4 使用分片集群
將把每一個分片的存儲單元定義為chunk,以邏輯單元chunk存儲數(shù)據(jù);
1.拆分:每個chunk默認64MB,當數(shù)據(jù)存滿64M時,數(shù)據(jù)會分裂為兩個新的chunk單元,每個數(shù)據(jù)32M,再滿再分裂;但是只會在一個復制集里(shard)分裂;
2.遷移:Mongodb插件balance會自動檢查節(jié)點的chunk的分布情況,如果不均勻會在復制集之間自動遷移達到均勻;遷移過程非常消耗IO也可以定制初始分片策略,使得每一個節(jié)點的數(shù)據(jù)均勻存儲,不需要遷移
1.分片模式range和hash
2.必須定義分片鍵,以經(jīng)常作為查詢條件的列定義分片鍵,與定義索引列是一樣的;分片鍵不可更改,而且分片鍵必須建索引,為Btree索引,分片鍵用于路由查詢
3.range應用數(shù)據(jù)量級大的情況,hash分布數(shù)據(jù)更加均勻
RANGE分片配置及測試
# 激活數(shù)據(jù)庫分片功能
mongo --port 38017 admin
admin> ( { enablesharding : "數(shù)據(jù)庫名稱" } )
eg:
admin> db.runCommand( { enablesharding : "test" } )
# 指定分片鍵對集合分片
### 創(chuàng)建索引
use test
> db.vast.ensureIndex( { id: 1 } ) //建索引
### 開啟分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } ) //test庫下vast表,分片鍵為id,1表示從小到大的順序分布,-1表示從大到小的順序分布
# 集合分片驗證,錄入數(shù)據(jù)
admin> use test
test> for(i=1;i<1000000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
test> db.vast.stats()
# 分片結果測試
shard1:
mongo --port 38021
db.vast.count();
shard2:
mongo --port 38024
db.vast.count();
# Hash分片例子:
對oldboy庫下的vast大表進行hash
創(chuàng)建哈希索引
(1)對于oldboy開啟分片功能
mongo --port 38017 admin
admin> db.runCommand( { enablesharding : "oldboy" } )
(2)對于oldboy庫下的vast表建立hash索引
use oldboy
oldboy> db.vast.ensureIndex( { id: "hashed" } )
(3)開啟分片
use admin
admin > sh.shardCollection( "oldboy.vast", { id: "hashed" } )
(4)錄入10w行數(shù)據(jù)測試
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();
分片集群的查詢及管理
# 判斷是否Shard集群
admin> db.runCommand({ isdbgrid : 1})
# 列出所有分片信息
admin> db.runCommand({ listshards : 1})
# 列出開啟分片的數(shù)據(jù)庫
admin> use config
config> db.databases.find( { "partitioned": true } )
或者:
config> db.databases.find() //列出所有數(shù)據(jù)庫分片情況
# 查看分片的片鍵
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
}
# 查看分片的詳細信息
admin> sh.status()
# 刪除分片節(jié)點(謹慎)
(1)確認blance是否在工作
sh.getBalancerState()
(2)刪除shard2節(jié)點(謹慎)
mongos> db.runCommand( { removeShard: "shard2" } )
注意:刪除操作一定會立即觸發(fā)blancer。
balancer操作
# 介紹
mongos的一個重要功能,自動巡查所有shard節(jié)點上的chunk的情況,自動做chunk遷移。
什么時候工作?
1、自動運行,會檢測系統(tǒng)不繁忙的時候做遷移
2、在做節(jié)點刪除的時候,立即開始遷移工作
3、balancer只能在預設定的時間窗口內(nèi)運行
有需要時可以關閉和開啟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
use config
sh.setBalancerState( true ) //開啟balance的功能
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )
sh.getBalancerWindow() //查看balance的時間窗口
sh.status()
關于集合的balancer(了解下)
關閉某個集合的balance
sh.disableBalancing("students.grades")
打開某個集合的balancer
sh.enableBalancing("students.grades")
確定某個集合的balance是開啟或者關閉
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
13、備份恢復
備份恢復工具介紹
(1)** mongoexport/mongoimport
(2)***** mongodump/mongorestore備份工具區(qū)別在哪里?
應用場景總結:
mongoexport(導出)/mongoimport(導入) //導入導出的是Json格式 或者csv格式 ;可讀性強,但體積大
(1)、異構平臺遷移 mysql <---> mongodb
(2)、同平臺,跨大版本:mongodb 低版本 ----> mongodb 高版本mongodump(導出)/mongorestore(導入) //導入導出的是Bson格式;二進制文件,體積小,但是沒有可讀性
日常備份恢復時使用.
13.1 導出工具mongoexport
mongoexport具體用法如下所示:
$ mongoexport --help
參數(shù)說明:
-h:指明數(shù)據(jù)庫宿主機的IP
-u:指明數(shù)據(jù)庫的用戶名
-p:指明數(shù)據(jù)庫的密碼
-d:指明數(shù)據(jù)庫的名字
-c:指明collection的名字
-f:指明要導出那些列
-o:指明到要導出的文件名
-q:指明導出數(shù)據(jù)的過濾條件
--authenticationDatabase admin //用戶的驗證庫
1.單表備份至json格式
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
注:備份文件的名字可以自定義,默認導出了JSON格式的數(shù)據(jù)。
2. 單表備份至csv格式
如果我們需要導出CSV格式的數(shù)據(jù),則需要使用----type=csv參數(shù):
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c oldguo --type=csv -f id,name,age,gender -o /mongodb/backup/log.csv
13.2 導入工具mongoimport
$ mongoimport --help
參數(shù)說明:
-h:指明數(shù)據(jù)庫宿主機的IP
-u:指明數(shù)據(jù)庫的用戶名
-p:指明數(shù)據(jù)庫的密碼
-d:指明數(shù)據(jù)庫的名字
-c:指明collection的名字
-f:指明要導入那些列
-j number //開啟并發(fā)導入 ,數(shù)據(jù)量大使用 ,number為cpu數(shù),默認為1,可以手動設定
數(shù)據(jù)恢復:
1.恢復json格式表數(shù)據(jù)到log1
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/backup/oldguo.json
2.恢復csv格式的文件到log2
上面演示的是導入JSON格式的文件中的內(nèi)容,如果要導入CSV格式文件中的內(nèi)容,則需要通過--type參數(shù)指定導入格式,具體如下所示:
錯誤的恢復
注意:
(1)csv格式的文件第一行,有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log2 --type=csv --headerline --file /mongodb/log.csv
//headerline:指明第一行是列名,不需要導入。
(2)csv格式的文件第一行,沒有列名字
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log3 --type=csv -f id,name,age,date --file /mongodb/log.csv
13.3 異構平臺遷移案例
# 案例1
mysql -----> mongodb
world數(shù)據(jù)庫下city表進行導出,導入到mongodb
(1)mysql開啟安全路徑
vim /etc/my.cnf --->添加以下配置
secure-file-priv=/tmp
--重啟數(shù)據(jù)庫生效
/etc/init.d/mysqld restart
(2)導出mysql的city表數(shù)據(jù)
source /root/world.sql
select * from world.city into outfile '/tmp/city1.csv' fields terminated by ',';
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 | | | |
| Population
vim /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 -j 4 /tmp/city1.csv
use world
db.city.find({CountryCode:"CHN"});
---------------------------------------------------------
# 案例2
world共100張表,全部遷移到mongodb
select 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.tables
mysql導出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';
13.4 mongodump和mongorestore
1、介紹
mongodump能夠在Mongodb運行時進行備份,它的工作原理是對運行的Mongodb做查詢,然后將所有查到的文檔寫入磁盤。
但是存在的問題時使用mongodump產(chǎn)生的備份不一定是數(shù)據(jù)庫的實時快照,如果我們在備份時對數(shù)據(jù)庫進行了寫入操作,
則備份出來的文件可能不完全和Mongodb實時數(shù)據(jù)相等。另外在備份時可能會對其它客戶端性能產(chǎn)生不利的影響。
2、mongodump用法如下:
$ mongodump --help
參數(shù)說明:
-h:指明數(shù)據(jù)庫宿主機的IP
-u:指明數(shù)據(jù)庫的用戶名
-p:指明數(shù)據(jù)庫的密碼
-d:指明數(shù)據(jù)庫的名字
-c:指明collection的名字
-o:指明到要導出的文件名
-q:指明導出數(shù)據(jù)的過濾條件
-j, number (4 by default) //并發(fā)
--oplog 備份的同時備份oplog,配置復制集使用
3、mongodump和mongorestore基本使用
mongodump 工具
# 全庫備份
mkdir /mongodb/backup
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
備份完有bson和 json兩種格式,bson為二進制格式,無法讀;
bsondump t100w.bson //bsondump工具,將bson格式文件轉換成 json格式文件
bsondump t100w.bson > /tmp/t100w.json
# 備份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、
mongorestore 恢復工具
一般是發(fā)生故障時,使用mongorestore恢復單庫、單副本集,會覆蓋原有數(shù)據(jù)
# 恢復world庫
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world //注意:恢復單庫,必須指定到要恢復的庫名路徑下
# 恢復oldguo庫下的t1集合
[mongod@db03 oldboy]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c t1 --gzip /mongodb/backup.bak/oldboy/log1.bson.gz //恢復單副本集、必須指定到文件名;備份時壓縮,恢復也要加上--gzip參數(shù)
# drop表示恢復的時候把之前的集合drop掉(危險)
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy
14、mongodump和mongorestore高級企業(yè)應用(--oplog)
- 注意:--oplog 只能在replica set(復制集)或者master/slave模式用
14.1 oplog介紹
oplog為mongodb自帶的日志,類似于mysql的binlog;有了oplog備份就可以采用熱備功能,可以把數(shù)據(jù)快照備份,也可以把備份過程中發(fā)生的變化一并保存下來。
在replica set中oplog是一個定容集合(capped collection),它的默認大小是磁盤空間的5%(可以通過--oplogSizeMB參數(shù)修改)。位于local庫的db.oplog.rs,有興趣可以看看里面到底有些什么內(nèi)容。
其中記錄的是整個mongod實例一段時間內(nèi)數(shù)據(jù)庫的所有變更(插入/更新/刪除)操作。
當空間用完時新記錄自動覆蓋最老的記錄。
其覆蓋范圍被稱作oplog時間窗口。需要注意的是,因為oplog是一個定容集合,
所以時間窗口能覆蓋的范圍會因為你單位時間內(nèi)的更新次數(shù)不同而變化。
想要查看當前的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定容集合內(nèi)容:
use local
db.oplog.rs.find().pretty()
"ts" : Timestamp(1553597844, 1), //時間戳,數(shù)字表示這一秒發(fā)生的第幾個操作
"op" : "n" //命令的類型
"o" : //具體信息
"i": insert
"u": update
"d": delete
"c": db cmd //庫級別的命令;刪庫,建表,刪表
例:db.oplog.rs.find({"op":"c"}).pretty() //查看oplog集合中op為c的信息
# 查看oplog集合覆蓋窗口信息
test: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)
14.2 oplog企業(yè)級應用
(1)實現(xiàn)熱備,在備份時使用--oplog選項
注:為了演示效果我們在備份過程,模擬數(shù)據(jù)插入
(2)準備測試數(shù)據(jù)
[mongod@db01 conf]$ mongo --port 28018
use oldboy
for(var i = 1 ;i < 100; i++) {
db.foo.insert({a:i});
}
my_repl:PRIMARY> db.oplog.rs.find({"op":"i"}).pretty()
# oplog 配合mongodump實現(xiàn)全備熱備
mongodump --port 28018 --oplog -o /mongodb/backup
作用介紹:--oplog 會記錄備份過程中的數(shù)據(jù)變化。會以oplog.bson保存下來
# 全備恢復
mongorestore --port 28018 --drop --oplogReplay /mongodb/backup
--drop 將重復的數(shù)據(jù)刪除,不加此參數(shù)會報錯
14.3 oplog高級應用
背景:每天0點全備,oplog恢復窗口為48小時
某天,上午10點world.city 業(yè)務表被誤刪除。
恢復思路:
0、停應用
2、找測試庫
3、恢復昨天晚上全備
4、截取全備之后到world.city誤刪除之間時間的oplog,并恢復到測試庫
5、將誤刪除表導出,恢復到生產(chǎn)庫
恢復步驟:
模擬故障環(huán)境:
1、全備數(shù)據(jù)庫
模擬原始數(shù)據(jù)
mongo --port 28017
use wo
for(var i = 1 ;i < 20; i++) {
db.ci.insert({a: i});
}
全備:
rm -rf /mongodb/backup/*
mongodump --port 28018 --oplog -o /mongodb/backup
--oplog功能:在備份同時,將備份過程中產(chǎn)生的日志進行備份
文件必須存放在/mongodb/backup下,自動命令為oplog.bson
再次模擬數(shù)據(jù)
db.ci1.insert({id:1})
db.ci2.insert({id:2})
2、上午10點:刪除wo庫下的ci表
10:00時刻,誤刪除
db.ci.drop()
show tables;
3、備份現(xiàn)有的oplog.rs表
mongodump --port 28018 -d local -c oplog.rs -o /mongodb/
ls /mongodb/local/
備份出來的文件記錄了所有的日志,它有冪等性,會跳過已有的日志
4、截取oplog并恢復到drop之前的位置
更合理的方法:登陸到原數(shù)據(jù)庫
[mongod@db03 local]$ mongo --port 28018
my_repl:PRIMARY> use local
db.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
思路:將oplog.rs日志的備份拷貝到全備目錄,重命名為oplog.bson,然后全備恢復,會自動讀取oplog.bson,跳過錯誤操作,恢復數(shù)據(jù)
[mongod@db03 backup]$ cd /mongodb/local/
[mongod@db03 local]$ ls
oplog.rs.bson oplog.rs.metadata.json
[mongod@db03 local]$ cp oplog.rs.bson /mongodb/backup/
cd /mongodb/backup/
mv oplog.rs.bson oplog.bson
# 恢復全備
mongorestore --port 38021 --oplogReplay --oplogLimit "1553659908:1" --drop /mongodb/backup/
--oplogReplay //重演oplog.bson
--oplogLimit "1553659908:1" //跳過錯誤操作
15、分片集群的備份思路(了解)
你要備份什么?
config server
shard 節(jié)點備份有什么困難和問題
(1)chunk遷移的問題
人為控制在備份的時候,避開chunk遷移的時間窗口
(2)shard節(jié)點之間的數(shù)據(jù)不在同一時間點。
保證節(jié)點數(shù)據(jù)時靜止時分片集群備份,同一時間點,用腳本將每個復制集去掉一個節(jié)點(rs.remove 節(jié)點名),數(shù)據(jù)就會靜止;就可以做一致性備份;備份完再將節(jié)點加上去
Ops Manager