您的位置:首页 > 数据库 > Mongodb

别让你的mongodb宕机了

2016-06-24 09:01 423 查看
接下来就要面临双十一这场惊心动魄的处女秀考验,
我们项目中会有一个wcf集群,而集群地址则放在mongodb中,所以mongodb的核心地位可想而知,如果mongodb挂掉,整个项目也就陷入
瘫痪,想让mongodb不宕机,最简单的方法就是要做双机热备,跟传统的关系型数据库的双机热备模式一样,一个主服务器,一个备份服务器,
一个仲裁服务器。如果热备集群中的主服务器宕掉,会有仲裁服务器参与投票来选出一台作为主服务器,我想这个大家都比较清楚,下面我们来
实战一下,最后会奉献源代码。
 
一:搭建mongodb热备集群
1. 准备工作
  为了做到最简化搭建,我就做一个主,一个备,一个仲裁就好了,然后最简化配置信息都放在mongodb.conf文件中,如下图:



 
从上图中可以看到,三个mongodb,我建立了对应的三个文件夹来存放对应的三个db,其中“主服务器”的端口为27000,“备服务器“的端口为
27001,”仲裁服务器“端口为27002。 具体mongodb.conf内容如下:







 
2. 开启 “主服务器” 【27000】
  


 
3.  开启 “备服务器” 【27001】



 
4.  开启 “仲裁服务器” 【27002】



 
现在三台服务器都开启起来了,细心的你会发现,三个控制台都有这么一段英文单词” replSet info you may need to run replSetInitiate“。。。
既然都这么说了,我现在就去run这个func。



 
配置完了之后,然后我们把“仲裁服务器【27002】”加入到“datamip”这个双机热备分集群中。



 
好了,现在大致配置好了,接下来我们用rs.Status()来查看下当前“主,备,仲裁”的分布情况。



 
从图中你应该看到了【27000】成为了主服务器,【27001】成为了备服务器,【27002】成为了仲裁服务器,到目前为止,搭建完成,是不是有
一个很爽的感觉呢???
 
三:使用驱动
  既然mongodb的双机热备已经做好了,我们驱动也必须支持,这样我们才能够嗨,对伐???其实在配置中使用也很简单,里面有一个
MongoClientSettings,你需要配置一下”ReplicaSetName“和”Servers“列表即可,核心代码如下:

1         static MongoDBHelper()
2         {
3             var ips = connectionString.Split(';');
4
5             var servicesList = new List<MongoServerAddress>();
6
7             foreach (var ip in ips)
8             {
9                 var host = ip.Split(':')[0];
10                 var port = Convert.ToInt32(ip.Split(':')[1]);
11
12                 servicesList.Add(new MongoServerAddress(host, port));
13             }
14
15             setting = new MongoClientSettings();
16             setting.ReplicaSetName = "datamip";
17
18             //集群中的服务器列表
19             setting.Servers = servicesList;
20         }


 
其中ips的信息是配置在app.config中。

<appSettings>
<add key="mongodbServerList" value="127.0.0.1:27000;127.0.0.1:27001;127.0.0.1:27002"/>
</appSettings>


 
然后我简单的封装了下mongodb。


 View
Code
 
四:测试一下
1. 首先向mongodb中插入一条记录,dbname=mydb, tablename=test,插入后我们用mongodUVE看一下数据:

1 namespace ConsoleApplication2
2 {
3     class Program
4     {
5         static void Main(string[] args)
6         {
7             MongoDBHelper<MongodbCustomerModel> helper = new MongoDBHelper<MongodbCustomerModel>("mydb", "test");
8
9             helper.Save(new MongodbCustomerModel()
10             {
11                 SendLastTime = DateTime.Now,
12                 ShopID = 1
13             });
14         }
15     }
16
17     public class MongodbCustomerModel
18     {
19         public ObjectId _id { get; set; }
20
21         public int ShopID { get; set; }
22
23         public DateTime SendLastTime { get; set; }
24     }
25 }




 
2. 然后我把【27000】 这个primary关闭掉,通过rs.Status看看“主备情况”。



 
3. 接下来,我们继续用mongodbHelper执行一下search,看是否能捞取到数据,如果可以,说明一台机器挂了没关系,这个“主备集群”还是活的。



 
是不是很牛逼的感觉,虽然挂了一台,我的客户端程序还是可以继续从mognodb中获取到刚才插入的数据,好了,大概就说这么多,洗洗睡了,
 
最后祝顶着双十一压力的兄弟们,一路平安。
 
--文件下载--

分类: MongoDB

好文要顶 关注我 收藏该文 

 






一线码农
关注 - 56
粉丝 - 6487

荣誉:推荐博客
+加关注

52

0

关注我

« 上一篇:十五天精通WCF——终结篇
那些你需要注意的坑
» 下一篇:15天玩转redis
—— 第一篇 开始入手

posted @ 2015-10-12 00:46 一线码农 阅读(8214)
评论(38) 编辑 收藏

评论列表

  
#1楼2015-10-12
02:17 Lumia1020  

牛逼 先顶一下
支持(0)反对(0)

  
#2楼2015-10-12
07:03 愤怒的TryCatch  

我这方面的知识是空白,楼主的信息量震惊了我。~
支持(0)反对(0)

  
#3楼2015-10-12
08:30 陆仁甲乙丙丁  

其实我最想问的是!VS中的背景图片是怎么加的?
支持(0)反对(0)

  
#4楼2015-10-12
08:47 博大无穷  

配置那一段的代码都是写在命令提示符里面的吗
支持(0)反对(0)

  
#5楼2015-10-12
08:55 wy123  

顶楼主,主服务器宕机之后,副本成为primary的时间要多久,中间有没有连的丢失,可就是这种集群在主节点提交的数据局多就可以提交到副本?
支持(1)反对(0)

  
#6楼2015-10-12
09:13 lichmama  

跟redis的哨兵机制(sentinel)有点像,而且redis的master如果从故障中恢复的话还能再次成为primary,不知道mongodb是不是这样。另外,还想问下已经挂掉的master如果重新启动了会自行同步数据吗?
支持(0)反对(0)

  
#7楼2015-10-12
09:49 Poiuyt_cyc  

这个是好东西。。

大概2年半以前就开始玩MONGODB了。那时资料太少,mongo c# driver还是1.8。update方法经常抽风,有时执行了会更新数据,有时抽风了就不更新数据,也不报错。看来现在都成熟多了。

这个正是我想要的。
支持(0)反对(0)

  
#8楼2015-10-12
10:13 DNMCM  

两年半,华为研发,可否应聘?
支持(0)反对(0)

  
#9楼[楼主] 2015-10-12
10:57 一线码农  

@ DNMCM

可以试一试
支持(0)反对(0)

  
#10楼[楼主] 2015-10-12
10:58 一线码农  

@ lichmama

重启了会同步数据的,并且会成为备服务器
支持(0)反对(0)

  
#11楼2015-10-12
11:39 杜少.  

楼主说的水果机可是黑莓???
支持(0)反对(0)

  
#12楼2015-10-12
11:47 leerh  

好文章,接地气的表达,通俗易懂
支持(0)反对(0)

  
#13楼2015-10-12
11:54 落幕残情  

如果是高并发的情况,MOGODB 主从备份 主机挂掉貌似 会有一段时间 

查询执行失败吧。。。
支持(0)反对(0)

  
#14楼[楼主] 2015-10-12
13:43 一线码农  

@ 杜少.

不是不是,统一apple。
支持(0)反对(0)

  
#15楼[楼主] 2015-10-12
13:48 一线码农  

@ 落幕残情

这个到不清楚,虽然某一台机器挂了,但是从属这台机器的集群是活的,应该会有一段时间的阻塞来选重新选出主服务器。
支持(0)反对(0)

  
#16楼[楼主] 2015-10-12
13:48 一线码农  

@ leerh

谢谢支持
支持(0)反对(0)

  
#17楼[楼主] 2015-10-12
13:49 一线码农  

@ Poiuyt_cyc

你想要的,那也说明我的没白写~~~
支持(0)反对(0)

  
#18楼2015-10-12
13:51 落幕残情  

@ 一线码农
引用
@落幕残情

这个到不清楚,虽然某一台机器挂了,但是从属这台机器的集群是活的,应该会有一段时间的阻塞来选重新选出主服务器。

"应该会有一段时间的阻塞来选重新选出主服务器" 就是在段时间 会发生N多错误。 以前做集群的时候遇见过。 尽量做到平滑过渡。而且“仲裁服务器”我没有记错的话是 投票选举。 建议平滑过渡。。
支持(0)反对(0)

  
#19楼[楼主] 2015-10-12
13:56 一线码农  

@ 落幕残情

感谢提醒
支持(0)反对(0)

  
#20楼2015-10-12
14:59 cncyber  

上次看了携程的一个技术分享,说的是你们自己封装了一个zookeeper在用
支持(0)反对(0)

  
#21楼2015-10-12
18:07 编程玩家  

不知道楼主有没有试过延迟备份,就是在config里设置一个延迟时间(1小时,1天,1周等),然后primary有变化,会延迟同步到secondary去。

如果程序员误操作删除了primary的数据,可以从secondary取回一定程度的数据。

那么问题来了,怎么从这个secondary恢复数据,或者升级为primary。这是我之前遇到的一个未解决的问题。
支持(0)反对(0)

  
#22楼2015-10-13
13:24 YunShi  

刚开始研究MongoDB,学习一下!
支持(0)反对(0)

  
#23楼2015-10-13
17:18 沧海一笑ONLINE  

说明文档还是写的很详细的
支持(0)反对(0)

  
#24楼2015-10-13
18:02 oct  

@ 陆仁甲乙丙丁
引用
其实我最想问的是!VS中的背景图片是怎么加的?

哈哈 其实我也想要知道
支持(0)反对(0)

  
#25楼2015-10-21
10:43 壹加壹等于二  

赞,教程很详细。。。
支持(0)反对(0)

  
#26楼2015-10-22
09:29 搭讪的法则  

楼主有没有关注官方C#驱动,2.0版本之后都是异步接口,对这方面不是很明白,希望楼主有空的时候出个文章或者helper类,感谢了
支持(0)反对(0)

  
#27楼2015-11-03
17:52 小小乐  

楼主,博大精深,现在有大概的了解了,努力ing
支持(0)反对(0)

  
#28楼2015-11-16
13:32 代码的味道  

@ 陆仁甲乙丙丁
引用
其实我最想问的是!VS中的背景图片是怎么加的?

<img src="http://images2015.cnblogs.com/blog/319395/201511/319395-20151116133148780-1915452994.png" alt="" border="0" "="" style="margin: 0px; padding: 0px; border: 0px; max-width: 400px;">你说的是这种么
支持(0)反对(0)

  
#29楼2015-11-16
15:14 陆仁甲乙丙丁  

@ CodeRen

是的!求具体步骤。
支持(0)反对(0)

  
#30楼2015-11-16
18:13 代码的味道  

@ 陆仁甲乙丙丁
引用
@CodeRen

是的!求具体步骤。

我用的Kyunbackground插件
支持(0)反对(0)

  
#31楼2015-11-16
18:14 代码的味道  

@ 陆仁甲乙丙丁
引用
@CodeRen

是的!求具体步骤。

上面拼错了 KyuuBackground
支持(0)反对(0)

  
#32楼2015-11-16
21:42 陆仁甲乙丙丁  

@ CodeRen

好的!谢谢啦!!!
支持(0)反对(0)

  
#33楼2015-11-16
22:03 陆仁甲乙丙丁  

@ CodeRen

还有!您用的那张图能给我发一下吗?很带感啊!愤怒的程序员
支持(0)反对(0)

  
#34楼2015-11-18
17:35 悲惨的大爷  

这个和博主之前写的8天学通MongoDB里有篇差不多,说的都是副本集,都比较赞
支持(0)反对(0)

  
#35楼2015-12-28
11:56 jerryli_vip  

谢谢,学习了
支持(0)反对(0)

  
#36楼2016-04-29
22:48 五月℃夏到了  

厉害
支持(0)反对(0)

  
#37楼2016-06-13
16:42 无痕公子1314  

求楼主的mongo可视化工具名称
支持(0)反对(0)

  
#38楼2016-06-16
18:36 aXinNo1  

谢谢,学习了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: