mongodb 副本集+分片

本文介绍Mongodb中分片与副本集的部署过程,包括配置、启动、测试及故障恢复等内容。通过实例演示了如何搭建Mongodb的高可用集群。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Mongodb 副本集+分片

 

1.本地磁盘不足,将数据分散到其它的机器,实现大数据的存储,处理负载,->shard,

2.故障恢复与冗余,读写分离->replica set

本文尝试多种不同的架构:

1.      副本集+分片

1)     其架构图为:



3台服务器,Server1作为主节点,3个分片,server2,server3作为副本集,对server1的数据进行备份。

2)     配置

serverA

shard1配置为:

port=28010
replSet=rs1
fork=true
dbpath=/root/data/shard/s0
logpath=/root/data/shard/log/s0.log
shardsvr=true
directoryperdb=true
 

shard2,config的replSet分别为rs2,rsconf

server B

shard1 配置为:

port=28010
replSet=rs1
fork=true
dbpath=/root/data/shard/s0
logpath=/root/data/shard/log/s0.log
logappend=true
directoryperdb=true

shard2, config的replSet分别为rs2,rsconf.

3)     启动

分别启动3台服务器的几个shard进程

mongod -f s0.conf

mongod -fs1.conf

任意进入一台服务器

mongo -port28010

a)       副本集rs1配置:

config={_id:"rs1",members:[
{_id:0,host:"192.168.182.210:28010"},
{_id:1,host:"192.168.182.211:28010"},
{_id:1,host:"192.168.182.212:28010",arbiterOnly:true}]
}

rs.initiate(config)

rs1的副本集搭建完毕,依此搭建rs2.

b)      搭建config,启动rout

报错:

BadValue:Invalid configdb connection string: FailedToParse: invalid url [192.13.183.210:30000,192. 168.182.211:30000,192.168.182.212:30000]

表示所有的步骤都是按照正确方式来的,后来发现在3.2版本,configdb的方式已经变成了: configReplSet/<cfgsvr1:port1>,<cfgsvr2:port2>,<cfgsvr3:port3>

c)       配置config为:

config={_id:"rsconf",members:[
{_id:0,host:"182.168.182.210:30000"},
{_id:1,host:"182.168.182.211:30000"},
{_id:1,host:"182.168.182.212:30000"}]}

d)      配置rout.conf

port=40000
fork=true
configdb=rsconf/192.168.182.210:30000,192.168.182.211:30000,192.168.182.212:30000
logpath=/root/data/shard/log/rout.log
chunkSize=1
logappend=true

e)       加入分片:

db.runCommand({addshard:"rs2/192.168.182.210:28010",name:"shard1"})
db.runCommand({addshard:"rs2/192.168.182.210:28011",name:"shard2"})

db.proj.ensureIndex({name:1})
mongos> db.runCommand({enablesharding:"test"})
{ "ok" : 1 }
mongos> db.runCommand({shardcollection:"test.proj",key:{"name":1}})
{ "collectionsharded" : "test.proj", "ok" : 1 }

for(var i=0;i<10000;i++){
... db.proj.insert({name:i+"de"})
... }

查看分片情况:

mongos>printShardingStatus()
--- ShardingStatus ---
  sharding version: {
         "_id" : 1,
         "minCompatibleVersion" : 5,
         "currentVersion" : 6,
         "clusterId" :ObjectId("57dcb44297abbc578ff6f300")
}
  shards:
         { "_id" : "shard1", "host" : "rs1/192.168.182.210:28010,192.168.182.210:28010"}
         { "_id" : "shard2", "host" : "rs2/192.168.182.211:28011,192.168.182.211:28011"}
         { "_id" : "shard3", "host" : "rs3/192.168.182.212:28012,192.168.182.212:28012"}
  active mongoses:
         "3.2.5" : 2
  balancer:
         Currently enabled:  yes
         Currently running:  no
         Failed balancer rounds in last 5attempts:  0
         Migration Results for the last 24hours:
                   2 : Success
                   1 : Failed with error'aborted', from shard1 to shard2
  databases:
         { "_id" : "test", "primary" : "shard1",  "partitioned" : true }
                   test.proj
                            shard key: {"name" : 1 }
                            unique: false
                            balancing: true
                            chunks:
                                     shard1      1
                                     shard2      1
                                     shard3      1
                            { "name" :{ "$minKey" : 1 } } -->> { "name" : "10de"} on : shard2 Timestamp(2, 0)
                            { "name" :"10de" } -->> { "name" : "6de" } on :shard3 Timestamp(3, 0)
                            { "name" :"6de" } -->> { "name" : { "$maxKey" : 1 } }on : shard1 Timestamp(3, 1)

4)     测试

a)       测试分片

新增分片:

db.runCommand({addshard:"rs2/192.168.182.210:28012",name:"shard3"})

进入任一个实例:mongo -port28012

rs3:SECONDARY>rs.slaveOk()
rs3:SECONDARY>db.proj.count()
6555

b)      测试故障

关闭serverA的shard1

自动选举出serverB的shard1作为主节点.

rs1:PRIMARY>rs.status()
{
         …
         "members" : [
                   {
                            "_id" : 0,
                            "name" :"192.168.182.210:28010",
                            "health" :0,
                            "state" :8,
                            "stateStr": "(not reachable/healthy)",
…

再启动ServerA的shard,其状态将变为SECONDARY


关闭Server A的config

会使用其他服务器的config,进入ServeB的mongos

mongos>db.proj.count()
10001

再关闭ServerB的config,会采纳ServerC的config文件


关闭ServerA的mongos

进入B的mongos进行查询

mongos>db.proj.count()

10001

关闭B的mongos

进入C的Mongos查询

mongos>db.proj.count()
10001
mongos>db.proj.find()
{"_id" : ObjectId("57dcbadde0ec017f1c47136d"),"name" : "test" }
{"_id" : ObjectId("57dcbc1ae0ec017f1c471376"),"name" : "8de" }
{"_id" : ObjectId("57dcbc1ae0ec017f1c471374"),"name" : "6de" }


至此,显示出副本集可以良好的进行冗余,多个config与mongos也是必要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值