第一章:邏輯結(jié)構(gòu)
Mongodb 邏輯結(jié)構(gòu) MySQL邏輯結(jié)構(gòu)
庫database 庫
集合(collection) 表
文檔(document) 數(shù)據(jù)行
選擇之所以稱之為選擇,肯定是痛苦的!
第二章:安裝部署
1、系統(tǒng)準(zhǔn)備
1)redhat或centos6.2以上系統(tǒng)
(2)系統(tǒng)開發(fā)包完整
(3)ip地址和hosts文件解析正常
(4)iptables防火墻&SElinux關(guān)閉
(5)關(guān)閉大頁內(nèi)存機(jī)制
########################################################################
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
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag
其他系統(tǒng)關(guān)閉參照官方文檔:
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
---------------
為什么要關(guān)閉桅狠?
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安裝
創(chuàng)建所需用戶和組
useradd mongod
passwd mongod
創(chuàng)建mongodb所需目錄結(jié)構(gòu)
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
設(shè)置目錄結(jié)構(gòu)權(quán)限
chown -R mongod:mongod /mongodb
設(shè)置用戶環(huán)境變量
su - mongod
vi .bash_profile
export PATH=/mongodb/bin:$PATH
source .bash_profile
啟動(dòng)mongodb
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
登錄mongodb
[mongod@server2 ~]$ mongo
使用配置文件
YAML模式
NOTE:
YAML does not support tab characters for indentation: use spaces instead.
--系統(tǒng)日志有關(guān)
systemLog:
destination: file
path: "/mongodb/log/mongodb.log" --日志位置
logAppend: true --日志以追加模式記錄
--數(shù)據(jù)存儲(chǔ)有關(guān)
storage:
journal:
enabled: true
dbPath: "/mongodb/data" --數(shù)據(jù)路徑的位置
-- 進(jìn)程控制
processManagement:
fork: true --后臺(tái)守護(hù)進(jìn)程
pidFilePath: <string> --pid文件的位置殿雪,一般不用配置朽色,可以去掉這行,自動(dòng)生成到data中
--網(wǎng)絡(luò)配置有關(guān)
net:
bindIp: <ip> -- 監(jiān)聽地址
port: <port> -- 端口號(hào),默認(rèn)不配置端口號(hào)蘑险,是27017
-- 安全驗(yàn)證有關(guān)配置
security:
authorization: enabled --是否打開用戶名密碼驗(yàn)證
------------------以下是復(fù)制集與分片集群有關(guān)----------------------
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的關(guān)閉方式
mongod -f mongo.conf --shutdown
mongodb 使用systemd管理
[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
3、mongodb常用基本操作
3.0 mongodb 默認(rèn)存在的庫
test:登錄時(shí)默認(rèn)存在的庫
管理MongoDB有關(guān)的系統(tǒng)庫
admin庫:系統(tǒng)預(yù)留庫,MongoDB系統(tǒng)管理庫
local庫:本地預(yù)留庫,存儲(chǔ)關(guān)鍵日志
config庫:MongoDB配置信息庫
show databases/show dbs
show tables/show collections
use admin
db/select database()
3.1 命令種類
db 對(duì)象相關(guān)命令
db.[TAB][TAB]
db.help()
db.oldboy.[TAB][TAB]
db.oldboy.help()
rs 復(fù)制集有關(guān)(replication set):
rs.[TAB][TAB]
rs.help()
sh 分片集群(sharding cluster)
sh.[TAB][TAB]
sh.help()
4. mongodb對(duì)象操作
mongo mysql
庫 -----> 庫
集合 -----> 表
文檔 -----> 數(shù)據(jù)行
4.1 庫的操作
> use test
>db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
4.2 集合的操作
app> db.createCollection('a')
{ "ok" : 1 }
app> db.createCollection('b')
方法2:當(dāng)插入一個(gè)文檔的時(shí)候岳悟,一個(gè)集合就會(huì)自動(dòng)創(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})
4.3 文檔操作
數(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()
全表查詢:
> db.log.find()
每頁顯示50條記錄:
> DBQuery.shellBatchSize=50;
按照條件查詢
> db.log.find({uid:999})
以標(biāo)準(zhǔn)的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({})
查看集合存儲(chǔ)信息
app> db.log.totalSize() //集合中索引+數(shù)據(jù)壓縮存儲(chǔ)之后的大小
5. 用戶及權(quán)限管理
5.1 注意
驗(yàn)證庫: 建立用戶時(shí)use到的庫,在使用用戶時(shí)贵少,要加上驗(yàn)證庫才能登陸呵俏。
對(duì)于管理員用戶,必須在admin下創(chuàng)建.
1. 建用戶時(shí),use到的庫,就是此用戶的驗(yàn)證庫
2. 登錄時(shí),必須明確指定驗(yàn)證庫才能登錄
3. 通常,管理員用的驗(yàn)證庫是admin,普通用戶的驗(yàn)證庫一般是所管理的庫設(shè)置為驗(yàn)證庫
4. 如果直接登錄到數(shù)據(jù)庫,不進(jìn)行use,默認(rèn)的驗(yàn)證庫是test,不是我們生產(chǎn)建議的.
5. 從3.6 版本開始,不添加bindIp參數(shù)滔灶,默認(rèn)不讓遠(yuǎn)程登錄普碎,只能本地管理員登錄。
4.2 用戶創(chuàng)建語法
db.createUser
{
user: "<name>",
pwd: "<cleartext password>",
roles: [
{ role: "<role>",
db: "<database>" } | "<role>",
...
]
}
基本語法說明:
user:用戶名
pwd:密碼
roles:
role:角色名
db:作用對(duì)象
role:root, readWrite,read
驗(yàn)證數(shù)據(jù)庫:
mongo -u oldboy -p 123 10.0.0.53/oldboy
4.3 用戶管理例子
$ mongo
use admin
db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
}
)
驗(yàn)證用戶
db.auth('root','root123')
配置文件中录平,加入以下配置
security:
authorization: enabled
重啟mongodb
mongod -f /mongodb/conf/mongo.conf --shutdown
mongod -f /mongodb/conf/mongo.conf
登錄驗(yàn)證
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()
創(chuàng)建應(yīng)用用戶
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到驗(yàn)證庫)
刪除用戶
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 用戶管理注意事項(xiàng)
1. 建用戶要有驗(yàn)證庫,管理員admin斗这,普通用戶是要管理的庫
2. 登錄時(shí)动猬,注意驗(yàn)證庫
mongo -uapp01 -papp01 10.0.0.51:27017/oldboy
3. 重點(diǎn)參數(shù)
net:
port: 27017
bindIp: 10.0.0.51,127.0.0.1
security:
authorization: enabled
6. MongoDB復(fù)制集RS(ReplicationSet)
6.1 基本原理
基本構(gòu)成是1主2從的結(jié)構(gòu),自帶互相監(jiān)控投票機(jī)制(Raft(MongoDB) Paxos(mysql MGR 用的是變種))
如果發(fā)生主庫宕機(jī)表箭,復(fù)制集內(nèi)部會(huì)進(jìn)行投票選舉赁咙,選擇一個(gè)新的主庫替代原有主庫對(duì)外提供服務(wù)。同時(shí)復(fù)制集會(huì)自動(dòng)通知
客戶端程序免钻,主庫已經(jīng)發(fā)生切換了彼水。應(yīng)用就會(huì)連接到新的主庫。
6.2 Replication Set配置過程詳解
6.2.1 規(guī)劃
三個(gè)以上的mongodb節(jié)點(diǎn)(或多實(shí)例)
6.2 環(huán)境準(zhǔn)備
多個(gè)端口:
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
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
啟動(dòng)多個(gè)實(shí)例備用
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 配置普通復(fù)制集:
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)
查詢復(fù)制集狀態(tài)
rs.status();
6.4 1主1從1個(gè)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 復(fù)制集管理操作
6.5.1 查看復(fù)制集狀態(tài)
rs.status(); //查看整體復(fù)制集狀態(tài)
rs.isMaster(); // 查看當(dāng)前是否是主節(jié)點(diǎn)
rs.conf()盯桦; //查看復(fù)制集配置信息
6.5.2 添加刪除節(jié)點(diǎn)
rs.remove("ip:port"); // 刪除一個(gè)節(jié)點(diǎn)
rs.add("ip:port"); // 新增從節(jié)點(diǎn)
rs.addArb("ip:port"); // 新增仲裁節(jié)點(diǎn)
例子:
添加 arbiter節(jié)點(diǎn)
1澡绩、連接到主節(jié)點(diǎn)
[mongod@db03 ~]$ mongo --port 28018 admin
2、添加仲裁節(jié)點(diǎn)
my_repl:PRIMARY> rs.addArb("10.0.0.53:28020")
3俺附、查看節(jié)點(diǎn)狀態(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"); // 刪除一個(gè)節(jié)點(diǎn)
例子:
my_repl:PRIMARY> rs.remove("10.0.0.53:28019");
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
rs.add("ip:port"); // 新增從節(jié)點(diǎn)
例子:
my_repl:PRIMARY> rs.add("10.0.0.53:28019")
{ "ok" : 1 }
my_repl:PRIMARY> rs.isMaster()
6.5.3 特殊從節(jié)點(diǎn)
介紹:
arbiter節(jié)點(diǎn):主要負(fù)責(zé)選主過程中的投票肥卡,但是不存儲(chǔ)任何數(shù)據(jù),也不提供任何服務(wù)
hidden節(jié)點(diǎn):隱藏節(jié)點(diǎn)事镣,不參與選主步鉴,也不對(duì)外提供服務(wù)。
delay節(jié)點(diǎn):延時(shí)節(jié)點(diǎn)璃哟,數(shù)據(jù)落后于主庫一段時(shí)間氛琢,因?yàn)閿?shù)據(jù)是延時(shí)的,也不應(yīng)該提供服務(wù)或參與選主随闪,所以通常會(huì)配合hidden(隱藏)
一般情況下會(huì)將delay+hidden一起配置使用
配置延時(shí)節(jié)點(diǎn)(一般延時(shí)節(jié)點(diǎn)也配置成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()
查看副本集各成員的狀態(tài)
admin> rs.status()
++++++++++++++++++++++++++++++++++++++++++++++++
--副本集角色切換(不要人為隨便操作)
admin> rs.stepDown()
注:
admin> rs.freeze(300) //鎖定從,使其不會(huì)轉(zhuǎn)變成主庫
freeze()和stepDown單位都是秒铐伴。
+++++++++++++++++++++++++++++++++++++++++++++
設(shè)置副本節(jié)點(diǎn)可讀:在副本節(jié)點(diǎn)執(zhí)行
admin> rs.slaveOk()
eg:
admin> use app
switched to db app
app> db.createCollection('a')
{ "ok" : 0, "errmsg" : "not master", "code" : 10107 }
查看副本節(jié)點(diǎn)(監(jiān)控主從延時(shí))
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日志(備份恢復(fù)章節(jié))
7. MongoDB Sharding Cluster 分片集群
7.1 規(guī)劃
10個(gè)實(shí)例:38017-38026
(1)configserver:38018-38020
3臺(tái)構(gòu)成的復(fù)制集(1主兩從撮奏,不支持arbiter)38018-38020(復(fù)制集名字configsvr)
(2)shard節(jié)點(diǎn):
sh1:38021-23 (1主兩從,其中一個(gè)節(jié)點(diǎn)為arbiter当宴,復(fù)制集名字sh1)
sh2:38024-26 (1主兩從畜吊,其中一個(gè)節(jié)點(diǎn)為arbiter,復(fù)制集名字sh2)
(3) mongos:
38017
7.2 Shard節(jié)點(diǎn)配置過程
7.2.1 目錄創(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
7.2.2 修改配置文件:
第一組復(fù)制集搭建: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
第二組節(jié)點(diǎn):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 啟動(dòng)所有節(jié)點(diǎn)户矢,并搭建復(fù)制集
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節(jié)點(diǎn)配置
7.3.1 目錄創(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
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啟動(dòng)節(jié)點(diǎn)玲献,并配置復(fù)制集
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 可以是一個(gè)節(jié)點(diǎn),官方建議復(fù)制集梯浪。configserver不能有arbiter捌年。
新版本中,要求必須是復(fù)制集挂洛。
注:mongodb 3.4之后礼预,雖然要求config server為replica set,但是不支持arbiter
7.4 mongos節(jié)點(diǎn)配置:
7.4.1創(chuàng)建目錄:
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啟動(dòng)mongos
mongos -f /mongodb/38017/conf/mongos.conf
7.5 分片集群添加節(jié)點(diǎn)
連接到其中一個(gè)mongos(10.0.0.51)抹锄,做以下配置
(1)連接到mongs的admin數(shù)據(jù)庫
# 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)整體狀態(tài)查看
mongos> sh.status();
7.6 使用分片集群
7.6.1 RANGE分片配置及測試
test庫下的vast大表進(jìn)行手工分片
1逆瑞、激活數(shù)據(jù)庫分片功能
mongo --port 38017 admin
admin> ( { enablesharding : "數(shù)據(jù)庫名稱" } )
eg:
admin> db.runCommand( { enablesharding : "test" } )
2、指定分片建對(duì)集合分片
eg:范圍片鍵
創(chuàng)建索引
use test
> db.vast.ensureIndex( { id: 1 } )
開啟分片
use admin
> db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
3伙单、集合分片驗(yàn)證
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、分片結(jié)果測試
shard1:
mongo --port 38021
db.vast.count();
shard2:
mongo --port 38024
db.vast.count();
7.6.2 Hash分片例子:
對(duì)oldboy庫下的vast大表進(jìn)行hash
創(chuàng)建哈希索引
(1)對(duì)于oldboy開啟分片功能
mongo --port 38017 admin
use admin
admin> db.runCommand( { enablesharding : "oldboy" } )
(2)對(duì)于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分片結(jié)果測試
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 列出開啟分片的數(shù)據(jù)庫
admin> use config
config> db.databases.find( { "partitioned": true } )
或者:
config> db.databases.find() //列出所有數(shù)據(jù)庫分片情況
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 查看分片的詳細(xì)信息
admin> sh.status()
7.7.6 刪除分片節(jié)點(diǎn)(謹(jǐn)慎)
(1)確認(rèn)blance是否在工作
sh.getBalancerState()
(2)刪除shard2節(jié)點(diǎn)(謹(jǐn)慎)
mongos> db.runCommand( { removeShard: "shard2" } )
注意:刪除操作一定會(huì)立即觸發(fā)blancer哈肖。
7.8 balancer操作
7.8.1 介紹
mongos的一個(gè)重要功能吻育,自動(dòng)巡查所有shard節(jié)點(diǎn)上的chunk的情況,自動(dòng)做chunk遷移淤井。
什么時(shí)候工作布疼?
1摊趾、自動(dòng)運(yùn)行,會(huì)檢測系統(tǒng)不繁忙的時(shí)候做遷移
2游两、在做節(jié)點(diǎn)刪除的時(shí)候砾层,立即開始遷移工作
3、balancer只能在預(yù)設(shè)定的時(shí)間窗口內(nèi)運(yùn)行
有需要時(shí)可以關(guān)閉和開啟blancer(備份的時(shí)候)
mongos> sh.stopBalancer()
mongos> sh.startBalancer()
7.8.2 自定義 自動(dòng)平衡進(jìn)行的時(shí)間段
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()
關(guān)于集合的balancer(了解下)
關(guān)閉某個(gè)集合的balance
sh.disableBalancing("students.grades")
打開某個(gè)集合的balancer
sh.enableBalancing("students.grades")
確定某個(gè)集合的balance是開啟或者關(guān)閉
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
8. 備份恢復(fù)
8.1 備份恢復(fù)工具介紹:
(1)** mongoexport/mongoimport
(2)***** mongodump/mongorestore
8.2 備份工具區(qū)別在哪里贱案?
應(yīng)用場景總結(jié):
mongoexport/mongoimport:json csv
1肛炮、異構(gòu)平臺(tái)遷移 mysql <---> mongodb
2、同平臺(tái)宝踪,跨大版本:mongodb 2 ----> mongodb 3
mongodump/mongorestore
日常備份恢復(fù)時(shí)使用.
8.3 導(dǎo)出工具mongoexport
mongoexport具體用法如下所示:
$ mongoexport --help
參數(shù)說明:
-h:指明數(shù)據(jù)庫宿主機(jī)的IP
-u:指明數(shù)據(jù)庫的用戶名
-p:指明數(shù)據(jù)庫的密碼
-d:指明數(shù)據(jù)庫的名字
-c:指明collection的名字
-f:指明要導(dǎo)出那些列
-o:指明到要導(dǎo)出的文件名
-q:指明導(dǎo)出數(shù)據(jù)的過濾條件
--authenticationDatabase admin
1.單表備份至json格式
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log -o /mongodb/log.json
注:備份文件的名字可以自定義侨糟,默認(rèn)導(dǎo)出了JSON格式的數(shù)據(jù)。
2. 單表備份至csv格式
如果我們需要導(dǎo)出CSV格式的數(shù)據(jù)瘩燥,則需要使用----type=csv參數(shù):
mongoexport -uroot -proot123 --port 27017 --authenticationDatabase admin -d test -c log --type=csv -f uid,name,age,date -o /mongodb/log.csv
8.4 導(dǎo)入工具mongoimport
$ mongoimport --help
參數(shù)說明:
-h:指明數(shù)據(jù)庫宿主機(jī)的IP
-u:指明數(shù)據(jù)庫的用戶名
-p:指明數(shù)據(jù)庫的密碼
-d:指明數(shù)據(jù)庫的名字
-c:指明collection的名字
-f:指明要導(dǎo)入那些列
-j, --numInsertionWorkers=<number> number of insert operations to run concurrently (defaults to 1)
//并行
數(shù)據(jù)恢復(fù):
1.恢復(fù)json格式表數(shù)據(jù)到log1
mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.json
2.恢復(fù)csv格式的文件到log2
上面演示的是導(dǎo)入JSON格式的文件中的內(nèi)容秕重,如果要導(dǎo)入CSV格式文件中的內(nèi)容,則需要通過--type參數(shù)指定導(dǎo)入格式厉膀,具體如下所示:
錯(cuò)誤的恢復(fù)
注意:
(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:指明第一行是列名服鹅,不需要導(dǎo)入汰具。
8.5 異構(gòu)平臺(tái)遷移案例
mysql -----> mongodb
world數(shù)據(jù)庫下city表進(jìn)行導(dǎo)出,導(dǎo)入到mongodb
(1)mysql開啟安全路徑
vim /etc/my.cnf --->添加以下配置
secure-file-priv=/tmp
--重啟數(shù)據(jù)庫生效
/etc/init.d/mysqld restart
(2)導(dǎo)出mysql的city表數(shù)據(jù)
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中導(dǎo)入備份
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';
導(dǎo)入:
提示留荔,使用infomation_schema.columns + information_schema.tables
mysql導(dǎo)出csv:
select * from test_info
into outfile '/tmp/test.csv'
fields terminated by ',' ------字段間以,號(hào)分隔
optionally enclosed by '"' ------字段用"號(hào)括起
escaped by '"' ------字段中使用的轉(zhuǎn)義符為"
lines terminated by '\r\n'; ------行以\r\n結(jié)束
mysql導(dǎo)入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運(yùn)行時(shí)進(jìn)行備份,它的工作原理是對(duì)運(yùn)行的Mongodb做查詢澜倦,然后將所有查到的文檔寫入磁盤聚蝶。
但是存在的問題時(shí)使用mongodump產(chǎn)生的備份不一定是數(shù)據(jù)庫的實(shí)時(shí)快照,如果我們?cè)趥浞輹r(shí)對(duì)數(shù)據(jù)庫進(jìn)行了寫入操作藻治,
則備份出來的文件可能不完全和Mongodb實(shí)時(shí)數(shù)據(jù)相等碘勉。另外在備份時(shí)可能會(huì)對(duì)其它客戶端性能產(chǎn)生不利的影響。
8.6.2 mongodump用法如下:
$ mongodump --help
參數(shù)說明:
-h:指明數(shù)據(jù)庫宿主機(jī)的IP
-u:指明數(shù)據(jù)庫的用戶名
-p:指明數(shù)據(jù)庫的密碼
-d:指明數(shù)據(jù)庫的名字
-c:指明collection的名字
-o:指明到要導(dǎo)出的文件名
-q:指明導(dǎo)出數(shù)據(jù)的過濾條件
-j, --numParallelCollections= number of collections to dump in parallel (4 by default)
--oplog 備份的同時(shí)備份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
恢復(fù)world庫
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d world1 /mongodb/backup/world
恢復(fù)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表示恢復(fù)的時(shí)候把之前的集合drop掉(危險(xiǎn))
$ mongorestore -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy --drop /mongodb/backup/oldboy
*****6桩卵、mongodump和mongorestore高級(jí)企業(yè)應(yīng)用(--oplog)