Mongodb

第一章:邏輯結(jié)構(gòu)

Mongodb 邏輯結(jié)構(gòu) MySQL邏輯結(jié)構(gòu)

庫database 庫

集合(collection) 表

文檔(document) 數(shù)據(jù)行

選擇之所以稱之為選擇,肯定是痛苦的!

------->oldguo

第二章:安裝部署
1、系統(tǒng)準備

(1)redhat或centos6.2以上系統(tǒng)

(2)系統(tǒng)開發(fā)包完整

(3)ip地址和hosts文件解析正常

(4)iptables防火墻&SElinux關(guān)閉

(5)關(guān)閉大頁內(nèi)存機制

########################################################################

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

設置目錄結(jié)構(gòu)權(quán)限

chown -R mongod:mongod /mongodb

設置用戶環(huán)境變量

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

使用配置文件

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ù)存儲有關(guān)

storage:

journal:

  enabled: true

dbPath: "/mongodb/data" --數(shù)據(jù)路徑的位置

-- 進程控制

processManagement:

fork: true --后臺守護進程

pidFilePath: <string> --pid文件的位置,一般不用配置,可以去掉這行,自動生成到data中

--網(wǎng)絡配置有關(guān)

net:

bindIp: <ip> -- 監(jiān)聽地址

port: <port> -- 端口號,默認不配置端口號,是27017

-- 安全驗證有關(guān)配置

security:

authorization: enabled --是否打開用戶名密碼驗證

------------------以下是復制集與分片集群有關(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 默認存在的庫

test:登錄時默認存在的庫

管理MongoDB有關(guān)的系統(tǒng)庫

admin庫:系統(tǒng)預留庫,MongoDB系統(tǒng)管理庫

local庫:本地預留庫,存儲關(guān)鍵日志

config庫:MongoDB配置信息庫

show databases/show dbs

show tables/show collections

use admin

db/select database()

3.1 命令種類
db 對象相關(guān)命令

db.[TAB][TAB]

db.help()

db.oldboy.[TAB][TAB]

db.oldboy.help()

rs 復制集有關(guān)(replication set):

rs.[TAB][TAB]

rs.help()

sh 分片集群(sharding cluster)

sh.[TAB][TAB]

sh.help()

  1. mongodb對象操作

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:當插入一個文檔的時候,一個集合就會自動創(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})

以標準的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({})

查看集合存儲信息

app> db.log.totalSize() //集合中索引+數(shù)據(jù)壓縮存儲之后的大小

  1. 用戶及權(quán)限管理
    5.1 注意

驗證庫: 建立用戶時use到的庫,在使用用戶時,要加上驗證庫才能登陸。

對于管理員用戶,必須在admin下創(chuàng)建.

  1. 建用戶時,use到的庫,就是此用戶的驗證庫

  2. 登錄時,必須明確指定驗證庫才能登錄

  3. 通常,管理員用的驗證庫是admin,普通用戶的驗證庫一般是所管理的庫設置為驗證庫

  4. 如果直接登錄到數(shù)據(jù)庫,不進行use,默認的驗證庫是test,不是我們生產(chǎn)建議的.

  5. 從3.6 版本開始,不添加bindIp參數(shù),默認不讓遠程登錄,只能本地管理員登錄。

5.2 用戶創(chuàng)建語法

use admin

db.createUser

{

user: "<name>",

pwd: "<cleartext password>",

roles: [

  { role: "<role>",

db: "<database>" } | "<role>",

...

]

}

基本語法說明:

user:用戶名

pwd:密碼

roles:

role:角色名

db:作用對象

role:root, readWrite,read

驗證數(shù)據(jù)庫:

mongo -u oldboy -p 123 10.0.0.53/oldboy

5.3 用戶管理例子

創(chuàng)建超級管理員:管理所有數(shù)據(jù)庫(必須use admin再去創(chuàng)建)

$ 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()

創(chuà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()

5.4 刪除用戶(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

  1. 重點參數(shù)

net:

port: 27017

bindIp: 10.0.0.51,127.0.0.1

security:

authorization: enabled

6.1 基本原理

基本構(gòu)成是1主2從的結(jié)構(gòu),自帶互相監(jiān)控投票機制(Raft(MongoDB) Paxos(mysql MGR 用的是變種))

如果發(fā)生主庫宕機,復制集內(nèi)部會進行投票選舉,選擇一個新的主庫替代原有主庫對外提供服務。同時復制集會自動通知

客戶端程序,主庫已經(jīng)發(fā)生切換了。應用就會連接到新的主庫。

6.2 Replication Set配置過程詳解
6.2.1 規(guī)劃

三個以上的mongodb節(jié)點(或多實例)

6.2.2 環(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

  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)

查詢復制集狀態(tài)

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 查看復制集狀態(tài)

rs.status(); //查看整體復制集狀態(tài)

rs.isMaster(); // 查看當前是否是主節(jié)點

rs.conf(); //查看復制集配置信息

6.5.2 添加刪除節(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é)點

my_repl:PRIMARY> rs.addArb("10.0.0.53:28020")

3、查看節(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()

介紹:

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

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[2].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) //鎖定從,使其不會轉(zhuǎn)變成主庫

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é))

7.1 規(guī)劃

10個實例:38017-38026

(1)configserver:38018-38020

3臺構(gòu)成的復制集(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

7.2 Shard節(jié)點配置過程
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 修改配置文件:
第一組復制集搭建: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é)點: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 啟動所有節(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

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é)點配置
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啟動節(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

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 可以是一個節(jié)點,官方建議復制集。configserver不能有arbiter。

新版本中,要求必須是復制集。

注:mongodb 3.4之后,雖然要求config server為replica set,但是不支持arbiter

7.4 mongos節(jié)點配置:
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啟動mongos

mongos -f /mongodb/38017/conf/mongos.conf

7.5 分片集群添加節(jié)點

連接到其中一個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.1 RANGE分片配置及測試
1、激活數(shù)據(jù)庫分片功能

mongo --port 38017 admin

admin> ( { enablesharding : "數(shù)據(jù)庫名稱" } )

eg:

admin> db.runCommand( { enablesharding : "test" } )

2、指定分片鍵對集合分片

創(chuàng)建索引

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<1000000;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分片例子:

對oldboy庫下的vast大表進行hash

創(chuàng)建哈希索引

(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行數(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 查看分片的詳細信息

admin> sh.status()

7.7.6 刪除分片節(jié)點(謹慎)

(1)確認blance是否在工作

sh.getBalancerState()

(2)刪除shard2節(jié)點(謹慎)

mongos> db.runCommand( { removeShard: "shard2" } )

注意:刪除操作一定會立即觸發(fā)blancer。

7.8 balancer操作
7.8.1 介紹

mongos的一個重要功能,自動巡查所有shard節(jié)點上的chunk的情況,自動做chunk遷移。

什么時候工作?

1、自動運行,會檢測系統(tǒng)不繁忙的時候做遷移

2、在做節(jié)點刪除的時候,立即開始遷移工作

3、balancer只能在預設定的時間窗口內(nèi)運行

有需要時可以關(guān)閉和開啟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()

關(guān)于集合的balancer(了解下)

關(guān)閉某個集合的balance

sh.disableBalancing("students.grades")

打開某個集合的balancer

sh.enableBalancing("students.grades")

確定某個集合的balance是開啟或者關(guān)閉

db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;

  1. 備份恢復
    8.1 備份恢復工具介紹:

(1)** mongoexport/mongoimport

(2)***** mongodump/mongorestore

8.2 備份工具區(qū)別在哪里?

應用場景總結(jié):

mongoexport/mongoimport:json csv

1、異構(gòu)平臺遷移 mysql <---> mongodb

2、同平臺,跨大版本:mongodb 2 ----> mongodb 3

mongodump/mongorestore

日常備份恢復時使用.

8.3 導出工具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ù)。

  1. 單表備份至csv格式

如果我們需要導出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 導入工具mongoimport

$ mongoimport --help

參數(shù)說明:

-h:指明數(shù)據(jù)庫宿主機的IP

-u:指明數(shù)據(jù)庫的用戶名

-p:指明數(shù)據(jù)庫的密碼

-d:指明數(shù)據(jù)庫的名字

-c:指明collection的名字

-f:指明要導入那些列

-j, --numInsertionWorkers=<number> number of insert operations to run concurrently (defaults to 1)

//并行

數(shù)據(jù)恢復:

1.恢復json格式表數(shù)據(jù)到log1

mongoimport -uroot -proot123 --port 27017 --authenticationDatabase admin -d oldboy -c log1 /mongodb/log.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

(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 異構(gòu)平臺遷移案例

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 ',';

(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 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 '"'        ------字段中使用的轉(zhuǎn)義符為"

lines terminated by '\r\n';  ------行以\r\n結(jié)束

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產(chǎn)生的備份不一定是數(shù)據(jù)庫的實時快照,如果我們在備份時對數(shù)據(jù)庫進行了寫入操作,

則備份出來的文件可能不完全和Mongodb實時數(shù)據(jù)相等。另外在備份時可能會對其它客戶端性能產(chǎn)生不利的影響。

8.6.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, --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

8.7 mongodump和mongorestore高級企業(yè)應用(--oplog)

注意:這是replica set或者master/slave模式專用

--oplog

use oplog for taking a point-in-time snapshot

8.7.1 oplog介紹

在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

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)

8.7.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 --oplogReplay /mongodb/backup

8.8 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/backup

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

[mongod@db03 backup]$ cd /mongodb/backup/local/

[mongod@db03 local]$ ls

oplog.rs.bson oplog.rs.metadata.json

[mongod@db03 local]$ cp oplog.rs.bson ../oplog.bson

rm -rf /mongodb/backup/local/

mongorestore --port 38021 --oplogReplay --oplogLimit "1553659908:1" --drop /mongodb/backup/

8.9 分片集群的備份思路(了解)

1、你要備份什么?

config server

shard 節(jié)點

單獨進行備份

2、備份有什么困難和問題

(1)chunk遷移的問題

人為控制在備份的時候,避開遷移的時間窗口

(2)shard節(jié)點之間的數(shù)據(jù)不在同一時間點。

選業(yè)務量較少的時候

Ops Manager

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內(nèi)容

  • 第一章:邏輯結(jié)構(gòu) 第二章:安裝部署 1、系統(tǒng)準備 2、mongodb安裝 創(chuàng)建所需用戶和組 創(chuàng)建mongodb所需...
    極光01閱讀 402評論 0 0
  • 第一章:邏輯結(jié)構(gòu) 選擇之所以稱之為選擇,肯定是痛苦的!------->oldguo 第二章:安裝部署 1、系統(tǒng)準備...
    王亞飛1992閱讀 749評論 0 0
  • 第一章:邏輯結(jié)構(gòu) 第二章:安裝部署 1、系統(tǒng)準備 2、mongodb安裝 創(chuàng)建所需用戶和組 創(chuàng)建mongodb所需...
    zwb_jianshu閱讀 1,601評論 0 1
  • NoSql數(shù)據(jù)庫優(yōu)缺點 在優(yōu)勢方面主要體現(xiàn)在下面幾點: 簡單的擴展 快速的讀寫 低廉的成本 靈活的數(shù)據(jù)模型 在不足...
    dreamer_lk閱讀 2,753評論 0 6
  • 集群基本結(jié)構(gòu)搭建分片策略應用balancer管理 一, 圖解與規(guī)劃 1. 圖解 2. 規(guī)劃 10個實例:38017...
    火雞不肥閱讀 616評論 0 5