第一節 準備工做
一 安裝mongodb
我這裏選用rehl 5.6做爲其運行載體。
1. 下載mongodb的linux版本(注意32位和64位的區別),下載地址:http://www.mongodb.org/downloads
# wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.4.tgz
2. 將下載的mongodb安裝文件 mongodb-linux-x86_64-2.0.4.tgz 放到/usr/local/下
3. 解壓
# tar -zxvf mongodb-linux-x86_64-2.0.4.tgz
重命名
# mv mongodb-linux-x86_64-2.0.4 /usr/local/mongodb
4. 建立數據庫文件目錄, # mkdir -p /data/mongodb,我把數據庫文件目錄放在當前文件夾下,# mkdir -p data/db,建立日誌目錄 #mkdir -p log
二 啓動
首先用命令進入到bin目錄下:cd /usr/local/mongodb/bin
方式一:直接運行命令啓動
./mongod –port 10000 –fork –logpath= logpath=/data/mongodb/log/mongodb.log -- logappend -- dbpath=/data/mongodb/data/db
方式二:經過配置文件方式啓動(推薦)。
1.在服務器上新建mongodb.conf配置文件(建議用命令生成,放在mongodb同一個目錄下)
內容爲:
port=10000 #端口號
fork=true #以守護進程的方式運行,建立服務器進程
#master=true #單主從配置時設爲主服務器
#salve=true ##單主從配置時設爲從服務器
logpath=/data/mongodb/log/mongodb.log #日誌輸出文件路徑
logappend=true #日誌輸出方式
dbpath=/data/mongodb/data/db #數據庫路徑
replSet=blort #設置富本集的名字
shardsvr=true #設置是否分片
2.運行./mongod –config ~/.mongodb.conf 命令(--config能夠直接寫成-f)。
輸出:
all output going to: /data/mongodb/log/mongodb.log
forked process: 5315
mongodb 啓動參數
--quiet # 安靜輸出
--port arg # 指定服務端口號,默認端口27017
--bind_ip arg # 綁定服務IP,若綁定127.0.0.1,則只能本機訪問,不指定默認本地全部IP
--logpath arg # 指定MongoDB日誌文件,注意是指定文件不是目錄
--logappend # 使用追加的方式寫日誌
--pidfilepath arg # PID File 的完整路徑,若是沒有設置,則沒有PID文件
--keyFile arg # 集羣的私鑰的完整路徑,只對於Replica Set 架構有效
--unixSocketPrefix arg # UNIX域套接字替代目錄,(默認爲 /tmp)
--fork # 以守護進程的方式運行MongoDB,建立服務器進程
--auth # 啓用驗證
--cpu # 按期顯示CPU的CPU利用率和iowait
--dbpath arg # 指定數據庫路徑
--diaglog arg # diaglog選項 0=off 1=W 2=R 3=both 7=W+some reads
--directoryperdb # 設置每一個數據庫將被保存在一個單獨的目錄
--journal # 啓用日誌選項,MongoDB的數據操做將會寫入到journal文件夾的文件裏
--journalOptions arg # 啓用日誌診斷選項
--ipv6 # 啓用IPv6選項
--jsonp # 容許JSONP形式經過HTTP訪問(有安全影響)
--maxConns arg # 最大同時鏈接數 默認2000
--noauth # 不啓用驗證
--nohttpinterface # 關閉http接口,默認關閉27018端口訪問
--noprealloc # 禁用數據文件預分配(每每影響性能)
--noscripting # 禁用腳本引擎
--notablescan # 不容許表掃描
--nounixsocket # 禁用Unix套接字監聽
--nssize arg (=16) # 設置信數據庫.ns文件大小(MB)
--objcheck # 在收到客戶數據,檢查的有效性,
--profile arg # 檔案參數 0=off 1=slow, 2=all
--quota # 限制每一個數據庫的文件數,設置默認爲8
--quotaFiles arg # number of files allower per db, requires --quota
--rest # 開啓簡單的rest API
--repair # 修復全部數據庫run repair on all dbs
--repairpath arg # 修復庫生成的文件的目錄,默認爲目錄名稱dbpath
--slowms arg (=100) # value of slow for profile and console log
--smallfiles # 使用較小的默認文件
--syncdelay arg (=60) # 數據寫入磁盤的時間秒數(0=never,不推薦)
--sysinfo # 打印一些診斷系統信息
--upgrade # 若是須要升級數據庫
* Replicaton 參數linux
--------------------------------------------------------------------------------mongodb
--fastsync # 從一個dbpath裏啓用從庫複製服務,該dbpath的數據庫是主庫的快照,可用於快速啓用同步
--autoresync # 若是從庫與主庫同步數據差得多,自動從新同步,
--oplogSize arg # 設置oplog的大小(MB)
* 主/從參數shell
--------------------------------------------------------------------------------數據庫
--master # 主庫模式
--slave # 從庫模式
--source arg # 從庫 端口號
--only arg # 指定單一的數據庫複製
--slavedelay arg # 設置從庫同步主庫的延遲時間
* Replica set(副本集)選項:json
--------------------------------------------------------------------------------安全
--replSet arg # 設置副本集名稱
* Sharding(分片)選項服務器
--------------------------------------------------------------------------------架構
--configsvr # 聲明這是一個集羣的config服務,默認端口27019,默認目錄/data/configdb
--shardsvr # 聲明這是一個集羣的分片,默認端口27018
--noMoveParanoia # 關閉偏執爲moveChunk數據保存?
app
三 查詢進程和關閉數據庫
1. 運行 ps -ef|grep mongo 命令查詢服務器進程
2. 運行 kill -2 5315命令kill掉5315的進程
四 進入數據庫並簡單操做數據庫
1.運行./mongo –port 1000進入剛剛啓動的端口號爲10000的數據庫
2.使用use test能夠切換集合(至關於數據庫表),這裏切換到了test集合
3.使用db.test.insert("a","b");向集合插入數據
4.使用db.test.find();查詢集合裏的數據
5.更多shell命令請查閱相關文檔ssh
五 注意事項
1. 防火牆設置(測試時可直接關閉linux關閉防火牆:當即但不永久生效:service iptables stop重啓永久生效:chkconfig iptables off)
第二節 副本集
簡單的說,副本集就是有自動故障恢復功能的主從集羣,副本集沒有固定的"主節點",集羣會經過投票選舉一個"主節點"。當主節點巖機時,會變動到其餘節點。副本集布在不一樣機器上時,至少要啓動三個(單數)數據庫服務器進程,不然啓動時投票不成功會一直初始化不了。
一 以配置文件方式啓動三臺機器上的數據庫服務器
1. 三臺服務器的配置文件:
port=10000 #端口號
fork=true #以守護進程的方式運行,建立服務器進程
logpath=/data/mongodb/log/mongodb.log #日誌輸出文件路徑
logappend=true #日誌輸出方式
dbpath=/data/mongodb/data/db #數據庫路徑
replSet=blort #設置富本集的名字爲blort,replSet是讓服務器知道在這個"blort"副本集中還有別的機器
# replSet=blort /10.10.112.181:10000, 10.10.112.191:10000#設置富本集的名字,這種方式也能夠,意思就是"blort"副本集其餘機器,位置在10.10.112.181:10000和10.10.112.191:10000,但不推薦
2. 通命令啓動三臺數據庫服務器
/usr/local/mongodb/bin/mongod -f /data/mongodb/blort/config.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb/blort2/config.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb/blort3/config.conf
二 初始化副本集(只能初始化一次)
/usr/local/mongodb/bin/mongo --port 30001
use admin
方法一:
db.runCommand({"replSetInitiate":{"_id":"blort","members":[{"_id":0,"host":"10.10.113.122:30001"},{"_id":1,"host":"10.10.113.122:30002"},{"_id":2,"host":"10.10.113.122:30003","arbiterOnly":true}]}})
方法二:
config={_id:'blort',members:[{"_id":0,host:'10.10.113.122:30001},{"_id":1,host:'10.10.113.122:30002'},{"_id":2,"host":"10.10.113.122:30003","arbiterOnly":true}]};
rs.initiate(config);
三 增長和設置副本集
有幾種不一樣類型的節點能夠存在於副本集:
Standard :存在於副本,參與投票,有可能成爲活躍節點(即主節點)
Passive :存儲了完整的數據副本,參與投票,不能成爲活躍節點
Arbiter:仲裁者,只參與投票,不能成爲活躍節點
Priority:優先級,(投票會投優先級高的,若是相同,則投數據最新的)
以上類型能夠經過如下命令對副本集合進行修改或者增長服務器
db.runCommand({"replSetReconfig":{"_id":"test3","version":2,"members":[{"_id":0,"host":"10.10.113.122:30001"},{"_id":1,"host":"10.10.113.122:30002"},{"_id":2,"host":"10.10.113.122:30003","arbiterOnly":true}]}})
增長副本服務器
在增長一個從服務器節點
a.以相同副本集名字啓動一臺服務器
b.經過rs.add命令往system.replset添加新的從服務器成員
rs.add("10.10.113.122:30005"); 或者rs.add({"_id":4,"host":"10.10.113.122:30005"})
添加仲裁
rs.addArb("10.10.113.122:30004");
四 讀擴展
待研究
五 用戶校驗
未成功
use test;
db.addUser("test","123456");
db.auth("test","123456");
db.system.users.find();
db.system.users.remove("test","123456");
第二節 replica sets + shard (雙機方案,單機模擬)
一 準備
mkdir -p /data/mongodb/shard1-1/db/
mkdir -p /data/mongodb/shard1-1/log/
/data/mongodb/shard1-1/config.conf
port=30001 #端口號
fork=true #以守護進程的方式運行,建立服務器進程
#nohttpinterface=true # 關閉http接口,默認關閉27018端口訪問 port + 1000
rest = true #http接口 啓動rest 使能訪問 。與nohttpinterface 對應 只開一個
shardsvr=true #啓動分片
#oplogSize=100 #複製日誌大小 MB
logpath=/data/mongodb/shard1-1/log/shard1-1.log #日誌輸出文件路徑
logappend=true #日誌輸出方式
dbpath=/data/mongodb/shard1-1/db #數據庫路徑
directoryperdb=true # 設置每一個數據庫將被保存在一個單獨的目錄
replSet=shard1 #設置富本集的名字爲shard1,replSet是讓服務器知道在這個"shard1"副本集中還有別的機器
#auth=true # 啓用驗證
mkdir -p /data/mongodb/shard1-1a/db/
mkdir -p /data/mongodb/shard1-1a/log/
/data/mongodb/shard1-1a/config.conf
port=30002 #端口號
fork=true #以守護進程的方式運行,建立服務器進程
#nohttpinterface=true # 關閉http接口,默認關閉27018端口訪問 port + 1000
rest = true #http接口 啓動rest 使能訪問 。與nohttpinterface 對應 只開一個
shardsvr=true #啓動分片
#oplogSize=100 #複製日誌大小 MB
logpath=/data/mongodb/shard1-1a/log/shard1-1a.log #日誌輸出文件路徑
logappend=true #日誌輸出方式
dbpath=/data/mongodb/shard1-1a/db #數據庫路徑
directoryperdb=true # 設置每一個數據庫將被保存在一個單獨的目錄
replSet=shard1 #設置富本集的名字爲shard1,replSet是讓服務器知道在這個"shard1"副本集中還有別的機器
#auth=true # 啓用驗證
mkdir -p /data/mongodb/shard1-2/db/
mkdir -p /data/mongodb/shard1-2/log/
/data/mongodb/shard1-2/config.conf
port=30003 #端口號
fork=true #以守護進程的方式運行,建立服務器進程
#nohttpinterface=true # 關閉http接口,默認關閉27018端口訪問 port + 1000
rest = true #http接口 啓動rest 使能訪問 。與nohttpinterface 對應 只開一個
shardsvr=true #啓動分片
#oplogSize=100 #複製日誌大小 MB
logpath=/data/mongodb/shard1-2/log/shard1-2.log #日誌輸出文件路徑
logappend=true #日誌輸出方式
dbpath=/data/mongodb/shard1-2/db #數據庫路徑
directoryperdb=true # 設置每一個數據庫將被保存在一個單獨的目錄
replSet=shard1 #設置富本集的名字爲shard1,replSet是讓服務器知道在這個"shard1"副本集中還有別的機器
#auth=true # 啓用驗證
mkdir -p /data/mongodb/shard2-1/db/
mkdir -p /data/mongodb/shard2-1/log/
/data/mongodb/shard2-1/config.conf
port=32001 #端口號
fork=true #以守護進程的方式運行,建立服務器進程
#nohttpinterface=true # 關閉http接口,默認關閉27018端口訪問 port + 1000
rest = true #http接口 啓動rest 使能訪問 。與nohttpinterface 對應 只開一個
shardsvr=true #啓動分片
#oplogSize=100 #複製日誌大小 MB
logpath=/data/mongodb/shard2-1/log/shard2-1.log #日誌輸出文件路徑
logappend=true #日誌輸出方式
dbpath=/data/mongodb/shard2-1/db #數據庫路徑
directoryperdb=true # 設置每一個數據庫將被保存在一個單獨的目錄
replSet=shard2 #設置富本集的名字爲shard2,replSet是讓服務器知道在這個"shard2"副本集中還有別的機器
#auth=true # 啓用驗證
mkdir -p /data/mongodb/shard2-1a/db/
mkdir -p /data/mongodb/shard2-1a/log/
/data/mongodb/shard2-1a/config.conf
port=32002 #端口號
fork=true #以守護進程的方式運行,建立服務器進程
#nohttpinterface=true # 關閉http接口,默認關閉27018端口訪問 port + 1000
rest = true #http接口 啓動rest 使能訪問 。與nohttpinterface 對應 只開一個
shardsvr=true #啓動分片
#oplogSize=100 #複製日誌大小 MB
logpath=/data/mongodb/shard2-1a/log/shard2-1a.log #日誌輸出文件路徑
logappend=true #日誌輸出方式
dbpath=/data/mongodb/shard2-1a/db #數據庫路徑
directoryperdb=true # 設置每一個數據庫將被保存在一個單獨的目錄
replSet=shard2 #設置富本集的名字爲shard2,replSet是讓服務器知道在這個"shard2"副本集中還有別的機器
#auth=true # 啓用驗證
mkdir -p /data/mongodb/shard2-2/db/
mkdir -p /data/mongodb/shard2-2/log/
/data/mongodb/shard2-2/config.conf
port=32003 #端口號
fork=true #以守護進程的方式運行,建立服務器進程
#nohttpinterface=true # 關閉http接口,默認關閉27018端口訪問 port + 1000
rest = true #http接口 啓動rest 使能訪問 。與nohttpinterface 對應 只開一個
shardsvr=true #啓動分片
#oplogSize=100 #複製日誌大小 MB
logpath=/data/mongodb/shard2-2/log/shard2-2.log #日誌輸出文件路徑
logappend=true #日誌輸出方式
dbpath=/data/mongodb/shard2-2/db #數據庫路徑
directoryperdb=true # 設置每一個數據庫將被保存在一個單獨的目錄
replSet=shard2 #設置富本集的名字爲shard2,replSet是讓服務器知道在這個"shard2"副本集中還有別的機器
#auth=true # 啓用驗證
mkdir -p /data/mongodb/config1/db/
mkdir -p /data/mongodb/config1/log/
/data/mongodb/config1/config.conf
dbpath = /data/mongodb/config1/db
configsvr = true
port = 40001
logpath =/data/mongodb/config1/log/config1.log
logappend = true
fork = true
#auth=true # 啓用驗證
mkdir -p /data/mongodb/config2/db/
mkdir -p /data/mongodb/config2/log/
/data/mongodb/config2/config.conf
dbpath = /data/mongodb/config2/db
configsvr = true
port = 40002
logpath =/data/mongodb/config2/log/config2.log
logappend = true
fork = true
#auth=true # 啓用驗證
mkdir -p /data/mongodb/config3/db/
mkdir -p /data/mongodb/config3/log/
/data/mongodb/config3/config.conf
dbpath = /data/mongodb/config3/db
configsvr = true
port = 40003
logpath =/data/mongodb/config3/log/config3.log
logappend = true
fork = true
#auth=true # 啓用驗證
mkdir -p /data/mongodb/mongos1/log/
/data/mongodb/mongos1/config.conf
configdb =10.10.113.122:40001,10.10.113.122:40002,10.10.113.122:40003
port = 50001
chunkSize = 1
logpath =/data/mongodb/mongos1/log/mongos1.log
logappend = true
fork = true
#auth=true # 啓用驗證
mkdir -p /data/mongodb/mongos2/log/
/data/mongodb/mongos2/config.conf
configdb =10.10.113.122:40001,10.10.113.122:40002,10.10.113.122:40003
port = 50002
chunkSize = 1
logpath =/data/mongodb/mongos2/log/mongos2.log
logappend = true
fork = true
#auth=true # 啓用驗證
二 啓動
shard1 副本 啓動
/usr/local/mongodb/bin/mongod -f /data/mongodb/shard1-1/config.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb/shard1-1a/config.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb/shard1-2/config.conf
/usr/local/mongodb/bin/mongo --port 30001
use admin
db.runCommand({"replSetInitiate":{"_id":"shard1","members":[{"_id":0,"host":"10.10.113.122:30001"},{"_id":1,"host":"10.10.113.122:30002","arbiterOnly":true},{"_id":2,"host":"10.10.113.122:30003"}]}})
shard2 副本 啓動
/usr/local/mongodb/bin/mongod -f /data/mongodb/shard2-1/config.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb/shard2-1a/config.conf
/usr/local/mongodb/bin/mongod -f /data/mongodb/shard2-2/config.conf
/usr/local/mongodb/bin/mongo --port 31001
use admin
db.runCommand({"replSetInitiate":{"_id":"shard2","members":[{"_id":0,"host":"10.10.113.122:32001"},{"_id":1,"host":"10.10.113.122:32002","arbiterOnly":true},{"_id":2,"host":"10.10.113.122:32003"}]}})
config1 啓動
/usr/local/mongodb/bin/mongod -f /data/mongodb/config1/config.conf
config2 啓動
/usr/local/mongodb/bin/mongod -f /data/mongodb/config2/config.conf
config3 啓動
/usr/local/mongodb/bin/mongod -f /data/mongodb/config3/config.conf
mongos1 啓動
/usr/local/mongodb/bin/mongos -f /data/mongodb/mongos1/config.conf
mongos2 啓動
/usr/local/mongodb/bin/mongos -f /data/mongodb/mongos2/config.conf
/usr/local/mongodb/bin/mongo --port 50001
use admin
db.runCommand({addshard:"shard1/10.10.113.122:30001,10.10.113.122:30003",name:"shard1", maxsize:100})
db.runCommand({addshard:"shard2/10.10.113.122:32001,10.10.113.122:32003",name:"shard2", maxsize:100})
db.runCommand({listshards:1})
use test
db.test.insert({"aaa":"bbb"});
第三節 replica sets + shard (3機高可用 , 一主雙備份)
一 方案
每一個分片3服務器,前期採用三臺,往後服務器的增長考慮災備,服務增長的基數最少爲三臺(或纔有雙機方案)。
Server1 10.10.113.122 Server1 10.10.113.132 Server3 10.10.113.133
類型 服務器 用途 系統 說明
存儲/數據 Server1 Shard1/Shard2/Shard3 Linux 64位 Shard1:10001;Shard2:10002,Shard3:10003;
Server2 Shard1/Shard2/Shard3 Linux 64位 Shard1:10001;Shard2:10002,Shard3:10003;
Server3 Shard1/Shard2/Shard3 Linux 64位 Shard1:10001;Shard2:10002,Shard3:10003;
配置 Server1 Config1 Linux 64位 Config1:20000;
Server2 Config2 Linux 64位 Config2:20000;
Server3 Config3 Linux 64位 Config3:20000;
路由 Server1 Mongos1 Linux 64位 Mongos:30000;
Server2 Mongos2 Linux 64位 Mongos:30000;
Server3 Mongos3 Linux 64位 Mongos:30000;
二 準備
安裝mongodb 參照第一節
linux 傳文件
# scp mongodb-linux-x86_64-2.0.4.tgz root@10.10.113.132:/root
# ssh 10.10.113.132
刪除目錄
# rm -r -f /data/mongodb
建立配置、日誌、分片、key文件存儲目錄及驗證文件
mkdir /data/mongodb/configsvr/ -p
mkdir /data/mongodb/log/ -p
mkdir /data/mongodb/shard1/ -p
mkdir /data/mongodb/shard2/ -p
mkdir /data/mongodb/shard3/ -p
mkdir /data/mongodb/key/ -p
mkdir /data/mongodb/conf/security/ -p
mkdir /data/mongodb/conf/nosecurity/ -p
建立配置文件
一、 建立驗證文件security於/data/mongodb/key/目錄,關賦予可讀權限,命令以下:
cd /data/mongodb/key/
echo 'hycloudmongodbkey' > security
chmod 600 security
二、 建立shard1.conf、shard2.conf、shard3.conf、configsvr.conf、mongos.conf於/data/mongodb/conf/security/ 和 /data/mongodb/conf/nosecurity/的目錄,內容分別以下:
shard1.conf
dbpath = /data/mongodb/shard1
directoryperdb = true
shardsvr = true
replSet = shard1
#bind_ip = 10.10.113.122,localhost
port = 10001
oplogSize = 100
logpath =/data/mongodb/log/shard1.log
logappend = true
profile = 1
slowms = 5
rest = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
shard2.conf
dbpath = /data/mongodb/shard2
directoryperdb = true
shardsvr = true
replSet = shard2
#bind_ip = 10.10.113.122,localhost
port = 10002
oplogSize = 100
logpath = /data/mongodb/log/shard2.log
logappend = true
profile = 1
slowms = 5
rest = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
shard3.conf
dbpath = /data/mongodb/shard3
directoryperdb = true
shardsvr = true
replSet = shard3
#bind_ip = 10.10.113.122,localhost
port = 10003
oplogSize = 100
logpath = /data/mongodb/log/shard3.log
logappend = true
profile = 1
slowms = 5
rest = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
configsvr.conf
dbpath = /data/mongodb/configsvr
directoryperdb = true
configsvr = true
port = 20000
logpath =/data/mongodb/log/configsvr.log
logappend = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
mongos.conf
configdb =10.10.113.122:20000, 10.10.113.132:20000, 10.10.113.133:20000
port = 30000
chunkSize = 1 #單位 mb 生成環境請使用 200 或刪除
logpath =/data/mongodb/log/mongos.log
logappend = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
分片配置
說明:分片要在無驗證環境中配置,不然會出現無權限等異常。採用如下命令啓動Server1\Server2\Server3上的shard1\shard2\shard3:
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard1.conf
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard2.conf
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard3.conf
如下命令查看是否正常啓動:
# netstat -lnpt # 或 ps -ef | grep mongo
啓動後鏈接到shard1\shard2\shard3分別進行配置,在任意一臺服務器便可,如下是具體配置過程:
# /usr/local/mongodb/bin/mongo --port 10001
>use admin
>config = {_id:"shard1", members: [
{_id: 0, host:"10.10.113.122:10001"},
{_id: 1, host:"10.10.113.132:10001"},
{_id: 2, host:"10.10.113.133:10001"}]
};
>rs.initiate(config)
>exit
# /usr/local/mongodb/bin/mongo --port 10002
>use admin
>config = {_id:"shard2", members: [
{_id: 0, host:"10.10.113.132:10002"},
{_id: 1, host:"10.10.113.133:10002"},
{_id: 2, host:"10.10.113.122:10002"}]
};
>rs.initiate(config)
>exit
# /usr/local/mongodb/bin/mongo --port 10003
>use admin
>config = {_id:"shard3", members: [
{_id: 0, host:"10.10.113.133:10003"},
{_id: 1, host:"10.10.113.122:10003"},
{_id: 2, host:"10.10.113.132:10003"}]
};
>rs.initiate(config)
至此,已完成分片配置
路由設置
路由是能過config來鏈接分片服務器,在啓動路由進程時,先啓動配置進程,路由配置過程以下:
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/configsvr.conf
# /usr/local/mongodb/bin/mongos -f /data/mongodb/conf/nosecurity/mongos.conf
啓動後,鏈接路由進行分片添加,只需配置一臺路由。注:分片操做需在admin庫下進行,另外必需在無驗證要求下進行,即採用前面建立於nosecurity文件夾下的配置。
# /usr/local/mongodb/bin/mongo --port 30000
mongos> use admin
mongos> db.runCommand({addshard:"shard1/10.10.113.122:10001,10.10.113.132:10001,10.10.113.133:10001",name:"shard1", maxsize:20480} )
mongos> db.runCommand({addshard:"shard2/10.10.113.122:10002,10.10.113.132:10002,10.10.113.133:10002",name:"shard2", maxsize:20480} )
mongos> db.runCommand({addshard:"shard3/10.10.113.122:10003,10.10.113.132:10003,10.10.113.133:10003",name:"shard3", maxsize:20480} )
命令檢查分片添加狀況,如出現如下結果則表示配置成功:
mongos> db.runCommand( {listshards : 1 } )
權限控制
MongoDB默認爲驗證模式。如需對數據庫進行權限控制,需先採用無驗證模式登陸,進入admin庫建立管理員用戶後,再採用驗證模式登陸。經過前面建立的管理員賬號進行數據庫與用戶的建立。MongoDB集羣的權限與單臺的權限控制的不一樣之處在於,單臺是經過-auth屬性,集羣是經過keyFile來進行服務器間的驗證。如下介紹配置全過程。
前面的全部步驟,都是在nosecurity模式下進行。若是沒有采用非驗證模式的須要將全部進程(分片、配置、mongos)中止,將切換到無驗證模式。
步驟一:先進行登陸,並切換進admin庫建立管理員賬號
# /usr/local/mongodb/bin/mongo --port 30000
mongos>use admin
mongos>db.addUser('admin','123456')
{
"singleShard" :"192.168.2.88:20000,192.168.2.89:20000,192.168.2.90:20000",
"n" : 0,
"connectionId" : 211,
"err" : null,
"ok" : 1
}
{
"_id" :ObjectId("4f6c78ddad912a3ac6833ece"),
"user" : "admin",
"readOnly" : false,
"pwd" :"95ec4261124ba5951720b199908d892b"
}
驗證用戶名與密碼
mongos> db.auth('admin','123456')
1
mongos>exit
步驟二:退出後,將Server1\Server2\Server3服務器上MongoDB的全部進程(分片、配置、mongos)中止,將切換到驗證模式。具體命令以下:
#killall mongod mongos
#netstat -lnpt
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard1.conf
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard2.conf
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard3.conf
# netstat -lnpt
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/configsvr.conf
# /usr/local/mongodb/bin/mongos -f /data/mongodb/conf/security/mongos.conf
啓動後,如對庫進行查看,則會報如下異常:
# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/admin
MongoDB shell version: 2.0.4
connecting to:10.10.113.122:30000/admin
> show dbs
Fri Mar 23 22:28:28 uncaughtexception: listDatabases failed:{ "ok" : 0, "errmsg" :"unauthorized" }
如下是正常登陸後顯示的信息:
# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/admin
MongoDB shell version: 2.0.4
connecting to:10.10.113.122:30000/admin
>db.auth('admin','123456')
1
mongos>
步驟三:如下是數據庫及數據庫用戶建立的過程:
mongos> use hello
switched to db hello
mongos>db.addUser('sa','sa')
{
"singleShard" :"shard2/10.10.113.122:10002,10.10.113.132:10002,10.10.113.133:10002",
"n" : 0,
"lastOp" :NumberLong("5723101431532093441"),
"connectionId" : 38,
"err" : null,
"ok" : 1
}
{
"user" : "sa",
"readOnly" : false,
"pwd" :"75692b1d11c072c6c79332e248c4f699",
"_id" :ObjectId("4f6c8a6e9f67b049a20a00de")
}
mongos> exit
bye
# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/hello -u sa -p
MongoDB shell version: 2.0.4
Enter password:
connecting to:10.10.113.122:30000/hello
> show collections
system.indexes
system.users
> db.system.users.find()
{ "_id" :ObjectId("4f6c8a6e9f67b049a20a00de"), "user" :"sa", "readOnly" : false, "pwd" :"75692b1d11c072c6c79332e248c4f699" }
分片
# /usr/local/mongodb/bin/mongo -port 30000
> use test
導入數據
> use admin
> db.runCommand({"enablesharding":"test"})
> db.runCommand({"shardcollection":"test.doc","key":{"_id":1}})
第四節 replica sets + shard (3機高可用 , 一主一備份一仲裁)
一 方案
每一個分片3服務器,前期採用三臺,往後服務器的增長考慮災備,服務增長的基數最少爲三臺(或用有雙機方案)。
Server1 10.10.113.122 Server1 10.10.113.132 Server3 10.10.113.133
類型 服務器 用途 系統 說明
存儲/數據 Server1 Shard1/Shard2/Shard3 Linux 64位 Shard1:10001;Shard2:10002,Shard3:10003;
Server2 Shard1/Shard2/Shard3 Linux 64位 Shard1:10001;Shard2:10002,Shard3:10003;
Server3 Shard1/Shard2/Shard3 Linux 64位 Shard1:10001;Shard2:10002,Shard3:10003;
配置 Server1 Config1 Linux 64位 Config1:20000;
Server2 Config2 Linux 64位 Config2:20000;
Server3 Config3 Linux 64位 Config3:20000;
路由 Server1 Mongos1 Linux 64位 Mongos:30000;
Server2 Mongos2 Linux 64位 Mongos:30000;
Server3 Mongos3 Linux 64位 Mongos:30000;
二 準備
安裝mongodb 參照第一節
linux 傳文件
# scp mongodb-linux-x86_64-2.0.4.tgz root@10.10.113.132:/root
# ssh 10.10.113.132
建立配置、日誌、分片、key文件存儲目錄及驗證文件
mkdir /data/mongodb/configsvr/ -p
mkdir /data/mongodb/log/ -p
mkdir /data/mongodb/shard1/ -p
mkdir /data/mongodb/shard2/ -p
mkdir /data/mongodb/shard3/ -p
mkdir /data/mongodb/key/ -p
mkdir /data/mongodb/conf/security/ -p
mkdir /data/mongodb/conf/nosecurity/ -p
建立配置文件
一、 建立驗證文件security於/data/mongodb/key/目錄,關賦予可讀權限,命令以下:
cd /data/mongodb/key/
echo 'hycloudmongodbkey' > security
chmod 600 /data/mongodb/key/security
二、 建立shard1.conf、shard2.conf、shard3.conf、configsvr.conf、mongos.conf於/data/mongodb/conf/security/ 和 /data/mongodb/conf/nosecurity/的目錄,內容分別以下:
shard1.conf
dbpath = /data/mongodb/shard1
directoryperdb = true
shardsvr = true
replSet = shard1
#bind_ip = 10.10.113.122,localhost
port = 10001
oplogSize = 100
logpath =/data/mongodb/log/shard1.log
logappend = true
profile = 1
slowms = 5
rest = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
shard2.conf
dbpath = /data/mongodb/shard2
directoryperdb = true
shardsvr = true
replSet = shard2
#bind_ip = 10.10.113.122,localhost
port = 10002
oplogSize = 100
logpath = /data/mongodb/log/shard2.log
logappend = true
profile = 1
slowms = 5
rest = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
shard3.conf
dbpath = /data/mongodb/shard3
directoryperdb = true
shardsvr = true
replSet = shard3
#bind_ip = 10.10.113.122,localhost
port = 10003
oplogSize = 100
logpath = /data/mongodb/log/shard3.log
logappend = true
profile = 1
slowms = 5
rest = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
configsvr.conf
dbpath = /data/mongodb/configsvr
directoryperdb = true
configsvr = true
port = 20000
logpath =/data/mongodb/log/configsvr.log
logappend = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
mongos.conf
configdb =10.10.113.122:20000, 10.10.113.132:20000, 10.10.113.133:20000
port = 30000
chunkSize = 1 #單位 mb 生成環境請使用 200 或刪除
logpath =/data/mongodb/log/mongos.log
logappend = true
fork = true
keyFile = /data/mongodb/key/security #nosecurity目錄將該行刪除
分片配置
說明:分片要在無驗證環境中配置,不然會出現無權限等異常。採用如下命令啓動Server1\Server2\Server3上的shard1\shard2\shard3:
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard1.conf
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard2.conf
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/shard3.conf
如下命令查看是否正常啓動:
# netstat -lnpt # 或 ps -ef | grep mongo
啓動後鏈接到shard1\shard2\shard3分別進行配置,在任意一臺服務器便可,如下是具體配置過程:(注意不能在仲裁機器初始化)
# /usr/local/mongodb/bin/mongo --port 10001
>use admin
>config = {_id:"shard1", members: [
{_id: 0, host:"10.10.113.122:10001"},
{_id: 1, host:"10.10.113.132:10001"},
{_id: 2, host:"10.10.113.133:10001","arbiterOnly":true}]
};
>rs.initiate(config)
>exit
# /usr/local/mongodb/bin/mongo --port 10002
>use admin
>config = {_id:"shard2", members: [
{_id: 0, host:"10.10.113.132:10002"},
{_id: 1, host:"10.10.113.133:10002"},
{_id: 2, host:"10.10.113.122:10002","arbiterOnly":true}]
};
>rs.initiate(config)
>exit
# /usr/local/mongodb/bin/mongo --port 10003
>use admin
>config = {_id:"shard3", members: [
{_id: 0, host:"10.10.113.133:10003"},
{_id: 1, host:"10.10.113.122:10003"},
{_id: 2, host:"10.10.113.132:10003","arbiterOnly":true}]
};
>rs.initiate(config)
至此,已完成分片配置
路由設置
路由是能過config來鏈接分片服務器,在啓動路由進程時,先啓動配置進程,路由配置過程以下:
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/nosecurity/configsvr.conf
# /usr/local/mongodb/bin/mongos -f /data/mongodb/conf/nosecurity/mongos.conf
啓動後,鏈接路由進行分片添加,只需配置一臺路由。注:分片操做需在admin庫下進行,另外必需在無驗證要求下進行,即採用前面建立於nosecurity文件夾下的配置。
# /usr/local/mongodb/bin/mongo --port 30000
mongos> use admin
# maxsize:20480 #單位 mb 分片限制大小 根據實際服務器來定
mongos> db.runCommand({addshard:"shard1/10.10.113.122:10001,10.10.113.132:10001,10.10.113.133:10001",name:"shard1", maxsize:20480} )
mongos> db.runCommand({addshard:"shard2/10.10.113.132:10002,10.10.113.133:10002,10.10.113.122:10002",name:"shard2", maxsize:20480} )
mongos> db.runCommand({addshard:"shard3/10.10.113.133:10003,10.10.113.122:10003,10.10.113.132:10003",name:"shard3", maxsize:20480} )
命令檢查分片添加狀況,如出現如下結果則表示配置成功:
mongos> db.runCommand( {listshards : 1 } )
權限控制
MongoDB默認爲驗證模式。如需對數據庫進行權限控制,需先採用無驗證模式登陸,進入admin庫建立管理員用戶後,再採用驗證模式登陸。經過前面建立的管理員賬號進行數據庫與用戶的建立。MongoDB集羣的權限與單臺的權限控制的不一樣之處在於,單臺是經過-auth屬性,集羣是經過keyFile來進行服務器間的驗證。如下介紹配置全過程。
前面的全部步驟,都是在nosecurity模式下進行。若是沒有采用非驗證模式的須要將全部進程(分片、配置、mongos)中止,將切換到無驗證模式。
步驟一:先進行登陸,並切換進admin庫建立管理員賬號
# /usr/local/mongodb/bin/mongo --port 30000
mongos>use admin
mongos>db.addUser('admin','123456')
{
"singleShard" :"192.168.2.88:20000,192.168.2.89:20000,192.168.2.90:20000",
"n" : 0,
"connectionId" : 211,
"err" : null,
"ok" : 1
}
{
"_id" :ObjectId("4f6c78ddad912a3ac6833ece"),
"user" : "admin",
"readOnly" : false,
"pwd" :"95ec4261124ba5951720b199908d892b"
}
驗證用戶名與密碼
mongos> db.auth('admin','123456')
1
mongos>exit
步驟二:退出後,將Server1\Server2\Server3服務器上MongoDB的全部進程(分片、配置、mongos)中止,將切換到驗證模式。具體命令以下:
# killall mongod mongos
# netstat -lnpt
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard1.conf
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard2.conf
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/shard3.conf
# netstat -lnpt # ps -ef | grep mongo
# /usr/local/mongodb/bin/mongod -f /data/mongodb/conf/security/configsvr.conf
# /usr/local/mongodb/bin/mongos -f /data/mongodb/conf/security/mongos.conf
啓動後,如對庫進行查看,則會報如下異常:
# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/admin
MongoDB shell version: 2.0.4
connecting to:10.10.113.122:30000/admin
> show dbs
Fri Mar 23 22:28:28 uncaughtexception: listDatabases failed:{ "ok" : 0, "errmsg" :"unauthorized" }
如下是正常登陸後顯示的信息:
# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/admin
MongoDB shell version: 2.0.4
connecting to:10.10.113.122:30000/admin
>db.auth('admin','123456')
1
mongos>
步驟三:如下是數據庫及數據庫用戶建立的過程:
mongos> use hello
switched to db hello
mongos>db.addUser('sa','sa')
{
"singleShard" :"shard2/10.10.113.122:10002,10.10.113.132:10002,10.10.113.133:10002",
"n" : 0,
"lastOp" :NumberLong("5723101431532093441"),
"connectionId" : 38,
"err" : null,
"ok" : 1
}
{
"user" : "sa",
"readOnly" : false,
"pwd" :"75692b1d11c072c6c79332e248c4f699",
"_id" :ObjectId("4f6c8a6e9f67b049a20a00de")
}
mongos> exit
bye
# /usr/local/mongodb/bin/mongo 10.10.113.122:30000/hello -u sa -p
MongoDB shell version: 2.0.4
Enter password:
connecting to:10.10.113.122:30000/hello
> show collections
system.indexes
system.users
> db.system.users.find()
{ "_id" :ObjectId("4f6c8a6e9f67b049a20a00de"), "user" :"sa", "readOnly" : false, "pwd" :"75692b1d11c072c6c79332e248c4f699" }
分片
# /usr/local/mongodb/bin/mongo -port 30000
> use admin
> db.runCommand({"enablesharding":"test"})
> db.runCommand({"shardcollection":"test.doc","key":{"_id":1}})
> db.runCommand({"shardcollection":"test.txt","key":{"_id":1}})
索引
> use test
> db.fs.chunks.ensureIndex({files_id: 1});
> use admin
> db.runCommand({ shardcollection : "test.fs.chunks", key : { files_id : 1 }})
索引 > use test > db.doc.ensureIndex({"letter":1}) 導入數據 查詢數據 分片管理 > use config > show collections > db.shards.find() > db.databases.find() > db.chunks.find() > db.printShardingStatus()