.Net?Core中使用MongoDB搭建集群與項(xiàng)目實(shí)戰(zhàn)
安裝 MongoDB
安裝 MongoDB 網(wǎng)上有很多教程,MongoDB 官方文檔:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
筆者這里簡單寫一下安裝過程,筆者使用 ubuntu 系統(tǒng)。
要按照的目標(biāo)版本:MongoDB 4.4 Community Edition
支持的系統(tǒng):
- 20.04 LTS (“Focal”)
- 18.04 LTS (“Bionic”)
- 16.04 LTS (“Xenial”)
更新軟件源
sudo apt update sudo apt upgrade
apt 直接安裝(方法1)
如果你要安裝穩(wěn)定版本,則直接使用一條命令安裝:
sudo apt install mongodb
執(zhí)行命令檢查 MingoDB 的狀態(tài):
sudo systemctl status mongodb
apt 倉庫安裝(方法2)
此種方式可以讓你安裝最新版本的 MongoDB 。
導(dǎo)入包管理系統(tǒng)使用的公鑰
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
添加 MongoDB 的倉庫源文件
/etc/apt/sources.list.d/mongodb-org-4.4.list
添加 MongoDB 的倉庫源地址
# ubuntu 16.04 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list # ubuntu 18.04 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list # ubuntu 20.04 echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
加載 MongoDB 的軟件包
sudo apt-get update
安裝最新穩(wěn)定版本的 MongoDB
sudo apt-get install -y mongodb-org
如果你想安裝指定版本:
sudo apt-get install -y mongodb-org=4.4.1 mongodb-org-server=4.4.1 mongodb-org-shell=4.4.1 mongodb-org-mongos=4.4.1 mongodb-org-tools=4.4.1
方法1、2啟動(dòng) MongoDB
執(zhí)行命令檢查 MongoDB 的狀態(tài):
sudo systemctl status mongodb
啟動(dòng) MongoDB:
sudo systemctl start mongod
開機(jī)啟動(dòng) MongoDB:
sudo systemctl enable mongod
查看 MongoDB 版本:
mongo --version mongod --version
注意:由于 Linux/Unix 系統(tǒng)會(huì)對(duì)文件描述符的數(shù)量或者線程數(shù)量加以限制,如果安裝過程或者啟動(dòng)時(shí)報(bào)錯(cuò),需要自行另外查找方法解決,這里不再贅述。
通過二進(jìn)制包安裝(方法3)
適合網(wǎng)絡(luò)不會(huì)或者離線安裝,有 tgz
、deb
、source code
等方法安裝,這里只使用 tgz
方式。
安裝依賴
# ubuntu 16.04 sudo apt-get install libcurl3 openssl liblzma5 # ubuntu 18.04 & 20.04 sudo apt-get install libcurl4 openssl liblzma5
選擇合適的系統(tǒng)下載二進(jìn)制包:
https://www.mongodb.com/try/download/community?tck=docs_server
Package 可以選擇包的形式,如 shell(deb)、shell(tgz)。
注意,要在服務(wù)器下載的話,就不要點(diǎn)擊 Download,而是點(diǎn)擊 Copy Link
復(fù)制二進(jìn)制包的下載鏈接。
請(qǐng)注意下載的軟件版本,mongos 、tagz 包含全部功能;
其它的是單獨(dú)提供 server 或者 client(shell) 功能。
本小節(jié)將提供安裝 .deb 和 tgz 包的說明,請(qǐng)自行選擇要安裝的包!(建議直接下載 tgz)。
deb 安裝 MongoDB
如果下載了 .deb 文件,請(qǐng)使用下面命令安裝。
wget {下載地址} sudo dpkg -i {軟件包名}.deb
tgz 安裝 MongoDB
如果下載了 .tar.gz
文件,請(qǐng)使用下面命令安裝。
tar -zxvf mongodb-{版本}.tgz # 下面是示例 cd mongodb-linux-x86_64-ubuntu1604-4.4.1 ... ... |-- bin | `-- mongo |-- LICENSE-Community.txt |-- MPL-2 |-- README `-- THIRD-PARTY-NOTICES
打開解壓的目錄,執(zhí)行:
sudo cp bin/* /usr/local/bin/ # 實(shí)際上就是將二進(jìn)制可執(zhí)行文件放到 bin 目錄
啟動(dòng) MongoDB
創(chuàng)建數(shù)據(jù)存放目錄:
sudo mkdir -p /var/lib/mongo
創(chuàng)建日志存放目錄:
sudo mkdir -p /var/log/mongodb
如果不是使用 root 用戶登錄,則需要獲取文件權(quán)限:
# whoami是你的用戶名 sudo chown `whoami` /var/lib/mongo sudo chown `whoami` /var/log/mongodb
運(yùn)行 MongoDB:
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
之后終端會(huì)提示已經(jīng)成功啟動(dòng);也可以查看 /var/log/mongodb/mongod.log
日志文件中的內(nèi)容確定 MongoDB 的運(yùn)行情況;
cat /var/log/mongodb/mongod.log
日志文件,會(huì)發(fā)現(xiàn)第一行:
pid=22639 port=27017
port 即 MongoDB 的連接端口。
卸載方法
apt 卸載方法
適合使用 鏡像倉庫安裝的 MongoDB。
sudo apt-get purge mongodb mongodb-clients mongodb-server mongodb-dev sudo apt-get purge mongodb-10gen sudo apt-get autoremove
注:執(zhí)行過程報(bào)錯(cuò)不用管。
tgz 卸載方法
適合卸載使用 .tar.gz 安裝的包。
rm /usr/local/bin/mongo*
指定啟動(dòng)的配置
通過配置文件
如果前面提到過配置文件 /etc/mongod.conf
,如果通過配置文件啟動(dòng),則會(huì)方便很多,使用配置文件啟動(dòng) MongoDB 的方法:
mongod --config /etc/mongod.conf
通過參數(shù)
通過參數(shù)啟動(dòng) MongoDB 的話,每次啟動(dòng)都比較麻煩:
mongod --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
MongoDB 綁定IP、端口
查看 MongoDB 配置:
# 進(jìn)入 shell mongo # 執(zhí)行 use admin db.runCommand( { getParameter : '*' } )
默認(rèn) MongoDB 是本地服務(wù),外界無法訪問主機(jī)的 MongoDB 服務(wù),這里來配置一下,使其能夠被外網(wǎng)訪問。
在 MongoDB 啟動(dòng)后,執(zhí)行以下命令修改配置。
# 綁定所有地址 mongod --bind_ip_all # 修改端口 mongod --port 27017
或者停了 MongoDB 服務(wù)后,使用以下命令啟動(dòng):
mongod --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
或者手動(dòng)修改 /etc/mongod.conf
配置文件,把其中一段改成 0.0.0.0
:
# network interfaces net: port: 27017 bindIp: 0.0.0.0
修改完畢后,需要關(guān)閉 MongoDB,再開啟,請(qǐng)參考后面 ”停止 MongoDB“ 一節(jié)。
測試遠(yuǎn)程 IP 連接
測試連接指定 IP 和 port 的 MongoDB 服務(wù):
mongo {你的服務(wù)器公網(wǎng)IP}:27017
加上密碼驗(yàn)證
設(shè)置賬號(hào)密碼
mongo # 進(jìn)入 MongoDB shell 后 use admin db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})
如果不生效,請(qǐng)自行找方法解決,這里不再贅述~
開啟登錄驗(yàn)證
然后打開 /etc/mongod.conf
文件,將 #security:
改成:
security: authorization: enabled
如果不生效,請(qǐng)自行找方法解決,這里不再贅述~
停止 MongoDB
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown
搭建集群
按照此方法,再炮制一臺(tái)服務(wù)器就行。
建議使用 docker 一次性搞好,自己手動(dòng)在物理機(jī)上面安裝,太折騰了。
接下來,我們要根據(jù)官方文檔,搭建簡單的副本集群。
官方文檔地址:https://docs.mongodb.com/manual/replication/
副本集
副本集是一組 MongoDB 實(shí)例來維護(hù)相同數(shù)據(jù)集。
官網(wǎng)文檔解釋:一個(gè)副本集包含多個(gè)數(shù)據(jù)承載節(jié)點(diǎn)和一個(gè)仲裁器節(jié)點(diǎn)(可選)。在數(shù)據(jù)承載節(jié)點(diǎn)中,只有一個(gè)成員被視為主要節(jié)點(diǎn),而其他節(jié)點(diǎn)則被視為次要節(jié)點(diǎn)。
用一下官方的圖:
故障轉(zhuǎn)移
圖中有三臺(tái) MongoDB 實(shí)例,當(dāng) Primary 掛了后,Secondary
可以換掉掛了的服務(wù)器,成為新的 Primary。
由于我只有兩臺(tái)服務(wù)器,因此只能組雙機(jī)熱備。
方案
主節(jié)點(diǎn)(Primary)
對(duì)外接收所有請(qǐng)求,然后將修改同步到所有 Secondary 中。
當(dāng) 主節(jié)點(diǎn)(Primary) 掛了后,其它 Secondary 或者 Arbiter 節(jié)點(diǎn)就會(huì)重新選舉一個(gè)主節(jié)點(diǎn)出來。
副本節(jié)點(diǎn)(Secondary)
副本節(jié)點(diǎn)是備胎,數(shù)據(jù)集跟主節(jié)點(diǎn)(Primary)一致,當(dāng)主節(jié)點(diǎn)掛了后,有機(jī)會(huì)成為正胎(Primary)。
仲裁者(Arbiter)
不保存數(shù)據(jù)集,也不能成為(Primary)。作用是當(dāng)主節(jié)點(diǎn)掛了后,投票給 Secondary,讓 Secondary 成為 Primary。
但是怎么配置原有的 MongoDB 實(shí)例,使其成為 Primary - Secondary 集群呢?Google 了很久。
找到 MongoDB 官方的文檔:
https://docs.mongodb.com/manual/tutorial/deploy-replica-set/
設(shè)計(jì)實(shí)例名稱
在 primary 機(jī)器和 secondary 機(jī)器上,分別打開 /etc/mongod.conf
文件,找到 #
replication,設(shè)置節(jié)點(diǎn)名稱。
replication: replSetName: {名稱}
primary 機(jī)器設(shè)置 primary
,secondary 機(jī)器設(shè)置 beitai
。
replSetName 的作用解釋如下:
https://docs.mongodb.com/manual/reference/configuration-options/#replication.replSetName
也可以在啟動(dòng) MongoDB 時(shí)加上 --replSet "beitai"
的參數(shù)。
mongod --replSet "beitai" ... ...
請(qǐng)停止 MongoDB 后,使用長命令的方法啟動(dòng) MongoDB。
請(qǐng)?jiān)谝O(shè)置為 Primary 的機(jī)器,執(zhí)行:
mongod --replSet "primary" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
請(qǐng)?jiān)谝O(shè)置為 Secondary 的機(jī)器,執(zhí)行:
mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
如何創(chuàng)建集群
必須要做到以下兩點(diǎn)配置:
- Add Members to a Replica Set
- Deploy a Replica Set
筆者在這里踩了很大的坑,試了很多種方法和配置才成功。
啟動(dòng)兩個(gè)實(shí)例(配置)
提前說明,如果使用 rs.
指令配置實(shí)例,想重新配置,出現(xiàn) ”"errmsg" : "already initialized"“,可以使用 rs.reconfig()
清除配置。
rsconf = rs.conf() rsconf.members = [{_id: 1, host: "本機(jī)的ip:27017"}] rs.reconfig(rsconf, {force: true})
在 Secondary 機(jī)器,執(zhí)行命令停止運(yùn)行:
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown
重新啟動(dòng) Secondary 機(jī)器:
mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
設(shè)置為 Secondary 節(jié)點(diǎn):
rs.initiate( { _id: "beitai", version: 1, members: [ { _id: 0, host : "primary的ip:27017" } { _id: 1, host : "secondary的ip:27017" } ] } )
注:id是優(yōu)先級(jí)。
在 primary 機(jī)器,執(zhí)行命令停止運(yùn)行:
mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown
重新啟動(dòng) primary:
mongod --replSet "beitai" --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork
在 primary 進(jìn)入 shell:
mongo
執(zhí)行命令進(jìn)行初始化并設(shè)置自己為 primary:
rs.initiate( { _id: "primary", version: 1, members: [ { _id: 0, host : "primary的ip:27017" }, { _id: 1, host : "secondary的ip:27017" } ] } )
分別在兩個(gè)實(shí)例打開 mongo shell,執(zhí)行:
rs.status()
發(fā)現(xiàn):
beitai:SECONDARY> ... primary:PRIMARY>
使用工具連接 MongoDB 并創(chuàng)建一個(gè)名為 Test 的數(shù)據(jù)庫:
副本集狀態(tài)查看
查看復(fù)制延遲:
rs.printSlaveReplicationInfo()
執(zhí)行結(jié)果:
WARNING: printSlaveReplicationInfo is deprecated and may be removed in the next major release. Please use printSecondaryReplicationInfo instead. source: *.*.*.*:27017 syncedTo: Sat Oct 17 2020 20:02:49 GMT+0800 (CST) 0 secs (0 hrs) behind the freshest member (no primary available at the moment) source: *.*.*.*:27017 syncedTo: Thu Jan 01 1970 08:00:00 GMT+0800 (CST) 1602936169 secs (445260.05 hrs) behind the freshest member (no primary available at the moment)
.NET Core 連接 MongoDB
.NET 程序要連接 MongoDB ,需要通過 Nuget 包安裝 MongoDB.Driver
驅(qū)動(dòng)。
我們來創(chuàng)建一個(gè)控制臺(tái)程序,Nuget 搜索 MongoDB.Driver 并安裝,接下來一步步使用連接 MongoDB。
文檔地址:https://mongodb.github.io/mongo-csharp-driver/2.10/getting_started/
添加 using 引用:
using MongoDB.Bson; using MongoDB.Driver;
連接 MongoDB
var client = new MongoClient("mongodb://primary的ip:27017,secondary的ip:27017");
獲取數(shù)據(jù)庫
IMongoDatabase database = client.GetDatabase("Test");
獲取文檔集合
var collection = database.GetCollection<BsonDocument>("MyCollection");
插入文檔(json)
var document = new BsonDocument { { "name", "MongoDB" }, { "type", "Database" }, { "count", 1 }, { "info", new BsonDocument { { "x", 203 }, { "y", 102 } }} };
其源結(jié)構(gòu)的 json 如下:
{ "name": "MongoDB", "type": "database", "count": 1, "info": { x: 203, y: 102 } }
將文檔插入到集合中:
collection.InsertOne(document); // 使用異步 await collection.InsertOneAsync(document);
然后執(zhí)行程序,一會(huì)兒后,打開 MongoDB 管理器,查看集合。
到此這篇關(guān)于.Net Core中使用MongoDB搭建集群與項(xiàng)目實(shí)戰(zhàn)的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
初識(shí) ASP.NET Membership 用戶管理
Membership 是用做用戶管理,進(jìn)行身份認(rèn)證使用的。通過ASP.NET Membership,我們可以創(chuàng)建用戶、刪除用戶和編輯用戶屬性。所以這是一個(gè)實(shí)現(xiàn)登錄相關(guān)控件的底層框架。2016-04-04ASP.NET Core使用IHttpClientFactory發(fā)出HTTP請(qǐng)求
這篇文章介紹了ASP.NET Core使用IHttpClientFactory發(fā)出HTTP請(qǐng)求的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-04-04Linux Ubuntu系統(tǒng)上手動(dòng)安裝.NET Core SDK的方法
.NET Core是一個(gè)開源通用的開發(fā)框架,支持跨平臺(tái),即支持在Window,macOS,Linux等系統(tǒng)上的開發(fā)和部署,并且可以在硬件設(shè)備,云服務(wù),和嵌入式/物聯(lián)網(wǎng)方案中進(jìn)行使用。下面這篇文章將給大家詳細(xì)介紹關(guān)于在Linux Ubuntu系統(tǒng)上手動(dòng)安裝.NET Core SDK的方法。2016-12-12ASP.NET樣板項(xiàng)目ABP框架的特性總結(jié)
這篇文章主要介紹了ASP.NET樣板項(xiàng)目ABP框架的特性總結(jié),ABP框架基于ASP.NET框架,用于開發(fā)Web應(yīng)用程序,需要的朋友可以參考下2016-06-06ASP.NET創(chuàng)建三層架構(gòu)圖解詳細(xì)教程
本文以圖片的形式完整演示了創(chuàng)建三層架構(gòu)的完整步驟,簡單實(shí)用,希望能給大家一些幫助。2016-04-04