MongoDB 搭建可复制群集
一、概述
MongoDB复制群集支持节点故障自动切换,最小配置应包含3个节点,正常情况下应该至少包含两个数据节点,第三个节点可以是数据节点也可以是仲裁节点。仲裁节点的作用是当出现偶数节点导致无法仲裁的时候参与进来进行投票使之变成奇数个投票点,仲裁节点可以看成是不包含任何数据集的副本节点。仲裁节点并不需要太多系统资源,仅仅只是参与投票,可随意部署在网络通的地方不会占用什么系统资源;而数据节点保存了数据,需要占用比较大的磁盘空间、内存等硬件资源,成本比仲裁节点高很多,但是额外提供了一个数据副本,相当于更多一层保障。
版本:MongoDB3.6.2
OS:Centos6.7
节点1:192.168.137.10:27010 ;目录/mongos27010
节点2:192.168.137.10:27011;目录/mongos27011
节点3:192.168.137.10:27012;目录/mongos27012
二、搭建
基本架构如下:

1.安装Mongodb
解压
tar -xvf mongodb-linux-x86_64-rhel62-3.6.2.tgz mv mongodb-linux-x86_64-rhel62-3.6.2 mongos27010
创建相关目录
cd /mongos27010
mkdir -p data/db
mkdir -p data/log
加入环境变量
vim /etc/profile
export PATH=/mongos27010/bin:$PATH
source /etc/profile
启动服务
/mongos27010/bin/mongod --maxConns 20000 --config /mongos27010/mongodb.conf
参数配置
net:
maxIncomingConnections:
port:
operationProfiling:
mode: slowOp
slowOpThresholdMs:
processManagement:
fork: "true"
replication:
oplogSizeMB:
replSetName: test
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /var/lib/mongodb-mms-automation/keyfile
setParameter:
enableLocalhostAuthBypass: "true"
storage:
dbPath: /data/mongo/test
directoryPerDB: true
engine: wiredTiger
indexBuildRetry: true
journal:
enabled: true
wiredTiger:
collectionConfig:
blockCompressor: snappy
engineConfig:
journalCompressor: snappy
cacheSizeGB:
indexConfig:
prefixCompression: true
systemLog:
destination: file
logAppend: true
path: /data/mongo/test/mongodb.log
quiet: true
生成keyfile文件
openssl rand -base64 756 > /mongodb27010/autokey chmod 400 /mongodb27010/autokey
3.添加群集
启动三个节点服务
/mongos27010/bin/mongod --maxConns 20000 --config /mongos27010/mongodb.conf
/mongos27011/bin/mongod --maxConns 20000 --config /mongos27011/mongodb.conf
/mongos27012/bin/mongod --maxConns 20000 --config /mongos27012/mongodb.conf

登入到主节点27010,添加其它两个节点
.登入
mongo --port
.切换admin数据库
use admin.初始化复制集,默认会创建当前节点为主节点的副本集
rs.initiate()
.退出重新登入
.添加数据节点27011,可以用机器名加端口也可以使用IP加端口
rs.add("192.168.137.10:27011")
.添加数据节点27012,可以用机器名加端口也可以使用IP加端口
rs.add("192.168.137.10:27012")
或者通过配置文件初始化副本集
conf={_id:'rs-a',members:[
{_id:0,host:'192.168.137.10:27010',priority:5},
{_id:1,host:'192.168.137.10:27011',priority:1},
{_id:2,host:'192.168.137.10:27012',arbiterOnly:true,priority:1}]
}
rs.initiate(conf)
----创建用户
use admin
db.createUser({
user:"dba",
pwd:"dba",
roles:[{role:"root",db:"admin"}]});
注意:添加节点后重启所有节点服务

注意:当前我已经把节点27010和27011的优先级都设成了10,节点27012的优先级设成了0,所以节点27012永远不会成为主节点。
arbiterOnly:表示该成员是仲裁者,arbiter的唯一作用是就是参与选举,其votes属性是1,arbiter不保存数据,也不会为client提供服务。
buildIndexes:表示是否在该成员上创建Index,该属性不能修改,只能在增加成员时设置该属性。如果一个成员仅仅作为备份,不接收Client的请求,将该成员设置为不创建index,能够提高数据同步的效率。
priority:表示一个成员被选举为Primary节点的优先级,默认值是1,取值范围是从0到100,将priority设置为0有特殊含义:Priority为0的成员永远不能成为Primary 节点。Replica Set中,Priority最高的成员,会优先被选举为Primary 节点,只要其满足条件。
hidden:将成员配置为隐藏成员,要求Priority 为0。Client不会向隐藏成员发送请求,因此隐藏成员不会收到Client的Request。
slaveDelay:单位是秒,将Secondary 成员配置为延迟备份节点,要求Priority 为0,表示该成员比Primary 成员滞后指定的时间,才能将Primary上进行的写操作同步到本地。为了数据读取的一致性,应将延迟备份节点的hidden设置为true,避免用户读取到明显滞后的数据。Delayed members maintain a copy of the data that reflects the state of the data at some time in the past.
votes:有效值是0或1,默认值是1,如果votes是1,表示该成员(voting member)有权限选举Primary 成员。在一个Replica Set中,最多有7个成员,其votes 属性的值是1。

注意:当前我已经把节点27012的优先级(priority)设成了0,所以节点27012在passives下面去了。
-----第三个副本节点为仲裁节点,不存储数据只充当仲裁,不存储数据也不接收业务请求
config ={
"_id" : "abc_set",
"members" : [
{
"_id" : ,
"host" : "111:30000"
},
{
"_id" : ,
"host" : "222:30000"
},
{
"_id" : ,
"host" : "333:30000",
"arbiterOnly":true
}
]
};
-----第三个副本节点为隐藏节点,要求Priority 为0。不参与投票,不接受业务请求,但是会存储数据
config ={
"_id" : "abc_set",
"members" : [
{
"_id" : ,
"host" : "111:30000"
},
{
"_id" : ,
"host" : "222:30000"
},
{
"_id" : ,
"host" : "333:30000",
"priority" : ,
"hidden" : true
}
]
}
4.故障测试
停止27010节点服务

登入节点27011查询,rs.status()

主节点已经切换到了27012节点
三、其它相关配置
1.配置节点优先级
在主节点中配置
cfg = rs.conf();
cfg.members[].priority = 10
cfg.members[].priority = 10
cfg.members[].priority = 5
rs.reconfig(cfg)
rs.conf();
注意:1.members[n]指的是rs.conf()查询中"_id"节点标志。如果将某个节点的priority设为0那么它将永远不会成为Primary节点。
2.这里的cfg只是一个别名,可以随意取。
3.主和备主的优先级建议设置成一样,避免主重启之后又进行主切换。
2.关闭节点投票
cfg = rs.conf()
cfg.members[].votes = 0;
rs.reconfig(cfg)
rs.conf();
注意:将节点votes设为0那么该节点将不具有投票权。
3.添加仲裁节点
rs.addArb("localhost:27012")
注意:添加节点后需要重启服务
4.删除节点
删除仲裁节点命令相同
rs.remove("localhost:27012")
注意:删除节点后要重启删除节点的服务,同时将删除节点的conf配置文件的replSet参数去掉。
5.查询群集相关状态
rs.status
"_id" : #集群中节点编号,从0开始
"name" : #成员服务器名称及端口
"health" : #表示成员中的健康状态(:down;:up)
"state" : #为0~,表示成员的当前状态
"stateStr" : #描述该成员是主库(PRIMARY)还是备库(SECONDARY)
"uptime" : #该成员在线时间(秒),从成员可达到现在所经历的时间。对于当前self成员,该时间是从成员启动一直到现在的时间。
"optime" : #成员最后一次应用日志(oplog)的信息
"optimeDate" : #成员最后一次应用日志(oplog)的时间
"electionTime" : #当前primary从操作日志中选举信息
"electionDate" : #当前primary被选定为primary的日期
"configVersion" : #mongodb版本
"self" : #为true 表示当前节点
-------===========非当前成员信息===========-----------
"lastHeartbeat" :#当前服务器最后一次收到拥有该信息成员心跳的时间
"pingMs" : 心跳从当前服务器到到达拥有该信息成员服务器所花费的平均时间,可以从这个字段选择从哪个成员进行同步 。
"syncingTo":当前成员正在从哪个成员处进行复制。
参考:https://docs.mongodb.com/manual/reference/command/replSetGetStatus/
rs.conf()
查询群集相关配置,包括优先级、投票等
参考:https://docs.mongodb.com/manual/reference/replica-configuration/
db.isMaster()
"passives" :priority=0的标志
"setName":群集名称
"ismaster":是否是主节点
"secondary":是否是从节点
参考:https://docs.mongodb.com/manual/reference/command/isMaster/
| Name | Description |
|---|---|
applyOps |
Internal command that applies oplog entries to the current data set. |
isMaster |
Displays information about this member’s role in the replica set, including whether it is the master. |
replSetAbortPrimaryCatchUp |
Forces the elected primary to abort sync (catch up) then complete the transition to primary. |
replSetFreeze |
Prevents the current member from seeking election as primary for a period of time. |
replSetGetConfig |
Returns the replica set’s configuration object. |
replSetGetStatus |
Returns a document that reports on the status of the replica set. |
replSetInitiate |
Initializes a new replica set. |
replSetMaintenance |
Enables or disables a maintenance mode, which puts a secondary node in a RECOVERING state. |
replSetReconfig |
Applies a new configuration to an existing replica set. |
replSetResizeOplog |
Dynamically resizes the oplog for a replica set member. Available for WiredTiger storage engine only. |
replSetStepDown |
Forces the current primary to step down and become a secondary, forcing an election. |
replSetSyncFrom |
Explicitly override the default logic for selecting a member to replicate from. |
resync |
Forces a mongod to re-synchronize from the master. For master-slave replication only. |
参考:https://docs.mongodb.com/manual/reference/command/nav-replication/
rs.printReplicationInfo()
查看oplog状态
rs.printSlaveReplicationInfo()
查看复制延迟
db.serverStatus()
查看服务状态详情
6.关闭服务
db.shutdownServer()
如果当前只剩下主节点需要执行带“force:true”参数的关闭服务命令
db.shutdownServer({"force":true});
7.配置启动服务
vim /etc/init.d/mongos27010
ulimit -SHn 655350
#!/bin/sh
# chkconfig: - 64 36
# description:mongod
case $1 in
start)
/mongos27010/bin/mongod --maxConns 20000 --config /mongos27010/mongodb.conf
;;
stop)
/mongos27010/bin/mongo -u dba -p dba 192.168.137.10:27010/admin --eval "db.shutdownServer()"
;;
status)
/mongos27010/bin/mongo -u dba -p dba 192.168.137.10:27010/admin --eval "db.stats()"
;;
esac
加入开启自动启动
chkconfig --level 345 mongos27010 on
四、总结
如果是首次搭建可能会遇到各种小问题,但是只要细心查找还是很容易解决;整体来说搭建一个MongoDB复制群集还是比较简单。
|
备注: 作者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接,否则保留追究责任的权利。 《欢迎交流讨论》 |
MongoDB 搭建可复制群集的更多相关文章
- MongoDB搭建ReplSet复制集群
MongoDB的复制集是一个主从复制模式 又具有故障转移的集群,任何成员都有可能是master,当master挂掉用会很快的重新选举一个节点来充当master. 复制集中的组成主要成员 Primary ...
- MySQL Cluster 与 MongoDB 复制群集分片设计及原理
分布式数据库计算涉及到分布式事务.数据分布.数据收敛计算等等要求 分布式数据库能实现高安全.高性能.高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Clus ...
- Python中使用Flask、MongoDB搭建简易图片服务器
主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...
- 用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库
上一篇介绍了如何用express搭建起服务端MVC的开发架构,本篇我们来详细介绍一下这个Model层,也就是数据库访问层.包含如何使用mongodb搭建数据库,以及如何使用mongoose来访问数据. ...
- 快速搭建MySQL复制集
快速搭建MySQL复制集 1 环境说明 MySQL版本 5.6 basedir :/u01/my3306 #MySQL软件目录 数据目录 :/u01/mysql/[实例名]/data 日志目录 :/u ...
- 用Node.JS+MongoDB搭建个人博客(页面模板)(五)(结束)
<差不多先生> 我是差不多先生,我的差不多是天生.也代表我很天真,也代表我是个闲人.这差不多的人生,总是见缝插针. 求学的道路上总是孤独的,即使别人不理解我,认为我是奇葩!但没关系,我会坚 ...
- 从无到有,用Nodejs+express+mongodb搭建简易登陆系统
前端处理server表示很蛋疼,初学Node,虽然感觉异常强大,但是学起来还是有些吃力的,Node是工具,它不是万能的,搭建一个系统还是需要借助其他一些工具,对于我这个没怎么接触server的前端来说 ...
- express + mongodb 搭建一个简易网站 (四)
express + mongodb 搭建一个简易网站 (四) 目前网站整体页面都已经能全部展示了,但是,整个网站还有两个块需要做完才能算完整,一个连接数据库,目前网站上的数据都是抓取的本地假数据,所以 ...
- express + mongodb 搭建一个简易网站 (三)
express + mongodb 搭建一个简易网站 (三) 前面已经实现了基本的网站功能,现在我们就开始开搞一个完整的网站,现在整个网站的UI就是下面的这个样子. 我们网站的样子就照着这个来吧. 1 ...
随机推荐
- Spring @Scheduled 在tomcat容器里面执行两次
今天在用spring里面的@Scheduled执行定时任务,但是发现到触发定时任务的时间点总会执行两次.原因是修改了tomcat conf包下面的server.xml文件导致的.配置如下: <H ...
- java进行图片和字符串的互相转换
今天做项目,突然发现图片居然能转成字符串,字符串也能转成图片. 接下来让我们进行代码演示吧! /** * 字符串转图片 * @param imgStr --->图片字符串 * @param fi ...
- intellij springmvc的配置文件报错
报错: Checks references injected by IntelliLang plugin. Cannot resolve bean 解决: File--Settings[或直接CTR ...
- 从arduino到32单片机的转型
#include "stm32f10x.h" #include "led.h" #include "delay.h" int main(vo ...
- getResource()和getSystemResource()分析
1. getClass().getResource() 第一步,getClass().getResource(path)是有一个路径参数的,这个路径会先被转换成"类所在的包名称+path&q ...
- 【Java SE】如何用Java实现插入排序
摘要:前面三期分别写了三篇简单排序的算法,今天来讲一点稍微难一点的排序算法-----插入排序. 基本思想: 设n个数据已经按照顺序排列好(假定从小排到大). 输入一个数据x,将其放在恰当的位置,使其顺 ...
- 封装的应用【example_Array工具】
定义一个数组工具[ArrayTool]封装其方法,ArrayDemo调用数组工具ArrayTool package new_Object; //封装多个个功能 class ArrayTool{ //1 ...
- plus、max、Pro、Edge
plus.max.Pro.Edge等后缀到底什么意思? Plus:比好更好.比牛X更牛X 译成中文是:加.和.正的-的意思.比如oneplus中文名就是一加.用于手机命名表示配置更加牛X,最早是由iP ...
- hdu3507 Print Article
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) P ...
- final修饰符,多态,抽象类,接口
1:final关键字(掌握) (1)是最终的意思,可以修饰类,方法,变量. (2)特点: A:它修饰的类,不能被继承. B:它修饰的方法,不能被重写. ...