mongodb單機和分佈式安裝部署過程

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章