搭建高可用mongoDB集群

搭建高可用mongoDB集群

任何一项服务的集群大致都可以由副本集和分片两部分组成,mongoDB自身就支持分片和副本集的操作,下面简单介绍一下搭建mongoDB集群。

典型的mongoDB集群结构如下:
这里写图片描述

Replica Set

在数据量不大的时候,其实可以不用对mongoDB分片,而几乎所有服务都要用到副本集。mongoDB淘汰了旧的master-slave模式,使用primary-secondary模式来实现副本。其实我并没有看出两种模式的异同,至少从用户角度来看,只是配置名改了。底层的实现改变我没有深究,猜测可能是primary-secondary不再完全由主节点处理读写请求,而是主要由主节点节点处理(master-slave模式是请求完全由master节点处理)。节点之间的数据同步方式仍然是heartbeat检测存活,然后进行数据同步同时记录同步时间戳。发一个副本集的启动脚本(仅仅是模拟,因为把副本集放在一台物理机上没有实际意义):

export MONGO_HOME=/workspace/softwares/mongodb/
export MONGO_LOG=/workspace/logs/mongodb/
export MONGO_DATA=/workspace/data/mongodb/
if [ ! -d $MONGO_LOG/set0 ]; then
    mkdir -p "$MONGO_LOG/set0"
fi
if [ ! -d $MONGO_DATA/set0 ]; then
    mkdir -p "$MONGO_DATA/set0/d0"
    mkdir -p "$MONGO_DATA/set0/d1"
    mkdir -p "$MONGO_DATA/set0/d2"
fi
$MONGO_HOME/bin/mongod --quiet --fork --dbpath=$MONGO_DATA/set0/d0 --logpath=$MONGO_LOG/set0/27010.log --port=27010 --replSet=set0
$MONGO_HOME/bin/mongod --quiet --fork --dbpath=$MONGO_DATA/set0/d1 --logpath=$MONGO_LOG/set0/27011.log --port=27011 --replSet=set0
$MONGO_HOME/bin/mongod --quiet --fork --dbpath=$MONGO_DATA/set0/d2 --logpath=$MONGO_LOG/set0/27012.log --port=27012 --replSet=set0

注意replSet参数,它指明了副本集的名字,同一个副本集的名字必须一样,待会在mongo中设置时会用到这个名字。
下一步用mongo客户端连入任意一个mongod

$MONGO_HOME/bin/mongo --port=27010 --host=127.0.0.1

执行

rs.initiate({ _id:"set0", members:[
    {_id:0,host:"192.168.1.136:27010"},
    {_id:1,host:"192.168.1.136:27011"},
    {_id:2,host:"192.168.1.136:27012"}]
});

尽管是在本地模拟集群环境,但是千万不要将host设置为127.0.0.1,否则会出错。配置完成之后大概等一分钟可以用rs.status()查看副本集的状态。若需要添加新的节点到副本集,可以执行rs.add(host:port),不过这条命令只能在primary节点执行。总结一些关于副本集常用的命令:

rs.status()  查看副本集运行状态
rs.add(host:port)  添加新的副本集节点
rs.conf()  查看副本集的配置
db.isMaster()  查看本节点是否是主节点,其实提示符已经显示了是不是主节点了= =

Shard

使用分片能有效的提高mongoDB性能,当请求太大以至于一台机器的吞吐量满足不了时,请考虑使用分片。mongoDB的分片操作也同样简单。
每个shard是一个mongod实例或者一个replica set(实际情况当然每个shard都是一个replica set),用于存储真实数据;请求由router来处理转发;config server存储元数据和chunkSize等。

#launch shard server
#27010用前面搭建的副本集作为shard,若27010挂掉,会选取27011或27012中的一个替代27010
#27021和27022用单个mongod实例作为shard
$MONGO_HOME/bin/mongod --port 27021 --dbpath=$MONGO_DATA/shard1 --logpath=$MONGO_LOG/shard1.log  --fork –quiet
$MONGO_HOME/bin/mongod --port 27022 --dbpath=$MONGO_DATA/shard2 --logpath=$MONGO_LOG/shard2.log  --fork --quiet

#launch config server
$MONGO_HOME/bin/mongod --port 27099 --dbpath=$MONGO_DATA/config --logpath=$MONGO_LOG/config.log  --fork --quiet

#launch route server,注意这里是mongos, chunkSize默认为200M
$MONGO_HOME/bin/mongos --port 30000 --configdb localhost:27099 --fork --logpath=$MONGO_LOG/route.log --chunkSize 500

下一步连接到router server进行配置:

$MONGO_HOME/bin/mongo --port=30000
#为router server添加shard
sh.addShard("set0/192.168.1.136:27010,192.168.1.136:27011,192.168.1.136:27012");
sh.addShard("192.168.1.136:27021");
sh.addShard("192.168.1.136:27022");
#指定test库的user表可分片,指定key为_id,Router根据key来分片,此命令只能在admin库执行
db.runCommand({enablesharding:"test.user",key:{_id:1}});

至此,mongoDB集群就搭建完成了,更多信息请参考mongoDB官方文档。

注:

本文摘自一个朋友pixyonly博客,原文地址:
http://pixyonly.github.io/da-jian-gao-ke-yong-mongodbji-qun.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值