mongodb
1.部署
a. 單機部署
1.配置MongoDB的yum源
創建yum源文件: vim /etc/yum.repos.d/mongodb-org-3.4.repo 添加以下內容: [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
這裏可以修改 gpgcheck=0, 省去gpg驗證
安裝之前先更新所有包 :yum update (可選操作)
2.安裝MongoDB 安裝命令: yum -y install mongodb-org
安裝完成後
查看mongo安裝位置 whereis mongod
查看修改配置文件 : vim /etc/mongod.conf
3.啓動MongoDB 啓動mongodb :systemctl start mongod.service 停止mongodb :systemctl stop mongod.service
查到mongodb的狀態:systemctl status mongod.service
4.外網訪問需要關閉防火牆: CentOS 7.0默認使用的是firewall作爲防火牆,這裏改爲iptables防火牆。 關閉firewall: systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall開機啓動
5.設置開機啓動 systemctl enable mongod.service
6.啓動Mongo shell 命令:mongo
7.設置mongodb遠程訪問: 編輯mongod.conf註釋bindIp,並重啓mongodb. vim /etc/mongod.conf
重啓mongodb:systemctl restart mongod.service
b. 分佈式集羣部署
1.mongodb安裝包下載
到https://www.mongodb.org/dl/linux/x86_64下載
mongodb-linux-x86_64-v3.4-latest.gz
2.建數據存儲目錄
/.../data/mongodb/mongos/{db,log}
/.../data/mongodb/configServer/{db,log}
/.../data/mongodb/shard1/{db,log}
/.../data/mongodb/shard2/{db,log}
3.寫配置文件mongo_node.conf
/.../data/mongodb/conf/mongo_node.conf
storage:
engine: wiredTiger
directoryPerDB: true
journal:
enabled: true
systemLog:
destination: file
logAppend: true
operationProfiling:
slowOpThresholdMs: 10000
replication:
oplogSizeMB: 10240
processManagement:
fork: true
net:
bindIp: 0.0.0.0
http:
enabled: true
security:
authorization: "enabled"
4.寫配置文件mongos.conf
/.../data/mongodb/conf/mongos.conf
systemLog:
destination: file
logAppend: true
processManagement:
fork: true
net:
http:
enabled: false
5.創建keyfile文件
/.../data/mongodb/keyfile/mongo.key
mkdir keyfile
openssl rand -base64 756 > mongo.key
chmod 400 mongo.key
mv mongo.key keyfile
6.遠程發送keyfile文件到其他節點
需要root權限
sudo scp mongo.key @test2:/home/test/apps/data/mongodb/keyfile
7.集羣搭建
1)編寫配置服務啓動腳本
a.配置服務腳本config_start.sh
WORK_DIR=/home/test/apps/data/mongodb
KEYFILE=$WORK_DIR/keyfile/mongo.key
CONFFILE=$WORK_DIR/conf/mongo_node.conf
MONGOD=/home/test/apps/mongodb3.4.23/bin/mongod
DBPATH=$WORK_DIR/configServer/db
LOGPATH=$WORK_DIR/configServer/log
$MONGOD --port 27017 --configsvr --replSet configReplSet --keyFile $KEYFILE --dbpath $DBPATH --pidfilepath $WORK_DIR/configServer/db.pid --logpath $LOGPATH/mongod.log --config $CONFFILE
b.副本集初始化
隨便進入一個mongo客戶端
./mongo
var conf = {
_id : "configReplSet",
members : [
{ _id : 1, host : "192.168.2.132:27017" },
{ _id : 2, host : "192.168.2.133:27017" },
{ _id : 3, host : "192.168.2.134:27017" }
]
}
rs.initiate(conf)
2) 編寫分片腳本shard1_start.sh和shard2_start.sh
a.編寫shard1腳本shard1_start.sh
WORK_DIR=/home/test/apps/data/mongodb
KEYFILE=$WORK_DIR/keyfile/mongo.key
CONFFILE=$WORK_DIR/conf/mongo_node.conf
MONGOD=/home/test/apps/mongodb3.4.23/bin/mongod
echo "start shard1 replicaset"
$MONGOD --port 27001 --shardsvr --replSet shard1 --keyFile $KEYFILE --dbpath $WORK_DIR/shard1/db --pidfilepath $WORK_DIR/configServer/db.pid --logpath $WORK_DIR/shard1/log/mongod.log --config $CONFFILE
b.編寫shard2腳本shard2_start.sh
WORK_DIR=/home/test/apps/data/mongodb
KEYFILE=$WORK_DIR/keyfile/mongo.key
CONFFILE=$WORK_DIR/conf/mongo_node.conf
MONGOD=/home/test/apps/mongodb3.4.23/bin/mongod
echo "start shard1 replicaset"
$MONGOD --port 27002 --shardsvr --replSet shard2 --keyFile $KEYFILE --dbpath $WORK_DIR/shard2/db --pidfilepath $WORK_DIR/configServer/db.pid --logpath $WORK_DIR/shard2/log/mongod.log --config $CONFFILE
c.分別在三臺機器執行兩個腳本
d.初始化副本集
進入一個客戶端
./mongo --port 27001 --host 127.0.0.1
cfg={
_id:"shard1",
members:[
{_id:0, host:'192.168.2.132:27001'},
{_id:1, host:'192.168.2.133:27001'},
{_id:2, host:'192.168.2.134:27001'}
]};
rs.initiate(cfg);
進入另一個
./mongo --port 27002 --host 127.0.0.1
cfg={
_id:"shard2",
members:[
{_id:0, host:'192.168.2.132:27002'},
{_id:1, host:'192.168.2.133:27002'},
{_id:2, host:'192.168.2.134:27002'}
]};
rs.initiate(cfg);
3.編寫路由腳本
a.編寫mongos_start.sh
WORK_DIR=/home/test/apps/data/mongodb
KEYFILE=$WORK_DIR/keyfile/mongo.key
CONFFILE=$WORK_DIR/conf/mongos.conf
MONGOS=/home/test/apps/mongodb3.4.23/bin/mongos
echo "start mongos instances"
$MONGOS --port 25001 --configdb configReplSet/192.168.2.132:27017,192.168.2.133:27017,192.168.2.134:27017 --keyFile $KEYFILE --pidfilepath $WORK_DIR/configServer/db.pid --logpath $WORK_DIR/mongos/log/db.log --config $CONFFILE
b.進入客戶端添加分片
./mongo --port 25001 --host 127.0.0.1
sh.addShard("shard1/192.168.2.132:27001")
sh.addShard("shard2/192.168.2.134:27002")
5.初始化用戶
接入其中一個mongos實例,添加管理員用戶
use admin
db.createUser({
user:'admin',pwd:'admin',
roles:[
{role:'clusterAdmin',db:'admin'},
{role:'userAdminAnyDatabase',db:'admin'},
{role:'dbAdminAnyDatabase',db:'admin'},
{role:'readWriteAnyDatabase',db:'admin'}
]})
當前admin用戶具有集羣管理權限、所有數據庫的操作權限。 需要注意的是,在第一次創建用戶之後,localexception不再有效,接下來的所有操作要求先通過鑑權。
use admin
db.auth('admin','admin')
檢查集羣狀態
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5da5796d1af1c6d6138fad3f")
}
shards:
{ "_id" : "shard1", "host" : "shard1/192.168.2.132:27001,192.168.2.133:27001,192.168.2.134:27001", "state" : 1 }
{ "_id" : "shard2", "host" : "shard2/192.168.2.132:27002,192.168.2.133:27002,192.168.2.134:27002", "state" : 1 }
active mongoses:
"3.4.23-8-g5e9b683bee" : 3
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
NaN
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
No recent migrations
databases:
8 .數據操作
在案例中,創建testpuser用戶、爲數據庫實例testb啓動分片。
test
db.createUser({user:'testuser',pwd:'123456',roles:[{role:'dbOwner',db:'test")
創建集合book,爲其執行分片初始化。
use appdb
db.createCollection("book")
db.device.ensureIndex({createTime:1})
sh.shardCollection("appdb.book", {bookId:"hashed"}, false, { numInitialChunks: 4} )
繼續往device集合寫入1W條記錄,觀察chunks的分佈情況
use test
var cnt = 0;
for(var i=0; i<100; i++){
var dl = [];
for(var j=0; j<100; j++){
dl.push({
"bookId" : "BBK-" + i + "-" + j,
"type" : "Revision",
"version" : "IricSoneVB0001",
"title" : "Jackson's Life",
"subCount" : 10,
"location" : "China CN Shenzhen Futian District",
"author" : {
"name" : 50,
"email" : "[email protected]",
"gender" : "female"
},
"createTime" : new Date()
});
}
cnt += dl.length;
db.book.insertMany(dl);
print("insert ", cnt);
}
執行db.book.getShardDistribution(),輸出如下:
mongos> db.book.getShardDistribution();
Shard shard1 at shard1/192.168.2.132:27001,192.168.2.133:27001,192.168.2.134:27001
data : 1.32MiB docs : 4961 chunks : 2
estimated data per chunk : 680KiB
estimated docs per chunk : 2480
Shard shard2 at shard2/192.168.2.132:27002,192.168.2.133:27002,192.168.2.134:27002
data : 1.34MiB docs : 5039 chunks : 2
estimated data per chunk : 690KiB
estimated docs per chunk : 2519
Totals
data : 2.67MiB docs : 10000 chunks : 4
Shard shard1 contains 49.61% data, 49.61% docs in cluster, avg obj size on shard : 280B
Shard shard2 contains 50.38% data, 50.39% docs in cluster, avg obj size on shard : 280B
各方案的優劣
單機模式:
優點:
a.部署容易,數據不需要複製備份,節省資源,適合少量數據的存取
b.安全穩定,受網絡影響小,安全性好
c.排障容易,只有一臺機器也容易找到故障來源
缺點:
a.可靠性差,機器故障容易丟失數據
b.擴展性差,升級配置需要的成本高
c.性能差,高併發時容易宕機
集羣模式:
優點:
a.可靠,一臺服務器宕機,並不影響系統運行
b.可擴展,隨時可以增加機器;
c.資源共享,共享數據是必不可少的應用,如銀行,預訂系統。
d.更快的速度:多臺計算機的運算速度遠大於一臺。
e.高性價比:相比縱向擴展硬件配置,節省了開支
缺點:
a.故障排除,產生故障時需要花費的時間更多
b.網絡影響,受網絡限制更大,集羣本身機器之間的數據傳輸依賴網絡傳輸
c.安全性,資源共享會導致安全風險
2.性能測試
服務器配置:
內存:64g
磁盤分區:11t
系統信息:
LSB Version: :core-4.1-amd64:core-4.1-noarch Distributor ID: CentOS Description: CentOS Linux release 7.2.1511 (Core) Release: 7.2.1511 Codename: Core
a. 單機
(1 讀/寫速度
a.文件讀寫
導入數據
2019-10-16T18:39:45.266+0800 imported 100000 documents
導出數據
2019-10-16T18:39:59.048+0800 connected to: 127.0.0.1:25001
2019-10-16T18:40:00.036+0800 [#.......................] test.book 8000/100000 (8.0%)
2019-10-16T18:40:01.036+0800 [#######.................] test.book 32000/100000 (32.0%)
2019-10-16T18:40:02.036+0800 [###########.............] test.book 48000/100000 (48.0%)
2019-10-16T18:40:03.036+0800 [#################.......] test.book 72000/100000 (72.0%)
2019-10-16T18:40:04.036+0800 [#####################...] test.book 88000/100000 (88.0%)
2019-10-16T18:40:04.268+0800 [########################] test.book 100000/100000 (100.0%)
2019-10-16T18:40:04.268+0800 exported 100000 records
100000條數據耗時: 6 s
1000w條數據:134 s
b.api請求讀寫
單條數據請求寫10000次耗時37s
單條數據請求讀10000次耗時40s
(2 容量大小
"db" : "test",
"collections" : 1,
"views" : 0,
"objects" : 337125,
"avgObjSize" : 234.4636559139785,
"dataSize" : 79043560,
"storageSize" : 11988992,
"numExtents" : 0,
"indexes" : 1,
"indexSize" : 3481600,
"ok" : 1
}
(3 資源使用
內存:268m
b. 集羣
(1 讀/寫速度
a.文件讀寫
導入數據
2019-10-16T18:16:55.532+0800 connected to: 127.0.0.1:25001
2019-10-16T18:16:57.651+0800 imported 100000 documents
100000條數據耗時: 2 s
導出數據
2019-10-16T18:17:04.586+0800 connected to: 127.0.0.1:25001
2019-10-16T18:17:05.564+0800 [#.......................] test.book 8000/100000 (8.0%)
2019-10-16T18:17:06.564+0800 [#######.................] test.book 32000/100000 (32.0%)
2019-10-16T18:17:07.564+0800 [###########.............] test.book 48000/100000 (48.0%)
2019-10-16T18:17:08.564+0800 [#################.......] test.book 72000/100000 (72.0%)
2019-10-16T18:17:09.564+0800 [#######################.] test.book 96000/100000 (96.0%)
2019-10-16T18:17:09.760+0800 [########################] test.book 100000/100000 (100.0%)
2019-10-16T18:17:09.760+0800 exported 100000 records
100000條數據耗時: 5 s
1000w條耗時322 s
10w條耗時336s
b.api請求讀寫
單條數據請求寫10000次耗時39s
單條數據請求寫100000次耗時386s
單條數據請求讀10000次耗時51s
(2 容量大小
導入數據2500w條的時候,導入速度變慢,但是api請求的速度不變
(3 資源使用
內存:1.8g
3.常用的數據存儲方式
mongodb存儲形式爲文檔形式,支持xml、json、bson
mongodb的數據格式爲任意類型的鍵值對,並且可以鍵值對嵌套在value中
數據存儲方式爲數據文件如:
collection-3-4415151890359181580.wt
以及索引文件:
index-4-4415151890359181580.wt
4.數據安全
a. 備份
數據備份:
mongodump -h host:port -u user -p pwd -d test -o path
如:./mongodump -h 127.0.0.1:25001 -u testuser -p 123456 -d test -o /data02/fw/bac
數據恢復:
mongorestore -h host:port -u user -p pwd -d test -directoryperdb path
b. 主從
mongodb採用主從複製的方式保證數據安全,我配置了三個節點,自動選舉出一個主節點,兩個從節點,共有三個備份
主節點:192.168.2.203:26001
從節點:192.168.2.203:26002,192.168.2.203:26003
5.權限控制
a. 數據分區控制
mongodb沒有分區,但是分佈式mongodb可以分片
我配置了兩個分片shard1和shard2
shard1:192.168.2.203:28001,92.168.2.203:28002,92.168.2.203:28003
shard2: 192.168.2.203:28004,92.168.2.203:28005,92.168.2.203:28006
分片可以減少單臺服務器存儲壓力,mongodb會將數據在每個分片間自動均衡
b. 用戶授權使用
剛剛安裝的mongodb是沒有權限限制的,在創建了管理員賬戶後,所有的操作都需要用戶驗證,所以需要再創建一個可讀可寫的普通用戶
使用分佈式mongodb時,都通過mongos實例對數據進行操作
./mong --port 25001
創建管理員
use admin
db.createUser({
user:'admin',pwd:'admin',
roles:[
{role:'clusterAdmin',db:'admin'},
{role:'userAdminAnyDatabase',db:'admin'},
{role:'dbAdminAnyDatabase',db:'admin'},
{role:'readWriteAnyDatabase',db:'admin'}
]})
身份驗證
use admin
db.auth('admin','admin')
創建普通用戶
db.createUser({user:'testuser',pwd:'123456',roles:[{role:'dbOwner',db:'test")
c. 網絡接入控制
一,訪問控制的參數
1,綁定IP地址
配置文件:
net:
bindIp: 0.0.0.0
mongod 參數:**--bind_ip**`` <ip address>
訪問ip:192.168.2.203
默認值是所有的IP地址都能訪問,該參數指定MongoDB對外提供服務的綁定IP地址,用於監聽客戶端 Application的連接,客戶端只能使用綁定的IP地址才能訪問mongod,其他IP地址是無法訪問的。
2,設置監聽端口
mongod 參數:**--port** <port>
25001/25001/25003
MongoDB 默認監聽的端口是27017,該參數顯式指定MongoDB實例監聽的TCP 端口,只有當客戶端Application連接的端口和MongoDB實例監聽的端口一致時,才能連接到MongoDB實例。
3,啓用用戶驗證
mongod 參數:**--auth**
配置文件:
security:
authorization: "enabled"
admin:admin
testuser:123456
4,權限認證
mongo 參數:**--username** <username>, -u <username>
mongo 參數:**--password** <password>, -p <password>
mongo 參數:**--authenticationDatabase** <dbname> 指定創建User的數據庫;在特定的數據庫中創建User,該DB就是User的authentication database。
原文出處:https://www.cnblogs.com/vision123/p/mongodb_install.html