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 ...
随机推荐
- Docker镜像导致centos-root根分区容量爆满
当虚拟机服务器运行Docker久了后,发现Docker的文件越来越大,某天发现此台机上的数据库访问不了了,再重启数据库等日志,提示空间不足,查看磁盘空间: root分区满载啊,前段时间还有不少空间的, ...
- svn checkout The XML response contains invalid XML
svn checkout 报错:The XML response contains invalid XML 待解决? ---目前没有找到好的解决方法,svn数据库中存的log入手应该可以,有时间再去看 ...
- U8g2库I2C总线再次突破性调试成功
这次采用U8X8的方式,不再采用u8g2,因为后者一直报内存问题.所以采用了不占内存的u8x8模式 同时u8g2库文件的示例代码也是很牛逼的, 里面还有message box 非常的可爱运行效果也非常 ...
- ImmutableMap
不可变集合,为什么使用它呢?线程安全\更有效的利用内存\可作为常量 ImmutableMap.<String, Object> builder().put("yananList& ...
- struts2 添加请求后缀的3种方式
第一种方式在struts.xml文件中添加 <constant name="struts.action.extension" value="">&l ...
- 【总目录】——概率论与数理统计及Python实现
注:这是一个横跨数年的任务,标题也可以叫做“从To Do List上划掉学习统计学”.在几年前为p值而苦恼的时候,还不知道Python是什么:后来接触过Python,就喜欢上了这门语言.统计作为数据科 ...
- jumpserver v0.4.0 基于 CenOS7 的安装详解
标签(linux): jumpserver 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 笔者已经弃用Jumpserver,并自已开发了shell跳板机. sh ...
- 集中式(SVN)和分布式(Git)版本控制系统的简单比较
集中式(SVN) 分布式(Git) 是否有中央服务器 有.开发人员需要从中央服务器获得最新版本的项目然后在本地开发,开发完推送给中央服务器.因此脱离服务器开发者是几乎无法工作的 没有中央 ...
- appium问题整理
在刚进入appium的世界时,遇到无数的坑,趟过无数的浑水,现在整理一些常用的报错讯息,供大家参考 1.org.openqa.selenium.remote.UnreachableBrowserExc ...
- @RequestMapping注解
Spring MVC中用于参数绑定的注解有很多,都在org.springframework.web.bind.annotation包中,根据它们处理的request的不同内容部分可以分为四类(主要讲解 ...