mongoDB 副本集 分片

MongoDB介紹

官網www.mongodb.com, 當前最新版3.4
C++編寫,基於分佈式的,屬於NoSQL的一種
在NoSQL中是最像關係型數據庫的
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔、數組及文檔數組。
關於JSON http://www.w3school.com.cn/json/index.asp
由於基於分佈式,因此很容易擴展
 
MongoDB和關係型數據庫對比
 

關係型數據庫數據結構php

 

MongoDB數據結構linux

 

MongoDB安裝

epel自帶的mongodb版本爲2.6,咱們須要安裝3.4版本
• 官方安裝文檔https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/
[root@harry-01 ~]# cd /etc/yum.repos.d/
[root@harry-01 yum.repos.d]# vim mongodb-org-3.4.reop
[mongodb-org-3.4]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

[root@harry-01 yum.repos.d]# yum list | grep mongodb 
[root@harry-01 yum.repos.d]# yum list | grep mongodb
mongodb-org.x86_64                         3.4.19-1.el7                mongodb-org-3.4
mongodb-org-mongos.x86_64                  3.4.19-1.el7                mongodb-org-3.4
mongodb-org-server.x86_64                  3.4.19-1.el7                mongodb-org-3.4
mongodb-org-shell.x86_64                   3.4.19-1.el7                mongodb-org-3.4
mongodb-org-tools.x86_64
[root@harry-01 yum.repos.d]# yum -y install mongodb-org
已加載插件:fastestmirror
Loading mirror speeds from cached hostfile
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: ap.stykers.moe
正在解決依賴關係
--> 正在檢查事務
---> 軟件包 mongodb-org.x86_64.0.3.4.19-1.el7 將被 安裝

/etc/mongo.conf  //mongoDB的配置文件web

 

 

鏈接MongoDBmongodb

systemctl start mongod //啓動服務shell

[root@harry-01 ~]# systemctl start mongod 
[root@harry-01 ~]# ps aux | grep mongod
mongod     6553  1.5  2.1 973328 40952 ?        Sl   13:06   0:00 /usr/bin/mongod -f /etc/mongod.conf
root       6581  0.0  0.0 112724   988 pts/1    R+   13:07   0:00 grep --color=auto mongod
[root@harry-01 ~]# netstat -lntp | grep mongo
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      6553/mongod         
[root@harry-01 ~]# netstat -lntp | grep mongod
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      6553/mongod         
[root@harry-01 ~]#

在本機能夠直接運行命令mongo進入到mongodb shell中數據庫

[root@harry-01 ~]# mongo
MongoDB shell version v3.4.19
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.19
Welcome to the MongoDB shell.

若是mongodb監聽端口並非默認的27017,則在鏈接的時候須要加--port 選項json

mongo --port 27018
 鏈接遠程mongodb,須要加--host,例如
 mongo --host  127.0.0.1

若是設置了驗證,則在鏈接的時候須要帶用戶名和密碼vim

mongo -uusername -ppasswd --authenticationDatabase db

 

MongoDB用戶管理

user指定用戶,customData爲說明字段,能夠省略,pwd爲密碼,roles指定用戶的角色,db指定庫名
use admin //切換到admin庫
db.system.users.find()  //列出全部用戶,須要切換到admin庫
show users  //查看當前庫下全部的用戶
db.dropUser('admin') //刪除用戶
[root@harry-01 ~]# mongo -u "admin" -p "123123" --authenticationDatabase "admin"
> use admin
switched to db admin
> db.createUser({user:"admin",customData:{description:"superuser"},pwd:"123123",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
	"user" : "admin",
	"customData" : {
		"description" : "superuser"
	},
	"roles" : [
		{
			"role" : "root",
			"db" : "admin"
		}
	]
}

 

> use db1
switched to db db1
> db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } )
Successfully added user: {
	"user" : "test1",
	"roles" : [
		{
			"role" : "readWrite",
			"db" : "db1"
		},
		{
			"role" : "read",
			"db" : "db2"
		}
	]
}
>
test1用戶對db1庫讀寫,對db2庫只讀。
• 之因此先use db1,表示用戶在 db1 庫中建立,就必定要db1庫驗證身份,即用戶的信息跟隨隨數據庫。好比上述 test1雖然有 db2 庫的讀取權限,可是必定要先在db1庫進行身份驗證,直接訪問會提示驗證失敗。
> use db1
switched to db db1
> db.auth("test1","123aaa")
1

 

MongoDB用戶角色數組

•Read:容許用戶讀取指定數據庫
• readWrite:容許用戶讀寫指定數據庫
• dbAdmin:容許用戶在指定數據庫中執行管理函數,如索引建立、刪除,查看統計或訪問system.profile
• userAdmin:容許用戶向system.users集合寫入,能夠找指定數據庫裏建立、刪除和管理用戶
• clusterAdmin:只在admin數據庫中可用,賦予用戶全部分片和複製集相關函數的管理權限。
• readAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀權限
• readWriteAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的讀寫權限
• userAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的userAdmin權限
• dbAdminAnyDatabase:只在admin數據庫中可用,賦予用戶全部數據庫的dbAdmin權限。

 root:只在admin數據庫中可用。超級帳號,超級權限緩存

db.version()  //查看版本
• use userdb  //若是庫存在就切換,不存在就建立
• show dbs //查看庫,此時userdb並無出現,這是由於該庫是空的,尚未任何集合,只須要建立一個集合就能看到了
• db.createCollection('clo1') //建立集合clo1,在當前庫下面建立
• db.dropDatabase() //刪除當前庫,要想刪除某個庫,必須切換到那個庫下
• db.stats()  //查看當前庫的信息
• db.serverStatus()   //查看mongodb服務器的狀態
 

MongoDB建立集合

> db.createCollection("mycol",{capped:true,size:6142800,max:10000})
{ "ok" : 1 }

語法:db.createCollection(name,options)

name就是集合的名字,options可選,用來配置集合的參數,參數以下
• capped true/false (可選)若是爲true,則啓用封頂集合。封頂集合是固定大小的集合,當它達到其最大大小,會自動覆蓋最先的條目。若是指定true,則也須要指定尺寸參數。
• autoindexID  true/false (可選)若是爲true,自動建立索引_id字段的默認值是false。
• size (可選)指定最大大小字節封頂集合。若是封頂若是是 true,那麼你還須要指定這個字段。單位B
• max (可選)指定封頂集合容許在文件的最大數量。
> show collections  #查看集合,或者使用show  tables
mycol
> db.Account.insert({AccountlD:1,UserName:"123",password:"123456"}) 
#若是集合不存在,直接插入數據,則mongodb會自動建立集合
WriteResult({ "nInserted" : 1 })

> db.Account.update({AccountlD:1},{"$set":{"Age":20}})
#更新
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.Account.find() #查看全部文檔
{ "_id" : ObjectId("5c879ed264c82e2e1f280c16"), "AccountlD" : 1, "UserName" : "123", "password" : "123456", "Age" : 20 }

> db.Account.find({AccountlD:1})#根據條件查詢
{ "_id" : ObjectId("5c879ed264c82e2e1f280c16"), "AccountlD" : 1, "UserName" : "123", "password" : "123456", "Age" : 20 }

> db.Account.remove({AccountlD:1}) #根據條件刪除
WriteResult({ "nRemoved" : 1 })

> db.Account.drop() #刪除全部文檔,即刪除集合
true

> use dbname #先進入對應的庫

switched to db dbname
> db.printCollectionStats() #查看集合狀態
>

 

PHP鏈接MongoDB – mongodb.so

[root@harry-01 ~]# cd /usr/local/src/
[root@harry-01 src]# wget https://pecl.php.net/get/mongodb-1.3.0.tgz 

[root@harry-01 src]# tar zxvf mongodb-1.3.0.tgz 
[root@harry-01 mongodb-1.3.0]# /usr/local/php-fpm/bin/phpize 
[root@harry-01 mongodb-1.3.0]# ./configure --with-php-config=/usr/local/php-fpm/bin/php-config
[root@harry-01 mongodb-1.3.0]# make
[root@harry-01 mongodb-1.3.0]# make install

vi /usr/local/php-fpm/etc/php.ini  // 搜索 extension=      增長 extension = mongodb.so\

#/usr/local/php-fpm/bin/php -m 

 

測試mongo擴展

vim /data/wwwroot/harry.com/1.php

•<?php

$m = new MongoClient(); // 鏈接

$db = $m->test; // 獲取名稱爲 "test" 的數據庫

$collection = $db->createCollection("runoob");

echo "集合建立成功";

?>

 curl  localhost/1.php

 

MongoDB副本集

早期版本使用master-slave,一主一從和MySQL相似,但slave在此架構中爲只讀,當主庫宕機後,從庫不能自動切換爲主
• 目前已經淘汰master-slave模式,改成副本集,這種模式下有一個主(primary),和多個從(secondary),只讀。支持給它們設置權重,當主宕掉後,權重最高的從切換爲主
• 在此架構中還能夠創建一個仲裁(arbiter)的角色,它只負責裁決,而不存儲數據
• 再此架構中讀寫數據都是在主上,要想實現負載均衡的目的須要手動指定讀庫的目標server
 

副本集架構圖:

                          

 

 

 

副本集搭建

三臺機器: 192.168.133.130(primary)   192.168.133.132(secondary) 192.168.133.133(secondary)
• 編輯三臺機器的配置文件,更改或增長:
• replication://把此行前面的#刪除
• ##oplog大小
• oplogSizeMB: 20//前面有兩個空格
• ##複製集名稱
• replSetName: aminglinux//前面有兩個空格
• 分別重啓三臺機器
 
在搭建過程當中遇到一下問題:
rs.initiate(config)
{
	"ok" : 0,
	"errmsg" : "'192.168.31.138:27017' has data already, cannot initiate set.",
	"code" : 110,
	"codeName" : "CannotInitializeNodeWithData"

解決方法:先將從上的/etc/mongod.conf中 replication的配置註釋掉
        清空從裏的庫
> use admin
switched to db admin
> db.dropDatabase()
{ "dropped" : "admin", "ok" : 1 }
> show dbs
local  0.000GB
> use local
switched to db local
> db.dropDatabase()
{ "dropped" : "local", "ok" : 1 }
> show dbs

"errmsg" : "replSetInitiate quorum check failed because not all proposed set members responded affirmatively: ##這裏說是否是全部的成員都已經果斷的響應

解決辦法:查看防火牆規則,selinux是否開啓。

mongoDB副本集測試

•主上建庫,建集合
• >use mydb
• >db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
• >show dbs
• 從上查看
• >show dbs  
• 若出現錯誤Error: listDatabases failed:{ "note" : "from execCommand", "ok" : 0, "errmsg" : "not master" },須要執行
• >rs.slaveOk() // 大寫O
aminglinux:PRIMARY> use mydb
switched to db mydb
aminglinux:PRIMARY> db.acc.insetr({AccountID:1,UserName:"123",password:"123456"})    
aminglinux:PRIMARY> db.acc.insert({AccountID:1,UserName:"123",password:"123456"})
WriteResult({ "nInserted" : 1 })
aminglinux:PRIMARY> show dbs;
admin  0.000GB
local  0.000GB
mydb   0.000GB
aminglinux:PRIMARY> use mydb
switched to db mydb
aminglinux:PRIMARY> show tables
acc
aminglinux:PRIMARY>

從上檢查:

aminglinux:SECONDARY> show dbs
2019-03-19T19:44:04.125+0800 E QUERY    [thread1] Error: listDatabases failed:{
	"ok" : 0,
	"errmsg" : "not master and slaveOk=false",
	"code" : 13435,
	"codeName" : "NotMasterNoSlaveOk"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:814:19
shellHelper@src/mongo/shell/utils.js:704:15
@(shellhelp2):1:1
aminglinux:SECONDARY> rs.slaveOk()
aminglinux:SECONDARY> show dbs
admin  0.000GB
local  0.000GB
mydb   0.000GB
aminglinux:SECONDARY> use mydb
switched to db mydb
aminglinux:SECONDARY> show tables 
acc
aminglinux:SECONDARY>

 

副本集更改權重模擬主宕機

默認三臺機器權重都爲1,若是任何一個權重設置爲比其餘的高,則該臺機器立刻切換爲primary角色,因此咱們預設三臺機器的權重分別爲:31.137,31.138,31.139
• 在主上執行
• cfg = rs.conf()
• cfg.members[0].priority = 3
• cfg.members[1].priority = 2
• cfg.members[2].priority = 1
• rs.reconfig(cfg)
• 這樣的話,第二個節點將會成爲候選主節點。
• 主上執行 iptables -I INPUT -p tcp --dport 27017 -j DROP
 
主上設置權重
aminglinux:PRIMARY> cfg = rs.conf()
aminglinux:PRIMARY> 
aminglinux:PRIMARY> cfg.members[0].priority = 3
3
aminglinux:PRIMARY> cfg.members[1].priority = 2
2
aminglinux:PRIMARY> cfg.members[2].priority = 1
1
aminglinux:PRIMARY> rs.reconfig(cfg)
{ "ok" : 1 }
aminglinux:PRIMARY> 
bye
[root@harry-01 ~]# iptables -I INPUT -p tcp --dport 27017  -j DROP

31.138權重爲2的機器成爲PRIMARY

"_id" : 1,
			"name" : "192.168.31.138:27017",
			"health" : 1,
			"state" : 1,
			"stateStr" : "PRIMARY", 
			"uptime" : 2692,
			"optime" : {
				"ts" : Timestamp(1552997408, 1),
				"t" : NumberLong(18)

 

MongoDB分片介紹

•分片就是將數據庫進行拆分,將大型集合分隔到不一樣服務器上。好比,原本100G的數據,能夠分割成10份存儲到10臺服務器上,這樣每臺機器只有10G的數據。

• 經過一個mongos的進程(路由)實現分片後的數據存儲與訪問,也就是說mongos是整個分片架構的核心,對客戶端而言是不知道是否有分片的,客戶端只須要把讀寫操做轉達給mongos便可。

• 雖然分片會把數據分隔到不少臺服務器上,可是每個節點都是須要有一個備用角色的,這樣能保證數據的高可用。

• 當系統須要更多空間或者資源的時候,分片可讓咱們按需方便擴展,只須要把mongodb服務的機器加入到分片集羣中便可

 

MongoDB分片相關概念

• mongos: 數據庫集羣請求的入口,全部的請求都經過mongos進行協調,不須要在應用程序添加一個路由選擇器,mongos本身就是一個請求分發中心,它負責把對應的數據請求請求轉發到對應的shard服務器上。在生產環境一般有多mongos做爲請求的入口,防止其中一個掛掉全部的mongodb請求都沒有辦法操做。

• config server: 配置服務器,存儲全部數據庫元信息(路由、分片)的配置。mongos自己沒有物理存儲分片服務器和數據路由信息,只是緩存在內存裏,配置服務器則實際存儲這些數據。mongos第一次啓動或者關掉重啓就會從 config server 加載配置信息,之後若是配置服務器信息變化會通知到全部的 mongos 更新本身的狀態,這樣 mongos 就能繼續準確路由。在生產環境一般有多個 config server 配置服務器,由於它存儲了分片路由的元數據,防止數據丟失!

• shard: 存儲了一個集合部分數據的MongoDB實例,每一個分片是單獨的mongodb服務或者副本集,在生產環境中,全部的分片都應該是副本集。

 

 

分片搭建

服務器規劃

•三臺機器 A B C

• A搭建:mongos、config server、副本集1主節點、副本集2仲裁、副本集3從節點

• B搭建:mongos、config server、副本集1從節點、副本集2主節點、副本集3仲裁

• C搭建:mongos、config server、副本集1仲裁、副本集2從節點、副本集3主節點

• 端口分配:mongos 20000、config 21000、副本集1 2700一、副本集2 2700二、副本集3 27003

• 三臺機器所有關閉firewalld服務和selinux,或者增長對應端口的規則

 

 

建立目錄

•分別在三臺機器上建立各個角色所須要的目錄

• mkdir -p /data/mongodb/mongos/log

• mkdir -p /data/mongodb/config/{data,log}

• mkdir -p /data/mongodb/shard1/{data,log}

• mkdir -p /data/mongodb/shard2/{data,log}

• mkdir -p /data/mongodb/shard3/{data,log}

 

config server配置

•mongodb3.4版本之後須要對config server建立副本集

• 添加配置文件(三臺機器都操做)

• mkdir /etc/mongod/

• vim /etc/mongod/config.conf //加入以下內容

pidfilepath = /var/run/mongodb/configsrv.pid

dbpath = /data/mongodb/config/data

logpath = /data/mongodb/config/log/congigsrv.log

logappend = true

bind_ip = 0.0.0.0

port = 21000

fork = true

configsvr = true #declare this is a config db of a cluster;

replSet=configs #副本集名稱

maxConns=20000 #設置最大鏈接數

•啓動三臺機器的config server

• mongod -f /etc/mongod/config.conf  //三臺機器都要操做

mongod -f  /etc/mongod/config.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 14599
child process started successfully, parent exiting

• 登陸任意一臺機器的21000端口,初始化副本集

• mongo --port 21000

• config = { _id: "configs", members: [ {_id : 0, host : "192.168.133.130:21000"},{_id : 1, host : "192.168.133.132:21000"},{_id : 2, host : "192.168.133.133:21000"}] }

• rs.initiate(config)

{ "ok" : 1 }

[root@harry-01 ~]# mongo --host 192.168.31.137 --port 21000
>config = { _id: "config", members: [ {_id : 0, host : "192.168.31.137:21000"},{_id : 1, host : "192.168.31.138:21000"},{_id : 2, host : "192.168.31.139:21000"}] }
{
	"_id" : "config",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.31.137:21000"
		},
		{
			"_id" : 1,
			"host" : "192.168.31.138:21000"
		},
		{
			"_id" : 2,
			"host" : "192.168.31.139:21000"
		}
	]
}

> rs.initiate(config)
{ "ok" : 1 }

 

 分片配置

•添加配置文件(三臺機器都操做)

shard1.conf shard2.conf sharde.conf 

• vim /etc/mongod/shard1.conf //加入以下內容

pidfilepath = /var/run/mongodb/shard1.pid

dbpath = /data/mongodb/shard1/data

logpath = /data/mongodb/shard1/log/shard1.log

logappend = true

bind_ip = 0.0.0.0

port = 27001

fork = true

httpinterface=true #打開web監控

rest=true

replSet=shard1 #副本集名稱

shardsvr = true #declare this is a shard db of a cluster;

maxConns=20000 #設置最大鏈接數

•啓動shard1

• mongod -f /etc/mongod/shard1.conf //三臺機器都要操做

[root@harry-01 ~]# mongod -f /etc/mongod/shard1.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 6391
child process started successfully, parent exiting

登陸137或者138任何一臺機器的27001端口初始化副本集,139之因此不行,是由於shard1咱們把137這臺機器的27001端口做爲了仲裁節點

[root@harry-01 ~]# mongo --port 27001
> use admin
switched to db admin
> config = { _id: "shard1", members: [ {_id : 0, host : "192.168.31.137:27001"}, {_id: 1,host : "192.168.31.138:27001"},{_id : 2, host : "192.168.31.139:27001",arbiterOnly:true}] }
{
	"_id" : "shard1",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.31.137:27001"
		},
		{
			"_id" : 1,
			"host" : "192.168.31.138:27001"
		},
		{
			"_id" : 2,
			"host" : "192.168.31.139:27001",
			"arbiterOnly" : true
		}
	]
}
> rs.initiate(config)
{ "ok" : 1 }
shard1:OTHER>

• 啓動shard2

• mongod -f /etc/mongod/shard2.conf //三臺機器都要操做

[root@harry-01 ~]# mongod -f /etc/mongod/shard2.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 6512
child process started successfully, parent exiting

登陸138或者139任何一臺機器的27002端口初始化副本集,137之因此不行,是由於shard2咱們把137這臺機器的27002端口做爲了仲裁節點

[root@harry-01 ~]# mongo --port 27002
> use admin
switched to db admin
> config = { _id: "shard2", members: [ {_id : 0, host : "192.168.31.137:27002" ,arbiterOnly:true},{_id : 1, host : "192.168.31.138:27002"},{_id : 2, host : "192.168.31.139:27002"}] }
{
	"_id" : "shard2",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.31.137:27002",
			"arbiterOnly" : true
		},
		{
			"_id" : 1,
			"host" : "192.168.31.138:27002"
		},
		{
			"_id" : 2,
			"host" : "192.168.31.139:27002"
		}
	]
}
> rs.initiate(config)
{ "ok" : 1 }
shard2:OTHER>

•啓動shard3

• mongod -f /etc/mongod/shard3.conf //三臺機器都要操做

[root@harry-01 ~]# mongod -f /etc/mongod/shard3.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 6577
child process started successfully, parent exiting

登陸137或者139任何一臺機器的27003端口初始化副本集,138之因此不行,是由於shard3咱們把138這臺機器的27003端口做爲了仲裁節點

 

[root@harry-01 ~]# mongo --port 27003
MongoDB shell version v3.4.20
connecting to: mongodb://127.0.0.1:27003/
MongoDB server version: 3.4.20
> use admin
switched to db admin
> config = { _id: "shard3", members: [ {_id : 0, host : "192.168.31.137:27003"},  {_id : 1, host : "192.168.31.138:27003", arbiterOnly:true}, {_id : 2, host : "192.168.31.139:27003"}] }
{
	"_id" : "shard3",
	"members" : [
		{
			"_id" : 0,
			"host" : "192.168.31.137:27003"
		},
		{
			"_id" : 1,
			"host" : "192.168.31.138:27003",
			"arbiterOnly" : true
		},
		{
			"_id" : 2,
			"host" : "192.168.31.139:27003"
		}
	]
}
> rs.initiate(config)
{ "ok" : 1 }
shard3:OTHER>

配置路由服務器

•添加配置文件(三臺機器都操做)

• vim /etc/mongod/mongos.conf //加入以下內容

pidfilepath = /var/run/mongodb/mongos.pid

logpath = /data/mongodb/mongos/log/mongos.log

logappend = true

bind_ip = 0.0.0.0

port = 20000

fork = true

configdb = configs/192.168.31.137:21000, 192.168.31.138:21000, 192.168.31.139:21000 #監聽的配置服務器,只能有1個或者3個,configs爲配置服務器的副本集名字

maxConns=20000 #設置最大鏈接數

啓用分片

•登陸任何一臺20000端口

• mongo --port 20000  

• 把全部分片和路由器串聯

•sh.addShard("shard1/192.168.31.137:27001,192.168.31.138:27001,192.168.31.139:27001")

•sh.addShard("shard2/192.168.31.137:27002,192.168.31.138:27002,192.168.31.139:27002")

•sh.addShard("shard3/192.168.31.137:27003,192.168.31.138:27003,192.168.31.139:27003")

• 查看集羣狀態

 sh.status()

測試

•登陸任何一臺20000端口

• mongo --port 20000  

• use admin

• db.runCommand({ enablesharding : "testdb"}) 或者

• sh.enableSharding("testdb") //指定要分片的數據庫

• db.runCommand( { shardcollection : "testdb.table1",key : {id: 1} } ) 或者

• sh.shardCollection("testdb.table1",{"id":1} ) //#指定數據庫裏須要分片的集合和片鍵

• use  testdb

• for (var i = 1; i <= 10000; i++) db.table1.save({id:i,"test1":"testval1"})//插入測試數據

 db.table1.stats()//查看table1狀態

 

MongoDB備份

•備份指定庫

• mongodump --host 127.0.0.1 --port 20000  -d mydb -o /tmp/mongobak

• 它會在/tmp/目錄下面生成一個mydb的目錄

• 備份全部庫

• mongodump --host 127.0.0.1 --port 20000 -o /tmp/mongobak/alldatabase

• 指定備份集合

• mongodump --host 127.0.0.1 --port 20000 -d mydb -c c1 -o /tmp/mongobak/

• 它依然會生成mydb目錄,再在這目錄下面生成兩個文件

• 導出集合爲json文件

• mongoexport --host 127.0.0.1 --port 20000 -d mydb -c c1 -o /tmp/mydb2/1.json

 

MongoDB恢復

•恢復全部庫

• mongorestore -h 127.0.0.1 --port 20000 --drop dir/ //其中dir是備份全部庫的目錄名字,其中--drop可選,意思是當恢復以前先把以前的數據刪除,不建議使用

• 恢復指定庫

• mongorestore -d mydb dir/  //-d跟要恢復的庫名字,dir就是該庫備份時所在的目錄

• 恢復集合

•mongorestore -d mydb -c testc dir/mydb/testc.bson // -c後面跟要恢復的集合名字,dir是備份mydb庫時生成文件所在路徑,這裏是一個bson文件的路徑

• 導入集合

• mongoimport -d mydb -c testc --file /tmp/testc.json

相關文章
相關標籤/搜索