一、概述

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 搭建可复制群集的更多相关文章

  1. MongoDB搭建ReplSet复制集群

    MongoDB的复制集是一个主从复制模式 又具有故障转移的集群,任何成员都有可能是master,当master挂掉用会很快的重新选举一个节点来充当master. 复制集中的组成主要成员 Primary ...

  2. MySQL Cluster 与 MongoDB 复制群集分片设计及原理

    分布式数据库计算涉及到分布式事务.数据分布.数据收敛计算等等要求 分布式数据库能实现高安全.高性能.高可用等特征,当然也带来了高成本(固定成本及运营成本),我们通过MongoDB及MySQL Clus ...

  3. Python中使用Flask、MongoDB搭建简易图片服务器

    主要介绍了Python中使用Flask.MongoDB搭建简易图片服务器,本文是一个详细完整的教程,需要的朋友可以参考下 1.前期准备 通过 pip 或 easy_install 安装了 pymong ...

  4. 用“MEAN”技术栈开发web应用(三)用mongodb搭建数据库

    上一篇介绍了如何用express搭建起服务端MVC的开发架构,本篇我们来详细介绍一下这个Model层,也就是数据库访问层.包含如何使用mongodb搭建数据库,以及如何使用mongoose来访问数据. ...

  5. 快速搭建MySQL复制集

    快速搭建MySQL复制集 1 环境说明 MySQL版本 5.6 basedir :/u01/my3306 #MySQL软件目录 数据目录 :/u01/mysql/[实例名]/data 日志目录 :/u ...

  6. 用Node.JS+MongoDB搭建个人博客(页面模板)(五)(结束)

    <差不多先生> 我是差不多先生,我的差不多是天生.也代表我很天真,也代表我是个闲人.这差不多的人生,总是见缝插针. 求学的道路上总是孤独的,即使别人不理解我,认为我是奇葩!但没关系,我会坚 ...

  7. 从无到有,用Nodejs+express+mongodb搭建简易登陆系统

    前端处理server表示很蛋疼,初学Node,虽然感觉异常强大,但是学起来还是有些吃力的,Node是工具,它不是万能的,搭建一个系统还是需要借助其他一些工具,对于我这个没怎么接触server的前端来说 ...

  8. express + mongodb 搭建一个简易网站 (四)

    express + mongodb 搭建一个简易网站 (四) 目前网站整体页面都已经能全部展示了,但是,整个网站还有两个块需要做完才能算完整,一个连接数据库,目前网站上的数据都是抓取的本地假数据,所以 ...

  9. express + mongodb 搭建一个简易网站 (三)

    express + mongodb 搭建一个简易网站 (三) 前面已经实现了基本的网站功能,现在我们就开始开搞一个完整的网站,现在整个网站的UI就是下面的这个样子. 我们网站的样子就照着这个来吧. 1 ...

随机推荐

  1. Oracle创建、管理撤销表空间

    撤销管理模式: 用户通过设定撤销管理模式(undo mode)就可以灵活地选择使用手动撤销管理(manual undo management)或自动撤销管理(automatic undo manage ...

  2. shopnc前台登陆不进去解决方法

    安装好shopnc后,注册新用户成功,且登陆后提示登陆成功,但是一两秒后自动跳转回登陆页面,需要重新登陆问题 PHP写session不是自动起的,需要修改后才行,所以 找到PHP的php.ini配置文 ...

  3. 读《你不知道的JavaScript(上卷)》后感-浅谈JavaScript作用域(一)

    原文 一. 序言 最近我在读一本书:<你不知道的JavaScript>,这书分为上中卷,内容非常丰富,认真细读,能学到非常多JavaScript的知识点,希望广大的前端同胞们,也入手看看这 ...

  4. sql 时间转换问题 from_unixtime() UNIX_TIMESTAMP()

    http://blog.csdn.net/test_soy/article/details/50328367 from_unixtime()是MySQL里的时间函数 date为需要处理的参数(该参数是 ...

  5. 如何在同一台机器上安装多个MySQL的实例

    转自:'http://www.cnblogs.com/shangzekai/p/4375271.html 最近由于工作的需要,需要在同一台机器上搭建两个MySQL的实例,(注:已经存在了一个3306的 ...

  6. Hi,WeTest限免开放Android Oreo云真机,Android 8.1可开测!

    2017年末,谷歌在印度正式发布 Android Oreo 8.1,向实现"为所有人打造由 AI 驱动的全覆盖移动平台"这一愿景迈进.Android 8.1在引入对 Android ...

  7. Linux安装JDK、MySQL和Tomcat

    1 依赖的安装 因为JDK.Tomcat和MySQL的安装过程中需要从网上下载部分支持包才可以继续,所以需要提前安装好依赖. yum install glibc.1686 yum -y install ...

  8. httpd添加新模块

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  9. linux中编译安装Apache、PHP、MySQL(上)

    1.简介 在阿里云买了个云服务器,一直没时间折腾.过了近十天了吧,才有时间好好玩玩这个云服务器.自己是做Web开发的,所以我需要的开发环境是LAMP.之前打算是采用yum安装,不过yum安装apach ...

  10. Apache中的gzip压缩作用及配置

    gzip会对文本资源进行压缩,一般能节省40%的大小,二进制内容不需要开启Gzip压缩,因为这些文件是已经压缩过的,如果再进行gzip压缩可能反而会增加其大小,并且空耗cpu资源啊. 静态资源一般都会 ...