转载地址: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. Dijkstra的双栈算术表达式的求值算法

    例如需要计算 ( 1 + (  ( 2 + 3 ) * ( 4 * 5 ) ) ) 我们以字符串的形式输入该表达式,利用两个栈来完成这个操作,其中一个栈保存运算符,一个栈保存操作数,过程是这样的: 表 ...

  2. mui事件绑定和可以用的js dom操作方法

    <script> //事件绑定 对象 方法 子元素 回调函数 mui('body').on('shown', '.mui-popover', function(e) { //console ...

  3. 关于Scala的一些感想(一)

    最近在完成自己的开源项目Application-center的时候,使用了Scala编程语言. 在使用了一段时间下来以后,有一些不是很"清晰"的感受,说实话我自己还没有很好的整理清 ...

  4. strlen()和sizeof()求数组长度

    在字符常量和字符串常量的博文里有提: 求字符串数组的长度 标准库函数strlen(s)可以返回字符串s的长度,在头文件<string.h>里. strlen(s)的判断长度的依据是(s[i ...

  5. Java 枚举类的基本使用

    枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示. 1.常量的使用       在JDK1.5之前,我们定义常量都是:p ...

  6. <<< Java生成Md5

    package cn.sevennight.test; import java.security.MessageDigest; public class md5{ public static Stri ...

  7. <<< jquery向id元素后面动态添加元素

    html代码: <div id="main"> <div>1</div> <div>1</div> </div&g ...

  8. NFS网络文件共享

    NFS(Network File System) NFS在企业中的应用场景 企业集群架构中,NFS网络文件系统一般用来存储共享的视频.图片.附件等静态资源,一般把网站用户上传的文件都放到NFS共享里, ...

  9. 创建你的第一个JavaScript库

    是否曾对Mootools的魔力感到惊奇?是否有想知道Dojo如何做到那样的?是否对jQuery感到好奇?在这个教程中,我们将了解它们背后的东西并且动手创建一个超级简单的你最喜欢的库. 我们其乎每天都在 ...

  10. [Scala] 快学Scala A3L3

    Actor 通过尽可能避免锁和共享状态,actor使得我们能够容易地设计出正确.没有死锁或争用状况的程序. Scala类库提供了一个actor模型的简单实现.AKKA是更高级的actor类库. 19. ...