日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

.Net?Core中使用MongoDB搭建集群與項(xiàng)目實(shí)戰(zhàn)_基礎(chǔ)應(yīng)用

作者:癡者工良 ? 更新時(shí)間: 2022-04-27 編程語言

安裝 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啟動 MongoDB

執(zhí)行命令檢查 MongoDB 的狀態(tài):

sudo systemctl status mongodb

啟動 MongoDB:

sudo systemctl start mongod

開機(jī)啟動 MongoDB:

sudo systemctl enable mongod

查看 MongoDB 版本:

mongo --version
mongod --version

注意:由于 Linux/Unix 系統(tǒng)會對文件描述符的數(shù)量或者線程數(shù)量加以限制,如果安裝過程或者啟動時(shí)報(bào)錯(cuò),需要自行另外查找方法解決,這里不再贅述。

通過二進(jìn)制包安裝(方法3)

適合網(wǎng)絡(luò)不會或者離線安裝,有?tgzdeb?、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)制包的下載鏈接。

請注意下載的軟件版本,mongos 、tagz 包含全部功能;

其它的是單獨(dú)提供 server 或者 client(shell) 功能。

本小節(jié)將提供安裝 .deb 和 tgz 包的說明,請自行選擇要安裝的包!(建議直接下載 tgz)。

不同種類的軟件包

deb 安裝 MongoDB

如果下載了 .deb 文件,請使用下面命令安裝。

wget {下載地址}
sudo dpkg -i {軟件包名}.deb

tgz 安裝 MongoDB

如果下載了?.tar.gz?文件,請使用下面命令安裝。

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 目錄

啟動 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

之后終端會提示已經(jīng)成功啟動;也可以查看?/var/log/mongodb/mongod.log?日志文件中的內(nèi)容確定 MongoDB 的運(yùn)行情況;

cat /var/log/mongodb/mongod.log?日志文件,會發(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*

指定啟動的配置

通過配置文件

如果前面提到過配置文件?/etc/mongod.conf,如果通過配置文件啟動,則會方便很多,使用配置文件啟動 MongoDB 的方法:

mongod --config /etc/mongod.conf

通過參數(shù)

通過參數(shù)啟動 MongoDB 的話,每次啟動都比較麻煩:

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 啟動后,執(zhí)行以下命令修改配置。

# 綁定所有地址
mongod --bind_ip_all

# 修改端口
mongod --port 27017

或者停了 MongoDB 服務(wù)后,使用以下命令啟動:

mongod  --bind_ip=0.0.0.0 --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --fork

或者手動修改?/etc/mongod.conf?配置文件,把其中一段改成?0.0.0.0

# network interfaces
net:
  port: 27017
  bindIp: 0.0.0.0  

修改完畢后,需要關(guān)閉 MongoDB,再開啟,請參考后面 ”停止 MongoDB“ 一節(jié)。

測試遠(yuǎn)程 IP 連接

測試連接指定 IP 和 port 的 MongoDB 服務(wù):

mongo {你的服務(wù)器公網(wǎng)IP}:27017

加上密碼驗(yàn)證

設(shè)置賬號密碼

mongo

# 進(jìn)入 MongoDB shell 后
use admin
db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})

如果不生效,請自行找方法解決,這里不再贅述~

開啟登錄驗(yàn)證

然后打開?/etc/mongod.conf?文件,將?#security:?改成:

security:
  authorization: enabled

如果不生效,請自行找方法解決,這里不再贅述~

停止 MongoDB

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown

搭建集群

按照此方法,再炮制一臺服務(wù)器就行。

建議使用 docker 一次性搞好,自己手動在物理機(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)。

用一下官方的圖:

mongoDB副本集

故障轉(zhuǎn)移

圖中有三臺 MongoDB 實(shí)例,當(dāng) Primary 掛了后,Secondary?可以換掉掛了的服務(wù)器,成為新的 Primary。

故障轉(zhuǎn)移

由于我只有兩臺服務(wù)器,因此只能組雙機(jī)熱備。

方案

主節(jié)點(diǎn)(Primary)

對外接收所有請求,然后將修改同步到所有 Secondary 中。

當(dāng) 主節(jié)點(diǎn)(Primary) 掛了后,其它 Secondary 或者 Arbiter 節(jié)點(diǎn)就會重新選舉一個(gè)主節(jié)點(diǎn)出來。

副本節(jié)點(diǎn)(Secondary)

副本節(jié)點(diǎn)是備胎,數(shù)據(jù)集跟主節(jié)點(diǎn)(Primary)一致,當(dāng)主節(jié)點(diǎn)掛了后,有機(jī)會成為正胎(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

也可以在啟動 MongoDB 時(shí)加上?--replSet "beitai"?的參數(shù)。

mongod --replSet "beitai" ... ...

請停止 MongoDB 后,使用長命令的方法啟動 MongoDB

請?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

請?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

筆者在這里踩了很大的坑,試了很多種方法和配置才成功。

啟動兩個(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

重新啟動 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)先級。

在 primary 機(jī)器,執(zhí)行命令停止運(yùn)行:

mongod --dbpath /var/lib/mongo --logpath /var/log/mongodb/mongod.log --shutdown

重新啟動 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ù)庫:

連接MongoDB

副本集狀態(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ū)動。

我們來創(chuàng)建一個(gè)控制臺程序,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("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í)行程序,一會兒后,打開 MongoDB 管理器,查看集合。

原文鏈接:https://www.cnblogs.com/whuanle/p/13832578.html

欄目分類
最近更新