作者:容易 2013-08-19 17:30:56
mdb三节点 reset
角色IP 端口目录
主节点192.168.4.164 27017/app/mongodb/db
从节点1192.168.4.165 27017/app/mongodb/db
从节点2 192.168.4.166 27017 /app/mongodb/db
一、生成replica set 密钥文件(所以rs节点上都需要配置,并且相同)
注意事项:生成的文件将权限改成400
echo "mdb secret key">/app/mongodb/etc/mdb.key
chmod 400 /app/mongodb/etc/mdb.key
二、各节点配置文件
主节点配置文件
logpath=/app/mongodb/log/mdb.log
logappend=true
pidfilepath=/app/mongodb/tmp/mdb.pid
unixSocketPrefix=/app/mongodb/tmp/
fork=true
dbpath=/app/mongodb/db/
directoryperdb=true
nssize=32
profile=1
slowms=50
syncdelay=30
maxConns=4000
journalCommitInterval=100
auth=true
replSet=pnrmongodb
keyFile=/app/mongodb/etc/mdb.key
从节点1配置
logpath=/app/mongodb/log/mdb.log
logappend=true
pidfilepath=/app/mongodb/tmp/mdb.pid
unixSocketPrefix=/app/mongodb/tmp/
fork=true
dbpath=/app/mongodb/db/
directoryperdb=true
nssize=32
profile=1
slowms=50
syncdelay=30
maxConns=4000
journalCommitInterval=100
auth=true
replSet=pnrmongodb
keyFile=/app/mongodb/etc/mdb.key
从节点2配置
logpath=/app/mongodb/log/mdb.log
logappend=true
pidfilepath=/app/mongodb/tmp/mdb.pid
unixSocketPrefix=/app/mongodb/tmp/
fork=true
dbpath=/app/mongodb/db/
directoryperdb=true
nssize=32
profile=1
slowms=50
syncdelay=30
maxConns=4000
journalCommitInterval=100
auth=true
replSet=pnrmongodb
keyFile=/app/mongodb/etc/mdb.key
三、启动mdb
numactl --interleave=all /app/mongodb/bin/mongod -f /app/mongodb/etc/mdb.conf
四、初始化配置
在登录主节点
mongo -u root -p tiger 127.0.0.1/admin
>pnrmongodb={_id:'pnrmongodb',members:[{_id:164,host:'192.168.4.164:27017',priority:1},
{_id:165,host:'192.168.4.165:27017'},
{_id:166,host:'192.168.4.166:27017'}]}
>rs.initiate(pnrmongodb)
查看状态
> rs.status()
{
"set" : "pnrmongodb",
"date" : ISODate("2013-07-31T07:52:18Z"),
"myState" : 1,
"members" : [
{
"_id" : 164,
"name" : "192.168.4.164:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 7102,
"optime" : Timestamp(1375138603, 1),
"optimeDate" : ISODate("2013-07-29T22:56:43Z"),
"lastHeartbeat" : ISODate("2013-07-31T07:52:16Z"),
"lastHeartbeatRecv" : ISODate("2013-07-31T07:52:17Z"),
"pingMs" : 0,
"syncingTo" : "192.168.4.165:27017"
},
{
"_id" : 165,
"name" : "192.168.4.165:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 147924,
"optime" : Timestamp(1375138603, 1),
"optimeDate" : ISODate("2013-07-29T22:56:43Z"),
"self" : true
},
{
"_id" : 166,
"name" : "192.168.4.166:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 147482,
"optime" : Timestamp(1375138603, 1),
"optimeDate" : ISODate("2013-07-29T22:56:43Z"),
"lastHeartbeat" : ISODate("2013-07-31T07:52:17Z"),
"lastHeartbeatRecv" : ISODate("2013-07-31T07:52:16Z"),
"pingMs" : 0,
"syncingTo" : "192.168.4.165:27017"
}
],
"ok" : 1
}
查看完成后的主节点
> rs.isMaster();
{
"setName" : "pnrmongodb",
"ismaster" : true,
"secondary" : false,
"hosts" : [
"192.168.4.165:27017",
"192.168.4.166:27017",
"192.168.4.164:27017"
],
"primary" : "192.168.4.165:27017",
"me" : "192.168.4.165:27017",
"maxBsonObjectSize" : 16777216,
"maxMessageSizeBytes" : 48000000,
"localTime" : ISODate("2013-07-31T07:55:43.367Z"),
"ok" : 1
}
读写分离
1. 读写分离
在主库插入数据,从从库查询数据,使从库拥有只读权限只有上述的基本配置是不够的,需要在从节点执行如下操作:
> db.getMongo().setSlaveOk() //让从库可以读
>
增加节点使用oplog增加节点
pnrmongodb:PRIMARY> rs.add({_id:167,host:"192.168.4.167:27017"});
{ "ok" : 1 }
观察rs的状态变化
进行初始化:节点状态"status":6,"errmsg":"still initializing"
进行数据同步:节点状态"status":3,"errmsg":"initial sync need a member to be primary or secondary to do our initial sync"
初始化同步完成:节点状态"status":3,"errmsg":"initial sync done"
节点添加完成:节点状态"status":2
刚加入时状态为UNKNOWN,并且提示在初始化
pnrmongodb:PRIMARY> rs.status();
{
"set" : "pnrmongodb",
"date" : ISODate("2013-07-31T08:47:27Z"),
"myState" : 1,
{
"_id" : 165,
"name" : "192.168.4.165:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 151233,
"optime" : Timestamp(1375260443, 1),
"optimeDate" : ISODate("2013-07-31T08:47:23Z"),
"self" : true
},
{
"_id" : 166,
"name" : "192.168.4.166:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 786,
"optime" : Timestamp(1375260443, 1),
"optimeDate" : ISODate("2013-07-31T08:47:23Z"),
"lastHeartbeat" : ISODate("2013-07-31T08:47:26Z"),
"lastHeartbeatRecv" : ISODate("2013-07-31T08:47:26Z"),
"pingMs" : 0,
"syncingTo" : "192.168.4.165:27017"
},
.......
{
"_id" : 167,
"name" : "192.168.4.167:27017",
"health" : 1,
"state" : 6,
"stateStr" : "UNKNOWN",
"uptime" : 4,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2013-07-31T08:47:27Z"),
"lastHeartbeatRecv" : ISODate("1970-01-01T00:00:00Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "still initializing"
}
],
"ok" : 1
}
初始同步
pnrmongodb:PRIMARY> rs.status();
{
"set" : "pnrmongodb",
"date" : ISODate("2013-07-31T08:47:31Z"),
"myState" : 1,
"members" : [
{
"_id" : 165,
"name" : "192.168.4.165:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 151237,
"optime" : Timestamp(1375260443, 1),
"optimeDate" : ISODate("2013-07-31T08:47:23Z"),
"self" : true
},
..........
{
"_id" : 167,
"name" : "192.168.4.167:27017",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 8,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2013-07-31T08:47:29Z"),
"lastHeartbeatRecv" : ISODate("2013-07-31T08:47:30Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "initial sync need a member to be primary or secondary to do our initial sync"
}
],
"ok" : 1
}
开始克隆
pnrmongodb:PRIMARY> rs.status();
{
"set" : "pnrmongodb",
"date" : ISODate("2013-07-31T08:47:51Z"),
"myState" : 1,
"members" : [
{
"_id" : 165,
"name" : "192.168.4.165:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 151257,
"optime" : Timestamp(1375260443, 1),
"optimeDate" : ISODate("2013-07-31T08:47:23Z"),
"self" : true
},
........
{
"_id" : 167,
"name" : "192.168.4.167:27017",
"health" : 1,
"state" : 5,
"stateStr" : "STARTUP2",
"uptime" : 28,
"optime" : Timestamp(0, 0),
"optimeDate" : ISODate("1970-01-01T00:00:00Z"),
"lastHeartbeat" : ISODate("2013-07-31T08:47:51Z"),
"lastHeartbeatRecv" : ISODate("2013-07-31T08:47:50Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "initial sync cloning db: tiger"
}
],
"ok" : 1
}
数据库快照+oplog增加节点
通过oplog 直接进行增加节点操作简单且无需人工干预过多,但oplog 是capped collection,采用循环的方式进行日志处理,所以采用oplog 的方式进行增加节点,有可能导致数据的不一致,因为日志中存储的信息有可能已经刷新过了。不过没关系,我们可以通过数据库快照(--fastsync)和oplog 结合的方式来增加节点,这种方式的操作流程是,先取某一个复制集成员的物理文件来做为初始化数据,然后剩余的部分用oplog 日志来追,最终达到数据一致性。
取某一个复制集成员的物理文件来做为初始化数据
如前所述添加新复制集节点192.168.8.207:28010,实例增加选项--fastsync
使用oplog增加节点,验证数据一致性
rs.add({_id:167,host:"192.168.4.167:27017"});
删除节点
rs.remove("192.168.4.167:27017")
查询延迟
pnrmongodb:PRIMARY> db.printSlaveReplicationInfo();
source: 192.168.4.164:27017
syncedTo: Fri Aug 02 2013 10:58:07 GMT+0800 (CST)
= 399 secs ago (0.11hrs)
source: 192.168.4.167:27017
syncedTo: Fri Aug 02 2013 11:04:45 GMT+0800 (CST)
= 1 secs ago (0hrs)
常用命令和参数
详细说明:(默认值在括号中)
_id:副本集的名字,必须和命令行的名字匹配,也就是您刚才启动mongodb数据库命令行的那个名字,数字字母,不能包含"/";
members:一个数组用来表示副本集中的每个成员,这个数组必须包含_id和host这2个key。
members 数组:
_id:在副本集中的每一个成员都必须有一个_id表示,这个_id是通常是数字,从0开始增长。需要注意的是当其中一个成员退休了(指从副本集config中移除了),新加入的成员不能重新使用这个退休成员的_id;
host:ip地址和端口号;
arbiterOnly(false):如果是true,则表示这个成员为仲裁节点,不接收数据;
buildIndexes(true):如果设置为false,则会阻止在这个节点上创建第二索引,通常这个节点是作为纯粹的数据备份,从不用来被查询。不过也因为此节点没有第二索引,所以他写入的东西很少,也就需要很少的内存和磁盘。_id的索引还是会被创建的。只有当priority属性设置为0时,此项才能设置为false,一般不会用到这个选项;
hidden(false):如果此项为true,不要告诉客户端的此节点的存在,设置隐藏节点的原因是此节点的数据的使用模式和其他节点大为不同,比如:报表,统计,备份等。设置为ture时,允许你针对这个节点发送非主要查询。
priority(1.0):权重,更高的权重会被选举为主节点
tags({}):一个文档代表这台服务器的位置,有利于位置感知的读写。其实就是表示此节点位于哪个数据中心的,mongodb会根据tags找近的数据中心节点同步数据。
slaveDelay(0):同步数据的延迟,设置为0表示立即更新同步数据。
votes(1):此节点可以发出的投票数,一般不用修改他
settings 对象:settings对象可以在集群建立起来以后用再进行设置,通常使用默认值
接下来我们来介绍下rs命令:在命令行我们输入
rs.help()
rs.status() { replSetGetStatus : 1 } checks repl set status
rs.initiate() { replSetInitiate : null } initiates set with default settings
rs.initiate(cfg) { replSetInitiate : cfg } initiates set with configuration cfg
rs.conf() get the current configuration object from local.system.replset
rs.reconfig(cfg) updates the configuration of a running replica set with cfg (disconnects)
rs.add(hostportstr) add a new member to the set with default attributes (disconnects)
rs.add(membercfgobj) add a new member to the set with extra attributes (disconnects)
rs.addArb(hostportstr) add a new member which is arbiterOnly:true (disconnects)
rs.stepDown([secs]) step down as primary (momentarily) (disconnects)
rs.freeze(secs) make a node ineligible to become primary for the time specified
rs.remove(hostportstr) remove a host from the replica set (disconnects)
rs.slaveOk() shorthand for db.getMongo().setSlaveOk()
db.isMaster() check who is primary
将一个普通数据节点修改为passive节点,也就是能同步数据、投票,但是不能成为primay。
除了仲裁节点,其他每个节点都有个优先权,我们可以通过设置优先权来决定谁的成为primay的权重最大。
MongoDB replica sets中通过设置priority的值来决定优先权的大小,这个值的范围是0--100,值越大,优先权越高。
如果值是0,那么不能成为primay。
1.通过rs.conf()命令查看出节点列表
PRIMARY> rs.conf()
{
"_id" : "test",
"version" : 22,
"members" : [
{
"_id" : 3,
"host" : "192.168.22.36:27017"
},
{
"_id" : 5,
"host" : "192.168.22.10:27017"
},
{
"_id" : 6,
"host" : "192.168.22.12:27017",
"priority" : 0,
"arbiterOnly" : true
},
{
"_id" : 7,
"host" : "192.168.22.115:27017"
}
]
}
2.将上面红色的192.168.22.10节点的priority值修改成0,让它只接收数据,不参与成为primary的竞争。
命令格式如下:
cfg = rs.conf()
cfg.members[0].priority = 0.5
cfg.members[1].priority = 2
cfg.members[2].priority = 2
rs.reconfig(cfg)
说明:cfg.members[0].priority =
红色中括号中的数字是执行rs.conf()得出的节点顺序,第一个节点在这里写0,第二个节点写1,依次类推。
执行命令
cfg = rs.conf()
cfg.members[1].priority = 0
rs.reconfig(cfg)
3.查看结果,192.168.22.10的优先权变为0.
点击(此处)折叠或打开
PRIMARY> rs.conf()
{
"_id" : "test",
"version" : 22,
"members" : [
{
"_id" : 3,
"host" : "192.168.22.36:27017"
},
{
"_id" : 5,
"host" : "192.168.22.10:27017"
"priority" : 0
},
{
"_id" : 6,
"host" : "192.168.22.12:27017",
"priority" : 0,
"arbiterOnly" : true
},
{
"_id" : 7,
"host" : "192.168.22.115:27017"
}
]
}
One Response