转载地址:http://www.cnblogs.com/huangxincheng/p/4870557.html

replicattion set 就是多台服务器维护相同的数据副本,提高服务器的可用性.和主从复制不同的是如果主服务器挂掉了,会自动推选出新的主服务器

Replication set 设置全过程

做双机热备,跟传统的关系型数据库的双机热备模式一样,一个主服务器,一个备份服务器,

一个仲裁服务器。如果热备集群中的主服务器宕掉,会有仲裁服务器参与投票来选出一台作为主服务器,我想这个大家都比较清楚,下面我们来

实战一下,最后会奉献源代码。

一:搭建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。

  1 namespace DataMipCRM.Common
2 {
3 public class MongoDBHelper<T>
4 {
5 private static readonly string connectionString = ConfigurationManager.AppSettings["mongodbServerList"];
6
7 static MongoClientSettings setting = null;
8 MongoServer server = null;
9
10 public string tableName = "person";
11
12 public string databaseName = "test";
13
14 static MongoDBHelper()
15 {
16 var ips = connectionString.Split(';');
17
18 var servicesList = new List<MongoServerAddress>();
19
20 foreach (var ip in ips)
21 {
22 var host = ip.Split(':')[0];
23 var port = Convert.ToInt32(ip.Split(':')[1]);
24
25 servicesList.Add(new MongoServerAddress(host, port));
26 }
27
28 setting = new MongoClientSettings();
29 setting.ReplicaSetName = "datamip";
30
31 //集群中的服务器列表
32 setting.Servers = servicesList;
33 }
34
35 public MongoDBHelper(string databaseName, string tableName)
36 {
37 this.databaseName = databaseName;
38 this.tableName = tableName;
39
40 server = new MongoClient(setting).GetServer();
41 }
42
43 public bool Remove(Expression<Func<T, bool>> func)
44 {
45 try
46 {
47 var database = server.GetDatabase(databaseName);
48
49 var collection = database.GetCollection<T>(tableName);
50
51 var query = Query<T>.Where(func);
52
53 var result = collection.Remove(query);
54
55 return result.Response["ok"].AsInt32 > 0 ? true : false;
56 }
57 catch (Exception ex)
58 {
59 return false;
60 }
61 }
62
63 public bool RemoveAll()
64 {
65 try
66 {
67 var database = server.GetDatabase(databaseName); //mongodb中的数据库
68
69 var collection = database.GetCollection<T>(tableName);
70
71 var result = collection.RemoveAll();
72
73 return result.Response["ok"].AsInt32 > 0 ? true : false;
74 }
75 catch (Exception ex)
76 {
77 return false;
78 }
79 }
80
81 #region 单条插入
82 /// <summary>
83 /// 单条插入
84 /// </summary>
85 /// <typeparam name="T"></typeparam>
86 /// <param name="t"></param>
87 public bool Insert(T t)
88 {
89 try
90 {
91 var database = server.GetDatabase(databaseName); //mongodb中的数据库
92
93 var collection = database.GetCollection<T>(tableName);
94
95 var result = collection.Insert(t);
96 return result.DocumentsAffected > 0;
97 }
98 catch (Exception ex)
99 {
100 return false;
101 }
102 }
103 #endregion
104
105 #region 单条覆盖,如果不存在插入,如果存在覆盖
106 /// <summary>
107 /// 单条覆盖,如果不存在插入,如果存在覆盖
108 /// </summary>
109 /// <typeparam name="T"></typeparam>
110 /// <param name="t"></param>
111 public bool Save(T t)
112 {
113 try
114 {
115 var database = server.GetDatabase(databaseName); //mongodb中的数据库
116
117 var collection = database.GetCollection<T>(tableName);
118 var result = collection.Save(t);
119 return result.DocumentsAffected > 0;
120 }
121 catch (Exception ex)
122 {
123 return false;
124 }
125 }
126 #endregion
127
128 #region 批量插入
129 /// <summary>
130 /// 批量插入
131 /// </summary>
132 /// <typeparam name="T"></typeparam>
133 /// <param name="t"></param>
134 public bool Insert(IEnumerable<T> t)
135 {
136 try
137 {
138 var database = server.GetDatabase(databaseName); //mongodb中的数据库
139
140 var collection = database.GetCollection<T>(tableName);
141
142 collection.InsertBatch(t);
143
144 return true;
145 }
146 catch (Exception ex)
147 {
148 return false;
149 }
150 }
151 #endregion
152
153 #region 批量查询
154
155 public List<T> Search(Expression<Func<T, bool>> func, bool forcemaster = false)
156 {
157 var list = new List<T>();
158
159 try
160 {
161 //是否强制使用 “主服务器”
162 if (forcemaster)
163 {
164 var database = server.GetDatabase(databaseName); //mongodb中的数据库
165
166 var collection = database.GetCollection<T>(tableName);
167 list = collection.Find(Query<T>.Where(func)).ToList();
168 }
169 else
170 {
171 var database = server.GetDatabase(databaseName); //mongodb中的数据库
172
173 var collection = database.GetCollection<T>(tableName);
174
175 list = collection.Find(Query<T>.Where(func)).ToList();
176 }
177 }
178 catch (Exception ex)
179 {
180 throw;
181 }
182
183 return list;
184 }
185
186 #endregion
187
188 #region 单条查询
189 /// <summary>
190 /// 单条查询
191 /// </summary>
192 public T SearchOne(Expression<Func<T, bool>> func, bool forcemaster = false)
193 {
194 T t = default(T);
195
196 try
197 {
198 if (forcemaster)
199 {
200 var database = server.GetDatabase(databaseName); //mongodb中的数据库
201
202 var collection = database.GetCollection<T>(tableName);
203
204 t = collection.FindOne(Query<T>.Where(func));
205 }
206 else
207 {
208 var database = server.GetDatabase(databaseName); //mongodb中的数据库
209
210 var collection = database.GetCollection<T>(tableName);
211
212 t = collection.FindOne(Query<T>.Where(func));
213 }
214
215 return t;
216 }
217 catch (Exception ex)
218 {
219 return t;
220 }
221 }
222 #endregion
223
224 /// <summary>
225 /// 查询所有数据
226 /// </summary>
227 /// <returns></returns>
228 public List<T> SearchAll()
229 {
230 var list = new List<T>();
231
232 try
233 {
234 var database = server.GetDatabase(databaseName); //mongodb中的数据库
235
236 var collection = database.GetCollection<T>(tableName);
237
238 list = collection.FindAll().ToList();
239
240 return list;
241 }
242 catch (Exception ex)
243 {
244 return list;
245 }
246 }
247 }
248 }

四:测试一下

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 replication set副本集(主从复制)(8)(转)的更多相关文章

  1. 【六】MongoDB管理之副本集

    一.复制介绍 所谓的复制就是在多个主机之间同步数据的过程. 1.数据冗余及可用性 复制技术提供数据冗余及可用性,在不同的数据库服务器上使用多个数据副本,复制技术防止单个数据库服务器出现数据故障而出现数 ...

  2. MongoDB 复制(副本集)学习

    MongoDB 复制(副本集)学习 replication set复制集,复制集,多台服务器维护相同的数据副本,提高服务器的可用性.MongoDB复制是将数据同步在多个服务器的过程.复制提供了数据的冗 ...

  3. mongodb中的副本集搭建实践

    准备运行1个主节点,2个从节点,从节点中其中是一个是仲裁节点(Arb). --oplogSize --oplogSize --oplogSize 其中application是副本集的名称,节点必须相同 ...

  4. MongoDB 安装及副本集简单操作

    安装MongoDB 3.4 # 查看现有yum源 [root@localhost ~]# ll /etc/yum.repos.d/ total 36 -rw-r--r--. 1 root root 1 ...

  5. Percona MongoDB 4 搭建副本集

    什么是副本集: 是一组维护相同数据集的mongod进程 提供冗余,自动故障转移和高可用性 提供读取可伸缩性 内部概念或多或少与MySQL的概念相似 PRIMARY概念与MySQL复制中的MASTER大 ...

  6. mongodb 4.0副本集搭建

    近期有同学问mongodb副本集难不难部署,我的回答是不难,很快,几分钟搞定,比mysql MHA简单的不止一点半点. 那么到底如何部署呢?请看下文. 1.  准备工作 1.1 下载软件 选择版本并下 ...

  7. 2.MongoDB 4.2副本集环境基于时间点的恢复

    (一)MongoDB恢复概述 对于任何数据库,如果要将数据库恢复到过去的任意时间点,否需要有过去某个时间点的全备+全备之后的重做日志. 接下来根据瑞丽航空的情况进行概述: 全备:每天晚上都会进行备份: ...

  8. Mongodb 笔记06 副本集的组成、从应用程序连接副本集、管理

    副本集的组成 1. 同步:MongoDB的复制功能是使用操作日志oplog实现的,操作日志包含了主节点的每一次写操作.oplog是主节点的local数据库中的一个固定集合.备份节点通过查询整个集合就可 ...

  9. mongodb replica set(副本集)设置步骤

    网上已经有一大堆的设置步骤的了,根据我遇到的问题,整理一下,如下: 首先先去下载一个mongodb最新版,目前最新版应该是2.6 cd /usr/local/bin wget http://fastd ...

随机推荐

  1. 如何让tableViewCell的分割线从边框顶端开始

    在ios8上 [TableView setSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];不起作用 经过测试加入下面方法 在ios7 8上都可以正常工作 -(voi ...

  2. 解决:Linux版百度云客户端 BCloud网络错误 问题

    国内很多云盘渐渐停止服务支持,如新浪.华为.115.360等... 强大的百度云,你会继续免费让大家使用吗? 今天在Linux上使用了liulang的BCloud百度云客户端,登陆之后不显示主页,什么 ...

  3. 给td添加滚动条

    <td><div style="overflow-y:scroll;height:330px;">test</div></td>

  4. MongoDB Node.js driver

    Node.js连接MongoDB的简单实例 安装Node.js driver npm install mongodb -save 连接 var MongodbClient = require('mon ...

  5. 5 构建Mysql+heartbeat+DRBD+LVS集群应用系统系列之生产环境下drbd裂脑处理

    preface 公司的业务变更,导致服务器要搬迁,所以需要关闭服务器,然后到新地在开启服务器. 关机前确定drbd+heartbeat+mysql是正常使用的,没有异常,Heartbeat和drbd都 ...

  6. MlLib--逻辑回归笔记

    批量梯度下降的逻辑回归可以参考这篇文章:http://blog.csdn.net/pakko/article/details/37878837 看了一些Scala语法后,打算看看MlLib的机器学习算 ...

  7. java -日期处理

    1. 计算某年某月份 总有多少个周,每周的开始和结束时间? 思路:1.计算出本月实际的总天数 2.循环每一天,判断这天是否是 周日(1),如果是,周数加1,再次判断是否是月的第一个周一,如是,开始时间 ...

  8. Win7普通版-X86-SP1-ios-旗舰版安装

    ------------------------------- 自己的电脑是X64Win7系统.Acer电脑----->>现在改装成  Win7普通版-X86-SP1-ios-旗舰版安装 ...

  9. Yii2.0 用户登录详解(上)

    一.准备 在开始编写代码之前,我们需要思考一下:用户登陆模块,实现的是什么功能?很明显,是登陆功能,那么,登陆需要用户名和密码,我们在数据库的一张表中就应该准备好用户名和密码的字段,再思考一下,如果要 ...

  10. matlab 有趣小细节

    图像的默认显示方式,坐标从1开始计数.是从左向右,从上到下为正,分别为x和y轴          如果加入x轴和y轴画成成的格子,起始位置并不是严格的左上角,而是像素的中心点,并不是以像素的边缘画格子 ...