未加星标

MongoDB 3.2.9 关于安全认证后使用C#调用碰上的相关问题

字体大小 | |
[数据库(综合) 所属分类 数据库(综合) | 发布者 店小二04 | 时间 2016 | 作者 红领巾 ] 0人收藏点击收藏

由于项目需要MongoDB做为存储数据库,在学习过程碰上疑难杂症,心痛如海,故此终于开始书写博客之路。

操作MongoDB类库版本:

----------------------------------------------

MongoDB.Driver 2.3 MongoDB.Driver.Core 2.3 MongoDB.Bson 2.3
MongoDB 版本 3.2.9
参考相关学习链接(转载):
--------------------------------------------- https://izk.cloud/437/ 安全认证,权限管理 http://www.cnblogs.com/huangxincheng/archive/2015/10/12/4870557.html 主从热备集群
http://blog.csdn.net/luonanqin/article/details/8497860 集群搭建

连接字符串的相关变化:

-----------------------------------------------

没有安全认证的URL:mongodb://127.0.0.1:27017

加上安全认证的URL:mongodb://[userName]:[userPwd]@127.0.0.1:27017/[DataBaseName]

重点变化是最后一个指定数据库,如果不指定,将为默认数据库

所以想当然测试的时候一般使用的是mongodb://[userName]:[userPwd]@127.0.0.1:27017

并没有加上自定义数据库名称,导致初始化报错。

网上参考文章带安全验证的连接都是:mongodb://[userName]:[userPwd]@127.0.0.1:27017 都没有在最后补上/[DataBaseName] 导致自定义数据库的创建失败。

主副热备集群相关代码处理上的问题:

-------------------------------------------------

感谢国庆,感谢国家,感谢这二篇博文,一直在操作主副集群C#代码碰上未知报错,通过下面链接

深度学习了一下:

双十一来了,别让你的mongodb宕机了

MongoDB副本集学习(二):基本测试与应用

虽然依然没有解决我的问题,但是从中学习到经验,值得回报。

按照上面代码(转载):


MongoClientSettings set = new MongoClientSettings();
List<MongoServerAddress> servers = new List<MongoServerAddress>();
servers.Add(new MongoServerAddress("192.168.129.129", 37017));
servers.Add(new MongoServerAddress("192.168.129.129", 37018));
servers.Add(new MongoServerAddress("192.168.129.129", 37019));
set.Servers = servers;
//设置副本集名称
set.ReplicaSetName = "rs0";
//设置超时时间为3秒
set.ConnectTimeout = new TimeSpan(0, 0, 0, 3, 0);
MongoClient client = new MongoClient(set);
MongoServer server = client.GetServer();
MongoDatabase db = server.GetDatabase("test");
MongoCollection coll = db.GetCollection("test");
//插入
BsonDocument bd = new BsonDocument();
bd.Add("name", "zhanjindong");
bd.Add("age", 23);
bd.Add("sex", "男D");
coll.Insert(bd);
//读取
QueryDocument qd = new QueryDocument();
qd.Add("name", "zhanjindong");
qd.Add("age", 23);
qd.Add("sex", "男D");
BsonDocument rd = coll.FindOneAs<BsonDocument>(qd);
Console.WriteLine(rd.ToString());
默认的C#驱动的ReadPreference是Primary,也就是说读写操作都是在主节点上的,那么当集群中只剩下一个节点的时候,按照前面所说该节点一定是secondary节点,这样读取操作也是没法进行的(通过mongo shell当然是可以的)。解决方法就是设置驱动的ReadPreferenceMode:
set.ReadPreference = new ReadPreference(ReadPreferenceMode.PrimaryPreferred);
状态说明:
primary
主节点,默认模式,读操作只在主节点,如果主节点不可用,报错或者抛出异常。
primaryPreferred
首选主节点,大多情况下读操作在主节点,如果主节点不可用,如故障转移,读操作在从节点。
secondary
从节点,读操作只在从节点, 如果从节点不可用,报错或者抛出异常。
secondaryPreferred
首选从节点,大多情况下读操作在从节点,特殊情况(如单主节点架构)读操作在主节点。
nearest
最邻近节点,读操作在最邻近的成员,可能是主节点或者从节点

你以为上面就复制粘贴一下就解决了?No,实际调用跟参考代码是二回事,呃?绕回正题,通过上面代码以为可以轻松一步了,结果又挖了一个大坑,在招待我。

报错详情:


System.TimeoutException”类型的异常在 MongoDB.Driver.Core.dll中发生,但未在用户代码中进行处理其他信息: A timeout occured after 3000ms selecting a server using CompositeServerSelector {
Selectors = ReadPreferenceServerSelector {
ReadPreference = {Mode = Secondary, TagSets = []
}
}, LatencyLimitingServerSelector {
AllowedLatencyRange = 00: 00: 00.0150000
}
}.Client view of cluster state is {
ClusterId: "1",
ConnectionMode: "ReplicaSet",
Type: "ReplicaSet",
State: "Disconnected",
Servers: [{
ServerId: "{ ClusterId : 1, EndPoint : "
Unspecified / mongodb - 10.localdomain: 27017 " }",
EndPoint: "Unspecified/mongodb-10.localdomain:27017",
State: "Disconnected",
Type: "Unknown",
HeartbeatException: "MongoDB.Driver.MongoConnectionException: An exception occurred while opening a connection to the server. ---> System.Net.Sockets.SocketException: 不知道这样的主机。

我当时就#¥#@¥@#¥,你懂的,一波三折,要命,经过大量时间排查我锁定问题位置:

EndPoint: "Unspecified/mongodb-10.localdomain:27017",
底气何来?原因如下:
MongoDB 3.2.9 关于安全认证后使用C#调用碰上的相关问题

如果你也是本地测试并且副集群IP地址使用是域名绑定,那么你在HOSTS没有配置域名的情况下,就会出现上面的超时30秒错误(一想起无数个F5等30秒就。。。。)

接下来配置HOSTS文件:


MongoDB 3.2.9 关于安全认证后使用C#调用碰上的相关问题

然后烧香拜佛,果然不出所料,调用成功,为此付出不少冤枉路,如果有人碰上相同的问题,可以参与一下。

最后放上测试单元代码:


using System;
using System.Collections.Generic;
using System.Linq;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
using System.Linq.Expressions;
public class MongoUnitily
{
/// <summary>
/// MongoDB调用类
/// </summary>
private MongoUnitily()
{
dataBase = new MongoClient(new MongoClientSettings
{Credentials = new List<MongoCredential>() { MongoCredential.CreateCredential("avatar","*******","*********") // 数据库名称,用户名,用户密码},Servers = new string[] { "10.199.*.1", "10.199.*.2", "10.199.*.3" }.Select(x => { return new MongoServerAddress(x); }), // 集群IP地址ConnectionMode = ConnectionMode.ReplicaSet, // Replica 模式ReplicaSetName = "RS01", // Replica名称ReadPreference = new ReadPreference(ReadPreferenceMode.SecondaryPreferred), // 读写配置,副IP不起作用的情况下使用主IPConnectTimeout = new TimeSpan(0, 0, 0, 3, 0), // 3秒报错测试,当初30秒我是等闲人。。。。MaxConnectionIdleTime = new TimeSpan(0, 0, 0, 3, 0), // 3秒报错测试,当初30秒我是等闲人。。。。MaxConnectionLifeTime = new TimeSpan(0, 0, 0, 3, 0), // 3秒报错测试,当初30秒我是等闲人。。。。ServerSelectionTimeout = new TimeSpan(0, 0, 0, 3, 0) // 3秒报错测试,当初30秒我是等闲人。。。。
}).GetDatabase(database); // 通过数据库名称获取 DbBase
}
static MongoUnitily()
{
//初始化单例对象
Instance = new MongoUnitily();
}
/// <summary>
/// 数据库名称
/// </summary>
private string database = "avatar";//数据库名
/// <summary>
/// dataBase上下文对象
/// </summary>
private IMongoDatabase dataBase = null;
public static MongoUnitily Instance { get; private set; }
/// <summary>
/// 验证读取
/// </summary>
/// <returns></returns>
public bool IsGet()
{
bool result = true;
var coll = dataBase.GetCollection<SysCodes>(nameof(SysCodes));
Expression<Func<SysCodes, bool>> predicate = x => true;
try
{var count = coll.Find(predicate).Count();
}
catch
{result = false;
}
return result;
}
/// <summary>
/// 验证写
/// </summary>
/// <returns></returns>
public bool IsPost()
{
var result = true;
var coll = dataBase.GetCollection<Demo>(nameof(Demo));
try
{coll.InsertOne(new Demo { Id = Guid.NewGuid(), Name = "三" });
}
catch
{result = false;
}
return result;
}
/// <summary>
/// 测试类
/// </summary>
public class Demo
{
public Guid Id { get; set; }
public string Name { get; set; }
}
}

验证结果:


MongoDB 3.2.9 关于安全认证后使用C#调用碰上的相关问题

本篇文章旨在解决使用新版本MongoDB碰上的集群、连接字符串、安全验证的相关问题,文章深度不高,提供新手对象相互学习互挽。

本文数据库(综合)相关术语:系统安全软件

分页:12
转载请注明
本文标题:MongoDB 3.2.9 关于安全认证后使用C#调用碰上的相关问题
本站链接:http://www.codesec.net/view/483395.html
分享请点击:


1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
技术大类 技术大类 | 数据库(综合) | 评论(0) | 阅读(45)