.NET Core+MongoDB集羣搭建與實戰

安裝 MongoDB

安裝 MongoDB 網上有不少教程,MongoDB 官方文檔:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/linux

筆者這裏簡單寫一下安裝過程,筆者使用 ubuntu 系統。git

要按照的目標版本:MongoDB 4.4 Community Editiongithub

支持的系統:mongodb

  • 20.04 LTS (「Focal」)
  • 18.04 LTS (「Bionic」)
  • 16.04 LTS (「Xenial」)

更新軟件源docker

sudo apt update
sudo apt upgrade

apt 直接安裝(方法1)

若是你要安裝穩定版本,則直接使用一條命令安裝:shell

sudo apt install mongodb

執行命令檢查 MingoDB 的狀態:數據庫

sudo systemctl status mongodb

apt 倉庫安裝(方法2)

此種方式可讓你安裝最新版本的 MongoDB 。json

導入包管理系統使用的公鑰ubuntu

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

安裝最新穩定版本的 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

方法一、2啓動 MongoDB

執行命令檢查 MongoDB 的狀態

sudo systemctl status mongodb

啓動 MongoDB

sudo systemctl start mongod

開機啓動 MongoDB

sudo systemctl enable mongod

查看 MongoDB 版本

mongo --version
mongod --version

注意:因爲 Linux/Unix 系統會對文件描述符的數量或者線程數量加以限制,若是安裝過程或者啓動時報錯,須要自行另外查找方法解決,這裏再也不贅述。

經過二進制包安裝(方法3)

適合網絡不會或者離線安裝,有 tgzdebsource code 等方法安裝,這裏只使用 tgz 方式。

安裝依賴

# ubuntu 16.04
sudo apt-get install libcurl3 openssl liblzma5

# ubuntu 18.04 & 20.04
sudo apt-get install libcurl4 openssl liblzma5

選擇合適的系統下載二進制包

https://www.mongodb.com/try/download/community?tck=docs_server

Package 能夠選擇包的形式,如 shell(deb)、shell(tgz)。

注意,要在服務器下載的話,就不要點擊 Download,而是點擊 Copy Link 複製二進制包的下載連接。

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

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

本小節將提供安裝 .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

打開解壓的目錄,執行:

sudo cp bin/* /usr/local/bin/
# 實際上就是將二進制可執行文件放到 bin 目錄

啓動 MongoDB

建立數據存放目錄

sudo mkdir -p /var/lib/mongo

建立日誌存放目錄:

sudo mkdir -p /var/log/mongodb

若是不是使用 root 用戶登陸,則須要獲取文件權限:

# whoami是你的用戶名
sudo chown `whoami` /var/lib/mongo
sudo chown `whoami` /var/log/mongodb

運行 MongoDB:

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

以後終端會提示已經成功啓動;也能夠查看 /var/log/mongodb/mongod.log 日誌文件中的內容肯定 MongoDB 的運行狀況;

cat /var/log/mongodb/mongod.log 日誌文件,會發現第一行:

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

注:執行過程報錯不用管。

tgz 卸載方法

適合卸載使用 .tar.gz 安裝的包。

rm /usr/local/bin/mongo*

指定啓動的配置

經過配置文件

若是前面提到過配置文件 /etc/mongod.conf,若是經過配置文件啓動,則會方便不少,使用配置文件啓動 MongoDB 的方法:

mongod --config /etc/mongod.conf

經過參數

經過參數啓動 MongoDB 的話,每次啓動都比較麻煩:

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

MongoDB 綁定IP、端口

查看 MongoDB 配置:

# 進入 shell
mongo

# 執行
use admin
db.runCommand( { getParameter : '*' } )

默認 MongoDB 是本地服務,外界沒法訪問主機的 MongoDB 服務,這裏來配置一下,使其可以被外網訪問。

在 MongoDB 啓動後,執行如下命令修改配置。

# 綁定全部地址
mongod --bind_ip_all

# 修改端口
mongod --port 27017

或者停了 MongoDB 服務後,使用如下命令啓動:

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

修改完畢後,須要關閉 MongoDB,再開啓,請參考後面 」中止 MongoDB「 一節。

測試遠程 IP 鏈接

測試鏈接指定 IP 和 port 的 MongoDB 服務:

mongo {你的服務器公網IP}:27017

加上密碼驗證

設置帳號密碼

mongo

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

若是不生效,請自行找方法解決,這裏再也不贅述~

開啓登陸驗證

而後打開 /etc/mongod.conf 文件,將 #security: 改爲:

security:
  authorization: enabled

若是不生效,請自行找方法解決,這裏再也不贅述~

中止 MongoDB

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

搭建集羣

按照此方法,再炮製一臺服務器就行。

建議使用 docker 一次性搞好,本身手動在物理機上面安裝,太折騰了。

接下來,咱們要根據官方文檔,搭建簡單的副本集羣。

官方文檔地址:https://docs.mongodb.com/manual/replication/

副本集

副本集是一組 MongoDB 實例來維護相同數據集。

官網文檔解釋:一個副本集包含多個數據承載節點和一個仲裁器節點(可選)。在數據承載節點中,只有一個成員被視爲主要節點,而其餘節點則被視爲次要節點。

用一下官方的圖:

mongoDB副本集

故障轉移

圖中有三臺 MongoDB 實例,當 Primary 掛了後,Secondary 能夠換掉掛了的服務器,成爲新的 Primary。

故障轉移

因爲我只有兩臺服務器,所以只能組雙機熱備。

方案

主節點(Primary)

對外接收全部請求,而後將修改同步到全部 Secondary 中。

當 主節點(Primary) 掛了後,其它 Secondary 或者 Arbiter 節點就會從新選舉一個主節點出來。

副本節點(Secondary)

副本節點是備胎,數據集跟主節點(Primary)一致,當主節點掛了後,有機會成爲正胎(Primary)。

仲裁者(Arbiter)

不保存數據集,也不能成爲(Primary)。做用是當主節點掛了後,投票給 Secondary,讓 Secondary 成爲 Primary。

可是怎麼配置原有的 MongoDB 實例,使其成爲 Primary - Secondary 集羣呢?Google 了好久。

找到 MongoDB 官方的文檔:

https://docs.mongodb.com/manual/tutorial/deploy-replica-set/

設計實例名稱

在 primary 機器和 secondary 機器上,分別打開 /etc/mongod.conf 文件,找到 #replication,設置節點名稱。

replication:
  replSetName: {名稱}

primary 機器設置 primary,secondary 機器設置 beitai

replSetName 的做用解釋以下:

https://docs.mongodb.com/manual/reference/configuration-options/#replication.replSetName

也能夠在啓動 MongoDB 時加上 --replSet "beitai" 的參數。

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

請中止 MongoDB 後,使用長命令的方法啓動 MongoDB

請在要設置爲 Primary 的機器,執行:

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

請在要設置爲 Secondary 的機器,執行:

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

如何建立集羣

必需要作到如下兩點配置:

  • Add Members to a Replica Set
  • Deploy a Replica Set

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

啓動兩個實例(配置)

提早說明,若是使用 rs. 指令配置實例,想從新配置,出現 」"errmsg" : "already initialized"「,可使用 rs.reconfig() 清除配置。

rsconf = rs.conf()
rsconf.members = [{_id: 1, host: "本機的ip:27017"}]
rs.reconfig(rsconf, {force: true})

在 Secondary 機器,執行命令中止運行:

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

從新啓動 Secondary 機器:

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

設置爲 Secondary 節點:

rs.initiate(
   {
      _id: "beitai",
      version: 1,
      members: [
         { _id: 0, host : "primary的ip:27017" }
         { _id: 1, host : "secondary的ip:27017" }
      ]
   }
)

注:id是優先級。

在 primary 機器,執行命令中止運行:

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 進入 shell:

mongo

執行命令進行初始化並設置本身爲 primary:

rs.initiate(
   {
      _id: "primary",
      version: 1,
      members: [
         { _id: 0, host : "primary的ip:27017" },
         { _id: 1, host : "secondary的ip:27017" }
      ]
   }
)

分別在兩個實例打開 mongo shell,執行:

rs.status()

發現:

beitai:SECONDARY> 
...
primary:PRIMARY>

使用工具鏈接 MongoDB 並建立一個名爲 Test 的數據庫:

鏈接MongoDB

副本集狀態查看

查看複製延遲:

rs.printSlaveReplicationInfo()

執行結果:

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 驅動。

咱們來建立一個控制檯程序,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");

獲取數據庫

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 }
                }}
            };

其源結構的 json 以下:

{
     "name": "MongoDB",
     "type": "database",
     "count": 1,
     "info": {
         x: 203,
         y: 102
     }
}

將文檔插入到集合中:

collection.InsertOne(document);
            // 使用異步 await collection.InsertOneAsync(document);

而後執行程序,一下子後,打開 MongoDB 管理器,查看集合。

相關文章
相關標籤/搜索