一、搭建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连接配置

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

测试CS代码

以下是测试代码:

 /*****************************************************************************************************
* 本代码版权归@wenli所有,All Rights Reserved (C) 2015-2017
*****************************************************************************************************
* CLR版本:4.0.30319.42000
* 唯一标识:63fcdf18-8930-4a86-93ca-f99f5a020844
* 机器名称:WENLI-PC
* 联系人邮箱:wenguoli_520@qq.com
*****************************************************************************************************
* 项目名称:$projectname$
* 命名空间:MongoDBOperator.Test
* 类名称:Program
* 创建时间:2017/7/13 16:00:44
* 创建人:wenli
* 创建说明:
*****************************************************************************************************/ using System;
using System.Linq;
using System.Threading.Tasks;
using MongoDBOperator.Interface;
using MongoDBOperator.Test.Model; namespace MongoDBOperator.Test
{
class Program
{
static void Main(string[] args)
{
Console.Title = "MongoDBOperator.Test"; IOperator<Account> customerOperator = new MongoOperator<Account>(); var account = new Account();
account.FirstName = "li";
account.LastName = "wen";
account.Phone = "";
account.Email = "wenguoli_520@qq.com";
account.HomeAddress = new Address
{
Address1 = "上海",
Address2 = "徐汇",
PostCode = "",
City = "上海",
Country = "中国"
}; Console.WriteLine("Create"); customerOperator.Add(account); Console.WriteLine("Read"); var c = customerOperator.Where(b => b.FirstName == "li").FirstOrDefault(); Console.WriteLine("Update"); c.FirstName = "guo li"; customerOperator.Update(c); Console.WriteLine("Delete"); customerOperator.Delete(c); customerOperator.DeleteAll(); Console.ReadLine(); }
}
}

vs调试效果如下:

转载请标明本文来源:http://www.cnblogs.com/yswenli/p/7421909.html 
更多内容欢迎star作者的github:https://github.com/yswenli/MongoDBOperator
如果发现本文有什么问题和任何建议,也随时欢迎交流~

C# MongoDB的更多相关文章

  1. 【翻译】MongoDB指南/聚合——聚合管道

    [原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...

  2. 【翻译】MongoDB指南/CRUD操作(四)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...

  3. 【翻译】MongoDB指南/CRUD操作(三)

    [原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...

  4. 【翻译】MongoDB指南/CRUD操作(二)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...

  5. 【翻译】MongoDB指南/CRUD操作(一)

    [原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(一) 主要内容:CRUD操作简介,插入文档,查询文档. CRUD操作包括创建.读取.更新和删 ...

  6. CRL快速开发框架系列教程十二(MongoDB支持)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  7. MongoDB系列(二):C#应用

    前言 上一篇文章<MongoDB系列(一):简介及安装>已经介绍了MongoDB以及其在window环境下的安装,这篇文章主要讲讲如何用C#来与MongoDB进行通讯.再次强调一下,我使用 ...

  8. MongoDB系列(一):简介及安装

    什么是MongoDB MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为应用提供可扩展的高 ...

  9. [原]分享一下我和MongoDB与Redis那些事

    缘起:来自于我在近期一个项目上遇到的问题,在Segmentfault上发表了提问 知识背景: 对不是很熟悉MongoDB和Redis的同学做一下介绍. 1.MongoDB数组查询:MongoDB自带L ...

  10. 用MongoDB分析合肥餐饮业

    看了<从数据角度解析福州美食>后难免心痒,动了要分析合肥餐饮业的念头,因此特地写了Node.js爬虫爬取了合肥的大众点评数据.分析数据库我并没有采用MySQL而是用的MongoDB,是因为 ...

随机推荐

  1. select模型

    在Windows中所有的socket函数都是阻塞类型的,也就是说只有网络中有特定的事件发生时才会返回,在没有发生事件时会一直等待,虽说我们将它们设置为非阻塞状态,但是在对于服务器段而言,肯定会一直等待 ...

  2. PE文件详解(四)

    本文转自小甲鱼的PE文件详解系列原文传送门 到此为止,小甲鱼和大家已经学了许多关于 DOS header 和 PE header 的知识.接下来就该轮到SectionTable (区块表,也成节表). ...

  3. VFS四大对象之三 struct dentry

    继上一篇文章介绍了inode结构体:继续介绍目录项dentry: http://www.cnblogs.com/linhaostudy/p/7427794.html 三.dentry结构体 目录项:目 ...

  4. 江西理工大学南昌校区cool code竞赛

    这次比赛原本就是来打酱油的,想做个签到题就走!一开始不知道1002是签到题,一直死磕1001,WA了四发过了,回头一看Rank,三十名,我靠!看了1001的AC率,在我AC之前只有一个人AC了,当时我 ...

  5. [51nod1474]宝藏图

    有n堆宝藏,每一堆宝藏有一个挖掘所需要的时间ti,有一个价值qi. 现在是做一个宝藏图.这个宝藏图是这样的,宝藏图的形状是一棵二叉树,二叉树刚好有k个叶子结点,从n堆宝藏中选k堆放到二叉树的叶子结点上 ...

  6. [国嵌攻略][059][2440-DMA程序设计]

    初始化DMA控制器 1.设置源地址 DISRC(0x4B000000)设置为发送数据的源地址,DISRCC0(0x4B0000004)设置为内存AHB总线,目的地址增长 2.设置目的地址 DIDST0 ...

  7. 使用nginx处理静态资源请求,其余交给node

    由于项目后台使用的是node,然而node不适合对静态资源的处理,因为他的异步处理(事件轮询)机制,所以更擅长的是密集I/O型的应用,所以我就有了一个想法,使用nginx来做反向代理,当请求的是静态资 ...

  8. phpmyadmin 自动登录的办法

    在本地开发php项目中,需要配合使用mysql在线管理系统phpmyadmin,因为经常使用,就不想每次都输入密码,所以想办法把用户名密码写入配置文件中,让每次都可以自动登录. 工具/原料   代码编 ...

  9. LNMP环境的搭建

    http://blog.csdn.net/wzy_1988/article/details/8438355#

  10. YUM常用命令介绍

    http://www.cnblogs.com/lostyue/archive/2012/05/06/2485653.html 1.列出所有可更新的软件清单 命令:yum check-update 2. ...