设为首页 收藏本站
查看: 923|回复: 0

[经验分享] [MongoDB] 安装MongoDB配置Replica Set

[复制链接]

尚未签到

发表于 2015-7-7 05:06:23 | 显示全部楼层 |阅读模式
  MongoDB的环境主要包括StandAlone,Replication和Sharding。


  • StandAlone:单机环境,一般开发测试的时候用。
  • Replication:主从结构,一个Primary,多个Secondary,可能会有Arbitry。

    • Primary挂掉之后,会选举出一个Secondary作为Primary,与zookeeper类似。
    • Arbitry上面不存数据,只是为了凑数。选举算法要求节点数必须是奇数个,如果Primary+Secondary不是奇数个,就要用Arbitry凑数。
    • 写数据只能在Primary,读数据默认也在Primary,可以配置成从Secondary读,可以选最近的节点。
    • 数据在Primary上写成功之后,会将操作记录在oplog中,Secondary将oplog拷贝过去,然后照着操作一遍,就有数据了。
    • Primary和Secondary上面的数据保证最终一致性,可以为写操作配置write concern,有几个级别:在Primary上写完就认为写成功;写到oplog后认为写成功;写到一个/多个/某个/某几个Secondary之后认为写成功,等等。


  • Sharding:share nothing的结构,每台机器只存一部分数据。mongod服务器存数据,mongos服务器负责路由读写请求,元数据存在config数据库中。
  因为数据量和机器量的原因,项目最终用了一个Primary,一个Secondary,一个Arbitry。我自己的开发环境是Ubuntu,测试环境是CentOS。安装的是64位的MongoDB。

Ubuntu上的安装



sudo apt-get install mongodb
CentOS上的安装
  配置yum源,创建文件:/etc/yum.repos.d/mongodb.repo



[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
  安装命令:



yum install mongo-10gen mongo-10gen-server
配置
  每台机器上面的配置文件/etc/mongod.conf修改成下面的:



#数据库文件所在位置(默认)
dbpath=/var/lib/mongo
#日志所在位置(默认)
logpath=/var/log/mongo/mongod.log
#pid所在位置(默认)
pidfilepath = /var/run/mongodb/mongod.pid
#keyFile所在位置,生成方式在后面(添加)
keyFile=/var/lib/mongo/key
#端口(默认)
port=27017
#每次启动后日志追加在后面,不会新建日志文件(默认)
logappend=true
#用deamon方式启动(添加)
fork=true
#打开操作日志,用于故障恢复和持久化(默认)
journal=true
#replica set的名字(添加)
replSet=test-set
  在每台机器上运行:



sudo mongod -f /etc/mongod.conf
  我的环境里面,Primary ip: 192.168.1.1,Secondary ip: 192.168.1.2,Arbitary ip: 192.168.1.3。在单机上可以将多个mongodb设置成不同端口,我测试了一下也是可以的。
  在Primary上运行“mongo”,打开命令行,设置Replica Set:



rs.initiate(
{"_id" : "test-set",
"members" : [
{"_id" : 1, "host" : "192.168.1.1"},
{"_id" : 2, "host" : "192.168.1.2"},
{"_id" : 3, "host" : "192.168.1.3", "arbiterOnly" : true}
]
});
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
  历史成功后需要等一段时间,他会选举Primary,然后查看Replica Set的状态:



test-set:PRIMARY> rs.status()
{
"set" : "test-set",
"date" : ISODate("2014-02-21T10:28:55Z"),
"myState" : 7,
"members" : [
{
"_id" : 1,
"name" : "192.168.1.1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 4086,
"optime" : Timestamp(1392972480, 1),
"optimeDate" : ISODate("2014-02-21T08:48:00Z"),
"lastHeartbeat" : ISODate("2014-02-21T10:28:54Z"),
"lastHeartbeatRecv" : ISODate("2014-02-21T10:28:53Z"),
"pingMs" : 0
},
{
"_id" : 2,
"name" : "192.168.1.2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 3997,
"optime" : Timestamp(1392972480, 1),
"optimeDate" : ISODate("2014-02-21T08:48:00Z"),
"lastHeartbeat" : ISODate("2014-02-21T10:28:54Z"),
"lastHeartbeatRecv" : ISODate("2014-02-21T10:28:55Z"),
"pingMs" : 0,
"syncingTo" : "192.168.131.15:27017"
},
{
"_id" : 3,
"name" : "192.168.1.3:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 5781,
"self" : true
}
],
"ok" : 1
}
  这样整个replica set就配置成功了,还是比较简单的。

KeyFile的设置
  KeyFile是机器间用来进行权限认证的,如果没有设置KeyFile,在rs.initiate()的时候,会提示有其他机器没有ready,大概这个意思记不清了,反正有个error...
  网上搜了一下这个错误,很多解释都是说,服务器异常关闭或者mongodb异常退出的时候,会留下一个锁文件"/var/lib/mongo/mongo.lock",需要把这个锁文件删除之后重启mongodb。我试了一下这个方法对我无效。
  查看了一台机器上的log文件,发现里面说,有其他机器给他发送消息,但是需要在每台机器上配置key file。大概是这个意思,忘记截图了。
  创建Key File用下面的语句:



openssl rand -base64 741
  产生的字符串存到一个文本文件中,然后把这个文件的权限chmod成600(如果权限过高不行,log里面会告诉你权限过高),然后在配置里面加上“keyFile=keyfile的路径”,重启mongodb就行了。

NUMA的问题
  测试机的CPU是NUMA的,于是在运行mongod的时候命令行和log里面会有下面的提示:



WARNING: You are running on a NUMA machine.
We suggest launching mongod like this to avoid performance problems:
numactl –-interleave=all mongod [other options]
  于是要把启动命令改成:



sudo numactl --interleave=all mongod -f /etc/mongod.conf
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-83821-1-1.html 上篇帖子: mongodb的查询语句学习摘要 下篇帖子: MongoDB 服务启动时指定dbpath
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表