副本集搭建
---何旭东(某上市公司运维工程师)
目录
副本集搭建... 1
参数介绍:... 1
开战... 3
基本操作... 3
逻辑图... 4
配置文件... 4
节点说明... 4
状态说明... 5
插入配置数据... 5
复制集初始化... 6
查看状态... 6
查看当前主库... 7
优化... 8
调整从库可读... 8
2015年7月16日
到此就配置好了二个replica sets!
发现问题思路:把基础环境一个一个总计一个一个梳理,确认每个节点的对应关系。即可!
在这里发扬个观念:鄙视团队技术隐藏,公司没有知识库,领导刻薄!!!
--quiet #安静输出
--port arg #指定服务端口号,默认端口27017
--bind_iparg #绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
--logpatharg #指定MongoDB日志文件,注意是指定文件不是目录
--logappend #使用追加的方式写日志
--pidfilepath arg #PID File 的完整路径,如果没有设置,则没有PID文件
--keyFilearg #集群的私钥的完整路径,只对于Replica Set 架构有效
--unixSocketPrefix arg # UNIX域套接字替代目录,(默认为 /tmp)
--fork #以守护进程的方式运行MongoDB,创建服务器进程
--auth #启用验证
--cpu #定期显示CPU的CPU利用率和iowait
--dbpatharg #指定数据库路径
--diaglogarg #diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads
--directoryperdb #设置每个数据库将被保存在一个单独的目录
--journal #启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
--journalOptionsarg # 启用日志诊断选项
--ipv6 #启用IPv6选项
--jsonp #允许JSONP形式通过HTTP访问(有安全影响)
--maxConnsarg #最大同时连接数 默认2000
--noauth #不启用验证
--nohttpinterface #关闭http接口,默认关闭27018端口访问
--noprealloc #禁用数据文件预分配(往往影响性能)
--noscripting #禁用脚本引擎
--notablescan #不允许表扫描
--nounixsocket #禁用Unix套接字监听
--nssize arg(=16) # 设置信数据库.ns文件大小(MB)
--objcheck #在收到客户数据,检查的有效性,
--profilearg #档案参数 0=off 1=slow, 2=all
--quota #限制每个数据库的文件数,设置默认为8
--quotaFilesarg # numberof files allower per db, requires --quota
--rest #开启简单的rest API
--repair #修复所有数据库run repair on all dbs
--repairpatharg #修复库生成的文件的目录,默认为目录名称dbpath
--slowms arg (=100) #value of slow for profile and console log
--smallfiles #使用较小的默认文件
--syncdelay arg (=60) # 数据写入磁盘的时间秒数(0=never,不推荐)
--sysinfo #打印一些诊断系统信息
--upgrade #如果需要升级数据库
* Replicaton 参数
-----------------------------------------------------------------------------
--fastsync #从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步
--autoresync #如果从库与主库同步数据差得多,自动重新同步,
--oplogSizearg #设置oplog的大小(MB)
* 主/从参数
-----------------------------------------------------------------------------
--master #主库模式
--slave #从库模式
--sourcearg #从库端口号
--onlyarg #指定单一的数据库复制
--slavedelayarg # 设置从库同步主库的延迟时间
* Replica set(副本集)选项:
-----------------------------------------------------------------------------
--replSetarg #设置副本集名称
* Sharding(分片)选项
-----------------------------------------------------------------------------
--configsvr #声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
--shardsvr #声明这是一个集群的分片,默认端口27018
--noMoveParanoia # 关闭偏执为moveChunk数据保存?
关闭防火墙
关闭selinux
配置hosts
时间同步
基本情况如下:
IP地址 |
主机名 |
角色 |
192.168.200.185 |
mongodb.1.hxd |
priority |
192.168.200.187 |
mongodb.2.hxd |
standard |
192.168.200.186 |
mongodb.3.hxd |
arbiter |
[root@mongodb ~]# cat /etc/mongod.conf
port=27017
dbpath = /usr/local/mongodb/data/
logpath =/usr/local/mongodb/logs/mongodb.log
logappend=true
fork=true
httpinterface=true
nojournal=true
rest=true
replSet=testSet
replIndexPrefetch=_id_only
standard:常规节点,它存储一份完整的数据副本,参与选举投票可以成为活跃节点。
passive:存储了完整的数据副本,参与投票,不能成为活跃节点。
arbiter:仲裁者只参与投票,不能接受复制数据,也不能成为活跃节点。
Bully选举算法
Bully算法是一种协调者(主节点)竞选算法,主要思想是集群的每个成员都可以声明它是主节点并通知其他节点。
默认情况:primary节点负责数据读写,secondary节点备份primary节点上的数据,但是arbiter节点
不会从primary节点同步数据
arbiter作用:
当primary节点故障,能够从second节点中,选出一个primary节点,不会参与数据读写。
STARTUP:刚加入到复制集中,配置还未加载
STARTUP2:配置已加载完,初始化状态
RECOVERING:正在恢复,不适用读
ARBITER: 仲裁者
DOWN:节点不可到达
UNKNOWN:未获取其他节点状态而不知是什么状态,一般发生在只有两个成员的架构,脑裂
REMOVED:移除复制集
ROLLBACK:数据回滚,在回滚结束时,转移到RECOVERING或SECONDARY状态
FATAL:出错。查看日志grep “replSetFATAL”找出错原因,重新做同步
PRIMARY:主节点
SECONDARY:备份节点
状态中关键数据位:
在用 rs.status()查看replica sets状态时,
state:1表示该host是当前可以进行读写,2:不能读写
health:1表示该host目前是正常的,0:异常
启动数据库
mongod -f /etc/mongod.conf
插入信息
rs.initiate({_id:"testSet",members:[{_id:1,host:"192.168.200.185:27017"},{_id:2,host:"192.168.200.187:27017"},{_id:3,host:"192.168.200.186:27017","arbiterOnly":true}]});
rs.initiate(conf);
testSet:PRIMARY> rs.status()
{
"set" : "testSet",
"date" : ISODate("2015-07-15T13:09:22Z"),
"myState" : 1,
"members" : [
{
"_id" : 1,
"name" :"192.168.1.109:27017",
"health" : 1,
"state" : 1,
"stateStr" :"PRIMARY",
"uptime" :1454,
"optime" :Timestamp(1436965655, 1),
"optimeDate": ISODate("2015-07-15T13:07:35Z"),
"electionTime" : Timestamp(1436965663, 1),
"electionDate" : ISODate("2015-07-15T13:07:43Z"),
"self" : true
},
{
"_id" : 2,
"name" :"192.168.1.110:27017",
"health" : 1,
"state" : 2,
"stateStr" :"SECONDARY",
"uptime": 107,
"optime" :Timestamp(1436965655, 1),
"optimeDate": ISODate("2015-07-15T13:07:35Z"),
"lastHeartbeat" : ISODate("2015-07-15T13:09:22Z"),
"lastHeartbeatRecv" :ISODate("2015-07-15T13:09:22Z"),
"pingMs" : 0,
"syncingTo" :"192.168.1.109:27017"
},
{
"_id" : 3,
"name" :"192.168.1.108:27017",
"health" : 1,
"state" : 7,
"stateStr" :"ARBITER",
"uptime" :107,
"lastHeartbeat" : ISODate("2015-07-15T13:09:22Z"),
"lastHeartbeatRecv" :ISODate("2015-07-15T13:09:20Z"),
"pingMs" : 0
}
],
"ok" : 1
}
testSet:PRIMARY>
testSet:SECONDARY> rs.isMaster();
{
"setName" :"testSet",
"setVersion" : 1,
"ismaster" : false,
"secondary" : true,
"hosts" : [
"192.168.200.187:27017",
"192.168.200.185:27017"
],
"arbiters" : [
"192.168.200.186:27017"
],
"primary" : "192.168.200.185:27017",
"me" : "192.168.200.187:27017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"maxWriteBatchSize" : 1000,
"localTime" : ISODate("2015-07-16T02:21:08.234Z"),
"maxWireVersion" : 2,
"minWireVersion" : 0,
"ok" : 1
}
我们可以看到三台机器的 health 为是1 说明机器目前是正常的。
再来观看每台机器的state 位,1 是可以读写,2 是不可读写
passive ----节点执行以下内容
testSet:PRIMARY> show dbs;
admin (empty)
local 2.077GB
testSet:PRIMARY> use testdb;
switched to db testdb
testSet:PRIMARY>db.document01.insert({"name":"hxd","sex":"N","age":"22"});
WriteResult({ "nInserted" : 1 })
testSet:PRIMARY> show tables;
document01
system.indexes
testSet:PRIMARY> db.document01.find();
{ "_id" :ObjectId("55a71118442e12ca0d28b50a"), "name" :"hxd", "sex" : "N", "age" :"22" }
testSet:PRIMARY>
standard ----节点执行以下内容
testSet:SECONDARY> show dbs;
admin (empty)
local 2.077GB
testdb 0.078GB
testSet:SECONDARY> use testdb
switched to db testdb
testSet:SECONDARY> show tables;
2015-07-16T10:05:22.978+0800 error: {"$err" : "not master and slaveOk=false", "code" :13435 } at src/mongo/shell/query.js:131
testSet:SECONDARY> rs.slaveOk();
testSet:SECONDARY> show tables;
document01
system.indexes
testSet:SECONDARY> db.document01.find();
{ "_id" :ObjectId("55a71118442e12ca0d28b50a"), "name" :"hxd", "sex" : "N", "age" :"22" }
testSet:SECONDARY>
本文出自 “晴空” 博客,谢绝转载!