==版本==

mongodb-linux-x86_64-rhel70-3.4.17.tgz

==准备==

3个节点,我这里的IP及hostname分别是:

10.11.2.52 dscn49

10.11.2.53 dscn50

10.11.2.54 dscn51

同时节点需要完成:

1、关闭防火墙

2、SSH互信

==节点规划==

dscn49:PRIMARY

dscn50:SECONDARY

dscn51:ARBITER

==安装步骤==

1、上传压缩包

使用ftp工具上传mongodb安装包并解压缩至

/home/hadmin/mongodb

2、创建文件夹

配置文件存放路径:mkdir /home/hadmin/mongodb/conf

数据文件存储目录:mkdir /home/hadmin/data/mongodb

日志文件存储路径:mkdir /home/hadmin/data/mongodb/log

3、创建MongoDB启动配置文件

配置文件:

/home/hadmin/mongodb/conf/mongo.conf

配置文件内容:

#端口号
port= #数据文件存储路径
dbpath=/home/hadmin/data/mongodb #日志文件存储路径
logpath=/home/hadmin/data/mongodb/log/mongodb.log #使用追加的方式写日志
logappend=true #以守护进程的方式启动,即在后台运行
fork=true #最大连接数
maxConns= #是否启用身份验证
auth=false #复制集名称
replSet=repl1

配置文件截图:

注意:复制名称的replSet的“S”需要大写。

4、配置Linux系统环境变量

vim /etc/profile

source /etc/profile

5、同样的配置在其他两个节点完成。

可以通过scp命令,把配置好的mongodb文件夹拷贝到其他两个节点。

scp -r /home/hadmin/mongodb dscn50:/home/hadmin

scp -r /home/hadmin/mongodb dscn51:/home/hadmin

==启动==

在dscn49上运行命令:mongod --config /home/hadmin/mongodb/conf/mongodb.conf

在dscn50上运行命令:mongod --config /home/hadmin/mongodb/conf/mongodb.conf

在dscn51上运行命令:mongod --config /home/hadmin/mongodb/conf/mongodb.conf

启动成功是可以看到如下日志:

about to fork child process, waiting until server is ready for connections.
forked process:
child process started successfully, parent exiting

可以用ps -ef  | grep mongo来查看进程ID。

好,通过上面一顿猛如虎的操作之后,MongoDB集群就启动起来了。

==初始化复制集==

启动三个节点的mongodb服务后,开始把他们初始化为副本集。

在想设置primary的节点上运行客户端mongo

复制集初始化命令:

config_repl1={_id:"repl1", members:[{_id:, host:"dscn49:27017", priority:}, {_id:, host:"dscn50:27017"}, {_id:, host:"dscn51:27017", arbiterOnly:true}]}
rs.initiate(config_repl1);

正常初始化复制集之后,可以看到

第一个节点变更为PRIMARY。

第二个节点变更为SECONDARY。

第三个节点变更为ARBITER。(仲裁几点)

==数据同步测试==

首先向PRIMRY(主节点)写入一条数据,

use qch
db.say.insert({"text":"Hello World"})

插入后可以使用db.say.find()查看一下插入结果。

进入SECONDARY(副节点)查看数据是否同步。

默认情况下SECONDARY节点不能读写,要设定slaveOK为true才可以从SECONDARY节点读取数据。

(replSet里只能有一个Primary节点,只能在Primary写数据,不能在SECONDARY写数据)

如果为设置slaveOK为true,会看到报错信息:

repl1:SECONDARY> db.say.find()
Error: error: {
"ok" : ,
"errmsg" : "not master and slaveOk=false",
"code" : ,
"codeName" : "NotMasterNoSlaveOk"
}
repl1:SECONDARY>

设置slaveOk之后,查看结果,可以看到数据已经正常同步。

==故障切换测试==

副本集还有个重要的功能就是故障切换,

如果把主节点关闭,看看副节点是否能接替主节点进行工作。

1、关闭主节点

命令:

use admin
db.shutdownServer()

2、去副节点查看状态

repl1:PRIMARY> rs.status()
{
"set" : "repl1",
"date" : ISODate("2018-09-26T03:16:42.857Z"),
"myState" : ,
"term" : NumberLong(),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -,
"heartbeatIntervalMillis" : NumberLong(),
"optimes" : {
"lastCommittedOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"appliedOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"durableOpTime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
}
},
"members" : [
{
"_id" : ,
"name" : "dscn49:27017",
"health" : ,
"state" : ,
"stateStr" : "(not reachable/healthy)",
"uptime" : ,
"optime" : {
"ts" : Timestamp(, ),
"t" : NumberLong(-)
},
"optimeDurable" : {
"ts" : Timestamp(, ),
"t" : NumberLong(-)
},
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"optimeDurableDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2018-09-26T03:16:42.484Z"),
"lastHeartbeatRecv" : ISODate("2018-09-26T03:15:32.439Z"),
"pingMs" : NumberLong(),
"lastHeartbeatMessage" : "Connection refused",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -,
"infoMessage" : "",
"configVersion" : -
},
{
"_id" : ,
"name" : "dscn50:27017",
"health" : ,
"state" : ,
"stateStr" : "PRIMARY",
"uptime" : ,
"optime" : {
"ts" : Timestamp(, ),
"t" : NumberLong()
},
"optimeDate" : ISODate("2018-09-26T03:16:33Z"),
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -,
"infoMessage" : "could not find member to sync from",
"electionTime" : Timestamp(, ),
"electionDate" : ISODate("2018-09-26T03:15:42Z"),
"configVersion" : ,
"self" : true,
"lastHeartbeatMessage" : ""
},
{
"_id" : ,
"name" : "dscn51:27017",
"health" : ,
"state" : ,
"stateStr" : "ARBITER",
"uptime" : ,
"lastHeartbeat" : ISODate("2018-09-26T03:16:42.465Z"),
"lastHeartbeatRecv" : ISODate("2018-09-26T03:16:40.992Z"),
"pingMs" : NumberLong(),
"lastHeartbeatMessage" : "",
"syncingTo" : "",
"syncSourceHost" : "",
"syncSourceId" : -,
"infoMessage" : "",
"configVersion" :
}
],
"ok" :
}
repl1:PRIMARY>

可以看到

dscn49变为:not reachable/healthy

dscn50变为:PRIMARY

==Java程序连接MongoDB副本集测试==

程序如下:

Github路径:https://github.com/quchunhui/tod-train-1.0/blob/master/mongodb/src/main/java/examples/TextMongoDBReplSet.java

public class TextMongoDBReplSet {
public static void main(String[] args) {
List<ServerAddress> addresses = new ArrayList<>();
ServerAddress address1 = new ServerAddress("10.11.2.52", 27017);
ServerAddress address2 = new ServerAddress("10.11.2.53", 27017);
ServerAddress address3 = new ServerAddress("10.11.2.54", 27017);
addresses.add(address1);
addresses.add(address2);
addresses.add(address3); MongoClient client = new MongoClient(addresses);
MongoDatabase db = client.getDatabase("qch");
MongoCollection<Document> coll = db.getCollection("say"); Document doc = new Document();
doc.append("morning", "Good Morning");
coll.insertOne(doc); FindIterable<Document> fi = coll.find();
for (Document rs : fi) {
System.out.println(rs.toString());
}
}
}

运行代码,可以看到如下运行结果

进入数据库,查看插入结果,也可以看到正常插入。

==可能遇到的问题==

1、Connection refused

在初始化集群的时候,可能出现Connection refused的拒绝访问的错误,如下图:

解决办法

在配置文件中增加bind_ip=0.0.0.0

bind_ip标识允许连接的客户端IP地址,此处设为0.0.0.0,表示允许所有机器连接。也可设置特定机器的IP。

--END--

MongoDB复制集搭建(3.4.17版)的更多相关文章

  1. mongodb复制集搭建

    注:mongodb当前版本是3.4.3 1.准备三个虚拟机做服务器 192.168.168.129:27017 192.168.168.130:27017 192.168.168.131:27017 ...

  2. MongoDB之 复制集搭建

    MongoDB复制集搭建步骤,本次搭建使用3台机器,一个是主节点,一个是从节点,一个是仲裁者. 主节点负责与前台客户端进行数据读写交互,从节点只负责容灾,构建高可用,冗余备份.仲裁者的作用是当主节点宕 ...

  3. MongoDB复制集原理、环境配置及基本测试详解

    一.MongoDB复制集概述 MongoDB复制集实现了冗余备份和故障转移两大功能,这样能保证数据库的高可用性.在生产环境,复制集至少包括三个节点,其中一个必须为主节点,一个从节点,一个仲裁节点.其中 ...

  4. MongoDB学习4:MongoDB复制集机制和原理,搭建复制集

    1.复制集的作用   1.1 MongoDB复制集的主要意义在于实现服务高可用   1.2 它的实现依赖于两个方面的功能:    · 数据写入时将数据迅速复制到另一个独立节点上    · 在接收写入的 ...

  5. MongoDB 复制集节点增加移除及节点属性配置

    复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...

  6. 02 . MongoDB复制集,分片集,备份与恢复

    复制集 MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种)) 如果发生主 ...

  7. Raft与MongoDB复制集协议比较

    在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...

  8. MongoDB复制集技术

    复制集搭建 没毛病: https://www.cnblogs.com/nicolegxt/p/6841442.html?utm_source=itdadao&utm_medium=referr ...

  9. MongoDB复制集的工作原理介绍(二)

    复制集工作原理 1)数据复制原理 开启复制集后,主节点会在 local 库下生成一个集合叫 oplog.rs,这是一个有限集合,也就是大小是固定的.其中记录的是整个mongod实例一段时间内数据库的所 ...

随机推荐

  1. zabbix监控windows磁盘空间

    监控windows磁盘空间,不是百分比. 当windows系统添加相应的windows模板后,会自动生成检测系统空间的监控项,在应用集(Filessystem)里面,Free disk space o ...

  2. 36. CentOS-6.3安装Mysql集群

    安装要求 安装环境:CentOS-6.3安装方式:源码编译安装 软件名称:mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz下载地址:http://mysql ...

  3. .NET Framework 官方下载地址

    .net framwork 官方下载地址 3.5 https://www.microsoft.com/zh-cn/download/details.aspx?id=25150 .NET Framewo ...

  4. MDAC 重新安装

    MDAC 重新安装 c:\windows\inf 下找出mdac.inf 然后点右键->安装

  5. app.$mount("#app") 手动挂载

    $mount()手动挂载 当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中: 假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载.例如: new Vue({ //el: ...

  6. jstl fmt

    1)导入jstl 包,加载ftm标签 首先将jstl的jar包放入类库中,使用1.2版本 其次在jsp文件中引入所需要的 标记库,对于 ftm 标签,如下: <%@ taglib prefix= ...

  7. virtual abstract override new 几点学习

    1.Vitual方法和普通方法区别为:继承其的子类可以用override/new在重载此方法,也可以不重载其方法,有方法体(可以写语句),override修饰则调用子类方法2.abstract类中抽象 ...

  8. js中对话框的使用

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. html资源 链接

    http://m.aicai.com/index.do?agentId=1&vt=5

  10. Week4-作业1:阅读笔记与思考

    我在这三天时间里阅读了<构建之法>的第四章和第十七章,产生了一些疑问和深层次的思考. 第四章 问题1: 书中第68页提到“注释(包括所有源代码)应该只用ASCII字符,不要用中文或其他特殊 ...