mongodb的多服务器配置,以前写过一篇文章,是master-slave模式的,请参考:详解mongodb 主从配置。master-slave模式,不能自动实现故障转移和恢复。所以推荐大家使用mongodb的replica set,来实现多服务器的高可用。给我的感觉是replica set好像自带了heartbeat功能,挺强大的。

一,三台服务器,1主,2从

服务器1:127.0.0.1:27017
服务器2:127.0.0.1:27018
服务器3:127.0.0.1:27019

1,创建数据库目录

1
[root@localhost ~]# mkdir /var/lib/{mongodb_2,mongodb_3}

在一台机子上面模拟,三台服务器,所以把DB目录分开了。
2,创建配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
[root@localhost ~]# cat /etc/mongodb.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}' //主服务器配置
port = 27017  //监听端口
fork = true   //后台运行
pidfilepath = /var/run/mongodb/mongodb.pid //进程PID文件
logpath = /var/log/mongodb/mongodb.log  //日志文件
dbpath =/var/lib/mongodb   //db存放目录
journal = true     //存储模式
nohttpinterface = true   //禁用http
directoryperdb=true    //一个数据库一个文件夹
logappend=true     //追加方式写日志
replSet=repmore     //集群名称,自定义
oplogSize=1000     //oplog大小
  
[root@localhost ~]# cat /etc/mongodb_2.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}' //从服务器
port = 27018
fork = true
pidfilepath = /var/run/mongodb/mongodb_2.pid
logpath = /var/log/mongodb/mongodb_2.log
dbpath =/var/lib/mongodb_2
journal = true
nohttpinterface = true
directoryperdb=true
logappend=true
replSet=repmore
oplogSize=1000
  
[root@localhost ~]# cat /etc/mongodb_3.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}' //从服务器
port = 27019
fork = true
pidfilepath = /var/run/mongodb/mongodb_3.pid
logpath = /var/log/mongodb/mongodb_3.log
dbpath =/var/lib/mongodb_3
journal = true
nohttpinterface = true
oplogSize = 1000
directoryperdb=true
logappend=true
replSet=repmore

在这里要注意一点,不要把认证开起来了,不然查看rs.status();时,主从服务器间,无法连接,"lastHeartbeatMessage" : "initial sync couldn't connect to 127.0.0.1:27017"

3,启动三台服务器

1
2
3
mongod -f /etc/mongodb.conf
mongod -f /etc/mongodb_2.conf
mongod -f /etc/mongodb_3.conf

注意:初次启动时,主服务器比较快的,从服务器有点慢。

二,配置并初始化replica set
1,配置replica set节点

1
> config = {_id:"repmore",members:[{_id:0,host:'127.0.0.1:27017',priority :2},{_id:1,host:'127.0.0.1:27018',priority:1},{_id:2,host:'127.0.0.1:27019',priority:1}]}

2,初始化replica set

1
2
3
4
5
> rs.initiate(config);
{
 "info" : "Config now saved locally. Should come online in about a minute.",
 "ok" : 1
}

3,查看replica set各节点状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
repmore:PRIMARY> rs.status();
{
 "set" : "repmore",
 "date" : ISODate("2013-12-16T21:01:51Z"),
 "myState" : 2,
 "syncingTo" : "127.0.0.1:27017",
 "members" : [
  {
   "_id" : 0,
   "name" : "127.0.0.1:27017",
   "health" : 1,
   "state" : 1,
   "stateStr" : "PRIMARY",
   "uptime" : 33,
   "optime" : Timestamp(1387227638, 1),
   "optimeDate" : ISODate("2013-12-16T21:00:38Z"),
   "lastHeartbeat" : ISODate("2013-12-16T21:01:50Z"),
   "lastHeartbeatRecv" : ISODate("2013-12-16T21:01:50Z"),
   "pingMs" : 0,
   "syncingTo" : "127.0.0.1:27018"
  },
  {
   "_id" : 1,
   "name" : "127.0.0.1:27018",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 1808,
   "optime" : Timestamp(1387227638, 1),
   "optimeDate" : ISODate("2013-12-16T21:00:38Z"),
   "errmsg" : "syncing to: 127.0.0.1:27017",
   "self" : true
  },
  {
   "_id" : 2,
   "name" : "127.0.0.1:27019",
   "health" : 1,
   "state" : 2,
   "stateStr" : "SECONDARY",
   "uptime" : 1806,
   "optime" : Timestamp(1387227638, 1),
   "optimeDate" : ISODate("2013-12-16T21:00:38Z"),
   "lastHeartbeat" : ISODate("2013-12-16T21:01:50Z"),
   "lastHeartbeatRecv" : ISODate("2013-12-16T21:01:51Z"),
   "pingMs" : 0,
   "lastHeartbeatMessage" : "syncing to: 127.0.0.1:27018",
   "syncingTo" : "127.0.0.1:27018"
  }
 ],
 "ok" : 1
}

在这里要注意,rs.initiate初始化也是要一定时间的,刚执行完rs.initiate,我就查看状态,从服务器的stateStr不是SECONDARY,而是stateStr" : "STARTUP2",等一会就好了。

三,replica set主,从测试
1,主服务器测试

1
2
3
4
5
6
7
repmore:PRIMARY> show dbs;
local 1.078125GB
repmore:PRIMARY> use test
switched to db test
repmore:PRIMARY> db.test.insert({'name':'tank','phone':'12345678'});
repmore:PRIMARY> db.test.find();
{ "_id" : ObjectId("52af64549d2f9e75bc57cda7"), "name" : "tank", "phone" : "12345678" }

2,从服务器测试

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost mongodb]# mongo 127.0.0.1:27018 //连接
MongoDB shell version: 2.4.6
connecting to: 127.0.0.1:27018/test
repmore:SECONDARY> show dbs;
local 1.078125GB
test 0.203125GB
repmore:SECONDARY> db.test.find();  //无权限查看
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
repmore:SECONDARY> rs.slaveOk();  //从库开启
repmore:SECONDARY> db.test.find();  //从库可看到主库刚插入的数据
{ "_id" : ObjectId("52af64549d2f9e75bc57cda7"), "name" : "tank", "phone" : "12345678" }
repmore:SECONDARY> db.test.insert({'name':'zhangying','phone':'12345678'}); //从库只读,无插入权限
not master

到这儿,我们的replica set就配置好了。

四,故障测试
前面我说过,mongodb replica set有故障转移功能,下面就模拟一下,这个过程
1,故障转移
1.1,关闭主服务器

1
2
3
4
5
6
7
8
9
10
[root@localhost mongodb]# ps aux |grep mongod //查看所有的mongod
root  16977 0.2 1.1 3153692 44464 ?  Sl 04:31 0:02 mongod -f /etc/mongodb.conf
root  17032 0.2 1.1 3128996 43640 ?  Sl 04:31 0:02 mongod -f /etc/mongodb_2.conf
root  17092 0.2 0.9 3127976 38324 ?  Sl 04:31 0:02 mongod -f /etc/mongodb_3.conf
root  20400 0.0 0.0 103248 860 pts/2 S+ 04:47 0:00 grep mongod
[root@localhost mongodb]# kill 16977 //关闭主服务器进程
[root@localhost mongodb]# ps aux |grep mongod
root  17032 0.2 1.1 3133124 43836 ?  Sl 04:31 0:02 mongod -f /etc/mongodb_2.conf
root  17092 0.2 0.9 3127976 38404 ?  Sl 04:31 0:02 mongod -f /etc/mongodb_3.conf
root  20488 0.0 0.0 103248 860 pts/2 S+ 04:47 0:00 grep mongod

1.2,在主库执行命令

1
2
repmore:PRIMARY> show dbs;
Tue Dec 17 04:48:02.392 DBClientCursor::init call() failed

1.3,从库查看状态,如下图,

replica set 故障测试
以前的从库变主库了,故障转移成功

2,故障恢复

mongod -f /etc/mongodb.conf  
启动刚被关闭的主服务器,然后在登录到主服务器,查看状态rs.status();已恢复到最原始的状态了。

mongodb replica set 配置高性能多服务器详解的更多相关文章

  1. NGINX高性能Web服务器详解(读书笔记)

    原文地址:NGINX高性能Web服务器详解(读书笔记) 作者:夏寥寥 第4章  Nginx服务器的高级配置 4.1 针对IPv4的内核7个参数的配置优化 说明:我们可以将这些内核参数的值追加到Linu ...

  2. Nginx高性能web服务器详解书中概要

    一.Nginx功能 1.Nginx服务器以其功能丰富著称于世.它既可以作为HTTP服务器,也可以作为反向代理服务器或者邮件服务器;能够快速响应静态页面(HTML)的请求;支持FastCGI.SSL.V ...

  3. 《Nginx高性能Web服务器详解》

    第1章 Nginx初探 第2章 Nginx服务器的安装部署 第3章 Nginx服务器架构初探 第4章 Nginx服务器的高级设置 第5章 Nginx服务器的Gzip压缩 第6章 Nginx服务器的Re ...

  4. nginx中configure脚本支持的常用选项,拍摄自《Nginx高性能Web服务器详解》

  5. Tomcat系列之服务器的安装与配置以及各组件详解

    Tomcat系列之服务器的安装与配置以及各组件详解 大纲 一.前言 二.安装与配置Tomcat 三.Tomcat 目录的结构 四.Tomcat 配置文件 注,本文的测试的操作系统为CentOS 6.4 ...

  6. 计算机网络: IP地址,子网掩码,默认网关,DNS服务器详解

    楔子: 以Windows系统中IP地址设置界面为参考(如图1), IP地址, 子网掩码, 默认网关 和 DNS服务器, 这些都是什么意思呢? 学习IP地址的相关知识时还会遇到网络地址,广播地址,子网等 ...

  7. robots.txt文件配置和使用方法详解

    robots.txt文件,提起这个概念,可能不少站长还很陌生:什么是robots.txt文件?robots.txt文件有什么作用?如何配置robots.txt文件?如何正确使用robots.txt文件 ...

  8. 【转载】Hadoop历史服务器详解

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:过往记忆(http://www.iteblog.com/)     原文地址: ...

  9. Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍

    Spring4.X + spring MVC + Mybatis3 零配置应用开发框架搭建详解(1) - 基本介绍 spring集成 mybatis Spring4.x零配置框架搭建 两年前一直在做后 ...

随机推荐

  1. Zen of Python(Python的19条哲学)

    The Zen of Python Beautiful is better than ugly. Explicit is better than implicit. Simple is better ...

  2. karaf中利用Bundle引入外部log4j配置文件

    环境准备: 1.在karaf_home下新建 config及logs目录 2.将mylog4j.properties拷贝到config文件夹下 查看log4j-1.2.17.jar/MANIFEST. ...

  3. 如何在Linux中使用sFTP上传或下载文件与文件夹

    如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...

  4. 视图交互--表视图(UITableView)的cell交互析略

    在表视图UITableView的cell上经常有一些交互,根据项目开发中的情况,需要对此进行一些规范.总结出了几种交互方法,这些方法在其他视图的交互上同样可以适用.用一个简单的例子来举例说明一下,其他 ...

  5. linux 设置ssh密钥登录

    一.查看服务器上是否开启了sshd服务 要确认linux是不是安装了和开启了ssh服务可以输入 netstat -an|grep 22,查看22端口是否打开,如果找开,则证明SSH服务开启了. ps ...

  6. 百科知识 ass文件如何打开

    直接拖入视频即可播放 鼠标右键 用记事本打开 也有一些软件支持比如POPSUB(也比较方便调整时间轴) 如果你是说如何加载字幕的话 用VOBSUB是最好的... ASS是视频的字幕,和视频放在同一文件 ...

  7. scala使用FunSpec进行单元测试报错

    遇到比较奇怪的问题,mvn项目中的main函数可以正常运行,但是test阶段出错,报错信息如下: Exception in thread "main" java.lang.NoCl ...

  8. SpringBoot学习之验证信息国际化

    以登录为例: 1.controller的登录方法: @RequestMapping("/SSOAuth/login") @ResponseBody public ResponseV ...

  9. 小胖学PHP总结4-----PHP的字符串操作

    1.字符串连接 字符串是通过半角句号"."来连接的.能够把两个或两个以上的字符串连接成一个字符串. 2.去除字符串首尾空格和特殊字符 PHP中提供了trim()函数去除字符串左右两 ...

  10. Spring Boot 测试时的日志级别

    1.概览 该教程中,我将向你展示:如何在测试时设置spring boot 日志级别.虽然我们可以在测试通过时忽略日志,但是如果需要诊断失败的测试,选择正确的日志级别是非常重要的. 2.日志级别的重要性 ...