MongoDB 是一個(gè)基于分布式文件存儲(chǔ)的 NoSQL 開源(遵循 SSPL 協(xié)議)數(shù)據(jù)庫,旨在為 WEB 應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB 將數(shù)據(jù)存儲(chǔ)為一個(gè)文檔,文檔由鍵/值(Key / Value)組成,結(jié)構(gòu)類似于 JSON 對(duì)象,值可以嵌套其他文檔,數(shù)組及文檔數(shù)組。MongoDB 在高負(fù)載的情況下,可以通過添加更多的節(jié)點(diǎn)保證服務(wù)器性能。
本方案基于CentOS8系統(tǒng)設(shè)計(jì),建議在RedHat/CentOS系統(tǒng)中使用。方案使用服務(wù)器及網(wǎng)絡(luò)資源較多,建議在實(shí)施前做好規(guī)劃工作,有利于部署工作順利、有序進(jìn)行。
目錄
1.前言
2.MongoDB 單點(diǎn)安裝和配置
3.MongoDB 副本集集群部署
--3.1.集群部署拓?fù)鋱D
--3.2.集群部署
4.MongoDB 副本集+分片集群部署
--4.1.集群部署拓?fù)鋱D
--4.2.集群部署
----4.2.1.通用前置配置
----4.2.2.部署配置服務(wù)器
----4.2.3.部署分片服務(wù)器
----4.2.4.部署路由服務(wù)器
--4.3.創(chuàng)建分片和初始化管理員賬戶
5.Robo 3T 客戶端
附錄一:MongoDB 配置文件詳解
附錄二:Java 集成開發(fā)學(xué)習(xí)指南
常見問題一:SELinux 引起的安全策略問題
常見問題二:MongoDB 運(yùn)行時(shí)文件已存在的問題
1.前言
MongoDB 是 MySQL、PostgreSQL 等 RDBMS 的可替代品,適用于 大數(shù)據(jù)、高并發(fā)、弱事務(wù)、少聯(lián)表 的 OLTP 數(shù)據(jù)庫系統(tǒng)。
1、MongoDB 的邏輯結(jié)構(gòu)
| 邏輯對(duì)象 | MongoDB | 對(duì)應(yīng) RDBMS 對(duì)象 |
|---|---|---|
| 數(shù)據(jù)標(biāo)準(zhǔn) | JSON | 二維表 |
| 實(shí)例 | 數(shù)據(jù)庫目錄(dbpath) | 數(shù)據(jù)庫實(shí)例(instance) |
| 數(shù)據(jù)庫 | 數(shù)據(jù)庫(database) | 數(shù)據(jù)庫(database) |
| 數(shù)據(jù)集 | 集合(collection) | 表(table) |
| 數(shù)據(jù)記錄 | 文檔(document) | 行(row) |
| 字段 | 鍵(key) | 列(column) |
| 值 | 值(value) | 值(value) |
| 主鍵 | 自動(dòng)主鍵(_id) | 主鍵(pk) |
| 外鍵 | 無 | 有(fk) |
| 索引 | 有(index) | 有(index) |
| 視圖 | 無 | 有(view) |
| 存儲(chǔ)過程 | 無 | 有(procedure) |
| 觸發(fā)器 | 無 | 有(tigger) |
2、MongoDB 的內(nèi)置角色
| 角色名稱 | 授予該角色用戶的權(quán)限 |
|---|---|
| read | 授予用戶讀取指定數(shù)據(jù)庫的權(quán)限 |
| readWrite | 授予用戶讀寫指定數(shù)據(jù)庫的權(quán)限 |
| dbAdmin | 授予用戶用戶在指定數(shù)據(jù)庫中執(zhí)行管理函數(shù),如:索引創(chuàng)建、刪除,查看統(tǒng)計(jì)或訪問系統(tǒng)日志的權(quán)限 |
| userAdmin | 授予用戶在指定數(shù)據(jù)庫里創(chuàng)建、刪除和管理用戶的權(quán)限 |
| clusterAdmin | 只在【admin】數(shù)據(jù)庫中可用,授予用戶所有分片和副本集相關(guān)函數(shù)的管理權(quán)限 |
| readAnyDatabase | 只在【admin】數(shù)據(jù)庫中可用,授予用戶所有數(shù)據(jù)庫的讀權(quán)限 |
| readWriteAnyDatabase | 只在【admin】數(shù)據(jù)庫中可用,授予用戶所有數(shù)據(jù)庫的讀寫權(quán)限 |
| userAdminAnyDatabase | 只在【admin】數(shù)據(jù)庫中可用,授予用戶所有數(shù)據(jù)庫創(chuàng)建、刪除和管理用戶的權(quán)限的權(quán)限 |
| dbAdminAnyDatabase | 只在【admin】數(shù)據(jù)庫中可用,授予用戶在所有數(shù)據(jù)庫中執(zhí)行管理函數(shù),如:索引創(chuàng)建、刪除,查看統(tǒng)計(jì)或訪問系統(tǒng)日志的權(quán)限 |
3、MongoDB 的集群概念
1、節(jié)點(diǎn)(node)和 集群(cluster):節(jié)點(diǎn)是單個(gè) MongoDB 服務(wù),一般部署在單獨(dú)的服務(wù)器上。集群由數(shù)據(jù)節(jié)點(diǎn)(主節(jié)點(diǎn)+備節(jié)點(diǎn))和仲裁節(jié)點(diǎn)組成,數(shù)據(jù)節(jié)點(diǎn)單獨(dú)或是合并承擔(dān)配置服務(wù)器、路由服務(wù)器、分片服務(wù)器(存儲(chǔ)服務(wù)器)的角色;仲裁節(jié)點(diǎn)則負(fù)責(zé)主節(jié)點(diǎn)的故障轉(zhuǎn)移。
2、主節(jié)點(diǎn)(master)和備節(jié)點(diǎn)(slaver):主節(jié)點(diǎn)提供所有增刪查改服務(wù);備節(jié)點(diǎn)僅提供查詢服務(wù)(或者不提供服務(wù)),當(dāng)客戶端進(jìn)行數(shù)據(jù)查詢時(shí),請(qǐng)求通過負(fù)載均衡分發(fā)到備節(jié)點(diǎn)執(zhí)行。
3、仲裁節(jié)點(diǎn)(arbiter):仲裁者是集群中的一個(gè)副本集節(jié)點(diǎn)。它并不保存數(shù)據(jù),主要負(fù)責(zé)當(dāng)主節(jié)點(diǎn)故障后,選擇并提示一個(gè)備節(jié)點(diǎn)成為新的主節(jié)點(diǎn)。仲裁節(jié)點(diǎn)必須部署在獨(dú)立的節(jié)點(diǎn)上,對(duì)于硬件需求較低。
4、配置服務(wù)器(config):配置服務(wù)器負(fù)責(zé)存儲(chǔ)所有數(shù)據(jù)庫元信息(路由、分片)的配置資源。mongos 本身沒有物理存儲(chǔ)分片服務(wù)器和數(shù)據(jù)路由信息,只是緩存在內(nèi)存里,config server 則實(shí)際存儲(chǔ)這些數(shù)據(jù)。mongos 第一次啟動(dòng)或者重啟就會(huì)從 config server 加載配置信息,以后如果 config server 的信息發(fā)生變化會(huì)通知到所有的 mongos 更新自己的狀態(tài),這樣 mongos 就能繼續(xù)準(zhǔn)確路由。在生產(chǎn)環(huán)境通常部署多個(gè) config server 以放棄防止其中一個(gè) mongos 離線后配置數(shù)據(jù)丟失。
5、路由服務(wù)器(mongos):路由服務(wù)器是數(shù)據(jù)庫集群請(qǐng)求的入口,所有的請(qǐng)求都通過 mongos 進(jìn)行協(xié)調(diào),不需要在應(yīng)用程序添加一個(gè)路由選擇器,mongos 自己就是一個(gè)請(qǐng)求分發(fā)中心,它負(fù)責(zé)把對(duì)應(yīng)的數(shù)據(jù)請(qǐng)求請(qǐng)求轉(zhuǎn)發(fā)到對(duì)應(yīng)的分片(shard)服務(wù)器上。在生產(chǎn)環(huán)境中通常部署多個(gè) mongos 以防止其中一個(gè) mongos 離線后數(shù)據(jù)庫無法訪問。
6、分片服務(wù)器(shard):分片服務(wù)器負(fù)責(zé)存儲(chǔ)數(shù)據(jù),它將數(shù)據(jù)庫拆分后在不同的服務(wù)器上存儲(chǔ)。將數(shù)據(jù)分散到不同的服務(wù)器上,不需要功能強(qiáng)大的服務(wù)器就可以存儲(chǔ)更多的數(shù)據(jù)和處理更大的負(fù)載。核心思想就是將集合切成小塊,這些塊分散到若干片里,每個(gè)片只負(fù)責(zé)總數(shù)據(jù)的一部分,最后通過一個(gè)均衡器來對(duì)各個(gè)分片進(jìn)行均衡(數(shù)據(jù)遷移)。
7、副本集(replica set):副本集是 shard 的備份,防止 shard 故障后引起數(shù)據(jù)丟失。replica set 提供了數(shù)據(jù)的冗余備份,并在多個(gè)服務(wù)器上存儲(chǔ)數(shù)據(jù)副本,提高了數(shù)據(jù)的可用性, 并可以保證數(shù)據(jù)的安全性。
4、MongoDB 與 RDBMS 的主要區(qū)別
- RDBMS 主要使用 T-SQL 操縱數(shù)據(jù)庫;MongoDB 使用 API 操縱數(shù)據(jù)庫。
- RDBMS 的數(shù)據(jù)結(jié)構(gòu)具有一致性,同一個(gè)表中的數(shù)據(jù)記錄必須有相同的字段;MongoDB 使用彈性的數(shù)據(jù)結(jié)構(gòu),同一個(gè)集合中的 JSON 文檔可以由不同的鍵組成。
- RDBMS 具有完整的 ACID 事務(wù)(原子性、一致性、隔離性和持久性)能力;MongoDB 只有簡化的 ACID 事務(wù)能力(僅支持 CRUD 和 信息查詢命令),早期版本僅支持單文檔事務(wù),v4.0 版本后支持多文檔事務(wù),v4.2 版本后能夠支持跨分片的事務(wù)。
- RDBMS 具有強(qiáng)大的 Join 聯(lián)表查詢功能;MongoDB 通過文檔嵌套實(shí)現(xiàn)聯(lián)表查詢,多級(jí)嵌套查詢的支撐能力不夠好。
- MongoDB 自帶分布式數(shù)據(jù)庫功能,數(shù)據(jù)可以分散在多個(gè)節(jié)點(diǎn)的分片中存儲(chǔ); RDBMS 不支持。
- MongoDB 自帶數(shù)據(jù)冗余存儲(chǔ)功能,統(tǒng)一份數(shù)據(jù)在多個(gè)節(jié)點(diǎn)中冗余存儲(chǔ);RDBMS 自帶主從數(shù)據(jù)庫實(shí)現(xiàn)。
- MongoDB 自帶集群功能,配置簡單,開箱即用;RDBMS 需要通過集成中間件搭建集群,配置復(fù)雜。
- MongoDB 的性能遠(yuǎn)遠(yuǎn)高于 RDBMS,水平擴(kuò)展能力遠(yuǎn)遠(yuǎn)高于 RDBMS。
- MongoDB 的數(shù)據(jù)存儲(chǔ)空間占用較多,本身沒有垃圾文件清理機(jī)制,需要外部干涉。
5、MongoDB 的應(yīng)用場(chǎng)景
相較于 RDBMS 來看,當(dāng)應(yīng)用系統(tǒng)具備以下需求時(shí),應(yīng)當(dāng)考慮使用 MongoDB 進(jìn)行替代:
1)性能面:
- 應(yīng)用對(duì)于 QPS(查詢率/秒) 和 TPS(事務(wù)數(shù)/秒)的高并發(fā)指標(biāo)具有較高的需求。
- 應(yīng)用對(duì)于避免宕機(jī),連續(xù)運(yùn)行時(shí)間的可靠性指標(biāo)具有較高的需求。
- 應(yīng)用對(duì)于數(shù)據(jù)的實(shí)時(shí)備份與在線恢復(fù)具有較高的需求。
2)業(yè)務(wù)面:
- 業(yè)務(wù)數(shù)據(jù)需要 TB 到 PB 級(jí)的存儲(chǔ)需求。
- 業(yè)務(wù)規(guī)模發(fā)展迅速,應(yīng)用需要快速水平擴(kuò)展的需求。
3)技術(shù)面:
- 新建應(yīng)用,不需要考慮 RDBMS 到 MongoDB 的改造工作。
- 需求不穩(wěn)定,數(shù)據(jù)模型頻繁變更的迭代型開發(fā)。
- 數(shù)據(jù)庫事務(wù)和 Join 聯(lián)表查詢的需求較弱(或是通過設(shè)計(jì)降低需求)。
總體來看,MongoDB 比 RDBMS 更適用于微服務(wù)架構(gòu)的應(yīng)用開發(fā)。
2.MongoDB 單點(diǎn)安裝和配置
1、打開 MongoDB 官方網(wǎng)站下載頁面【https://www.mongodb.com/try/download/community】,選擇 MongoDB 社區(qū)版的發(fā)布版本、適配操作系統(tǒng)和組件包(包括 server、mongos、shell 的編譯程序 rpm 包)下載到用戶主目錄中。

2、安裝 MongoDB 。
[centos@host ~]$ sudo dnf install mongodb-org-server-4.4.1-1.el8.x86_64.rpm
[centos@host ~]$ sudo dnf install mongodb-org-mongos-4.4.1-1.el8.x86_64.rpm
[centos@host ~]$ sudo dnf install mongodb-org-shell-4.4.1-1.el8.x86_64.rpm
程序安裝目錄是"/usr/bin";
服務(wù)端程序文件是"/usr/bin/mongod";
客戶端程序文件是"/usr/bin/mongo"。
服務(wù)端配置文件是"/etc/mongod.conf";
服務(wù)端默認(rèn)數(shù)據(jù)目錄是"/var/lib/mongo";
服務(wù)端默認(rèn)日志目錄是"/var/log/mongodb";
服務(wù)端默認(rèn)運(yùn)行目錄是"/var/run/mongodb";
服務(wù)端運(yùn)行用戶和組是"mongod :mongod ","mongod "用戶和組安裝時(shí)默認(rèn)創(chuàng)建。
3、創(chuàng)建 MongoDB 的數(shù)據(jù)目錄、日志目錄、運(yùn)行目錄,并設(shè)置目錄的擁有者為 MongoDB 管理用戶和組。
[centos@host ~]$ sudo mkdir -p /data/mongodb/data
[centos@host ~]$ sudo mkdir -p /data/mongodb/logs
[centos@host ~]$ sudo chown -R mongod:mongod /data/mongodb
4、在SELinux模式運(yùn)行時(shí),設(shè)置自定義目錄的安全標(biāo)記和安全策略。
[centos@host ~]$ sudo semanage fcontext -a -t default_t "/data(/.*)?"
[centos@host ~]$ sudo semanage fcontext -a -t mongod_var_lib_t "/data/mongodb/data(/.*)?"
[centos@host ~]$ sudo semanage fcontext -a -t mongod_log_t "/data/mongodb/logs(/.*)?"
[centos@host ~]$ sudo semanage fcontext -a -t mongod_var_run_t "/data/mongodb/run(/.*)?"
[centos@host ~]$ sudo restorecon -Rv /data
5、設(shè)置 MongoDB 配置文件參數(shù)。
使用文本編輯器打開配置文件:
[centos@host ~]$ sudo gedit /etc/mongod.conf
在文件中驗(yàn)證或修改以下內(nèi)容并保存:
# 日志配置
systemLog:
# 日志輸出目的地,可以指定為 “file” 或者“syslog”,表述輸出到日志文件,如果不指定,則會(huì)輸出到標(biāo)準(zhǔn)輸出中(standard output)
destination: file
# 如果為 true,當(dāng) mongod/mongos 重啟后,將在現(xiàn)有日志的尾部繼續(xù)添加日志。否則,將會(huì)備份當(dāng)前日志文件,然后創(chuàng)建一個(gè)新的日志文件;默認(rèn)為 false。
logAppend: true
# 日志文件位置。
path: /data/mongodb/logs/mongod.log
# 數(shù)據(jù)配置
storage:
# 日志存儲(chǔ)目錄。
dbPath: /data/mongodb/data
# 數(shù)據(jù)恢復(fù)
journal:
# 是否開啟 journal 日志持久存儲(chǔ)
enabled: true
# 是否將不同 DB 的數(shù)據(jù)存儲(chǔ)在不同的目錄中,默認(rèn)值為 false。
directoryPerDB: true
# 存儲(chǔ)引擎類型,mongodb 3.0 之后支持 “mmapv1”、“wiredTiger” 兩種引擎,默認(rèn)值為“mmapv1”;官方宣稱 wiredTiger 引擎更加優(yōu)秀。
# engine: wiredTiger
# 進(jìn)程管理
processManagement:
# 是否在后臺(tái)進(jìn)程運(yùn)行。在 docker 中運(yùn)行應(yīng)設(shè)置為 false。
fork: true
# PID 文件位置。
pidFilePath: /var/run/mongodb/mongod.pid
# 時(shí)間區(qū)域信息目錄。
timeZoneInfo: /usr/share/zoneinfo
# 網(wǎng)絡(luò)接口管理
net:
# 監(jiān)聽端口號(hào)。
port: 27017
# 綁定 IP 地址?!?.0.0.0】 表示綁定全部 IPv4 地址,【::】 表示綁定全部 IPv6 地址。多個(gè)地址使用 【,】 分割。
bindIp: 0.0.0.0
# 安全管理
security:
# disabled 或者 enabled,僅對(duì) mongod 有效;表示是否開啟用戶訪問控制(Access Control),即客戶端可以通過用戶名和密碼認(rèn)證的方式訪問系統(tǒng)的數(shù)據(jù),默認(rèn)為 “disabled”,即客戶端不需要密碼即可訪問數(shù)據(jù)庫數(shù)據(jù)。(限定客戶端與 mongod、mongos 的認(rèn)證)
authorization: enabled
6、配置 MongoDB 服務(wù)開機(jī)自啟動(dòng)。
使用文本編輯器打開"/lib/systemd/system/mongod.service"文件:
[centos@host ~]$ sudo gedit /usr/lib/systemd/system/mongod.service
驗(yàn)證或修改文件內(nèi)容并保存:
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod.conf"
ExecStart=/usr/bin/mongod $OPTIONS
PermissionsStartOnly=true
# 在 docker 中運(yùn)行應(yīng)注釋 "Type=forking"。
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
7、啟動(dòng)數(shù)據(jù)庫實(shí)例服務(wù),并設(shè)置為開機(jī)自動(dòng)啟動(dòng)。
[centos@host ~]$ sudo systemctl daemon-reload
[centos@host ~]$ sudo systemctl start mongod.service
[centos@host ~]$ sudo systemctl enable mongod.service
8、開啟遠(yuǎn)程訪問策略。
1)在SELinux模式運(yùn)行時(shí),開啟遠(yuǎn)程訪問安全策略。
[centos@host ~]$ sudo semanage port -a -t mongod_port_t -p tcp 27017
2)設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"27017"端口(MongoDB 默認(rèn)端口)訪問服務(wù)器。
[centos@host ~]$ sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
[centos@host ~]$ sudo firewall-cmd --reload
9、初始化管理員賬戶。
[centos@host ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017
> use admin
# 響應(yīng)信息
switched to db admin
mongos> db.createUser({
user:'admin',
pwd:'password',
roles:[
{role:'clusterAdmin',db:'admin'},
{role:'userAdminAnyDatabase',db:'admin'},
{role:'dbAdminAnyDatabase',db:'admin'},
{role:'readWriteAnyDatabase',db:'admin'}
]})
# 響應(yīng)信息
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "clusterAdmin",
"db" : "admin"
},
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "dbAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
]
}
10、數(shù)據(jù)庫運(yùn)維管理。
1)啟動(dòng)數(shù)據(jù)庫(任選一種方式)
[centos@host ~]$ sudo systemctl start mongod.service
或者
[centos@host ~]$ sudo -u mongod /usr/bin/mongod -f /etc/mongod.conf
或者
[centos@host ~]$ sudo -u mongod /usr/bin/mongod -dbpath /data/mongodb/data -port 27017 -fork -logpath /data/mongodb/logs/mongod.log -directoryperdb
2)停止數(shù)據(jù)庫(需通過用戶認(rèn)證)
[centos@host ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017 -u admin -p password
> use admin
# 響應(yīng)信息
switched to db admin
> db.shutdownServer()
# 響應(yīng)信息
server should be down...
3)查看數(shù)據(jù)庫狀態(tài)(查看狀態(tài))
[centos@host ~]$ sudo systemctl status mongod.service
或者(查看進(jìn)程)
[centos@host ~]$ sudo ps -ef | grep mongod
或者(查看端口)
[centos@host ~]$ sudo netstat -ntap | grep mongod
4)啟用開機(jī)自啟動(dòng)
[centos@host ~]$ sudo systemctl enable mongod.service
5)禁用開機(jī)自啟動(dòng)
[centos@host ~]$ sudo systemctl disable mongod.service
6)登錄客戶端
[centos@host ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017 -u admin -p password
>
或者
[centos@host ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017 -u admin
Enter password:
>
或者
[centos@host ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017
> use admin
# 響應(yīng)信息
switched to db admin
mongos> db.auth("admin","password")
# 響應(yīng)信息
1
7)備份數(shù)據(jù)庫
[centos@host ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017 -u admin -p password
> mongodump -h 127.0.0.1:27017 -d dbname -o /data/mongodb/backup
-h:MongDB所在服務(wù)器地址,例如:127.0.0.1 或 127.0.0.1:27017 。
-d:需要備份的數(shù)據(jù)庫實(shí)例
-o:備份的數(shù)據(jù)存放目錄。
8)恢復(fù)數(shù)據(jù)庫
[centos@host ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017 -u admin -p password
> mongorestore -h 127.0.0.1:27017 -d dbname /data/mongodb/backup/dbname
-h:MongDB所在服務(wù)器地址,例如:127.0.0.1 或 127.0.0.1:27017 。
-d:需要備份的數(shù)據(jù)庫實(shí)例。
--drop:恢復(fù)的時(shí)候,先刪除當(dāng)前數(shù)據(jù),然后恢復(fù)備份的數(shù)據(jù)。
--dir:指定備份的目錄。
<path>:設(shè)置備份數(shù)據(jù)所在位置,不能與 "--dir" 參數(shù)同時(shí)使用。
9)查看幫助信息
[centos@host ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017
>help
注意:在多個(gè)實(shí)例并行的情況下,每個(gè)實(shí)例獨(dú)立工作目錄、獨(dú)立配置文件、獨(dú)立PID文件、獨(dú)立端口、獨(dú)立啟動(dòng)服務(wù)。
3.MongoDB 副本集集群部署
3.1.集群部署拓?fù)鋱D

網(wǎng)絡(luò)資源規(guī)劃:
1、副本集節(jié)點(diǎn)(ReplSet Node)
| 節(jié)點(diǎn)名 | 主機(jī)名 | IP:PORT | 程序 | 操作系統(tǒng) |
|---|---|---|---|---|
| 副本集主節(jié)點(diǎn) | Master | 192.168.216.128:27017 | MongoDB | CentOS8 |
| 副本集備節(jié)點(diǎn)≥1 | Slaver-1 | 192.168.216.129:27017 | MongoDB | CentOS8 |
| 副本集仲裁節(jié)點(diǎn) | Arbiter | 192.168.216.130:27017 | MongoDB | CentOS8 |
2、客戶端:同一網(wǎng)段計(jì)算機(jī),部署 Robo 3T 或應(yīng)用系統(tǒng)的調(diào)用程序模塊。
3.2.集群部署
以"副本集主節(jié)點(diǎn)"為例:
1、參照章節(jié) "2.MongoDB 單點(diǎn)安裝和配置" 之第1-2 步安裝各個(gè)節(jié)點(diǎn) MongoDB 數(shù)據(jù)庫。
2、創(chuàng)建集群工作目錄。在 SELinux 模式運(yùn)行時(shí),需設(shè)置 SELinux 安全策略。
[centos@Master ~]$ sudo mkdir -p /data/mongodb-cluster
[centos@Master ~]$ sudo chown -R mongod:mongod /data/mongodb-cluster
[centos@Master ~]$ sudo semanage fcontext -a -t default_t "/data(/.*)?"
[centos@Master ~]$ sudo restorecon -Rv /data
3、創(chuàng)建集群安全認(rèn)證文件。在 SELinux 模式運(yùn)行時(shí),需設(shè)置 SELinux 安全策略。
[centos@Master ~]$ sudo -u mongod touch /data/mongodb-cluster/keyfile.key
[centos@Master ~]$ sudo chmod 666 /data/mongodb-cluster/keyfile.key
[centos@Master ~]$ sudo -u mongod echo "password"|base64 > /data/mongodb-cluster/keyfile.key
[centos@Master ~]$ sudo chmod 600 /data/mongodb-cluster/keyfile.key
[centos@Master ~]$ sudo semanage fcontext -a -t mongod_var_lib_t "/data/mongodb-cluster/keyfile.key"
[centos@Master ~]$ sudo restorecon -Rv /data/mongodb-cluster/keyfile.key
注意:其他集群節(jié)點(diǎn)上全部需要按照以上步驟配置,同一集群中全部節(jié)點(diǎn)的 "password" 必須一致。
4、設(shè)置 SELinux 安全策略。
使用文本編輯器在創(chuàng)建 "mongodb-extra.te" 策略源文件,例如:
[centos@Master ~]$ sudo gedit /data/mongodb-cluster/mongodb-extra.te
編寫以下內(nèi)容并保存:
module mongodb-extra 1.0;
require {
type mongod_t;
type cgroup_t;
class file { getattr open read };
}
#============= mongod_t ==============
#!!!! This avc is allowed in the current policy
allow mongod_t cgroup_t:file { getattr open read };
編譯并安裝策略文件:
[centos@Master ~]$ sudo checkmodule -M -m -o /data/mongodb-cluster/mongodb-extra.mod /data/mongodb-cluster/mongodb-extra.te
[centos@Master ~]$ sudo semodule_package -o /data/mongodb-cluster/mongodb-extra.pp -m /data/mongodb-cluster/mongodb-extra.mod
[centos@Master ~]$ sudo semodule -X 300 -i /data/mongodb-cluster/mongodb-extra.pp
5、創(chuàng)建 MongoDB 節(jié)點(diǎn)的數(shù)據(jù)目錄、日志目錄、運(yùn)行目錄,并設(shè)置目錄的擁有者為 MongoDB 管理用戶和組。
[centos@Master ~]$ sudo mkdir -p /data/mongodb-cluster/{data,logs,run}
[centos@Master ~]$ sudo chown -R mongod:mongod /data/mongodb-cluster
6、設(shè)置 MongoDB 節(jié)點(diǎn)的配置文件參數(shù)。
使用文本編輯器創(chuàng)建配置文件:
[centos@Master ~]$ sudo gedit /etc/mongod.conf
在文件中編寫以下內(nèi)容并保存:
systemLog:
destination: file
logAppend: true
path: /data/mongodb-cluster/logs/mongod.log
storage:
dbPath: /data/mongodb-cluster/data
journal:
enabled: true
directoryPerDB: true
net:
port: 27017
# 各節(jié)點(diǎn)分別設(shè)置為:192.168.216.128(129,130)或者統(tǒng)一設(shè)置為 0.0.0.0,127.0.0.1
bindIp: 0.0.0.0
processManagement:
fork: true
pidFilePath: /data/mongodb-cluster/run/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
security:
authorization: enabled
keyFile: /data/mongodb-cluster/keyfile.key
replication:
replSetName: replset
7、在 SELinux 模式運(yùn)行時(shí),設(shè)置自定義目錄的安全標(biāo)記和安全策略。
[centos@Master ~]$ sudo semanage fcontext -a -t mongod_var_lib_t "/data/mongodb-cluster/data(/.*)?"
[centos@Master ~]$ sudo semanage fcontext -a -t mongod_log_t "/data/mongodb-cluster/logs(/.*)?"
[centos@Master ~]$ sudo semanage fcontext -a -t mongod_var_run_t "/data/mongodb-cluster/run(/.*)?"
[centos@Master ~]$ sudo restorecon -Rv /data/mongodb-cluster
[centos@Master ~]$ sudo semanage fcontext -a -t etc_t "/etc/mongod.conf"
[centos@Master ~]$ sudo restorecon -Rv /etc/mongod.conf
8、配置 MongoDB 節(jié)點(diǎn)的服務(wù)開機(jī)自啟動(dòng)。
使用文本編輯器創(chuàng)建配置文件:
[centos@Master ~]$ sudo gedit /usr/lib/systemd/system/mongod.service
驗(yàn)證或修改文件內(nèi)容并保存:
[Unit]
Description=MongoDB Cluster Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod.conf -replSet replset"
ExecStart=/usr/bin/mongod $OPTIONS
PermissionsStartOnly=true
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
9、開啟 MongoDB 遠(yuǎn)程訪問策略。
1)在 SELinux 模式運(yùn)行時(shí),開啟遠(yuǎn)程訪問安全策略。
[centos@Master ~]$ sudo semanage port -a -t mongod_port_t -p tcp 27017
2)設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"27017"端口訪問服務(wù)器。
[centos@Master ~]$ sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
[centos@Master ~]$ sudo firewall-cmd --reload
10、啟動(dòng) MongoDB 節(jié)點(diǎn)的實(shí)例服務(wù),并設(shè)置為開機(jī)自動(dòng)啟動(dòng)。
[centos@Master ~]$ sudo systemctl daemon-reload
[centos@Master ~]$ sudo systemctl start mongod.service
[centos@Master ~]$ sudo systemctl enable mongod.service
注意:其他"副本集服務(wù)器"節(jié)點(diǎn)上全部需要按照以上步驟配置。
11、所有節(jié)點(diǎn)部署完成后,在主節(jié)點(diǎn)(本例為:192.168.216.128【Master 】)的客戶端本地登錄到服務(wù)器實(shí)例,初始化集群。
1)初始化集群節(jié)點(diǎn),并指定主節(jié)點(diǎn)。
[centos@Master ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017
> rs.initiate( { _id : "replset", members: [
{ _id: 0, host: "192.168.216.128:27017", priority:2 },
{ _id: 1, host: "192.168.216.129:27017", priority:1 },
{ _id: 2, host: "192.168.216.130:27017", arbiterOnly:true } ]})
# 響應(yīng)信息
{ "ok" : 1 }
> db.isMaster()
# 響應(yīng)信息
{
"hosts" : [
"192.168.216.128:27017",
"192.168.216.129:27017"
],
"arbiters" : [
"192.168.216.130:27017"
],
"setName" : "replset",
"setVersion" : 1,
"ismaster" : true,
"secondary" : false,
"primary" : "192.168.216.128:27017",
"me" : "192.168.216.128:27017",
"readOnly" : false,
"ok" : 1,
......
}
2)查看并驗(yàn)證集群狀態(tài)。
[centos@Master ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017
replset:PRIMARY> rs.status()
# 響應(yīng)信息
{
"set" : "replset",
......
"members" : [
{
"_id" : 0,
"name" : "192.168.216.128:27017",
"stateStr" : "PRIMARY",
......
},
{
"_id" : 1,
"name" : "192.168.216.129:27017",
"stateStr" : "SECONDARY",
......
},
{
"_id" : 2,
"name" : "192.168.216.130:27017",
"stateStr" : "ARBITER",
......
}
],
"ok" : 1,
......
}
12、所有節(jié)點(diǎn)部署完成后,在主節(jié)點(diǎn)(本例為:192.168.216.128【Master 】)的客戶端本地登錄到服務(wù)器實(shí)例,初始化管理員賬戶。
[centos@Master ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017
> use admin
# 響應(yīng)信息
switched to db admin
mongos> db.createUser({
user:'admin',
pwd:'password',
roles:[
{role:'clusterAdmin',db:'admin'},
{role:'userAdminAnyDatabase',db:'admin'},
{role:'dbAdminAnyDatabase',db:'admin'},
{role:'readWriteAnyDatabase',db:'admin'}
]})
# 響應(yīng)信息
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "clusterAdmin",
"db" : "admin"
},
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "dbAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
]
}
4.MongoDB 副本集+分片集群部署
4.1.集群部署拓?fù)鋱D

網(wǎng)絡(luò)資源規(guī)劃:
1、配置副本集節(jié)點(diǎn)(Config ReplSet Node)
| 節(jié)點(diǎn)名 | 主機(jī)名 | IP:PORT | 程序 | 操作系統(tǒng) |
|---|---|---|---|---|
| Config 副本集主節(jié)點(diǎn)-1 | Config-1 | 192.168.216.1:27019 | MongoDB | CentOS8 |
| Config 副本集備節(jié)點(diǎn)-2 | Config-2 | 192.168.216.2:27019 | MongoDB | CentOS8 |
| Config 副本集備節(jié)點(diǎn)≥3 | Config-3 | 192.168.216.3:27019 | MongoDB | CentOS8 |
2、數(shù)據(jù)副本集節(jié)點(diǎn)(Data ReplSet Node)
每個(gè)數(shù)據(jù)副本集中包含 3 個(gè)分片,每個(gè)分片是同一節(jié)點(diǎn)上的一個(gè) MongoDB 實(shí)例。
| 節(jié)點(diǎn)名 | 主機(jī)名 | IP:PORT | 程序 | 操作系統(tǒng) |
|---|---|---|---|---|
| Shard 副本集主節(jié)點(diǎn) | Repl-1 | 192.168.216.101:(27018 / 27028 / 27038) | MongoDB | CentOS8 |
| Shard 副本集備節(jié)點(diǎn)-1 | Repl-2 | 192.168.216.102:(27018 / 27028 / 27038) | MongoDB | CentOS8 |
| Shard 副本集備節(jié)點(diǎn)≥2 | Repl-3 | 192.168.216.103:(27018 / 27028 / 27038) | MongoDB | CentOS8 |
3、路由服務(wù)器節(jié)點(diǎn)(Router Server Node)
| 節(jié)點(diǎn)名 | 主機(jī)名 | IP:PORT | 程序 | 操作系統(tǒng) |
|---|---|---|---|---|
| Router 集群節(jié)點(diǎn)-1 | Router-1 | 192.168.216.128:27017 | MongoDB | CentOS8 |
| Router 集群節(jié)點(diǎn)-2 | Router-2 | 192.168.216.129:27017 | MongoDB | CentOS8 |
| Router 集群節(jié)點(diǎn)≥3 | Router-3 | 192.168.216.130:27017 | MongoDB | CentOS8 |
4、客戶端:同一網(wǎng)段計(jì)算機(jī),部署 Robo 3T 或應(yīng)用系統(tǒng)的調(diào)用程序模塊。
注意:配置服務(wù)器、路由服務(wù)器、分片服務(wù)器可以合并部署到同一節(jié)點(diǎn)上,通過啟動(dòng)不同的 MongoDB 實(shí)例實(shí)現(xiàn)。(在合并部署時(shí),單個(gè)服務(wù)器有可能會(huì)安裝 5(3 × Shard,1 × Router,1 × Config) 個(gè) MongoDB 實(shí)例)。
4.2.集群部署
4.2.1.通用前置配置
1、集群中全部節(jié)點(diǎn)參照章節(jié) "2.MongoDB 單點(diǎn)安裝和配置" 之第1-2 步安裝各個(gè)節(jié)點(diǎn) MongoDB 數(shù)據(jù)庫。
2、每一個(gè)節(jié)點(diǎn)上創(chuàng)建集群工作目錄。在 SELinux 模式運(yùn)行時(shí),需設(shè)置 SELinux 安全策略。
[centos@host ~]$ sudo mkdir -p /data/mongodb-cluster
[centos@host ~]$ sudo chown -R mongod:mongod /data/mongodb-cluster
[centos@host ~]$ sudo semanage fcontext -a -t default_t "/data(/.*)?"
[centos@host ~]$ sudo restorecon -Rv /data
3、每一個(gè)節(jié)點(diǎn)上創(chuàng)建集群安全認(rèn)證文件。在 SELinux 模式運(yùn)行時(shí),需設(shè)置 SELinux 安全策略。
[centos@host ~]$ sudo -u mongod touch /data/mongodb-cluster/keyfile.key
[centos@host ~]$ sudo chmod 666 /data/mongodb-cluster/keyfile.key
[centos@host ~]$ sudo -u mongod echo "password"|base64 > /data/mongodb-cluster/keyfile.key
[centos@host ~]$ sudo chmod 600 /data/mongodb-cluster/keyfile.key
[centos@host ~]$ sudo semanage fcontext -a -t mongod_var_lib_t "/data/mongodb-cluster/keyfile.key"
[centos@host ~]$ sudo restorecon -Rv /data/mongodb-cluster/keyfile.key
注意:其他集群節(jié)點(diǎn)上全部需要按照以上步驟配置,同一集群中全部節(jié)點(diǎn)的 "password" 必須一致。
4、每一個(gè)節(jié)點(diǎn)上設(shè)置 SELinux 安全策略。
使用文本編輯器在創(chuàng)建 "mongodb-extra.te" 策略源文件,例如:
[centos@host ~]$ sudo gedit /data/mongodb-cluster/mongodb-extra.te
編寫以下內(nèi)容并保存:
module mongodb-extra 1.0;
require {
type mongod_t;
type cgroup_t;
class file { getattr open read };
}
#============= mongod_t ==============
#!!!! This avc is allowed in the current policy
allow mongod_t cgroup_t:file { getattr open read };
編譯并安裝策略文件:
[centos@host ~]$ sudo checkmodule -M -m -o /data/mongodb-cluster/mongodb-extra.mod /data/mongodb-cluster/mongodb-extra.te
[centos@host ~]$ sudo semodule_package -o /data/mongodb-cluster/mongodb-extra.pp -m /data/mongodb-cluster/mongodb-extra.mod
[centos@host ~]$ sudo semodule -X 300 -i /data/mongodb-cluster/mongodb-extra.pp
4.2.2.部署配置服務(wù)器
1、創(chuàng)建 MongoDB Config Server 節(jié)點(diǎn)的數(shù)據(jù)目錄、日志目錄、運(yùn)行目錄,并設(shè)置目錄的擁有者為 MongoDB 管理用戶和組。
[centos@Config-1 ~]$ sudo mkdir -p /data/mongodb-cluster/config/{data,logs,run}
[centos@Config-1 ~]$ sudo chown -R mongod:mongod /data/mongodb-cluster/config
2、設(shè)置 MongoDB Config Server 節(jié)點(diǎn)的配置文件參數(shù)。
使用文本編輯器創(chuàng)建配置文件:
[centos@Config-1 ~]$ sudo gedit /etc/mongod-config.conf
在文件中編寫以下內(nèi)容并保存:
systemLog:
destination: file
logAppend: true
path: /data/mongodb-cluster/config/logs/mongod.log
storage:
dbPath: /data/mongodb-cluster/config/data
journal:
enabled: true
directoryPerDB: true
net:
port: 27019
bindIp: 0.0.0.0 # 192.168.216.1(2,3),127.0.0.1
processManagement:
fork: true
pidFilePath: /data/mongodb-cluster/config/run/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
security:
authorization: enabled
keyFile: /data/mongodb-cluster/keyfile.key
replication:
replSetName: repl_config
sharding:
clusterRole: configsvr
3、在 SELinux 模式運(yùn)行時(shí),設(shè)置自定義目錄的安全標(biāo)記和安全策略。
[centos@Config-1 ~]$ sudo semanage fcontext -a -t mongod_var_lib_t "/data/mongodb-cluster/config/data(/.*)?"
[centos@Config-1 ~]$ sudo semanage fcontext -a -t mongod_log_t "/data/mongodb-cluster/config/logs(/.*)?"
[centos@Config-1 ~]$ sudo semanage fcontext -a -t mongod_var_run_t "/data/mongodb-cluster/config/run(/.*)?"
[centos@Config-1 ~]$ sudo restorecon -Rv /data/mongodb-cluster/config
[centos@Config-1 ~]$ sudo semanage fcontext -a -t etc_t "/etc/mongod-config.conf"
[centos@Config-1 ~]$ sudo restorecon -Rv /etc/mongod-config.conf
4、配置 MongoDB Config Server 節(jié)點(diǎn)的服務(wù)開機(jī)自啟動(dòng)。
使用文本編輯器創(chuàng)建配置文件:
[centos@Config-1 ~]$ sudo gedit /usr/lib/systemd/system/mongod-config.service
驗(yàn)證或修改文件內(nèi)容并保存:
[Unit]
Description=MongoDB Cluster Config Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod-config.conf"
ExecStart=/usr/bin/mongod $OPTIONS
PermissionsStartOnly=true
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
5、開啟 MongoDB Config Server 遠(yuǎn)程訪問策略。
1)在 SELinux 模式運(yùn)行時(shí),開啟遠(yuǎn)程訪問安全策略。
[centos@Config-1 ~]$ sudo semanage port -a -t mongod_port_t -p tcp 27019
2)設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"27019"端口訪問服務(wù)器。
[centos@Config-1 ~]$ sudo firewall-cmd --zone=public --add-port=27019/tcp --permanent
[centos@Config-1 ~]$ sudo firewall-cmd --reload
6、啟動(dòng) MongoDB Config Server 節(jié)點(diǎn)的實(shí)例服務(wù),并設(shè)置為開機(jī)自動(dòng)啟動(dòng)。
[centos@Config-1 ~]$ sudo systemctl daemon-reload
[centos@Config-1 ~]$ sudo systemctl start mongod-config.service
[centos@Config-1 ~]$ sudo systemctl enable mongod-config.service
注意:其他"配置副本集服務(wù)器"節(jié)點(diǎn)上全部需要按照以上步驟配置。
7、所有配置服務(wù)器部署完成后,在主節(jié)點(diǎn)(本例為:192.168.216.1【Config-1】)的客戶端本地登錄到配置服務(wù)器實(shí)例,初始化集群。
1)初始化集群節(jié)點(diǎn)。
[centos@Config-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27019
> rs.initiate( { _id : "repl_config", members: [
{ _id: 0, host: "192.168.216.1:27019" },
{ _id: 1, host: "192.168.216.2:27019" },
{ _id: 2, host: "192.168.216.3:27019" } ]})
# 響應(yīng)信息
{
"ok" : 1,
......
}
2)查看并驗(yàn)證集群狀態(tài)。
[centos@Config-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27019
repl_config:PRIMARY> rs.status()
# 響應(yīng)信息
{
"set" : "repl_config",
"configsvr" : true,
......
"members" : [
{
"_id" : 0,
"name" : "192.168.216.1:27019",
"stateStr" : "PRIMARY",
......
},
{
"_id" : 1,
"name" : "192.168.216.2:27019",
"stateStr" : "SECONDARY",
......
},
{
"_id" : 2,
"name" : "192.168.216.3:27019",
"stateStr" : "SECONDARY",
......
}
],
"ok" : 1,
......
}
4.2.3.部署分片服務(wù)器
1、創(chuàng)建 MongoDB Shard Server 節(jié)點(diǎn)的數(shù)據(jù)目錄、日志目錄、運(yùn)行目錄,并設(shè)置目錄的擁有者為 MongoDB 管理用戶和組。
[centos@Repl-1 ~]$ sudo mkdir -p /data/mongodb-cluster/shard/{data,logs,run}/{a,b,c}
[centos@Repl-1 ~]$ sudo chown -R mongod:mongod /data/mongodb-cluster/shard
2、設(shè)置 MongoDB Shard Server 節(jié)點(diǎn)的配置文件參數(shù)。
- 【Shard_A】
使用文本編輯器創(chuàng)建配置文件:
[centos@Repl-1 ~]$ sudo gedit /etc/mongod-shard-a.conf
在文件中編寫以下內(nèi)容并保存:
systemLog:
destination: file
logAppend: true
# 分片實(shí)例日志文件。
path: /data/mongodb-cluster/shard/logs/a/mongod.log
storage:
# 分片實(shí)例數(shù)據(jù)目錄。
dbPath: /data/mongodb-cluster/shard/data/a
journal:
enabled: true
directoryPerDB: true
net:
# 分片實(shí)例端口號(hào),分別是:27018,27028,27038。
port: 27018
# 分片實(shí)例IP地址,分別是:192.168.216.101(102,103),127.0.0.1,0.0.0.0
bindIp: 0.0.0.0
processManagement:
fork: true
# 分片實(shí)例運(yùn)行文件。
pidFilePath: /data/mongodb-cluster/shard/run/a/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
security:
authorization: enabled
keyFile: /data/mongodb-cluster/keyfile.key
replication:
# 分片的副本集名稱,用于區(qū)分不同副本集節(jié)點(diǎn)上的同一組分片。
replSetName: repl_shard_a
sharding:
clusterRole: shardsvr
- 【Shard_B】
使用文本編輯器創(chuàng)建配置文件:
[centos@Repl-1 ~]$ sudo gedit /etc/mongod-shard-b.conf
在文件中編寫以下內(nèi)容并保存:
systemLog:
destination: file
logAppend: true
# 分片實(shí)例日志文件。
path: /data/mongodb-cluster/shard/logs/b/mongod.log
storage:
# 分片實(shí)例數(shù)據(jù)目錄。
dbPath: /data/mongodb-cluster/shard/data/b
journal:
enabled: true
directoryPerDB: true
net:
# 分片實(shí)例端口號(hào),分別是:27018,27028,27038。
port: 27028
# 分片實(shí)例IP地址,分別是:192.168.216.101(102,103),127.0.0.1,0.0.0.0
bindIp: 0.0.0.0
processManagement:
fork: true
# 分片實(shí)例運(yùn)行文件。
pidFilePath: /data/mongodb-cluster/shard/run/b/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
security:
authorization: enabled
keyFile: /data/mongodb-cluster/keyfile.key
replication:
# 分片的副本集名稱,用于區(qū)分不同副本集節(jié)點(diǎn)上的同一組分片。
replSetName: repl_shard_b
sharding:
clusterRole: shardsvr
- 【Shard_C】
使用文本編輯器創(chuàng)建配置文件:
[centos@Repl-1 ~]$ sudo gedit /etc/mongod-shard-c.conf
在文件中編寫以下內(nèi)容并保存:
systemLog:
destination: file
logAppend: true
# 分片實(shí)例日志文件。
path: /data/mongodb-cluster/shard/logs/c/mongod.log
storage:
# 分片實(shí)例數(shù)據(jù)目錄。
dbPath: /data/mongodb-cluster/shard/data/c
journal:
enabled: true
directoryPerDB: true
net:
# 分片實(shí)例端口號(hào),分別是:27018,27028,27038。
port: 27038
# 分片實(shí)例IP地址,分別是:192.168.216.101(102,103),127.0.0.1,0.0.0.0
bindIp: 0.0.0.0
processManagement:
fork: true
# 分片實(shí)例運(yùn)行文件。
pidFilePath: /data/mongodb-cluster/shard/run/c/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
security:
authorization: enabled
keyFile: /data/mongodb-cluster/keyfile.key
replication:
# 分片的副本集名稱,用于區(qū)分不同副本集節(jié)點(diǎn)上的同一組分片。
replSetName: repl_shard_c
sharding:
clusterRole: shardsvr
3、在 SELinux 模式運(yùn)行時(shí),設(shè)置自定義目錄的安全標(biāo)記和安全策略。
[centos@Repl-1 ~]$ sudo semanage fcontext -a -t mongod_var_lib_t "/data/mongodb-cluster/shard/data(/.*)?"
[centos@Repl-1 ~]$ sudo semanage fcontext -a -t mongod_log_t "/data/mongodb-cluster/shard/logs(/.*)?"
[centos@Repl-1 ~]$ sudo semanage fcontext -a -t mongod_var_run_t "/data/mongodb-cluster/shard/run(/.*)?"
[centos@Repl-1 ~]$ sudo restorecon -Rv /data/mongodb-cluster/shard
[centos@Repl-1 ~]$ sudo semanage fcontext -a -t etc_t "/etc/mongod-shard-a.conf"
[centos@Repl-1 ~]$ sudo semanage fcontext -a -t etc_t "/etc/mongod-shard-b.conf"
[centos@Repl-1 ~]$ sudo semanage fcontext -a -t etc_t "/etc/mongod-shard-c.conf"
[centos@Repl-1 ~]$ sudo restorecon -Rv /etc/{mongod-shard-a.conf,mongod-shard-b.conf,mongod-shard-c.conf}
4、配置 MongoDB Shard Server 節(jié)點(diǎn)的服務(wù)開機(jī)自啟動(dòng)。
- 【Shard_A】
使用文本編輯器創(chuàng)建配置文件:
[centos@Repl-1 ~]$ sudo gedit /usr/lib/systemd/system/mongod-shard-a.service
驗(yàn)證或修改文件內(nèi)容并保存:
[Unit]
Description=MongoDB Cluster Shard Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod-shard-a.conf"
ExecStart=/usr/bin/mongod $OPTIONS
PermissionsStartOnly=true
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
- 【Shard_B】
使用文本編輯器創(chuàng)建配置文件:
[centos@Repl-1 ~]$ sudo gedit /usr/lib/systemd/system/mongod-shard-b.service
驗(yàn)證或修改文件內(nèi)容并保存:
[Unit]
Description=MongoDB Cluster Shard Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod-shard-b.conf"
ExecStart=/usr/bin/mongod $OPTIONS
PermissionsStartOnly=true
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
- 【Shard_C】
使用文本編輯器創(chuàng)建配置文件:
[centos@Repl-1 ~]$ sudo gedit /usr/lib/systemd/system/mongod-shard-c.service
驗(yàn)證或修改文件內(nèi)容并保存:
[Unit]
Description=MongoDB Cluster Shard Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod-shard-c.conf"
ExecStart=/usr/bin/mongod $OPTIONS
PermissionsStartOnly=true
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
5、開啟 MongoDB Shard Server 遠(yuǎn)程訪問策略。
1)在 SELinux 模式運(yùn)行時(shí),開啟遠(yuǎn)程訪問安全策略。
[centos@Repl-1 ~]$ sudo semanage port -a -t mongod_port_t -p tcp 27018
[centos@Repl-1 ~]$ sudo semanage port -a -t mongod_port_t -p tcp 27028
[centos@Repl-1 ~]$ sudo semanage port -a -t mongod_port_t -p tcp 27038
2)設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"27018"、"27028"、"27038"端口訪問服務(wù)器。
[centos@Repl-1 ~]$ sudo firewall-cmd --zone=public --add-port=27018/tcp --permanent
[centos@Repl-1 ~]$ sudo firewall-cmd --zone=public --add-port=27028/tcp --permanent
[centos@Repl-1 ~]$ sudo firewall-cmd --zone=public --add-port=27038/tcp --permanent
[centos@Repl-1 ~]$ sudo firewall-cmd --reload
6、啟動(dòng) MongoDB Shard Server 節(jié)點(diǎn)的實(shí)例服務(wù),并設(shè)置為開機(jī)自動(dòng)啟動(dòng)。
[centos@Repl-1 ~]$ sudo systemctl daemon-reload
[centos@Repl-1 ~]$ sudo systemctl start mongod-shard-a.service
[centos@Repl-1 ~]$ sudo systemctl start mongod-shard-b.service
[centos@Repl-1 ~]$ sudo systemctl start mongod-shard-c.service
[centos@Repl-1 ~]$ sudo systemctl enable mongod-shard-a.service
[centos@Repl-1 ~]$ sudo systemctl enable mongod-shard-b.service
[centos@Repl-1 ~]$ sudo systemctl enable mongod-shard-c.service
注意:其他"數(shù)據(jù)副本集服務(wù)器"節(jié)點(diǎn)上全部需要按照以上步驟配置。
7、所有副本集服務(wù)器部署完成后,在主節(jié)點(diǎn)(本例為:192.168.216.101【Shard-1】)的客戶端本地登錄到分片服務(wù)器實(shí)例,分別初始化各個(gè)分片的集群。
1)初始化集群節(jié)點(diǎn)。
- 【Shard_A】
[centos@Repl-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27018
> rs.initiate( { _id : "repl_shard_a", members: [
{ _id: 0, host: "192.168.216.101:27018" },
{ _id: 1, host: "192.168.216.102:27018" },
{ _id: 2, host: "192.168.216.103:27018" } ]})
# 響應(yīng)信息
{ "ok" : 1 }
- 【Shard_B】
[centos@Repl-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27028
> rs.initiate( { _id : "repl_shard_b", members: [
{ _id: 0, host: "192.168.216.101:27028" },
{ _id: 1, host: "192.168.216.102:27028" },
{ _id: 2, host: "192.168.216.103:27028" } ]})
# 響應(yīng)信息
{ "ok" : 1 }
- 【Shard_C】
[centos@Repl-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27038
> rs.initiate( { _id : "repl_shard_c", members: [
{ _id: 0, host: "192.168.216.101:27038" },
{ _id: 1, host: "192.168.216.102:27038" },
{ _id: 2, host: "192.168.216.103:27038" } ]})
# 響應(yīng)信息
{ "ok" : 1 }
2)查看并驗(yàn)證集群狀態(tài)。
- 【Shard_A】
[centos@Repl-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27018
repl_shard_a:PRIMARY> rs.status()
# 響應(yīng)信息
{
"set" : "repl_shard_a",
......
"members" : [
{
"_id" : 0,
"name" : "192.168.216.101:27018",
"stateStr" : "PRIMARY",
......
},
{
"_id" : 1,
"name" : "192.168.216.102:27018",
"stateStr" : "SECONDARY",
......
},
{
"_id" : 2,
"name" : "192.168.216.103:27018",
"stateStr" : "SECONDARY",
......
}
],
"ok" : 1,
......
}
- 【Shard_B】
[centos@Repl-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27028
repl_shard_b:PRIMARY> rs.status()
# 響應(yīng)信息
{
"set" : "repl_shard_b",
......
"members" : [
{
"_id" : 0,
"name" : "192.168.216.101:27028",
"stateStr" : "PRIMARY",
......
},
{
"_id" : 1,
"name" : "192.168.216.102:27028",
"stateStr" : "SECONDARY",
......
},
{
"_id" : 2,
"name" : "192.168.216.103:27028",
"stateStr" : "SECONDARY",
......
}
],
"ok" : 1,
......
}
- 【Shard_C】
[centos@Repl-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27038
repl_shard_c:PRIMARY> rs.status()
# 響應(yīng)信息
{
"set" : "repl_shard_c",
......
"members" : [
{
"_id" : 0,
"name" : "192.168.216.101:27038",
"stateStr" : "PRIMARY",
......
},
{
"_id" : 1,
"name" : "192.168.216.102:27038",
"stateStr" : "SECONDARY",
......
},
{
"_id" : 2,
"name" : "192.168.216.103:27038",
"stateStr" : "SECONDARY",
......
}
],
"ok" : 1,
......
}
4.2.4.部署路由服務(wù)器
1、創(chuàng)建 MongoDB Router Server 節(jié)點(diǎn)的數(shù)據(jù)目錄、日志目錄、運(yùn)行目錄,并設(shè)置目錄的擁有者為 MongoDB 管理用戶和組。
[centos@Router-1 ~]$ sudo mkdir -p /data/mongodb-cluster/router/{data,logs,run}
[centos@Router-1 ~]$ sudo chown -R mongod:mongod /data/mongodb-cluster/router
2、設(shè)置 MongoDB Router Server 節(jié)點(diǎn)的配置文件參數(shù)。
使用文本編輯器創(chuàng)建配置文件:
[centos@Router-1 ~]$ sudo gedit /etc/mongod-router.conf
在文件中編寫以下內(nèi)容并保存:
systemLog:
destination: file
logAppend: true
path: /data/mongodb-cluster/router/logs/mongod.log
net:
port: 27017
bindIp: 0.0.0.0 # 192.168.216.128(129,130),127.0.0.1
processManagement:
fork: true
pidFilePath: /data/mongodb-cluster/router/run/mongod.pid
timeZoneInfo: /usr/share/zoneinfo
security:
keyFile: /data/mongodb-cluster/keyfile.key
sharding:
configDB: "repl_config/192.168.216.1:27019,192.168.216.2:27019,192.168.216.3:27019"
3、在 SELinux 模式運(yùn)行時(shí),設(shè)置自定義目錄的安全標(biāo)記和安全策略。
[centos@Router-1 ~]$ sudo semanage fcontext -a -t mongod_var_lib_t "/data/mongodb-cluster/router/data(/.*)?"
[centos@Router-1 ~]$ sudo semanage fcontext -a -t mongod_log_t "/data/mongodb-cluster/router/logs(/.*)?"
[centos@Router-1 ~]$ sudo semanage fcontext -a -t mongod_var_run_t "/data/mongodb-cluster/router/run(/.*)?"
[centos@Router-1 ~]$ sudo restorecon -Rv /data/mongodb-cluster/router
[centos@Router-1 ~]$ sudo semanage fcontext -a -t etc_t "/etc/mongod-router.conf"
[centos@Router-1 ~]$ sudo restorecon -Rv /etc/mongod-router.conf
4、配置 MongoDB Router Server 節(jié)點(diǎn)的服務(wù)開機(jī)自啟動(dòng)。
使用文本編輯器創(chuàng)建配置文件:
[centos@Router-1 ~]$ sudo gedit /usr/lib/systemd/system/mongod-router.service
驗(yàn)證或修改文件內(nèi)容并保存:
[Unit]
Description=MongoDB Cluster Router Server
Documentation=https://docs.mongodb.org/manual
After=network.target
[Service]
User=mongod
Group=mongod
Environment="OPTIONS=-f /etc/mongod-router.conf"
ExecStart=/usr/bin/mongos $OPTIONS
PermissionsStartOnly=true
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings
[Install]
WantedBy=multi-user.target
5、開啟 MongoDB Router Server 遠(yuǎn)程訪問策略。
1)在 SELinux 模式運(yùn)行時(shí),開啟遠(yuǎn)程訪問安全策略。
[centos@Router-1 ~]$ sudo semanage port -a -t mongod_port_t -p tcp 27017
2)設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"27017"端口訪問服務(wù)器。
[centos@Router-1 ~]$ sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent
[centos@Router-1 ~]$ sudo firewall-cmd --reload
6、啟動(dòng) MongoDB Router Server 節(jié)點(diǎn)的實(shí)例服務(wù),并設(shè)置為開機(jī)自動(dòng)啟動(dòng)。
[centos@Router-1 ~]$ sudo systemctl daemon-reload
[centos@Router-1 ~]$ sudo systemctl start mongod-router.service
[centos@Router-1 ~]$ sudo systemctl enable mongod-router.service
注意:其他"路由服務(wù)器"節(jié)點(diǎn)上全部需要按照以上步驟配置。
4.3.創(chuàng)建分片和初始化管理員賬戶
選擇任何一個(gè)路由服務(wù)器節(jié)點(diǎn)(本例為:192.168.216.128【Router-1】)的客戶端本地登錄到路由服務(wù)器實(shí)例,創(chuàng)建分片和建立管理員賬戶。
1、創(chuàng)建分片。
[centos@Router-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017
mongos> use admin
# 響應(yīng)信息
switched to db admin
mongos> db.runCommand( { addshard :"repl_shard_a/192.168.216.128:27018,192.168.216.129:27018,192.168.216.130:27018",name:"shard_a"} )
# 響應(yīng)信息
{
"shardAdded" : "shard_a",
"ok" : 1,
......
}
mongos> db.runCommand( { addshard :"repl_shard_b/192.168.216.128:27028,192.168.216.129:27028,192.168.216.130:27028",name:"shard_b"} )
# 響應(yīng)信息
{
"shardAdded" : "shard_b",
"ok" : 1,
......
}
mongos> db.runCommand( { addshard :"repl_shard_c/192.168.216.128:27038,192.168.216.129:27038,192.168.216.130:27038",name:"shard_c"} )
# 響應(yīng)信息
{
"shardAdded" : "shard_c",
"ok" : 1,
......
}
注意:數(shù)據(jù)庫實(shí)例需要通過人工開啟分片功能,如果數(shù)據(jù)庫需要使用分片模式,在創(chuàng)建數(shù)據(jù)庫之后,執(zhí)行 "db.runCommand( { enablesharding : "db_name" } )" 命令,開啟名為【db_name】數(shù)據(jù)庫的分片模式。
2、初始化管理員賬戶。
[centos@Router-1 ~]$ /usr/bin/mongo -host 127.0.0.1 -port 27017
mongos> use admin
# 響應(yīng)信息
switched to db admin
mongos> db.createUser({
user:'admin',
pwd:'password',
roles:[
{role:'clusterAdmin',db:'admin'},
{role:'userAdminAnyDatabase',db:'admin'},
{role:'dbAdminAnyDatabase',db:'admin'},
{role:'readWriteAnyDatabase',db:'admin'}
]})
# 響應(yīng)信息
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "clusterAdmin",
"db" : "admin"
},
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "dbAdminAnyDatabase",
"db" : "admin"
},
{
"role" : "readWriteAnyDatabase",
"db" : "admin"
}
]
}
3、用戶登錄。
[centos@Router-1 ~]$ /usr/bin/mongo -port 27017 -u admin -p password
mongos>
或者
[centos@Router ~]$ /usr/bin/mongo -port 27017 -u admin
Enter password:
mongos>
或者
[centos@Router ~]$ /usr/bin/mongo -port 27017
mongos> use admin
# 響應(yīng)信息
switched to db admin
mongos> db.auth("admin","password")
# 響應(yīng)信息
1
4、查看分片(需通過用戶認(rèn)證)。
[centos@Router-1 ~]$ /usr/bin/mongo -port 27017 -u admin -p password
mongos>sh.status()
# 響應(yīng)信息
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("5ed1250ec57cda0044ac4387")
}
shards:
{ "_id" : "shard_a", "host" : "repl_shard_a/192.168.216.128:27018,192.168.216.129:27018,192.168.216.130:27018", "state" : 1 }
{ "_id" : "shard_b", "host" : "repl_shard_b/192.168.216.128:27028,192.168.216.129:27028,192.168.216.130:27028", "state" : 1 }
{ "_id" : "shard_c", "host" : "repl_shard_c/192.168.216.128:27038,192.168.216.129:27038,192.168.216.130:27038", "state" : 1 }
active mongoses:
"4.2.7" : 3
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration Results for the last 24 hours:
682 : Success
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
shard_a 342
shard_b 341
shard_c 341
too many chunks to print, use verbose if you want to force print
5.Robo 3T 客戶端
Robo 3T 是一個(gè)開源的(遵循 GPL 協(xié)議) MongoDB 可視化管理工具。官方下載地址:【https://www.robomongo.org/】。
數(shù)據(jù)庫連接步驟如下:






附錄一:MongoDB 配置文件詳解
位于程序配置目錄 "/etc" 下的 "mongod.conf" 是 MongoDB 的主配置文件。主配置文件的參數(shù)包括:
# 1.日志配置
systemLog:
# 1.1.日志輸出目的地,可以指定為 “file” 或者“syslog”,表述輸出到日志文件,如果不指定,則會(huì)輸出到標(biāo)準(zhǔn)輸出中(standard output)
destination: file
# 1.2.如果為 true,當(dāng) mongod/mongos 重啟后,將在現(xiàn)有日志的尾部繼續(xù)添加日志。否則,將會(huì)備份當(dāng)前日志文件,然后創(chuàng)建一個(gè)新的日志文件;默認(rèn)為 false。
logAppend: true
# 1.3.日志文件位置。
path: /var/log/mongodb/mongod.log
# 1.4.日志級(jí)別,0:默認(rèn)值,包含 “info” 信息;范圍1~5,即大于 0 的值均會(huì)包含 debug 信息。
verbosity: 0
# 1.5.日志 “回轉(zhuǎn)”,防止一個(gè)日志文件特別大,則使用 logRotate 指令將文件 “回轉(zhuǎn)”,可選值:
# 1)rename:重命名日志文件,默認(rèn)值;
# 2)reopen:使用 linux 日志 rotate 特性,關(guān)閉并重新打開此日志文件,可以避免日志丟失,但是 logAppend 必須為 true。
logRotate: rename
# 2.數(shù)據(jù)配置
storage:
# 2.1.日志存儲(chǔ)目錄。
dbPath: /var/lib/mongo
# 2.2.數(shù)據(jù)恢復(fù)
journal:
# 2.2.1是否開啟 journal 日志持久存儲(chǔ)
enabled: true
# 2.3.是否將不同 DB 的數(shù)據(jù)存儲(chǔ)在不同的目錄中,默認(rèn)值為 false。
directoryPerDB: false
# 2.4.當(dāng)構(gòu)建索引時(shí) mongod 意外關(guān)閉,那么再次啟動(dòng)是否重新構(gòu)建索引;索引構(gòu)建失敗,mongod 重啟后將會(huì)刪除尚未完成的索引,但是否重建由此參數(shù)決定。默認(rèn)值為 true。
indexBuildRetry: true
# 2.5.存儲(chǔ)引擎類型,mongodb 3.0 之后支持 “mmapv1”、“wiredTiger” 兩種引擎,默認(rèn)值為“mmapv1”;官方宣稱 wiredTiger 引擎更加優(yōu)秀。
engine: wiredTiger
# 2.6.數(shù)據(jù)引擎(wiredTiger)
wiredTiger:
# 2.6.1.引擎配置
engineConfig:
# 2.6.1.1.緩存工作集數(shù)據(jù)的內(nèi)存大小,單位:GB。默認(rèn)情況下,cacheSizeGB 的值為假定當(dāng)前節(jié)點(diǎn)只部署一個(gè) mongod 實(shí)例,此值的大小為物理內(nèi)存的一半;如果當(dāng)前節(jié)點(diǎn)部署了多個(gè) mongod 進(jìn)程,那么需要合理配置此值。
cacheSizeGB: 8
# 2.6.1.2.是否將索引和 collections 數(shù)據(jù)分別存儲(chǔ)在 dbPath 單獨(dú)的目錄中。即 index 數(shù)據(jù)保存 “index” 子目錄,collections 數(shù)據(jù)保存在 “collection” 子目錄。默認(rèn)值為 false,僅對(duì) mongod 有效。
directoryForIndexes: true
# 2.6.2.數(shù)據(jù)集合配置
collectionConfig:
# 2.6.2.1.數(shù)據(jù)壓縮算法,可選值 “none”、“snappy”、“zlib”。
blockCompressor: zlib
# 2.6.3.數(shù)據(jù)索引配置
indexConfig:
# 2.6.3.1.是否對(duì)索引數(shù)據(jù)使用 “前綴壓縮”。前綴壓縮可以有效的減少索引數(shù)據(jù)的內(nèi)存使用量。默認(rèn)值為 true。
prefixCompression: true
# 2.7.數(shù)據(jù)引擎(mmapv1)
mmapv1:
# 2.7.1.配額配置
quota:
# 2.7.1.1.配額管理,是否限制每個(gè) DB 所能持有的最大文件數(shù)量,默認(rèn)值為 false。
enforced:false
# 2.7.1.2.如果 enforce 開啟,每個(gè) DB 所持有的存儲(chǔ)文件不會(huì)超過此閥值。
maxFilesPerDB:8
# 2.7.2.是否使用小文件存儲(chǔ)數(shù)據(jù);如果此值為 true,mongod 將會(huì)限定每個(gè)數(shù)據(jù)文件的大小為 512M(默認(rèn)最大為 2G),journal 降低到 128M(默認(rèn)為 1G)。如果 DB 的數(shù)據(jù)量較大,將會(huì)導(dǎo)致每個(gè) DB 創(chuàng)建大量的小文件,這對(duì)性能有一定的影響。在生產(chǎn)環(huán)境下不宜修改此值,在測(cè)試時(shí)可以設(shè)置以節(jié)約磁盤。
smallFiles: false
# 2.7.3.數(shù)據(jù)恢復(fù)日志
journal:
# 2.7.3.1.提交 journal 日志的時(shí)間間隔,即 fsync 的間隔。單位:毫秒
commitIntervalMs: 100
# 2.7.3.2.每個(gè) database 的 namespace 文件的大小,默認(rèn)為 16,單位:M;最大值可以設(shè)置為 2048,即 dbpath 下 “.ns” 后綴文件的大小。16M 基本上可以保存 24000 條命名條目,新建一個(gè) collection 或者 index 信息,即會(huì)增加一個(gè) namespace 條目;如果你的 database 下需要?jiǎng)?chuàng)建大量的 collection(比如數(shù)據(jù)分析),則可以適度調(diào)大此值。
nsSize:16
# 3.進(jìn)程管理
processManagement:
# 3.1.是否在后臺(tái)進(jìn)程運(yùn)行。
fork: true
# 3.2.PID 文件位置。
pidFilePath: /var/run/mongodb/mongod.pid
# 3.3.時(shí)間區(qū)域信息目錄。
timeZoneInfo: /usr/share/zoneinfo
# 4.網(wǎng)絡(luò)接口管理
net:
# 4.1.監(jiān)聽端口號(hào)。
port: 27017
# 4.2.綁定 IP 地址?!?.0.0.0】 表示綁定全部 IPv4 地址,【::】 表示綁定全部 IPv4 地址。多個(gè)地址使用 【,】 分割。
bindIp: 0.0.0.0
# 4.3.進(jìn)程允許的最大連接數(shù),默認(rèn)值為 65536。
maxIncomingConnections: 65536
# 4.4.當(dāng)客戶端寫入數(shù)據(jù)時(shí) 檢測(cè)數(shù)據(jù)的有效性 (BSON),默認(rèn)值為 true。
wireObjectCheck: true
# 4.5.是否支持 IPv6,默認(rèn)值為 false。
ipv6: false
# 5.安全配置
security:
# 5.1.disabled 或者 enabled,僅對(duì) mongod 有效;表示是否開啟用戶訪問控制(Access Control),即客戶端可以通過用戶名和密碼認(rèn)證的方式訪問系統(tǒng)的數(shù)據(jù),默認(rèn)為 “disabled”,即客戶端不需要密碼即可訪問數(shù)據(jù)庫數(shù)據(jù)。(限定客戶端與 mongod、mongos 的認(rèn)證)
authorization: enabled
# 5.2.集群中 members 之間的認(rèn)證模式,可選值為 “keyFile”、“sendKeyFile”、“sendX509”、“x509”,對(duì) mongod/mongos 有效;默認(rèn)值為 “keyFile”,mongodb 官方推薦使用 x509,不過我個(gè)人覺得還是 keyFile 比較易于學(xué)習(xí)和使用。不過 3.0 版本中,mongodb 增加了對(duì) TLS/SSL 的支持,如果可以的話,建議使用 SSL 相關(guān)的配置來認(rèn)證集群的 member,此文將不再介紹。(限定集群中 members 之間的認(rèn)證)
clusterAuthMode: keyFile
# 5.3.當(dāng) clusterAuthMode 為 “keyFile” 時(shí),此參數(shù)指定 keyfile 的位置,mongodb 需要有訪問此文件的權(quán)限。
keyFile: /data/mongodb/keyfile
# 5.4.表示是否允許 mongod 上執(zhí)行 javascript 腳本,默認(rèn)為 true。如果為 false,可以提高安全性,但 mapreduce、group 命令等將無法使用,因?yàn)樗鼈冃枰?mongod 上執(zhí)行 javascript 腳本方法。
javascriptEnabled: true
# 5.服務(wù)器端參數(shù)
setParameter
# 5.1.true 或者 false,默認(rèn)為 true,對(duì) mongod/mongos 有效;表示是否開啟 “l(fā)ocalhost exception”,對(duì)于 sharding cluster 而言,我們傾向于在 mongos 上開啟,在 shard 節(jié)點(diǎn)的 mongod 上關(guān)閉。
enableLocalhostAuthBypass: true
# 5.2.認(rèn)證機(jī)制,可選值為 “SCRAM-SHA-1”、“MONGODB-CR”、“PLAN” 等,建議為“SCRAM-SHA-1”,對(duì) mongod/mongos 有效;一旦選定了認(rèn)證機(jī)制,客戶端訪問 databases 時(shí)需要與其匹配才能有效。
authenticationMechanisms: SCRAM-SHA-1
# 5.3.默認(rèn)值為 200,對(duì) mongod/mongos 有效;表示當(dāng)前 mongos 或者 shard 與集群中其他 shards 鏈接的鏈接池的最大容量,此值我們通常不會(huì)調(diào)整。連接池的容量不會(huì)阻止創(chuàng)建新的鏈接,但是從連接池中獲取鏈接的個(gè)數(shù)不會(huì)超過此值。維護(hù)連接池需要一定的開支,保持一個(gè)鏈接也需要占用一定的系統(tǒng)資源。
connPoolMaxShardedConnsPerHost: 200
# 5.4.默認(rèn)值為 200,對(duì) mongod/mongos 有效;同上,表示 mongos 或者 mongod 與其他 mongod 實(shí)例之間的連接池的容量,根據(jù) host 限定。
connPoolMaxConnsPerHost: 200
# 6.性能分析
operationProfiling:
# 6.1.數(shù)據(jù)庫 profiler 判定一個(gè)操作是 “慢查詢” 的時(shí)間閥值,單位毫秒;mongod 將會(huì)把慢查詢記錄到日志中,即使 profiler 被關(guān)閉。當(dāng) profiler 開啟時(shí),慢查詢記錄還會(huì)被寫入 “system.profile” 這個(gè)系統(tǒng)級(jí)的 collection 中。默認(rèn)值為 100,此值只對(duì) mongod 進(jìn)程有效。
slowOpThresholdMs: 100
# 6.2.數(shù)據(jù)庫 profiler 級(jí)別,操作的性能信息將會(huì)被寫入日志文件中,可選值:
# 1)off:關(guān)閉 profiling
# 2)slowOp:on,只包含慢操作日志
# 3)3)all:on,記錄所有操作
# 數(shù)據(jù)庫 profiling 會(huì)影響性能,建議只在性能調(diào)試階段開啟。此參數(shù)僅對(duì) mongod 有效。
mode: off
# 7.主從復(fù)制
replication:
# 7.1.操作日志的最大尺寸,單位:MB。mongod 進(jìn)程根據(jù)磁盤最大可用空間來創(chuàng)建 oplog,比如 64 位系統(tǒng),oplog 為磁盤可用空間的 5%,一旦 mongod 創(chuàng)建了 oplog 文件,此后再次修改 oplogSizeMB 將不會(huì)生效。此值不要設(shè)置的太小, 應(yīng)該足以保存 24 小時(shí)的操作日志,以保證 secondary 有充足的維護(hù)時(shí)間;如果太小,secondary 將不能通過 oplog 來同步數(shù)據(jù),只能全量同步。
oplogSizeMB: 10240
# 7.2.“復(fù)制集” 的名稱,復(fù)制集中的所有 mongd 實(shí)例都必須有相同的名字,sharding 分布式下,不同的 sharding 應(yīng)該使用不同的 replSetName
replSetName: setname
# 7.3.是否開啟 readConcern 的級(jí)別為 “majority”,默認(rèn)為 false;只有開啟此選項(xiàng),才能在 read 操作中使用 “majority”。(3.2 + 版本)
enableMajorityReadConcern: false
# 7.4.只對(duì) mmapv1 存儲(chǔ)引擎有效。復(fù)制集中的 secondary,從 oplog 中運(yùn)用變更操作之前,將會(huì)先把索引加載到內(nèi)存中,默認(rèn)情況下,secondaries 首先將操作相關(guān)的索引加載到內(nèi)存,然后再根據(jù) oplog 應(yīng)用操作。可選值:
# 1)none:secondaries 不將索引數(shù)據(jù)加載到內(nèi)容
# 2)all:sencondaries 將此操作有關(guān)的索引數(shù)據(jù)加載到內(nèi)存
# 3)_id_only:只加載_id 索引
# 默認(rèn)值為:all,此配置僅對(duì) mongod 有效。
secondaryIndexPrefetch: all
# 7.5.ping 時(shí)間,單位:毫秒,mongos 用來判定將客戶端 read 請(qǐng)求發(fā)給哪個(gè) secondary。僅對(duì) mongos 有效。默認(rèn)值為 15,和客戶端 driver 中的默認(rèn)值一樣。當(dāng) mongos 接收到客戶端 read 請(qǐng)求,它將:
# 1)找出復(fù)制集中 ping 值最小的 member。
# 2)將延遲值被此值允許的 members,構(gòu)建一個(gè)列表。
# 3)從列表中隨機(jī)選擇一個(gè) member。
# ping 值是動(dòng)態(tài)值,每 10 秒計(jì)算一次。mongos 將客戶端請(qǐng)求轉(zhuǎn)發(fā)給延遲較?。ㄅc此值相比)的某個(gè) secondary 節(jié)點(diǎn)。
localPingThresholdMs: 15
# 8.分片設(shè)置
sharding:
# 8.1.在 sharding 集群中,此 mongod 實(shí)例的角色,可選值:
# 1)configsvr:此實(shí)例為 config server(配置服務(wù)器),默認(rèn)偵聽 27019 端口。
# 2)shardsvr:此實(shí)例為 shard server(分片服務(wù)器),默認(rèn)偵聽 27018 端口。
# 3)此配置僅對(duì) mongod 有效。通常 config server 和 sharding server 需要使用各自的配置文件。
clusterRole: shardsvr
# 8.2.當(dāng) chunks 因?yàn)?“負(fù)載平衡” 而遷移到其他節(jié)點(diǎn)時(shí),mongod 是否將這些 chunks 歸檔,并保存在 dbPath 下 “moveChunk” 目錄下,mongod 不會(huì)刪除 moveChunk 下的文件。默認(rèn)為 true。
archiveMovedChunks: true
# 8.3.是否開啟 sharded collections 的自動(dòng)分裂,僅對(duì) mongos 有效。如果所有的 mongos 都設(shè)定為 false,那么 collections 數(shù)據(jù)增長但不能分裂成新的 chunks。因?yàn)榧褐腥魏我粋€(gè) mongos 進(jìn)程都可以觸發(fā) split,所以此值需要在所有 mongos 行保持一致。僅對(duì) mongos 有效。
autoSplit: true
# 8.4.設(shè)定 config server 的地址列表,每個(gè) server 地址之間以 “,” 分割,通常 sharded 集群中指定 1 或者 3 個(gè) config server。(生產(chǎn)環(huán)境,通常是 3 個(gè) config server,但 1 個(gè)也是可以的)。所有的 mongos 實(shí)例必須配置一樣,否則可能帶來不必要的問題。
configDB:cfgdb
# 8.5.分片集群中每個(gè) chunk 的大小,單位:MB,默認(rèn)為 64,此值對(duì)于絕大多數(shù)應(yīng)用而言都是比較理想的。chunkSize 太大會(huì)導(dǎo)致分布不均,太小會(huì)導(dǎo)致分裂成大量的 chunk 而經(jīng)常移動(dòng). 整個(gè) sharding 集群中,此值需要保持一致,集群啟動(dòng)后修改此值將不再生效。
chunkSize: 64
附錄二:Java 集成開發(fā)學(xué)習(xí)指南
官方接口文檔:https://docs.mongodb.com/drivers/java
推薦學(xué)習(xí)資料:
- MongoDB Java【https://www.runoob.com/mongodb/mongodb-java.html】
- MongoDB 安裝以及使用 Java 連接 MongoDB【http://www.itdecent.cn/p/209a25705b9e】
- Java 連接 MongoDB 并進(jìn)行增刪改查操作【https://blog.csdn.net/qq_36760753/article/details/81149077】
- Java 操作 MongoDB【https://segmentfault.com/a/1190000012705470】
常見問題一:SELinux 引起的安全策略問題

當(dāng)使用 systemctl 啟動(dòng) MongoDB 實(shí)例時(shí),如果提示類似上圖錯(cuò)誤,則可能是由SELinux 引起的安全策略問題。
解決方案一(最安全,首選方案):
- 方法一
在允許一次程序(無論成功或者失敗)后,SELinux 會(huì)生成 audit 日志,可以從日志中導(dǎo)出所有不符合策略,一次性生成策略源文件和對(duì)應(yīng)的編譯文件,直接安裝。操作如下:
[centos@host ~]$ sudo ausearch -c 'mongod' --raw | sudo audit2allow -M mongodb-extra
[centos@host ~]$ sudo semodule -X 300 -i mongodb-extra.pp
注意:這個(gè)過程需要反復(fù)若干次,因?yàn)榘踩呗詥栴}只能發(fā)現(xiàn)一條解決后,才能發(fā)現(xiàn)另一條。
- 方法二
使用文本編輯器在創(chuàng)建 "mongodb-extra.te" 策略源文件,例如:
[centos@host ~]$ sudo gedit mongodb-extra.te
編寫以下內(nèi)容并保存:
module mongodb-extra 1.0;
require {
type mongod_t;
type cgroup_t;
class file { getattr open read };
}
#============= mongod_t ==============
#!!!! This avc is allowed in the current policy
allow mongod_t cgroup_t:file { getattr open read };
編譯并安裝策略文件:
[centos@host ~]$ sudo checkmodule -M -m -o mongodb-extra.mod mongodb-extra.te
[centos@host ~]$ sudo semodule_package -o mongodb-extra.pp -m mongodb-extra.mod
[centos@host ~]$ sudo semodule -X 300 -i mongodb-extra.pp
注意:這個(gè)方法一般在所有策略都已發(fā)現(xiàn)的情況下比較適用。
解決方案二(最有效,兜底方案):
第一步,臨時(shí)關(guān)閉 SELinux,重新運(yùn)行 systemctl 查看是否正常。
[centos@host ~]$ sudo setenforce 0
第二步,修改 SELinux 配置文件,永久關(guān)閉 SELinux。
使用文本編輯器打開"/etc/selinux/config"文件:
[centos@host ~]$ sudo gedit /etc/selinux/config
將 "SELINUX" 參數(shù)設(shè)置為:"permissive" 或者 "disabled",并保存:
# enforcing - 表示啟用 SELinux 安全策略。
# permissive - 表示啟用 SELinux 安全策略,但不強(qiáng)制驗(yàn)證。如果執(zhí)行第一步可以正常運(yùn)行,則建議設(shè)置此值。
# disabled - 關(guān)閉 SELinux 安全策略,相當(dāng)于沒有安裝 SELinux。
SELINUX=disabled
重啟服務(wù)器:
[centos@host ~]$ sudo reboot
常見問題二:MongoDB 運(yùn)行時(shí)文件已存在的問題

當(dāng)啟動(dòng) MongoDB 實(shí)例時(shí)(無論何種方式),如果提示類似上圖錯(cuò)誤,則可能是由于運(yùn)行時(shí) PID 文件已存在的問題,這通常是因?yàn)樯弦淮芜\(yùn)行異常中斷導(dǎo)致的,如:通過 "kill" 指令強(qiáng)制殺死進(jìn)程;也有可能是配置文件錯(cuò)誤導(dǎo)致啟動(dòng)后故障,如:監(jiān)聽的 IP 地址錯(cuò)誤。
解決方案:到程序運(yùn)行目錄下手動(dòng)刪除 PID 文件即可。如:
[centos@host ~]$ sudo rm /var/run/mongodb/mongod.pid