C# MongoDB

来源:http://www.cnblogs.com/yswenli/archive/2017/08/24/7421909.html
-Advertisement-
Play Games

一、搭建Mongodb 副本集 副本集中有三個角色: 主節點:所有副節點的數據均來自於主節點,並且只能對主節點進行讀寫操作。副節點:數據來自於主節點,可以進行讀取操作,但是不能進行寫操作。仲裁者:不含數據也不與客戶端交流,只在選舉主節點的時候進行投票。 Mongodb最多支持50個副本集成員以及最多 ...


一、搭建Mongodb 副本集

副本集中有三個角色:

主節點:所有副節點的數據均來自於主節點,並且只能對主節點進行讀寫操作。
副節點:數據來自於主節點,可以進行讀取操作,但是不能進行寫操作。
仲裁者:不含數據也不與客戶端交流,只在選舉主節點的時候進行投票。

Mongodb最多支持50個副本集成員以及最多7個選舉成員,啟動副本集後將開始第一次選舉,在選舉過程中,所有副本集成員都只能讀取,直到選舉出主節點後主節點才能進行讀寫,但是在這個期間副本成員可以提供查詢服務。

而主節點要保持主節點的位置需要每兩秒發送一個ping請求,如果10秒內沒有得到響應則標記為不可訪問,當一半以上的副本集成員不可訪問,那麼主節點將降級為副節點。

其中設置成員的priority值可以優先成員主節點,這個值介於0-1000之間,預設為1,如果這個值為0,那麼它的votes值也為0,只要votes為0的成員不能投選舉票,但是可以投否決票。但是我們也可以手動設置成員priority值為大於1的成員是否有投票權利。

在進行選舉的時候,其他成員會作以下幾點判斷來進行投票參與選舉的成員是否能作為主節點,選舉步驟:

自己是否能與主節點通訊。
參與選舉的成員是否比其他參與選舉的成員數據最新。
如果參與選舉的成員數據相等則嘗試使用具有最高priority的值的成員。

仲裁者

仲裁者的出現是為了避免只有兩個成員的副本集,兩個成員的副本集投票可能無法滿足一半以上的投票情況。

仲裁者不負責數據和客戶端交流,只有參與選舉的功能,需要註意的是仲裁者一旦設置過後就再也無法變為非仲裁者了。

首先部署一個副本集很簡單,下麵的代碼是部署了一個本地含有三個成員的副本集。

建立三個成員的副本集,首先你得建立三個資料庫的存放目錄:

mkdir -p ./replDb/s0 ./replDb/s1 ./replDb/s2
然後我們啟動三個副本集成員,其中replSet參數後面跟的是副本集的名稱,將需要有關聯的成員的副本集名稱要一致。

mongod --dbpath ./replDb/s0 --port 27017 --replSet s0

mongod --dbpath ./replDb/s0 --port 27018 --replSet s0

mongod --dbpath ./replDb/s0 --port 27019 --replSet s0
創建仲裁者也同樣非常簡單,建立一個空的數據目錄,然後和其他副本集成員一樣設置同樣的副本集名稱啟動,最後通過rs.add方法的第二個參數設置為true:

mongod --dbpath ./replDb/s5 --port 27020 --replSet s0

mongod --port 27017 --host localhost

> rs.add('localhost:27020', true);

然後通過Mongo Shell進入到埠為27017的成員中,並配置副本集。

mongod --port 27017 --host localhost
進入到Mongo Shell後通過rs.initiate方法來配置副本集。

> var conf = {
_id: 'r0',
version: 1,
members: [
{
_id: 0,
host: 'localhost:27017'
},
{
_id: 1,
host: 'localhost:27018'
},
{
_id: 2,
host: 'localhost:27019'
},
{
_id: 3,
host: 'localhost:27020'
}
]
};

> rs.initiate(conf);
initiate接受一個對象,對象_id為副本集名稱,必須和啟動副本集設置的一致才能添加進來(本例為rs0)。version為版本號,每當我們修改副本集配置的時候這個版本號都會遞加1,而members則為副本集成員,我們可以在這裡一次性添加完,也可以只添加一個後面再通過add方法添加,比如下麵這樣:

> rs.add('localhost:27018');
> rs.add('localhost:27019');

刪除副本集

刪除副本集通過rs.remove方法來刪除,它接受一個<localhost>:<port>這樣的字元串。下麵是刪除一個副本集成員:

> rs.remove('localhost:27019');

查詢副本集配置

查看副本集配置是通過rs.conf方法查詢,返回包含所有副本集的配置內容.

> rs.conf();

查詢主節點

每當使用rs.add方法添加成員的時候可能會影響選舉來選擇主節點是誰,查看主節點通過rs.isMaster()方法來查看。

> rs.isMaster();
返回的內容中有幾個可以瞭解

{
"hosts" : [ //副本集成員
"localhost:27017",
"localhost:27018",
"localhost:27019"
],
"setName" : "rs0", //副本集名稱
"setVersion" : 3, //副本集配置版本
"ismaster" : true, //是否是主節點
"primary" : "localhost:27017", //主節點成員的主機地址
"me" : "localhost:27017", //當前所在主機
}

讀取副節點

副節點預設是無法讀取的,我們可以通過rs.setSlaveOk()方法來設置Slave屬性為true。下麵是設置埠為27018的副節點可以進行讀取

mongod --port 27018 --host localhost

> rs.setSlaveOk();

隱藏成員

隱藏成員通過設置成員的hidden屬性為true並且優先值priority為0則可以隱藏此成員,隱藏成員不能當主節點也不能當其他成員的複製源

> rs.add({
> _id: 1,
> _host: 'localhost:27017',
> hidden: true,
> priority: 0
> })

延遲複製

通過設置成員的slaveDelay的值並且優先值priority為0,來讓當前成員滯後多少秒後才開始複製數據。

> rs.add({
> _id: 1,
> _host: 'localhost:27017',
> slaveDelay: 120,
> priority: 0
> })

索引管理

通過成員的buildIndexes的值並且優先值priority為0,來設置是否在備份機器上建立相同的索引,一般這個選項只用於純粹備份的伺服器。

下麵的代碼設置添加的副本集成員不創建索引。

> rs.add({
> _id: 1,
> _host: 'localhost:27017',
> buildIndexes: false
> priority: 0
> })

二、搭建配置伺服器

首先搭建配置伺服器,配置伺服器如同分片的大腦,保存著集群和數據的描述信息。

因為Mongodb3.4版本後需要配置伺服器必須配置為副本集,所以需要給配置伺服器配置副本集

首先建立三個空的資料庫目錄,用於搭建配置伺服器的副本集,並分別啟動它們,在啟動的時候需要加上我們副本集的名稱和--configsvr來表示這是一個配置伺服器,並分別指定不同的埠。

$ mkdir config0 config1 config2

$ mongod --dbpath config0 --replSet conServer --configsvr --port 27020

$ mongod --dbpath config1 --replSet conServer --configsvr --port 27021

$ mongod --dbpath config2 --replSet conServer --configsvr --port 27020

然後通過mongo隨意進入一個副本集成員,併為配置伺服器的副本集進行配置:

$ mongo --port 27020 --host localhost

> var conf = {
    _id: 'conServer',
    version: 1,
    members: [
        {
            _id: 0,
            host: 'localhost:27020'
        },
        {
            _id: 1,
            host: 'localhost:27021'
        },
        {
            _id: 2,
            host: 'localhost:27022'
        }
    ]
};

> rs.initiate(conf);

至此配置伺服器配置完成。

三、搭建分片伺服器

官方建議我們的分片服務區至少在3個或以上才能發揮出更好的性能,我們這裡也創建三個分片伺服器。

因為分片伺服器沒有強制要求必須是副本集,所以下麵就創建了三個單機分片伺服器,但是Mongodb接受分片伺服器為副本集。

下麵創建三個空資料庫目錄,然後啟動它們,在啟動的時候需要加上--shardsvr以表示這是一個分片伺服器:

$ mkdir sh0 sh1 sh2

$ mongod --dbpath sh0 --shardsvr --port 27030

$ mongod --dbpath sh1 --shardsvr --port 27031

$ mongod --dbpath sh2 --shardsvr --port 27032

至此分片伺服器也搭建完成。

四、搭建路由伺服器

mongodb提供了一個路由工具,它會隨著我們下載包一起下載,名字為mongosmongos.exe,通過它配置路由功能。

啟動路由我們需要加上參數--configdb,它的語法為:

--configdb 配置伺服器副本集名稱/配置伺服器1地址埠,配置伺服器1地址埠...

啟動路由,併為路由指定一個埠,用於開放給客戶端鏈接:

$ mongos --configdb conServer/localhost:27020,localhost:27021,localhost:27022 --port 27040

至此路由已經搭建完成。

五、配置分片

配置分片伺服器

通過mongodb提供的mongo進入到路由伺服器中進行配置,把我們開始創建的三個分片伺服器通過sh.addShard()方法添加進行,這個方法接受一個字元串裡面的格式為host:port

$ mongo --port 27040 --host localhost

> sh.addShard('localhost:27030');
> sh.addShard('localhost:27031');
> sh.addShard('localhost:27032');

可以通過rs.status()方法中返回的shards欄位看是否添加成功。

配置片鍵

到目前為止,分片伺服器已經搭建完成,但是目前分片伺服器無法正常工作,我們所有的操作都將在隨機的一個主分片上操作,這是因為分片伺服器不知道怎麼進行分片,所以我們還需要配置片鍵來告訴分片伺服器按照什麼來分片。

分片是基於資料庫集合中的文檔的一個鍵進行分片的,比如選擇username鍵,那麼會根據這個鍵的順序就行分片,而mongodb會自動平衡分片的數據。

Mongodb要求作為片鍵的鍵必須是索引過的,所以我們在建立片鍵之前需要對鍵進行索引,建立後片鍵就是集合中的最重要的索引。

在生產環境中建議先想好數據建構建立索引和片鍵後開始操作數據,這樣會減輕分片伺服器的負載。

首先我們在需要進行分片的資料庫上開啟分片功能,通過sh.enableSharding方法開啟。

$ mongo --port 27040 --host localhost

> sh.enableSharding('test');

然後在開啟分片的資料庫中的test集合插入測試數據,註意此時我們還沒有進行配置片鍵,所以所有的數據操作都在分片伺服器隨機分配的一個主分片上面進行的。

> for(var i = 0; i < 100; i++){
    db.test.insert({
        username: 'user' + i,
        idNum: i
    })
}

這時候以username為片鍵,通過sh.shardCollection方法進行建立,它的語法為:

sh.shardCollection(namespace, key, unique, options)

首先給我們要建立的片鍵建立索引:

> db.test.ensureIndex({'username': 1});

然後建立片鍵:

> sh.shardCollection('test.test', {username:1});

等待幾分鐘後,可以通過sh.status方法查看數據分片的情況了,可以從中很清楚的看見哪些數據在哪個分片伺服器上面,並且通過explain方法來查看我們查詢的過程中哪些分片伺服器參與了查詢。

六使用MongoDB

下載驅動

打開vs,使用nuget下載驅動

 

下載驅動封裝庫

打開https://github.com/yswenli/MongoDBOperator/releases下載二次驅動封裝庫

 

連接配置

 打開app.config或web.config填寫mongo連接配置

1 <?xml version="1.0" encoding="utf-8" ?>
2 <configuration>
3   <connectionStrings>
4     <add name="MongoServerSettings" connectionString="mongodb://admin:admin@localhost:27017/MongoTests?authSource=admin" />
5   </connectionStrings>
6 </configuration>

測試CS代碼

 以下是測試代碼: 

 1 /*****************************************************************************************************
 2 * 本代碼版權歸@wenli所有,All Rights Reserved (C) 2015-2017
 3 *****************************************************************************************************
 4 * CLR版本:4.0.30319.42000
 5 * 唯一標識:63fcdf18-8930-4a86-93ca-f99f5a020844
 6 * 機器名稱:WENLI-PC
 7 * 聯繫人郵箱:[email protected]
 8 *****************************************************************************************************
 9 * 項目名稱:$projectname$
10 * 命名空間:MongoDBOperator.Test
11 * 類名稱:Program
12 * 創建時間:2017/7/13 16:00:44
13 * 創建人:wenli
14 * 創建說明:
15 *****************************************************************************************************/
16 
17 using System;
18 using System.Linq;
19 using System.Threading.Tasks;
20 using MongoDBOperator.Interface;
21 using MongoDBOperator.Test.Model;
22 
23 namespace MongoDBOperator.Test
24 {
25     class Program
26     {
27         static void Main(string[] args)
28         {
29             Console.Title = "MongoDBOperator.Test";
30 
31             IOperator<Account> customerOperator = new MongoOperator<Account>();
32 
33 
34             var account = new Account();
35             account.FirstName = "li";
36             account.LastName = "wen";
37             account.Phone = "13800138000";
38             account.Email = "[email protected]";
39             account.HomeAddress = new Address
40             {
41                 Address1 = "上海",
42                 Address2 = "徐匯",
43                 PostCode = "210001",
44                 City = "上海",
45                 Country = "中國"
46             };
47 
48             Console.WriteLine("Create");
49 
50             customerOperator.Add(account);            
53 
54             Console.WriteLine("Read");
55 
56             var c = customerOperator.Where(b => b.FirstName == "li").FirstOrDefault();
57 
58             Console.WriteLine("Update");
59 
60             c.FirstName = "guo li";
61 
62             customerOperator.Update(c);
63 
64             Console.WriteLine("Delete");
65 
66             customerOperator.Delete(c);
67 
68             customerOperator.DeleteAll();
69 
70             Console.ReadLine();
71 
72         }
73     }
74 }

 

vs調試效果如下:

 

 

 


轉載請標明本文來源:http://www.cnblogs.com/yswenli/p/7421909.html 
更多內容歡迎star作者的github:https://github.com/yswenli/MongoDBOperator
如果發現本文有什麼問題和任何建議,也隨時歡迎交流~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 說明 以下操作以Ubuntu為例,大家可以參考。 我在Ubuntu 14.04和16.04都試過了。 Windows共用文件夾 如果區域網內有一臺Windows主機,將指定文件夾設為共用,就可以在區域網內訪問了。 如果要從Linux下訪問該如何操作呢? 使用 mount.cifs Windows共用 ...
  • 命令簡介 cmd是command的縮寫.即命令行 。 雖然隨著電腦產業的發展,Windows 操作系統的應用越來越廣泛,DOS 面臨著被淘汰的命運,但是因為它運行安全、穩定,有的用戶還在使用,所以一般Windows 的各種版本都與其相容,用戶可以在Windows 系統下運行DOS,中文版Windo ...
  • 運維之linux基礎知識(一) 1.GUI:Graphic User Interface 圖形用戶界面 2.CLI:Command line Interface 命令行界面 3 dll:DynamicLinkLibrary 動態鏈接庫 4 so : shared object 共性對象 5指令說明: ...
  • 一、何為PXE Preboot Eexcution Environment,簡稱PXE,暫且翻譯為預啟動執行環境。用一句話來概括PXE的功能——它能通過網路為電腦(特別是“裸機”)安裝操作系統。在PXE下,“裸機”的BIOS和網卡能通過網路來引導啟動自身,而不是通過傳統的磁碟引導方式。PXE的這種 ...
  • 前言:在Linux下學習了很久,可是操作卻還是小學生一樣,唉,於是把整理的linux下vim的命令分享給大家,有了這些快捷鍵相信相信大家在linux下學習都會得心應手的。 一、移動游標 1、左移h、右移l、下移j、上移k 2、向下翻頁ctrl + f,向上翻頁ctrl + b 3、向下翻半頁ctrl ...
  • 用dba用戶登錄plsql,執行 第一步,建立表空間 CREATE SMALLFILE TABLESPACE "ASSETS" LOGGING DATAFILE 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\SDZC0216\ASSETS1.ora' SIZE 500M AUT ...
  • 由於防火牆問題,TCP keep alive 問題,以及 MySQL 自身的參數問題這三個在使用中比較常見,所以今天就分享下自己找到的排查方法。 今天先聊一聊防火牆問題 大多數人在第一次創建 MySQL database on Azure 實例之後便開始嘗試連接。但是往往遇到的結果不是連接成功而是如 ...
  • 用 insert 添加用戶時,可能會報錯: ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value my-default.ini中有一條語句: sql_mode=NO_ENGINE_SUBSTITUTION,STRICT ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...