MongoDB的安全與集群
一占键、安全和認(rèn)證
每個(gè)MongoDB實(shí)例中的數(shù)據(jù)庫都可以有許多用戶碗降。如果開啟了安全性檢查政恍,則只有數(shù)據(jù)庫認(rèn)證用戶才能執(zhí)行讀或者寫操作。
在認(rèn)證的上下文中雪标,MongoDB會(huì)將普通的數(shù)據(jù)作為admin數(shù)據(jù)庫處理。admin數(shù)據(jù)庫中的用戶被視為超級(jí)用戶(即管理員)溉跃。
在認(rèn)證之后村刨,管理員可以讀寫所有數(shù)據(jù)庫,執(zhí)行特定的管理命令撰茎,如listDatabases和shutdown嵌牺。
在開啟安全檢查之前,一定要至少有一個(gè)管理員賬號(hào)龄糊。
在admin數(shù)據(jù)庫中創(chuàng)建管理員賬號(hào):
use admin;
db.addUser(“root”,”root”);
在test數(shù)據(jù)庫中創(chuàng)建普通賬號(hào):
use test;
db.addUser(“zhangsan”,”123”);
db.addUser(“l(fā)isi”,”123”,true);
注意:用戶zhangsan逆粹,密碼為123,對(duì)test數(shù)據(jù)庫擁有讀寫權(quán)限
用戶lisi炫惩,密碼為123僻弹,對(duì)test數(shù)據(jù)庫擁有只讀權(quán)限
重新啟動(dòng)數(shù)據(jù)庫服務(wù),并開啟安全檢查:
mongod --dbpath d:\mongo_data --auth
二他嚷、主從復(fù)制(主從集群)
主從復(fù)制是MongoDB最常用的復(fù)制方式蹋绽。這種方式非常靈活,可用于備份筋蓖、故障恢復(fù)卸耘、讀擴(kuò)展等。
最基本的設(shè)置方式就是建立一個(gè)主節(jié)點(diǎn)和一個(gè)或者多個(gè)從節(jié)點(diǎn)粘咖,每個(gè)從節(jié)點(diǎn)要知道主節(jié)點(diǎn)的地址鹊奖。
運(yùn)行mongod --master就啟動(dòng)了主服務(wù)器。
運(yùn)行mongod --slave --source master_address 則啟動(dòng)了從服務(wù)器涂炎,
其中master_address就是上面主節(jié)點(diǎn)的地址忠聚。
可以在一臺(tái)計(jì)算機(jī)上來模擬主節(jié)點(diǎn)和從節(jié)點(diǎn):
在D盤創(chuàng)建兩個(gè)目錄master和slave设哗,
master目錄作為主節(jié)點(diǎn)的數(shù)據(jù)文件的目錄,
slave目錄作為從節(jié)點(diǎn)的數(shù)據(jù)文件的目錄两蟀。
注意:主節(jié)點(diǎn)和從節(jié)點(diǎn)要指定不同的端口网梢。
啟動(dòng)主節(jié)點(diǎn):mongod --dbpath d:\master --port 10000 --master
啟動(dòng)從節(jié)點(diǎn):mongod --dbpath d:\slave --port 10001 --slave --source localhost:10000
啟動(dòng)成功后就可以連接主節(jié)點(diǎn)進(jìn)行操作了,而這些操作會(huì)同步到從節(jié)點(diǎn)赂毯。
三战虏、副本集
副本集就是有自動(dòng)故障恢復(fù)功能的主從集群。
主從集群和副本集最大的區(qū)別就是副本集沒有固定的“主節(jié)點(diǎn)”党涕;整個(gè)集群會(huì)選出一個(gè)“主節(jié)點(diǎn)”烦感,當(dāng)其掛掉后,又在剩下的從節(jié)點(diǎn)中選中其他節(jié)點(diǎn)為“主節(jié)點(diǎn)”膛堤,副本集總有一個(gè)活躍點(diǎn)(primary)和一個(gè)或多個(gè)備份節(jié)點(diǎn)(secondary)手趣。
以三個(gè)節(jié)點(diǎn)為例:
節(jié)點(diǎn)1:
HOST:localhost:10001
Log File:D:\mongodb\logs\node1\logs.txt
Data File:D:\mongodb\dbs\node1
節(jié)點(diǎn)2:
HOST:localhost:10002
Log File:D:\mongodb\logs\node2\logs.txt
Data File:D:\mongodb\dbs\node2
節(jié)點(diǎn)3:
HOST:localhost:10003
Log File:D:\mongodb\logs\node3\logs.txt
Data File:D:\mongodb\dbs\node3
啟動(dòng):
啟動(dòng)節(jié)點(diǎn)1:
mongod --dbpath D:\mongodb\dbs\node1 --logpath
D:\mongodb\logs\node1\logs.txt --logappend --port 10001 --replSet
hcx/localhost:10002 --master
啟動(dòng)節(jié)點(diǎn)2:
mongod --dbpath D:\mongodb\dbs\node2 --logpath
D:\mongodb\logs\node2\logs.txt --logappend --port 10002 --replSet
hcx/localhost:10001
啟動(dòng)節(jié)點(diǎn)3:
mongod --dbpath D:\mongodb\dbs\node3 --logpath
D:\mongodb\logs\node3\logs.txt --logappend --port 10003 --replSet
hcx/localhost:10001,localhost:10002
初始化節(jié)點(diǎn)(只能初始化一次):
隨便登錄一個(gè)節(jié)點(diǎn),以10001為例
monogo localhost:10001/admin
db.runCommand({
db.runCommand({
"replSetInitiate":{
"_id":"hcx",
"members":[
{
"_id":1,
"host":"localhost:10001",
"priority":3
},
{
"_id":2,
"host":"localhost:10002",
"priority":2
},
{
"_id":3,
"host":"localhost:10003",
"priority":1
}
]}});
查詢當(dāng)前主庫,登錄10002
mongo localhost:10002
db.$cmd.findOne ( {ismaster: 1 } );
關(guān)閉10001服務(wù)Dos命令窗口, 登錄10002查詢當(dāng)前主庫
mongo localhost:10002
db.$cmd.findOne ( {ismaster: 1 } );
四肥荔、分片(sharding)分布式存儲(chǔ)
分片(sharding)是指將數(shù)據(jù)拆分绿渣,將其分散存在不同的機(jī)器上的過程。有時(shí)也用分區(qū)(partitioning)來表示這個(gè)概念燕耿。將數(shù)據(jù)分散到不同的機(jī)器上中符,不需要功能強(qiáng)大的大型計(jì)算機(jī)就可以儲(chǔ)存更多的數(shù)據(jù),處理更多的負(fù)載誉帅。
MongoDB分片的基本思想就是將集合切分成小塊淀散。這些塊分散到若干片里面,每個(gè)片只負(fù)責(zé)總數(shù)據(jù)的一部分蚜锨。應(yīng)用程序不必知道哪片對(duì)應(yīng)哪些數(shù)據(jù)吧凉,甚至不需要知道數(shù)據(jù)已經(jīng)被拆分了,所以在分片之前要運(yùn)行一個(gè)路由進(jìn)程踏志,該進(jìn)程名為mongos阀捅。這個(gè)路由器知道所有數(shù)據(jù)的存放位置,所以應(yīng)用可以連接它來正常發(fā)送請(qǐng)求针余。對(duì)應(yīng)用來說饲鄙,它僅知道連接了一個(gè)普通的mongod。路由器知道數(shù)據(jù)和片的對(duì)應(yīng)關(guān)系圆雁,能夠轉(zhuǎn)發(fā)請(qǐng)求到正確的片上忍级。如果請(qǐng)求有了回應(yīng),路由器將其收集起來回送給應(yīng)用伪朽。
設(shè)置分片時(shí)轴咱,需要從集合里面選一個(gè)鍵,用該鍵的值作為數(shù)據(jù)拆分的依據(jù)。這個(gè)鍵稱為片鍵(shard key)朴肺。
{name:"zhangsan",age:1}
用個(gè)例子來說明這個(gè)過程:假設(shè)有個(gè)文檔集合表示的是人員窖剑。如果選擇名字("name")作為片鍵,第一片可能會(huì)存放名字以AF開頭的文檔戈稿,第二片存的GP的名字西土,第三片存的Q~Z的名字。隨著添加或者刪除片鞍盗,MongoDB會(huì)重新平衡數(shù)據(jù)需了,使每片的流量都比較均衡,數(shù)據(jù)量也在合理范圍內(nèi)般甲。
步驟:
1肋乍、創(chuàng)建三個(gè)目錄,分別存放兩個(gè)mongod服務(wù)的數(shù)據(jù)文件和config服務(wù)的數(shù)據(jù)文件
2敷存、開啟config服務(wù)器 墓造。mongos要把mongod之間的配置放到config服務(wù)器里面,所以首先開啟它历帚,這里就使用2222端口滔岳。 命令為:
mongod --dbpath E:\sharding\config_node --port 2222
3杠娱、開啟mongos服務(wù)器 挽牢。這里要注意的是我們開啟的是mongos,端口3333摊求,同時(shí)指定下config服務(wù)器禽拔。命令為:
mongos --port 3333 --configdb=127.0.0.1:2222
4、啟動(dòng)mongod服務(wù)器 室叉。對(duì)分片來說睹栖,也就是要添加片了,這里開啟兩個(gè)mongod服務(wù)茧痕,端口分別為:4444野来,5555。命令為:
mongod --dbpath E:\sharding\mongod_node1 --port 4444
mongod --dbpath E:\sharding\mongod_node2 --port 5555
5踪旷、服務(wù)配置 曼氛。client直接跟mongos打交道,也就說明我們要連接mongos服務(wù)器令野,然后將4444舀患,5555的mongod交給mongos,添加分片也就是addshard()。
6气破、開啟數(shù)據(jù)庫分片功能聊浅,命令很簡(jiǎn)單 enablesharding(),這里就開啟test數(shù)據(jù)庫。
7、指定集合中分片的片鍵低匙,這里就指定為person.name鍵旷痕。
8、通過mongos插入10w記錄努咐,然后通過printShardingStatus命令查看mongodb的數(shù)據(jù)分片情況苦蒿。