安裝配置MongoDB 6.0全攻略:從倉庫適配到安全部署)
1. 項(xiàng)目緣起為什么要在麒麟Linux上折騰MongoDB最近接手了一個(gè)新項(xiàng)目后端數(shù)據(jù)模型變動(dòng)頻繁傳統(tǒng)的關(guān)系型數(shù)據(jù)庫在頻繁修改表結(jié)構(gòu)時(shí)顯得有點(diǎn)力不從心。團(tuán)隊(duì)討論后決定引入文檔型數(shù)據(jù)庫MongoDB來應(yīng)對(duì)這種靈活多變的場(chǎng)景。我們開發(fā)環(huán)境的主力是Ubuntu部署環(huán)境則清一色是國產(chǎn)化的麒麟Linux操作系統(tǒng)。在Ubuntu上裝MongoDBapt一條命令就搞定了但到了麒麟Linux這邊事情就沒那么簡(jiǎn)單了。麒麟Linux無論是基于Debian的社區(qū)版還是基于Red Hat的企業(yè)版如銀河麒麟V10其軟件倉庫里通常不會(huì)直接提供MongoDB的官方包。直接去MongoDB官網(wǎng)下載你會(huì)發(fā)現(xiàn)官方主要提供的是針對(duì)RHEL/CentOS、Ubuntu、Debian等主流發(fā)行版的預(yù)編譯包。這就意味著在麒麟系統(tǒng)上安裝不能簡(jiǎn)單地“一鍵安裝”需要我們手動(dòng)處理依賴、配置和服務(wù)。這個(gè)過程雖然比常規(guī)Linux發(fā)行版多幾個(gè)步驟但每一步都踩得穩(wěn)反而能讓你更清楚MongoDB在系統(tǒng)里是怎么“安家落戶”的。這篇文章我就把在銀河麒麟V10 SP1ARM架構(gòu)和社區(qū)版x86_64架構(gòu)上成功安裝并配置MongoDB 6.0社區(qū)版的完整過程以及中間遇到的各種“坑”和解決方案詳細(xì)記錄下來。2. 安裝前的核心準(zhǔn)備理清系統(tǒng)與架構(gòu)動(dòng)手之前最忌諱的就是盲目開干。在麒麟Linux上安裝任何軟件第一步必須是摸清自家系統(tǒng)的“底細(xì)”。這直接決定了你后續(xù)要下載哪個(gè)安裝包以及可能會(huì)遇到哪些依賴問題。2.1 確認(rèn)系統(tǒng)版本與架構(gòu)打開終端執(zhí)行以下命令來獲取關(guān)鍵信息# 查看操作系統(tǒng)名稱和版本 cat /etc/os-release # 查看系統(tǒng)內(nèi)核架構(gòu) uname -m對(duì)于銀河麒麟V10/etc/os-release的輸出通常會(huì)包含Kylin Linux Advanced Server release V10 (Sword)之類的信息并且NAME字段很可能就是Kylin Linux。而uname -m會(huì)告訴你CPU架構(gòu)x86_64代表英特爾或AMD的64位處理器aarch64則代表ARM架構(gòu)常見于飛騰、鯤鵬等國產(chǎn)CPU。為什么這步至關(guān)重要MongoDB官方為不同的Linux發(fā)行版和架構(gòu)提供了不同的倉庫配置和安裝包。例如針對(duì)Red Hat系如CentOS使用.rpm包和yum倉庫針對(duì)Debian系如Ubuntu使用.deb包和apt倉庫。麒麟Linux的社區(qū)版通?;赨buntu/Debian而企業(yè)版如銀河麒麟V10則更接近Red Hat/CentOS。如果你下載了錯(cuò)誤的包類型比如在基于RPM的系統(tǒng)上嘗試安裝.deb包安裝過程會(huì)直接失敗。2.2 選擇安裝方式包管理器 vs 二進(jìn)制包在麒麟Linux上主要有兩種安裝MongoDB的思路使用官方倉庫推薦但需適配MongoDB為RHEL/CentOS 7/8/9和Ubuntu等提供了官方倉庫。對(duì)于類RHEL的麒麟系統(tǒng)我們可以嘗試適配CentOS的倉庫對(duì)于類Debian的麒麟系統(tǒng)則嘗試適配Ubuntu的倉庫。這種方式能通過系統(tǒng)包管理器yum/dnf或apt進(jìn)行安裝、升級(jí)和管理最為規(guī)范。手動(dòng)下載二進(jìn)制壓縮包直接從MongoDB官網(wǎng)下載對(duì)應(yīng)架構(gòu)的.tgz壓縮包解壓到指定目錄如/usr/local/mongodb然后手動(dòng)配置環(huán)境變量、數(shù)據(jù)目錄、日志和服務(wù)。這種方式最靈活不受系統(tǒng)版本限制但所有維護(hù)工作都需要手動(dòng)進(jìn)行。對(duì)于生產(chǎn)環(huán)境我強(qiáng)烈推薦第一種方式。盡管需要一些適配工作但它能讓MongoDB的集成度更高服務(wù)管理更便捷使用systemctl。本文也將以配置官方倉庫并安裝為例進(jìn)行詳細(xì)說明。如果你的系統(tǒng)版本實(shí)在無法適配官方倉庫我會(huì)在最后補(bǔ)充二進(jìn)制包安裝的要點(diǎn)。2.3 安裝必要的系統(tǒng)工具在開始之前確保你的系統(tǒng)已經(jīng)安裝了curl、gnupg等工具用于下載密鑰和倉庫文件。對(duì)于類RHEL系統(tǒng)銀河麒麟V10sudo yum install -y curl gnupg2對(duì)于類Debian系統(tǒng)麒麟社區(qū)版sudo apt update sudo apt install -y curl gnupg3. 為麒麟Linux配置MongoDB官方倉庫這是整個(gè)安裝過程中最具挑戰(zhàn)性但也最關(guān)鍵的一步。我們的目標(biāo)是讓系統(tǒng)的包管理器“認(rèn)識(shí)”MongoDB的官方源。3.1 針對(duì)類RHEL系統(tǒng)銀河麒麟V10的配置MongoDB為RHEL 8/9提供了官方倉庫。由于銀河麒麟V10的內(nèi)核和基礎(chǔ)庫與CentOS 8較為接近我們可以嘗試使用CentOS 8的倉庫進(jìn)行適配。首先創(chuàng)建MongoDB的倉庫配置文件sudo vi /etc/yum.repos.d/mongodb-org-6.0.repo將以下內(nèi)容粘貼進(jìn)去。請(qǐng)注意這里我們使用的是el/8對(duì)應(yīng)RHEL/CentOS 8的倉庫地址。如果你的系統(tǒng)是類似RHEL 7的版本可能需要嘗試el/7但MongoDB 6.0對(duì)glibc版本有要求RHEL 7可能不滿足。[mongodb-org-6.0] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/8/mongodb-org/6.0/x86_64/ # 如果系統(tǒng)是aarch64架構(gòu)將上一行改為 # baseurlhttps://repo.mongodb.org/yum/redhat/8/mongodb-org/6.0/aarch64/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp/server-6.0.asc關(guān)鍵點(diǎn)解析baseurl: 這里指定了軟件包的下載地址。你必須根據(jù)你的系統(tǒng)架構(gòu)x86_64或aarch64修改路徑。這是最容易出錯(cuò)的地方。gpgcheck1和gpgkey: 啟用GPG簽名檢查確保下載的軟件包來自MongoDB官方未被篡改。保存退出后清除yum緩存并重新建立元數(shù)據(jù)sudo yum clean all sudo yum makecache現(xiàn)在嘗試搜索MongoDB包測(cè)試倉庫是否配置成功sudo yum search mongodb-org如果能看到mongodb-org-server、mongodb-org-shell等包列表恭喜你倉庫配置基本成功了。如果報(bào)錯(cuò)最常見的錯(cuò)誤是baseurl指向的倉庫路徑不存在404錯(cuò)誤。這時(shí)你需要再次確認(rèn)你的麒麟系統(tǒng)版本到底更接近RHEL 7、8還是9并嘗試調(diào)整baseurl中的版本號(hào)8改為7或9。3.2 針對(duì)類Debian系統(tǒng)麒麟社區(qū)版的配置如果你的麒麟系統(tǒng)是基于Ubuntu的配置過程會(huì)稍微標(biāo)準(zhǔn)一些。首先導(dǎo)入MongoDB的GPG公鑰curl -fsSL https://www.mongodb.org/static/pgp/server-6.0.asc | sudo gpg --dearmor -o /usr/share/keyrings/mongodb-server-6.0.gpg接下來創(chuàng)建APT倉庫源文件。你需要知道你的Ubuntu版本代號(hào)如20.04是focal22.04是jammy。可以通過lsb_release -cs查看。假設(shè)你的系統(tǒng)對(duì)應(yīng)focalecho deb [ archamd64,arm64 signed-by/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list對(duì)于ARM架構(gòu)aarch64arch參數(shù)中必須包含arm64。更新APT包列表sudo apt update同樣使用apt search mongodb-org來驗(yàn)證倉庫是否添加成功。注意無論是哪種系統(tǒng)在配置倉庫后執(zhí)行update或makecache時(shí)可能會(huì)遇到“Release”文件簽名無效或找不到的警告。只要不是導(dǎo)致整個(gè)更新失敗的錯(cuò)誤通??梢詴簳r(shí)忽略重點(diǎn)看后續(xù)是否能成功搜索和安裝MongoDB包。4. 安裝MongoDB 6.0社區(qū)版?zhèn)}庫配置妥當(dāng)后安裝本身反而成了最簡(jiǎn)單的步驟。4.1 執(zhí)行安裝命令對(duì)于類RHEL系統(tǒng)使用yum/dnfsudo yum install -y mongodb-org這個(gè)命令會(huì)安裝mongodb-org這個(gè)元包它會(huì)自動(dòng)拉取并安裝以下核心組件mongodb-org-server:mongod守護(hù)進(jìn)程核心服務(wù)。mongodb-org-mongos: 分片集群的路由服務(wù)。mongodb-org-shell:mongoshell客戶端注意6.0版本默認(rèn)安裝的是mongosh一個(gè)更強(qiáng)大的新shell。mongodb-org-tools: 包含mongodump,mongorestore,mongoimport,mongoexport等工具。對(duì)于類Debian系統(tǒng)使用aptsudo apt install -y mongodb-org安裝過程會(huì)輸出大量信息顯示正在下載和安裝的包及其依賴。耐心等待完成即可。4.2 安裝后的目錄結(jié)構(gòu)安裝完成后MongoDB的主要文件會(huì)分布在系統(tǒng)的標(biāo)準(zhǔn)路徑下了解這些路徑對(duì)后續(xù)管理和排錯(cuò)很有幫助配置文件/etc/mongod.conf。這是MongoDB服務(wù)的主配置文件所有關(guān)鍵的路徑、端口、安全設(shè)置都在這里。數(shù)據(jù)目錄/var/lib/mongo。默認(rèn)的數(shù)據(jù)庫文件存儲(chǔ)位置。日志目錄/var/log/mongodb。默認(rèn)的日志文件存儲(chǔ)位置日志文件通常名為mongod.log??蓤?zhí)行文件/usr/bin/mongod,/usr/bin/mongos,/usr/bin/mongosh等。Systemd服務(wù)單元文件/usr/lib/systemd/system/mongod.serviceRHEL系或/lib/systemd/system/mongod.serviceDebian系。這是用systemctl管理MongoDB服務(wù)的依據(jù)。5. 關(guān)鍵配置調(diào)整與服務(wù)啟動(dòng)安裝完成并不代表就能直接用了。默認(rèn)配置可能不完全符合你的需求尤其是數(shù)據(jù)目錄和日志目錄的權(quán)限。5.1 檢查并調(diào)整目錄權(quán)限MongoDB服務(wù)默認(rèn)會(huì)以mongod用戶和mongod組的身份運(yùn)行。你必須確保數(shù)據(jù)目錄和日志目錄的所有權(quán)和權(quán)限正確。首先檢查目錄是否存在以及當(dāng)前權(quán)限ls -ld /var/lib/mongo /var/log/mongodb通常安裝包會(huì)創(chuàng)建這些目錄并設(shè)置好權(quán)限。但如果目錄不存在或權(quán)限不對(duì)你需要手動(dòng)處理# 創(chuàng)建目錄如果不存在 sudo mkdir -p /var/lib/mongo /var/log/mongodb # 更改所有者為mongod用戶和組 sudo chown -R mongod:mongod /var/lib/mongo /var/log/mongodb # 設(shè)置合適的權(quán)限例如755 sudo chmod 755 /var/lib/mongo /var/log/mongodb權(quán)限問題是最常見的啟動(dòng)失敗原因之一。如果mongod進(jìn)程沒有寫入數(shù)據(jù)目錄或日志目錄的權(quán)限服務(wù)會(huì)啟動(dòng)失敗并在日志中報(bào)錯(cuò)。5.2 修改配置文件可選但推薦編輯配置文件/etc/mongod.conf你可以根據(jù)需要進(jìn)行定制。一個(gè)最基礎(chǔ)的關(guān)注點(diǎn)是綁定IP。默認(rèn)配置可能只綁定到127.0.0.1這意味著只能從本機(jī)訪問。如果你需要從其他服務(wù)器連接需要修改net.bindIp。sudo vi /etc/mongod.conf找到net部分net: port: 27017 bindIp: 127.0.0.1 # 修改為 0.0.0.0 以允許所有IP連接或指定IP列表安全警告將bindIp設(shè)置為0.0.0.0會(huì)使你的數(shù)據(jù)庫暴露在網(wǎng)絡(luò)上務(wù)必在防火墻中限制訪問來源并盡快配置認(rèn)證。生產(chǎn)環(huán)境切勿長期使用無認(rèn)證的開放綁定。5.3 啟動(dòng)MongoDB服務(wù)并設(shè)置開機(jī)自啟使用systemd來管理服務(wù)是標(biāo)準(zhǔn)做法。# 啟動(dòng)mongod服務(wù) sudo systemctl start mongod # 檢查服務(wù)狀態(tài)確認(rèn)是否運(yùn)行正常 sudo systemctl status mongod # 如果狀態(tài)顯示為active (running)則設(shè)置開機(jī)自動(dòng)啟動(dòng) sudo systemctl enable mongod當(dāng)執(zhí)行sudo systemctl status mongod后你應(yīng)該能看到綠色的“active (running)”字樣并且下面沒有紅色的錯(cuò)誤日志。這是服務(wù)成功啟動(dòng)的標(biāo)志。5.4 驗(yàn)證安裝與基本操作服務(wù)啟動(dòng)后進(jìn)行一個(gè)簡(jiǎn)單的連接測(cè)試# 使用mongosh連接本地MongoDB實(shí)例默認(rèn)端口27017 mongosh如果連接成功你會(huì)進(jìn)入mongosh的交互式命令行界面提示符類似test。執(zhí)行幾個(gè)基本命令驗(yàn)證// 顯示當(dāng)前數(shù)據(jù)庫 db // 顯示所有數(shù)據(jù)庫 show dbs // 創(chuàng)建一個(gè)名為‘mydb’的數(shù)據(jù)庫實(shí)際上在插入數(shù)據(jù)前不會(huì)真正創(chuàng)建 use mydb // 在‘mycollection’集合中插入一條文檔 db.mycollection.insertOne({name: 麒麟, type: OS}) // 查詢剛插入的文檔 db.mycollection.find()如果能順利插入和查詢數(shù)據(jù)說明MongoDB已經(jīng)安裝并運(yùn)行成功。6. 防火墻與SELinux配置如啟用如果你的服務(wù)器啟用了防火墻如firewalld或SELinux需要額外配置以允許MongoDB通信。6.1 配置防火墻firewalld如果使用firewalld開放MongoDB默認(rèn)的27017端口sudo firewall-cmd --zonepublic --add-port27017/tcp --permanent sudo firewall-cmd --reload驗(yàn)證端口是否開放sudo firewall-cmd --zonepublic --list-ports6.2 處理SELinuxSELinux可能會(huì)阻止mongod進(jìn)程訪問數(shù)據(jù)目錄、日志目錄或網(wǎng)絡(luò)端口。如果系統(tǒng)啟用了SELinux可通過sestatus命令查看并且你遇到了權(quán)限拒絕的錯(cuò)誤即使文件系統(tǒng)權(quán)限正確也可能需要調(diào)整SELinux策略。一個(gè)相對(duì)簡(jiǎn)單但非生產(chǎn)環(huán)境最佳實(shí)踐的臨時(shí)解決方案是將SELinux設(shè)置為寬容模式以進(jìn)行測(cè)試sudo setenforce 0但這只是臨時(shí)生效重啟后會(huì)恢復(fù)。要永久禁用不推薦或進(jìn)行精細(xì)的SELinux策略配置需要更復(fù)雜的操作。對(duì)于生產(chǎn)環(huán)境建議根據(jù)審計(jì)日志ausearch或/var/log/audit/audit.log來添加正確的SELinux策略模塊。7. 二進(jìn)制包安裝方式要點(diǎn)如果官方倉庫方式因系統(tǒng)兼容性問題始終無法成功手動(dòng)安裝二進(jìn)制包是可靠的備選方案。下載從MongoDB官網(wǎng)下載中心選擇“TGZ”包并匹配你的系統(tǒng)架構(gòu)x86_64或ARM64。解壓tar -zxvf mongodb-linux-*.tgz -C /usr/local/創(chuàng)建軟鏈接可選sudo ln -s /usr/local/mongodb-*/bin/* /usr/local/bin/方便命令行直接調(diào)用。創(chuàng)建數(shù)據(jù)和日志目錄sudo mkdir -p /data/db /var/log/mongodb并設(shè)置權(quán)限可以創(chuàng)建一個(gè)專門的mongodb用戶來運(yùn)行。手動(dòng)啟動(dòng)/usr/local/mongodb/bin/mongod --dbpath /data/db --logpath /var/log/mongodb/mongod.log --fork配置systemd服務(wù)這是將手動(dòng)安裝規(guī)范化的關(guān)鍵。你需要參照官方安裝包生成的服務(wù)文件手動(dòng)編寫一個(gè)/etc/systemd/system/mongod.service文件指定正確的可執(zhí)行文件路徑、數(shù)據(jù)路徑、日志路徑和運(yùn)行用戶。然后通過systemctl daemon-reload加載之后就能用systemctl來管理了。手動(dòng)安裝的靈活性高但后續(xù)的版本升級(jí)、服務(wù)管理都需要你自己負(fù)責(zé)維護(hù)成本較高。8. 安裝后的安全加固與基礎(chǔ)運(yùn)維安裝并成功運(yùn)行只是第一步。一個(gè)暴露在公網(wǎng)且沒有認(rèn)證的MongoDB實(shí)例是極其危險(xiǎn)的。以下是最基本的安全措施啟用身份認(rèn)證這是必須的。編輯/etc/mongod.conf找到security部分取消注釋并修改security: authorization: enabled重啟服務(wù)后使用mongosh本地連接創(chuàng)建一個(gè)管理員用戶use admin db.createUser({ user: myAdmin, pwd: passwordPrompt(), // 會(huì)交互式提示輸入密碼 roles: [ { role: userAdminAnyDatabase, db: admin }, readWriteAnyDatabase ] })之后連接都需要指定用戶名密碼mongosh -u myAdmin -p --authenticationDatabase admin。配置防火墻如前所述嚴(yán)格限制訪問MongoDB端口的源IP地址僅允許應(yīng)用服務(wù)器或管理終端的IP。定期更新關(guān)注MongoDB的安全公告定期通過包管理器更新到新版本。日志監(jiān)控定期檢查/var/log/mongodb/mongod.log關(guān)注警告和錯(cuò)誤信息。備份策略即使是測(cè)試環(huán)境也應(yīng)建立簡(jiǎn)單的備份習(xí)慣。可以使用mongodump進(jìn)行定期邏輯備份mongodump --urimongodb://myAdmin:passwordlocalhost:27017 --out/backup/path/$(date %Y%m%d)在麒麟Linux上安裝MongoDB核心難點(diǎn)在于系統(tǒng)與官方倉庫的適配。這個(gè)過程迫使你去理解系統(tǒng)版本、架構(gòu)、包管理機(jī)制和軟件倉庫的工作原理這本身就是一個(gè)很好的學(xué)習(xí)機(jī)會(huì)。一旦倉庫配置成功后續(xù)的安裝、配置、服務(wù)管理就與在其他主流Linux發(fā)行版上無異了。最關(guān)鍵的是不要被一開始的“404”或“GPG錯(cuò)誤”嚇退根據(jù)錯(cuò)誤信息冷靜分析調(diào)整倉庫URL或系統(tǒng)標(biāo)識(shí)問題總能解決。