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学习之路三——第一个Spring程序(体会IoC)
体会IoC:Spring通过一种称作控制反转(IoC)的技术促进了松耦合.当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象.你可以认为IoC与JN ...
- 前端css常用class命名id命名
1.常用id的命名: (1)页面结构 容器: container 页头:header 内容:content/container 页面主体:main 页尾:footer 导航:nav 侧栏:sideba ...
- whoops php调试库
Whoops 适用于PHP环境的错误捕获与调试PHP库: whoops非常容易使用,它提供stackbased错误捕获及超美观的错误查看 测试效果如下 安装步骤(composer安装) 安装完成之后在 ...
- hexo部署github和gitment操作简单介绍
优点: 快速高效 支持markdown 布局自定义简单,无广告 部署简单 因为想开始写博客,但又找不到好的博客平台,平时都看博客园和开源中国看博客文章,但博客园的那个皮肤是真有点难受,所以就想自己打个 ...
- linkin大话数据结构--字符串,数组,list之间的互转
在实际开发中,我们经常会用到字符串,字符数组,字符list,当然也会不可避免的进行这3者之间的互相转换. 在使用到Apache和Google下的common包,可以这样子实现: package tz. ...
- String.Format 格式化货币的小问题
今天在开发过程中,遇到一件让我觉得比较纳闷的事情:用String.Format 格式化充值金额的时候,我这样处理: String.Format("{0:C2}", dr[" ...
- 04_Javascript初步第三天
事件 内联模型.脚本模型,DOM2级模型 <!--内联模型--> <input type="button" value="bt1" oncli ...
- mac对比class文件
下载反编译工具 wget https://varaneckas.com/jad/jad158g.mac.intel.zip 设置Beyond Compare 填写编译工具路径
- Win10下通过IIS调试ASP程序遇到的问题和解决方案
最近维护了以前别人的写的一个ASP的系统,记录一下调试过程中的问题和解决方案. 环境篇 万维网发布服务(W3SVC)已经停止 问题: 万维网发布服务(W3SVC)已经停止.除非万维网发布服务(W3SV ...
- java 数组与集合(list)相互转化
上代码 package com.core.array2collection; import java.util.ArrayList; import java.util.Arrays; import j ...