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

2022-01-10 DotNet

(給DotNet加星標,提升.Net技能)

cnblogs.com/whuanle/p/13832578.html

安裝 MongoDB

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

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

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

支持的系統:

20.04 LTS (「Focal」)

18.04 LTS (「Bionic」)

16.04 LTS (「Xenial」)

更新軟體源

sudo apt update
sudo apt upgrade

apt 直接安裝(方法1)


如果你要安裝穩定版本,則直接使用一條命令安裝:

sudo apt install mongodb

執行命令檢查 MingoDB 的狀態:

sudo systemctl status mongodb

apt 倉庫安裝(方法2)


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

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

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

方法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)


適合網絡不會或者離線安裝,有 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

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

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 實例,當 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

如何創建集群


必須要做到以下兩點配置:

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

啟動兩個實例(配置)


提前說明,如果使用 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 的資料庫:

副本集狀態查看


查看複製延遲:

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 管理器,查看集合。

- EOF -

看完本文有收穫?請轉發分享給更多人

關注「DotNet」加星標,提升.Net技能 

好文章,我在看❤️

相關焦點

  • OceanBase 2.x體驗:手動搭建OceanBase集群
    此前在《OceanBase資料庫實踐入門——手動搭建OceanBase集群》裡介紹過OceanBase 1.4的手動搭建方法。
  • Docker&MongoDB實戰(一)單機部署
    本系列文章將重點介紹如何在Docker中使用MongoDB,從單一的開發/測試環境設置到複雜的多主機MongoDB集群都會涉及,包括日誌管理、性能、數據持久化等。下面是虛擬機和Docker的對比:網上有很多介紹在Docker與MongoDB的文章,但是大多都是基於Ubuntu,並且也僅僅只是在單機上部署,也沒有準備在生產環境中使用。
  • 資料庫安全之MongoDB滲透
    二、軟體安裝及環境搭建1、MongoDB安裝MongoDB官網提供了32位、64位的預編譯二進位包。配置文件啟動目的:將mongodb服務安裝到Windows服務中,可以通過net命令進行開啟和關閉首先在C:\MongoDB目錄下創建一個mongodb.conf文件(這個文件名和文件的路徑隨意,只要在mongodb
  • Kubernetes 集群部署 MongoDB+exporter (單節點)
    這裡介紹下如何在 Kubernetes 環境中部署用於開發、測試的環境的 MongoDB 資料庫,當然,部署的是單節點模式,並非用於生產環境的主從或集群模式。單節點的 MongoDB 部署簡單,且配置存活探針,能保證快速檢測 MongoDB 是否可用,當不可用時快速進行重啟。
  • k8s系列第八篇~k8s集群環境搭建
    前七篇文章帶大家初步了解了kubernetes資源對象,本文主要帶大家搭建kubernetes集群環境。
  • MongoDB 是什麼?看完你就知道了!
    點擊上方藍色字體,選擇「置頂公眾號」優質文章,第一時間送達連結 | blog.csdn.net1.為什麼需要分片當數據量過大,索引和工作數據集佔用的內存就會越來越多,所以需要通過分片負載來解決這個問題2.分片的工作原理mongos路由器:是一個路由器,將讀寫請求指引到合適的分片上配置伺服器config:持久化分片集群的元數據,包括:全局集群配置;每個資料庫、集合和特定範圍數據位置;一份變更記錄,保存了數據在分片之間進行遷移的歷史信息。
  • 記錄一個集群的搭建過程
    雖然長期以來從事計算化學研究,Rita居然還沒有過搭建集群的經歷,一直以來使用的Artificial Paradise雖有四個節點,但各個節點的硬體設施都極具個性
  • MongoDB是什麼?看完你就知道了!
    六、MongoDB副本集本節同樣主要簡單呈現MongoDB副本集搭建的簡易性,與副本集的強壯性,監控容易性1.為什麼要使用副本集提供主從複製能力,熱備能力,故障轉移能力2.構建方式rs.initiate()rs.add("localhost:40001")rs.add("localhost:40002",{arbiterOnly:true
  • MongoDB和Redis的區別是什麼
    3、數據量和性能:當物理內存夠用的時候,redis>mongodb>mysql當物理內存不夠用的時候,redis和mongodb都會使用虛擬內存。實際上如果redis要開始虛擬內存,那很明顯要麼加內存條,要麼你換個資料庫了。
  • asp.net core 5.0的一些模塊
    .n
  • 大數據技術棧實踐私教級教程-4.Hadoop集群搭建
    1集群搭建的過程集群啟動和集群測試前三步我們已經在之前的章節Hadoop100主機中完成,現在只需要在VM中複製一下再做相應的修改即可。2VM虛擬機克隆通過VM將Hadooop_template複製三份名字分別為Hadoop102、Hadoop103、Hadoop104。
  • Libc-Database 本地搭建實戰
    另外,此教程中涉及到了部分文件的修改,我也對原項目進行了部分本地化,因此也可以直接獲取我fork修改的項目進行搭建。https://github.com/hebtuerror404/libc-database。
  • Kubenetes高可用集群搭建
    搭建外部etcd集群: etcd是kubernetes集群中的一個十分重要的組件,用於保存集群所有的網絡配置和對象的狀態信息。本次實驗通過kubelet部署static pod方式在集群外部部署一個3節點的etcd集群。2.
  • 部署一個 Containerd 容器運行時的 Kubernetes 集群
    本文使用 kubeadm 從頭搭建一個使用 containerd 作為容器運行時的 Kubernetes 集群,這裡我們安裝最新的 v1.22.1 版本。 = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1bridge-nf 使得 netfilter 可以對 Linux 網橋上的 IPv4/ARP/IPv6 包過濾。
  • Linux環境快速搭建elasticsearch6.5.4集群和Head插件
    來源:https://blog.csdn.net/boling_cavalry/article/details/86358716
  • Linux下搭建Kafka集群
    本文基於Ubuntu 16.04 LTS,介紹如何搭建1主2備的kafka集群。伺服器數量 >= 2Java 8+搭建好ZooKeeper集群防火牆開放9092埠:$ tar -xzvf kafka_2.13-2.7.0.tgz -C /usr/local$ cd /usr/local/kafka_2.13-2.7.0利用模板文件zoo_sample.cfg
  • Docker搭建Redis的cluster集群
    ,cluster集群能支持擴容,且無須額外的節點來監控狀態,所以使用這種模式集群的系統會用得更多些。上文中提到的cluster集群裡有16384個哈希槽,並不意味著在這種集群模式中一定要有16384個節點。哈希槽是虛擬的,是會被分配到若干臺集群裡的機器上的。
  • Redis集群環境搭建實踐
    本文是Redis集群學習的實踐總結(基於Redis 6.0+),詳細介紹逐步搭建Redis集群環境的過程,並完成集群伸縮的實踐。相比於主從複製、哨兵模式,Redis集群實現了較為完善的高可用方案,解決了存儲能力受到單機限制,寫操作無法負載均衡的問題。本文是Redis集群學習的實踐總結,詳細介紹逐步搭建Redis集群環境的過程,並完成集群伸縮的實踐。
  • 使用 kube-vip 搭建高可用 Kubernetes 集群
    kube-vip 最初是為 Kubernetes 控制平面提供 HA 解決方案而創建的,隨著時間的推移,它已經發展為將相同的功能合併到 Kubernetes 的 LoadBalancer 類型的 Service 中了。帶有 ARP(第 2 層)或 BGP(第 3 層)的控制平面。帶有 kubeadm(靜態 Pod)的控制平面 HA。
  • Redis 集群搭建
    單節點的Redis 已經就達到了很高的性能,為了提高可用性我們可以使用 Redis 集群。集群簡介Redis 集群是一個可以在多個 Redis 節點之間進行數據共享的設施(installation)。Redis 集群通過分區(partition)來提供一定程度的可用性(availability):即使集群中有一部分節點失效或者無法進行通訊,集群也可以繼續處理命令請求。