數(shù)據(jù)庫架構(gòu)之【MongoDB】NoSQL 數(shù)據(jù)庫集群方案

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

集群部署拓?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

Mongod 集群部署拓?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ù)庫連接步驟如下:

第一步
第二步
第三步
第四步
第五步
數(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í)資料:


常見問題一:SELinux 引起的安全策略問題

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í)文件已存在的問題

PID文件問題

當(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容