MongoDB复制集搭建(3.4.17版)
==版本==
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副本集测试==
程序如下:
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版)的更多相关文章
- mongodb复制集搭建
注:mongodb当前版本是3.4.3 1.准备三个虚拟机做服务器 192.168.168.129:27017 192.168.168.130:27017 192.168.168.131:27017 ...
- MongoDB之 复制集搭建
MongoDB复制集搭建步骤,本次搭建使用3台机器,一个是主节点,一个是从节点,一个是仲裁者. 主节点负责与前台客户端进行数据读写交互,从节点只负责容灾,构建高可用,冗余备份.仲裁者的作用是当主节点宕 ...
- MongoDB复制集原理、环境配置及基本测试详解
一.MongoDB复制集概述 MongoDB复制集实现了冗余备份和故障转移两大功能,这样能保证数据库的高可用性.在生产环境,复制集至少包括三个节点,其中一个必须为主节点,一个从节点,一个仲裁节点.其中 ...
- MongoDB学习4:MongoDB复制集机制和原理,搭建复制集
1.复制集的作用 1.1 MongoDB复制集的主要意义在于实现服务高可用 1.2 它的实现依赖于两个方面的功能: · 数据写入时将数据迅速复制到另一个独立节点上 · 在接收写入的 ...
- MongoDB 复制集节点增加移除及节点属性配置
复制集(replica Set)或者副本集是MongoDB的核心高可用特性之一,它基于主节点的oplog日志持续传送到辅助节点,并重放得以实现主从节点一致.再结合心跳机制,当感知到主节点不可访问或宕机 ...
- 02 . MongoDB复制集,分片集,备份与恢复
复制集 MongoDB复制集RS(ReplicationSet): 基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB)Paxos(mysql MGR 用的是变种)) 如果发生主 ...
- Raft与MongoDB复制集协议比较
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
- MongoDB复制集技术
复制集搭建 没毛病: https://www.cnblogs.com/nicolegxt/p/6841442.html?utm_source=itdadao&utm_medium=referr ...
- MongoDB复制集的工作原理介绍(二)
复制集工作原理 1)数据复制原理 开启复制集后,主节点会在 local 库下生成一个集合叫 oplog.rs,这是一个有限集合,也就是大小是固定的.其中记录的是整个mongod实例一段时间内数据库的所 ...
随机推荐
- zabbix监控windows磁盘空间
监控windows磁盘空间,不是百分比. 当windows系统添加相应的windows模板后,会自动生成检测系统空间的监控项,在应用集(Filessystem)里面,Free disk space o ...
- 36. CentOS-6.3安装Mysql集群
安装要求 安装环境:CentOS-6.3安装方式:源码编译安装 软件名称:mysql-cluster-gpl-7.2.6-linux2.6-x86_64.tar.gz下载地址:http://mysql ...
- .NET Framework 官方下载地址
.net framwork 官方下载地址 3.5 https://www.microsoft.com/zh-cn/download/details.aspx?id=25150 .NET Framewo ...
- MDAC 重新安装
MDAC 重新安装 c:\windows\inf 下找出mdac.inf 然后点右键->安装
- app.$mount("#app") 手动挂载
$mount()手动挂载 当Vue实例没有el属性时,则该实例尚没有挂载到某个dom中: 假如需要延迟挂载,可以在之后手动调用vm.$mount()方法来挂载.例如: new Vue({ //el: ...
- jstl fmt
1)导入jstl 包,加载ftm标签 首先将jstl的jar包放入类库中,使用1.2版本 其次在jsp文件中引入所需要的 标记库,对于 ftm 标签,如下: <%@ taglib prefix= ...
- virtual abstract override new 几点学习
1.Vitual方法和普通方法区别为:继承其的子类可以用override/new在重载此方法,也可以不重载其方法,有方法体(可以写语句),override修饰则调用子类方法2.abstract类中抽象 ...
- js中对话框的使用
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- html资源 链接
http://m.aicai.com/index.do?agentId=1&vt=5
- Week4-作业1:阅读笔记与思考
我在这三天时间里阅读了<构建之法>的第四章和第十七章,产生了一些疑问和深层次的思考. 第四章 问题1: 书中第68页提到“注释(包括所有源代码)应该只用ASCII字符,不要用中文或其他特殊 ...