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实例一段时间内数据库的所 ...
随机推荐
- C_point指针
1,关于C语言中变量的访问方式,直接访问[使用变量名直接引用,操作变量进行赋值,改变变量值等操作],间接访问--指针,一种指向变量飞, 程序对变如量的读写操作,实际是对变量所在的存储空间进行写入和取出 ...
- 写下thinkphp5和thinkphp3.2的不同
只列出一些自己的直观感受 1 引入了命令行,估计来源是laravel,前阵子刚练手完laravel5.0的系统, 感觉thinkphp5的命令行和laravel的很像 2 引入了路由,来源估计也是la ...
- python3基础:字符串、文本文件
字符串: 练习1: str = "大胖三百磅不是二百磅陪着一百磅的小胖" print(str.replace("磅", "斤")) # 替换 ...
- sqoop2的安装配置
1.下载 wget http://mirror.bit.edu.cn/apache/sqoop/1.99.7/sqoop-1.99.7-bin-hadoop200.tar.gz 2.解压 tar -z ...
- leetcode118
public class Solution { public IList<IList<int>> Generate(int numRows) { var list = new ...
- 4.struts2的配置文件优先级
转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在struts2中一些配置(比如常量)可以同时在struts-default ...
- eclipse中maven多模块项目的创建、提交和检出
1.创建父项目:maven项目.创建完成后删除src目录:删除项目属性java builder中的src目录. 2.在父项目中创建maven module子项目. 3.修改pom文件,添加依赖,修改g ...
- fabric应用
安装: easy_install fabric 或 pip install fabric 验证: #python >>> import fabric 有时候我们可以直接使用命令行的 ...
- Session的常用场景
session :存储浏览器sessionID值保存在客户端,sessionID的key:data 数据存储在服务器上 会话管理,用户登录验证,权限访问控制,购物车,临时数据.
- hadoop 集群安装配置 【转】
http://www.cnblogs.com/ejiyuan/p/5557061.html 注意:要把master 上所有的配置文件(主要是配置的那四个 xxxx-site.xml 和 xxx-env ...