MongoDB是否有必要mongodb 读写分离离

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&--一步,二步,三步,N步,二行脚印
张映 发表于
分类目录:
标签:, , , ,
mongodb的多服务器配置,以前写过一篇文章,是master-slave模式的,请参考:。master-slave模式,不能自动实现故障转移和恢复。所以推荐大家使用mongodb的replica set,来实现多服务器的高可用。给我的感觉是replica set好像自带了heartbeat功能,挺强大的。
一,三台服务器,1主,2从
服务器1:127.0.0.1:27017
服务器2:127.0.0.1:27018
服务器3:127.0.0.1:27019
1,创建数据库目录
[root@localhost ~]# mkdir /var/lib/{mongodb_2,mongodb_3}
在一台机子上面模拟,三台服务器,所以把DB目录分开了。
2,创建配置文件
[root@localhost ~]# cat /etc/mongodb.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}'
//主服务器配置
port = 27017
//监听端口
fork = true
//后台运行
pidfilepath = /var/run/mongodb/mongodb.pid
//进程PID文件
logpath = /var/log/mongodb/mongodb.log
//日志文件
dbpath =/var/lib/mongodb
//db存放目录
journal = true
//存储模式
nohttpinterface = true
//禁用http
directoryperdb=true
//一个数据库一个文件夹
logappend=true
//追加方式写日志
replSet=repmore
//集群名称,自定义
oplogSize=1000
//oplog大小
[root@localhost ~]# cat /etc/mongodb_2.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}'
//从服务器
port = 27018
fork = true
pidfilepath = /var/run/mongodb/mongodb_2.pid
logpath = /var/log/mongodb/mongodb_2.log
dbpath =/var/lib/mongodb_2
journal = true
nohttpinterface = true
directoryperdb=true
logappend=true
replSet=repmore
oplogSize=1000
[root@localhost ~]# cat /etc/mongodb_3.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}'
//从服务器
port = 27019
fork = true
pidfilepath = /var/run/mongodb/mongodb_3.pid
logpath = /var/log/mongodb/mongodb_3.log
dbpath =/var/lib/mongodb_3
journal = true
nohttpinterface = true
oplogSize = 1000
directoryperdb=true
logappend=true
replSet=repmore
在这里要注意一点,不要把认证开起来了,不然查看rs.status();时,主从服务器间,无法连接,"lastHeartbeatMessage" : "initial sync couldn't connect to 127.0.0.1:27017"
3,启动三台服务器
mongod -f /etc/mongodb.conf
mongod -f /etc/mongodb_2.conf
mongod -f /etc/mongodb_3.conf
注意:初次启动时,主服务器比较快的,从服务器有点慢。
二,配置并初始化replica set
1,配置replica set节点
& config = {_id:"repmore",members:[{_id:0,host:'127.0.0.1:27017',priority :2},{_id:1,host:'127.0.0.1:27018',priority:1},{_id:2,host:'127.0.0.1:27019',priority:1}]}
2,初始化replica set
& rs.initiate(config);
"info" : "Config now saved locally.
Should come online in about a minute.",
3,查看replica set各节点状态
repmore:PRIMARY& rs.status();
"set" : "repmore",
"date" : ISODate("T21:01:51Z"),
"myState" : 2,
"syncingTo" : "127.0.0.1:27017",
"members" : [
"_id" : 0,
"name" : "127.0.0.1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 33,
"optime" : Timestamp(, 1),
"optimeDate" : ISODate("T21:00:38Z"),
"lastHeartbeat" : ISODate("T21:01:50Z"),
"lastHeartbeatRecv" : ISODate("T21:01:50Z"),
"pingMs" : 0,
"syncingTo" : "127.0.0.1:27018"
"_id" : 1,
"name" : "127.0.0.1:27018",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1808,
"optime" : Timestamp(, 1),
"optimeDate" : ISODate("T21:00:38Z"),
"errmsg" : "syncing to: 127.0.0.1:27017",
"self" : true
"_id" : 2,
"name" : "127.0.0.1:27019",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 1806,
"optime" : Timestamp(, 1),
"optimeDate" : ISODate("T21:00:38Z"),
"lastHeartbeat" : ISODate("T21:01:50Z"),
"lastHeartbeatRecv" : ISODate("T21:01:51Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "syncing to: 127.0.0.1:27018",
"syncingTo" : "127.0.0.1:27018"
在这里要注意,rs.initiate初始化也是要一定时间的,刚执行完rs.initiate,我就查看状态,从服务器的stateStr不是SECONDARY,而是stateStr" : "STARTUP2",等一会就好了。
三,replica set主,从测试
1,主服务器测试
repmore:PRIMARY&
1.078125GB
repmore:PRIMARY& use test
switched to db test
repmore:PRIMARY& db.test.insert({'name':'tank','phone':''});
repmore:PRIMARY& db.test.find();
{ "_id" : ObjectId("52afe75bc57cda7"), "name" : "tank", "phone" : "" }
2,从服务器测试
[root@localhost mongodb]# mongo 127.0.0.1:27018
MongoDB shell version: 2.4.6
connecting to: 127.0.0.1:27018/test
repmore:SECONDARY&
1.078125GB
0.203125GB
repmore:SECONDARY& db.test.find();
//无权限查看
error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
repmore:SECONDARY& rs.slaveOk();
//从库开启
repmore:SECONDARY& db.test.find();
//从库可看到主库刚插入的数据
{ "_id" : ObjectId("52afe75bc57cda7"), "name" : "tank", "phone" : "" }
repmore:SECONDARY& db.test.insert({'name':'zhangying','phone':''});
//从库只读,无插入权限
not master
到这儿,我们的replica set就配置好了。
四,故障测试
前面我说过,mongodb replica set有故障转移功能,下面就模拟一下,这个过程
1,故障转移
1.1,关闭主服务器
[root@localhost mongodb]# ps aux |grep mongod
//查看所有的mongod
0:02 mongod -f /etc/mongodb.conf
0:02 mongod -f /etc/mongodb_2.conf
0:02 mongod -f /etc/mongodb_3.conf
0.0 103248
0:00 grep mongod
[root@localhost mongodb]# kill 16977
//关闭主服务器进程
[root@localhost mongodb]# ps aux |grep mongod
0:02 mongod -f /etc/mongodb_2.conf
0:02 mongod -f /etc/mongodb_3.conf
0.0 103248
0:00 grep mongod
1.2,在主库执行命令
repmore:PRIMARY&
Tue Dec 17 04:48:02.392 DBClientCursor::init call() failed
1.3,从库查看状态,如下图,
replica set 故障测试
以前的从库变主库了,故障转移成功
2,故障恢复
mongod -f /etc/mongodb.conf
启动刚被关闭的主服务器,然后在登录到主服务器,查看状态rs.status();已恢复到最原始的状态了。
转载请注明作者:海底苍鹰地址:MongoDB是否有必要读写分离 - 开源中国社区
当前访客身份:游客 [
当前位置:
看过京东对MongoDB运营的经验,对读写分离的分析是:
是不是可以使用Secondary或者SecondaryPreference实现读写分离来提高系统的承载能
1、Secondary节点的写压力跟Primary基本是相同的,所以,读操作在从库上并不会提高
查询速度。
2、由于是异步复制数据,所以读Secondary的数据可能是过时的。
3、在分片架构中使用读写分离的时候有可能会丢失数据或者读到重复数据。
读写分离真的收益不大吗
共有1个答案
<span class="a_vote_num" id="a_vote_num_
其实读写分离还是有意义的,关键是要解决同步数据延时问题,mongodb其实提供了相关的解决方案:
写操作的相关设置:
通过writeConcern指定REPLICA_ACKNOWLEDGED(4,2000),也就是说4台节点全部写确认成功后才返回,设置了2秒的等待超时,可以根据复制集群数来指定节点数和等待超时时间
读操作的相关设置:
readPreference:SECONDARY_PREFERRED
也就是优先将读操作转发给mongodb从节点
感兴趣可以了解一下bboss会话共享框架,采用mongodb来存储会话数据,快速实现集群节点间会话共享和跨域跨应用会话共享,实现与具体容器无关,能够统计在线会话数,还能在统一监控中心管理应用会话(删除会话,查询会话数据等),无需使用session_sticky,参考资料:
--- 共有 3 条评论 ---
: 所有这个是一个矛盾的问题,要防止延迟读到脏数据,又要保证速度,这时通过设置超时间很有讲究了,同步复制策略也很关键
(1年前)&nbsp&
另外,因为从库也是不断从主机同步数据,其实从库的写压力也是很大
(1年前)&nbsp&
谢谢你精彩的回答, 不过我有一个问题,如果设置集群全部写确认成功后才返回,会影响接口API的返回响应时间。所以我们只采用确认主机写成功即返回
(1年前)&nbsp&
更多开发者职位上
有什么技术问题吗?
类似的话题MongoDB是否有必要读写分离_百度知道

我要回帖

更多关于 mongodb 读写性能 的文章

 

随机推荐