第一章:邏輯結構
Mongodb 邏輯結構 MySQL邏輯結構
庫database 庫
集合(collection) 表
文檔(document) 數據行
選擇之所以稱之為選擇,肯定是痛苦的!
------->oldguo
第二章:安裝部署
1、系統準備
(1)redhat或cnetos6.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/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
其他系統關閉參照官方文檔:
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
---------------
為什么要關閉?
Transparent Huge Pages (THP) is a Linux memory management system
that reduces the overhead of Translation Lookaside Buffer (TLB)
lookups on machines with large amounts of memory by using larger memory pages.
However, database workloads often perform poorly with THP,
because they tend to have sparse rather than contiguous memory access patterns.
You should disable THP on Linux machines to ensure best performance with MongoDB.
############################################################################
2、mongodb安裝
創建所需用戶和組
useradd mongod
passwd mongod
創建mongodb所需目錄結構
mkdir -p /mongodb/conf
mkdir -p /mongodb/log
mkdir -p /mongodb/data
上傳并解壓軟件到指定位置
cd /server/tools/
解壓:
tar xf mongodb-linux-x86_64-rhel70-3.2.16.tgz
拷貝目錄下bin程序到/mongodb/bin
cp -a /server/tools/mongodb-linux-x86_64-rhel70-3.2.16/bin/* /mongodb/bin
設置目錄結構權限
chown -R mongod:mongod /mongodb
設置用戶環境變量
su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile
啟動mongodb
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
登錄mongodb
[mongod@server2 ~]$ mongo
使用配置文件
vim /mongodb/conf/mongodb.conf
logpath=/mongodb/log/mongodb.log
dbpath=/mongodb/data
port=27017
logappend=true
fork=true
+++++++++++++++++++
關閉mongodb
mongod -f /mongodb/conf/mongodb.conf --shutdown
使用配置文件啟動mongodb
mongod -f /mongodb/conf/mongodb.conf
YAML模式
NOTE:
YAML does not support tab characters for indentation: use spaces instead.
--系統日志有關
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式記錄
--數據存儲有關
storage:
journal:
enabled: true
dbPath: "/mongodb/data" --數據路徑的位置
-- 進程控制
processManagement:
fork: true --后臺守護進程
pidFilePath: <string> --pid文件的位置,一般不用配置,可以去掉這行,自動生成到data中
--網絡配置有關
net:
bindIp: <ip> -- 監聽地址
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 mongodb.conf --shutdown
mongodb 使用systemd管理
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
3、mongodb常用基本操作
3.0 mongodb 默認存在的庫
test:登錄時默認存在的庫
管理mongodb有關的系統庫
admin庫:系統預留庫,mongodb系統管理庫
local庫:本地預留庫,存儲關鍵日志
3.1 命令種類
數據庫對象(
庫(database),
表(collection),
行(document))
db.命令
DB級別命令
db.[TAB] 類似于linux中的tab功能
db.help() db級別的命令使用幫助
collection級別操作
db.Collection_name.xxx
document級別操作
db.t1.insert()
db.t1.update()
db.t1.deleteMany()
db.t1.find()
db.t1.remove()
復制集有關(replication set):
rs.
分片集群(sharding cluster)
sh.
3.2、幫助
help
KEYWORDS.help()
KEYWORDS.[TAB]
db.help()
db.a.help()
rs.help()
sh.help()
3.3 基本操作
3.3.1 庫的基本操作
db.version()
db
show dbs
use local
db.stats()
db.dropDatabase()
3.3.2 集合基本操作
show tables;
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 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})
4.3 文檔操作
數據錄入:
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new
Date()})}
查詢數據行數:
> 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參數,默認不讓遠程登錄,只能本地管理員登錄。
用戶創建語法
use admin
db.createUser
{
user: "<name>",
pwd: "<cleartext password>",
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
基本語法說明:
user:用戶名
pwd:密碼
roles:
role:角色名
db:作用對象
role:root, readWrite,read
驗證數據庫:
mongo -u oldboy -p 123 10.0.0.53/oldboy
5.4 用戶管理例子
創建超級管理員:管理所有數據庫(必須use admin再去創建)
$ mongo
use admin
db.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 admin
mongo -uroot -proot123 10.0.0.53/admin
或者
mongo
use admin
db.auth('root','root123')
查看用戶:
use admin
db.system.users.find().pretty()
創建應用用戶
use oldboy
db.createUser(
{
user: "app01",
pwd: "app01",
roles: [ { role: "readWrite" , db: "oldboy" } ]
}
)
mongo -uapp01 -papp01 app
查詢mongodb中的用戶信息
mongo -uroot -proot123 10.0.0.53/admin
db.system.users.find().pretty()
刪除用戶(root身份登錄,use到驗證庫)
刪除用戶
db.createUser({user: "app02",pwd: "app02",roles: [ { role: "readWrite" , db: "oldboy1" } ]})
mongo -uroot -proot123 10.0.0.53/admin
use oldboy1
db.dropUser("app02")
5.5 用戶管理注意事項
1\. 建用戶要有驗證庫,管理員admin,普通用戶是要管理的庫
2\. 登錄時,注意驗證庫
mongo -uapp01 -papp01 10.0.0.51:27017/oldboy
3\. 重點參數
net:
port: 27017
bindIp: 10.0.0.51,127.0.0.1
security:
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 環境準備
多個端口:
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
配置文件內容
cat > /mongodb/28017/conf/mongod.conf <<EOF
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 10.0.0.51,127.0.0.1
port: 28017
replication:
oplogSizeMB: 2048
replSetName: my_repl
EOF
\cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/
\cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/
\cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/
sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i
sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i
sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i
啟動多個實例備用
mongod -f /mongodb/28017/conf/mongod.conf
mongod -f /mongodb/28018/conf/mongod.conf
mongod -f /mongodb/28019/conf/mongod.conf
mongod -f /mongodb/28020/conf/mongod.conf
netstat -lnp|grep 280
6.3 配置普通復制集:
1主2從,從庫普通從庫
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'}]
}
rs.initiate(config)
查詢復制集狀態
rs.status();
6.4 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)
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 --port 28018 admin
2、添加仲裁節點
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 特殊從節點
介紹:
arbiter節點:主要負責選主過程中的投票,但是不存儲任何數據,也不提供任何服務
hidden節點:隱藏節點,不參與選主,也不對外提供服務。
delay節點:延時節點,數據落后于主庫一段時間,因為數據是延時的,也不應該提供服務或參與選主,所以通常會配合hidden(隱藏)
一般情況下會將delay+hidden一起配置使用
配置延時節點(一般延時節點也配置成hidden)
cfg=rs.conf()
cfg.members[2].priority=0
cfg.members[2].hidden=true
cfg.members[2].slaveDelay=120
rs.reconfig(cfg)
cfg=rs.conf()
cfg.members[2].priority=0
cfg.members[2].hidden=true
cfg.members[2].slaveDelay=120
rs.reconfig(cfg)
取消以上配置
cfg=rs.conf()
cfg.members[2].priority=1
cfg.members[2].hidden=false
cfg.members[3].slaveDelay=0
rs.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> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }
查看副本節點(監控主從延時)
admin> rs.printSlaveReplicationInfo()
source: 192.168.1.22:27017
syncedTo: Thu May 26 2016 10:28:56 GMT+0800 (CST)
0 secs (0 hrs) behind the primary
OPlog日志(備份恢復章節)
7. MongoDB Sharding Cluster 分片集群
7.1 規劃
10個實例:38017-38026
(1)configserver:38018-38020
3臺構成的復制集(1主兩從,不支持arbiter)38018-38020(復制集名字configsvr)
(2)shard節點:
sh1:38021-23 (1主兩從,其中一個節點為arbiter,復制集名字sh1)
sh2:38024-26 (1主兩從,其中一個節點為arbiter,復制集名字sh2)
(3) mongos:
38017
7.2 Shard節點配置過程
7.2.1 目錄創建:
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
7.2.2 修改配置文件:
第一組復制集搭建: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.51,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
第二組節點: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.51,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
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 mongod
mongo --port 38021
use admin
config = {_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 admin
config = {_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/data
mkdir -p /mongodb/38019/conf /mongodb/38019/log /mongodb/38019/data
mkdir -p /mongodb/38020/conf /mongodb/38020/log /mongodb/38020/data
7.3.2修改配置文件:
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.51,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
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 38018
use 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 <<EOF
systemLog:
destination: file
path: /mongodb/38017/log/mongos.log
logAppend: true
net:
bindIp: 10.0.0.51,127.0.0.1
port: 38017
sharding:
configDB: configReplSet/10.0.0.51:38018,10.0.0.51:38019,10.0.0.51:38020
processManagement:
fork: true
EOF
7.4.3啟動mongos
mongos -f /mongodb/38017/conf/mongos.conf
7.5 分片集群添加節點
連接到其中一個mongos(10.0.0.51),做以下配置
(1)連接到mongs的admin數據庫
# su - mongod
$ mongo 10.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分片配置及測試
test庫下的vast大表進行手工分片
1、激活數據庫分片功能
mongo --port 38017 admin
admin> ( { enablesharding : "數據庫名稱" } )
eg:
admin> db.runCommand( { enablesharding : "test" } )
2、指定分片建對集合分片
eg:范圍片鍵
創建索引
use test
> db.vast.ensureIndex( { id: 1 } )
開啟分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
3、集合分片驗證
admin> use test
test> for(i=1;i<500000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
test> db.vast.stats()
4、分片結果測試
shard1:
mongo --port 38021
db.vast.count();
shard2:
mongo --port 38024
db.vast.count();
7.6.2 Hash分片例子:
對oldboy庫下的vast大表進行hash
創建哈希索引
(1)對于oldboy開啟分片功能
mongo --port 38017 admin
use 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行數據測試
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();
7.7 分片集群的查詢及管理
7.7.1 判斷是否Shard集群
admin> db.runCommand({ isdbgrid : 1})
7.7.2 列出所有分片信息
admin> db.runCommand({ listshards : 1})
7.7.3 列出開啟分片的數據庫
admin> use config
config> 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 mongos
use config
sh.setBalancerState( true )
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )
sh.getBalancerWindow()
sh.status()
關于集合的balancer(了解下)
關閉某個集合的balance
sh.disableBalancing("students.grades")
打開某個集合的balancer
sh.enableBalancing("students.grades")
確定某個集合的balance是開啟或者關閉
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
8. 備份恢復
8.1 備份恢復工具介紹:
(1)** mongoexport/mongoimport
(2)***** mongodump/mongorestore
8.2 備份工具區別在哪里?
應用場景總結:
mongoexport/mongoimport:json csv
1、異構平臺遷移 mysql <---> mongodb
2、同平臺,跨大版本:mongodb 2 ----> mongodb 3
mongodump/mongorestore
日常備份恢復時使用.
================================================
8.3 導出工具mongoexport
mongoexport具體用法如下所示:
$ mongoexport --help
參數說明:
-h:指明數據庫宿主機的IP
-u:指明數據庫的用戶名
-p:指明數據庫的密碼
-d:指明數據庫的名字
-c:指明collection的名字
-f:指明要導出那些列
-o:指明到要導出的文件名
-q:指明導出數據的過濾條件
--authenticationDatabase admin
1.單表備份至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.sql
select * 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 | | | |
| 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 --file /tmp/city1.csv
use world
db.city.find({CountryCode:"CHN"});
-------------
world共100張表,全部遷移到mongodb
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';
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 to dump in parallel (4 by default)
--oplog 備份的同時備份oplog
8.6.3 mongodump和mongorestore基本使用
全庫備份
mkdir /mongodb/backup
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup
備份world庫
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -o /mongodb/backup/
備份oldboy庫下的log集合
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/backup/
壓縮備份
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldguo -o /mongodb/backup/ --gzip
mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -o /mongodb/backup/ --gzip
$ mongodump -uroot -proot123 --port 27017 --authenticationDatabase admin -d app -c vast -o /mongodb/backup/ --gzip
恢復world庫
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world
恢復oldguo庫下的t1集合
[mongod@db03 oldboy]$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world -c t1 --gzip /mongodb/backup.bak/oldboy/log1.bson.gz
drop表示恢復的時候把之前的集合drop掉(危險)
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy
*****6、mongodump和mongorestore高級企業應用(--oplog)
注意:這是replica set或者master/slave模式專用
--oplog
use oplog for taking a point-in-time snapshot
6.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 cmd
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)
6.2、oplog企業級應用
(1)實現熱備,在備份時使用--oplog選項
注:為了演示效果我們在備份過程,模擬數據插入
(2)準備測試數據
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實現熱備
mongodump --port 28017 --oplog -o /mongodb/backup
作用介紹:--oplog 會記錄備份過程中的數據變化。會以oplog.bson保存下來
恢復
mongorestore --port 28017 --oplogReplay /mongodb/backup
!!!!!!!!!!oplog高級應用 ==========binlog應用
背景:每天0點全備,oplog恢復窗口為48小時
某天,上午10點world.city 業務表被誤刪除。
恢復思路:
0、停應用
2、找測試庫
3、恢復昨天晚上全備
4、截取全備之后到world.city誤刪除時間點的oplog,并恢復到測試庫
5、將誤刪除表導出,恢復到生產庫
恢復步驟:
模擬故障環境:
1、全備數據庫
模擬原始數據
mongo --port 28017
use wo
for(var i = 1 ;i < 20; i++) {
db.ci.insert({a: i});
}
全備:
rm -rf /mongodb/backup/*
mongodump --port 28017 --oplog -o /mongodb/backup
--oplog功能:在備份同時,將備份過程中產生的日志進行備份
文件必須存放在/mongodb/backup下,自動命令為oplog.bson
再次模擬數據
db.ci1.insert({id:1})
db.ci2.insert({id:2})
2、上午10點:刪除wo庫下的ci表
10:00時刻,誤刪除
db.ci.drop()
show tables;
3、備份現有的oplog.rs表
mongodump --port 28017 -d local -c oplog.rs -o /mongodb/backup
4、截取oplog并恢復到drop之前的位置
更合理的方法:登陸到原數據庫
[mongod@db03 local]$ mongo --port 28017
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
[mongod@db03 backup][圖片上傳失敗...(image-193a69-1556879801033)]
ls
oplog.rs.bson oplog.rs.metadata.json
[mongod@db03 local]$ cp oplog.rs.bson ../oplog.bson
rm -rf /mongodb/backup/local/
mongorestore --port 28017 --oplogReplay --oplogLimit "1553659908:1" --drop /mongodb/backup/
**分片集群的備份思路(了解)
1、你要備份什么?
config server
shard 節點
單獨進行備份
2、備份有什么困難和問題
(1)chunk遷移的問題
人為控制在備份的時候,避開遷移的時間窗口
(2)shard節點之間的數據不在同一時間點。
選業務量較少的時候
Ops Manager