Mongo之架构部署(Replica Sets+Sharding)
admin
2023-04-14 01:21:24
0

 

Mongo之架构部署(Replica Sets+Sharding)

 

 

一、环境

 

Mongo之架构部署(Replica Sets+Sharding)

要构建一个 MongoDB Sharding Cluster,需要三种角色:

Shard Server: mongod 实例,用于存储实际的数据块。

Config Server: mongod 实例,存储了整个 Cluster Metadata,其中包括 chunk 信息。

Route Server: mongos 实例,前端路由,客户端由此接入,且让整个集群看上去像单一进程  

 数据库。

方案一:

192.168.136.14

192.168.136.15

192.168.136.16

192.168.136.26

192.168.136.29

Shard1(master)

Shard2(master)

Shard3(master)

Shard1(slave)

Shard1(arbiter)

Shard2(slave)

Shard3(slave)

Shard1(slave)

Shard3(slave)

Shard2(arbiter)

Shard3(arbiter)

Shard1(arbiter)

Shard2(arbiter)

Shard2(slave)

Shard3 (arbiter)

 

1.节点:

 S1: 192.168.136..14,192.168.136..26,192.168.136..16,192.168.136.15,192.168.136.29(arbiter)

 S2: 192.168.136.15,192.168.136.26,192.168.136.14,192.168.136.16,192.168.136.29(arbiter)

 S3: 192.168.136.16,192.168.136.26,192.168.136.15,192.168.136.14,192.168.136.29(arbiter)

 

 

c

 

主机

端口信息

192.168.136.14

mongod shard1:27017(master)

mongod shard2:27018(slave)

mongod shard3:27019(arbiter)

mongod config:30000

mongs:40000

192.168.136.15

mongod shard1:27017(arbiter)

mongod shard2:27018(master)

mongod shard3:27019(slave)

mongod config:30000

mongs:40000

192.168.136.16

mongod shard1:27017(slave

mongod shard2:27018(arbiter)

mongod shard3:27019(master)

mongod config:30000

mongs:40000

192.168.136.26

mongod shard1:27017(slave)

mongod shard2:27018(slave)

mongod shard3:27019(slave)

192.168.136.29

mongod shard1:27017(arbiter)

mongod shard2:27018(arbiter)

mongod shard3:27019(arbiter)

 

二、安装部署

软件准备及目录

1.下载mongodb程序

  curl -O http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-1.8.3.tgz

2.解压mongodb-linux-x86_64-2.0.0.tgz

  tar zxvf mongodb-linux-x86_64-1.8.3.tgz

3.重命名mongodb-linux-x86_64-2.0.0.tgzmongodb

  mv mongodb-linux-x86_64-2.0.0 mongodb

4.进入mongodb目录

  cd mongodb

5.新建文件夹data

  mkdir data

  mkdir logs

 

 

 

 

配置Replica Sets,Config Server

 

※配置配置文件conf

# 1.start_mongod Shard1.conf

shardsvr=true

port=27017

dbpath=/data/database/shard1/

logpath=/data/logs/shard1.log

logappend=true

fork=true

replSet=s1

rest=true

journal=true

 

# 2.start_mongod Shard2.conf

shardsvr=true

port=27018

dbpath=/data/database/shard2/

logpath=/data/logs/shard2.log

logappend=true

fork=true

replSet=s2

rest=true

journal=true

 

# 3.start_mongod Shard3.conf

shardsvr=true

port=27019

dbpath=/data/database/shard3/

logpath=/data/logs/shard3.log

logappend=true

fork=true

replSet=s3

rest=true

journal=true

 

 

 

 

 

192.168.136.14

1.创建相应的文件夹(注意此处的testadmin是客户端登陆名)

mkdir -p /data/database/shard1
mkdir -p /data/database/shard2
mkdir -p /data/database/shard3
mkdir -p /data/database/config

mkdir -p /data/logs

 

2.配置mongod

./mongod --config /mongodb/shard1.conf

./mongod --config /mongodb/shard2.conf

./mongod --config /mongodb/shard3.conf

./mongod --config /mongodb/configsvr.conf

 

3.查看mongod的进程是否启动

ps aux | grep mongodb | grep -v grep

 

 

4.初始化replica sets(此处ip是对应的内网IP)

/testadmin/mongodb/bin/mongo --port 27017

   config = {_id: 's1', members: [{_id: 0,host: '192.168.136.14:27017',priority:5},{_id: 1, host: '192.168.136.26:27017',priority:2},{_id: 2, host: '192.168.136.16:27017',priority:.5},{_id: 3, host: '192.168.136.15:27017',arbiterOnly: true},{_id: 4, host: '192.168.136.29:27017', arbiterOnly: true}]}

     rs.initiate(config)
     rs.status()

 

192.168.136.15

1.创建相应的文件夹(注意此处的testadmin是客户端登陆名)

mkdir -p /data/database/shard1
mkdir -p /data/database/shard2
mkdir -p /data/database/shard3
mkdir -p /data/database/config

mkdir -p /data/logs

 

 

2.配置mongod

./mongod --config /mongodb/shard1.conf

./mongod --config /mongodb/shard2.conf

./mongod --config /mongodb/shard3.conf

./mongod --config /mongodb/configsvr.conf

 

3.查看mongod的进程是否启动

ps aux | grep mongodb | grep -v grep

 

4.初始化replica sets

/testadmin/mongodb/bin/mongo --port 27018

  config={_id: 's2', members: [{_id: 0, host: '192.168.136.15:27018',priority:5},{_id: 1, host: '192.168.136.26:27018',priority:2},{_id: 2, host: '192.168.136.14:27018',priority:.5},{_id: 3, host: '192.168.136.16:27018', arbiterOnly: true},{_id: 4, host: '192.168.136.29:27018', arbiterOnly: true}]}

  rs.initiate(config)

 

192.168.136.16

1.创建相应的文件夹(注意此处的testadmin是客户端登陆名)

mkdir -p /data/shard1
mkdir -p /data/shard2
mkdir -p /data/shard3
mkdir -p /data/config

mkdir -p /data/logs

 

 

2.配置mongod

./mongod --config /mongodb/shard1.conf

./mongod --config /mongodb/shard2.conf

./mongod --config /mongodb/shard3.conf

./mongod --config /mongodb/configsvr.conf

 

3.查看mongod的进程是否启动

ps aux | grep mongodb | grep -v grep

 

4.初始化replica sets

/testadmin/mongodb/bin/mongo --port 27019

 config={_id: 's3',members: [{_id: 0, host: '192.168.136.16:27019',priority:5},{_id: 1, host: '192.168.136.26:27019',priority:2},{_id: 2, host: '192.168.136.15:27019',priority:.5},{_id: 3, host: '192.168.136.14:27019', arbiterOnly: true},{_id: 4, host: '192.168.136.29:27019', arbiterOnly: true}]}
rs.status()

 

192.168.136.26,192.168.136.29分别执行如下:

1.创建相应的文件夹(注意此处的testadmin是客户端登陆名)

mkdir -p /data/shard1
mkdir -p /data/shard2
mkdir -p /data/shard3
mkdir -p /data/config

mkdir -p /data/logs

 

 

 

2.配置mongod

./mongod --config /mongodb/shard1.conf

./mongod --config /mongodb/shard2.conf

./mongod --config /mongodb/shard3.conf

 

3.查看mongod的进程是否启动

ps aux | grep mongodb | grep -v grep

 

 

 

配置Mongos(在每一台机子上建立路由)

/mongodb/bin/

./mongos --fork --port 40000 --logpath /data/logs/mongos.log --configdb 192.168.136.14:30000,192.168.136.15:30000,192.168.136.16:30000

 

 

 

 

 

添加分片

1连接任意一台,其他无需这样操作:

/home/testadmin/bin/mongo --port 40000
use admin
db.runCommand({addshard:'s1/192.168.136.14:27017,192.168.136.26:27017,192.168.136.16:27017'}) db.runCommand({addshard:'s2/192.168.136.15:27018,192.168.136.26:27018,192.168.136.14:27018'}) db.runCommand({addshard:'s3/192.168.136.16:27019,192.168.136.26:27019,192.168.136.15:27019'})

db.runCommand({ listshards:1 })

db.runCommand({ enablesharding:'weibo' })
db.runCommand({shardcollection:'weibo.test', key:{_id:1},
unique:true}) printShardingStatus()

db.data.stats();

 

 

 

三、用户认证

1.注意1.9.1之前复制集不支持用户认证,只能通过keyFile密匙文件,幸好这几天2.0正式版出来了,很多功能问题都已解决。呵呵

 

注意:用户验证,启动mongod必须添加--auth

#设置用户名和密码

>use test

>db.addUser('mongo','456123');

>db.auth('mongo','456123')

>db.system.users.find() --查看该用户是否添加成功

>db.system.users.remove('mongo','456123')

>mongo 数据库 -u mongo -p

 

注意:启动时必须添加--auth用户权限才会生效,第一次配置完成后,没效果就重启下。

 

 

 

 

四、鸭梨大了怎么办?添加服务器,怎么样添加呢?

1.如果读得鸭梨大了,则添加加slave节点,分散读得鸭梨。

启动后,在primary节点中添加节点

如:rs.add("10.168.0.100:27017") 当我们看到变为secondary后,就一切正常。

2.如果写的鸭梨打了,则可以添加一组shard节点分散写的鸭梨。

如:如上所述启动mongod,添加即可。

五、备份恢复策略

增量备份(添加延迟备份节点)

1、利用另外一台secondary机器传送数据

2、在新机器上中配置文件中添加fastsync=true配置(当需要从有数据中启动节点,那么必须加上fastsync=true否则启动会报错,如果是从主库直接同步所有数据,那么就不需要添加这个参数)

3、启动后,在primary节点中添加节点

如:rs.add("10.168.0.102:27017") 当我们看到变为secondary后,就一切正常,可以正常提供线上服务了

4、通过rs.conf()命令查看现在的节点信息(需要admin库密码权限)

5rs.remove("10.168.0.102:27017")删除节点

6、添加arbiter节点:rs.addArb("10.73.24.171:19003") 

7、添加延时备份机器:

rs.add({_id:5,host:"10.168.0.102:27017",priority:0,slaveDelay:300});

rs.add({_id:5,host:"10.168.0.102:27018",priority:0,slaveDelay:300});

rs.add({_id:5,host:"10.168.0.102:27019",priority:0,slaveDelay:300});

注意:slaveDelay单位秒.

8、出现这个错误时:replSet error RS102 too stale to catch up,我们可以db.printReplicationInfo()查看主库、从库的oplog信息

利用延迟备份节点恢复数据

1.    先把延迟备份节点的数据,备份到各节点的master机子上。如:

#./mongodump -h 192.168.136.14:27017 -d weibo -o /data/mongoback/

#./mongodump -h 192.168.136.15:27018 -d weibo -o /data/mongoback/

#./mongodump -h 192.168.136.16:27019 -d weibo -o /data/mongoback/

2.  把备份的数据导入到个节点的master上。如:

建议先修复下,压缩空间

db.repairDatabase();修复数据(和压缩(删除数据)空间)

./mongorestore -h 127.0.0.1:27017 --directoryperdb /data/mongoback --drop --indexesLast

./mongorestore -h 127.0.0.1:27018 --directoryperdb /data/mongoback --drop --indexesLast

./mongorestore -h 127.0.0.1:27019 --directoryperdb /data/mongoback --drop --indexesLast

 

全量备份(添加延迟备份节点)

1.  写好脚本定期凌晨备份数据,如:

./mongodump -h 10.168.0.187:40000 -d weibo -o /data/mongoback/

2.  恢复数据

3.  建议先修复下,压缩空间

4.       db.repairDatabase();修复数据(和压缩(删除数据)空间)

./mongorestore -h 10.168.0.187:40000 --directoryperdb /data/mongoback --drop --indexesLast

 

 

六、其他问题~

1.如果启动不成功,则尝试修复.如:

./mongod --port 27017 --repair --dbpath /data/database/shard1/

2如果master节点kill了,则起来之后通过rs.stepDown(100)让出master的位置。

3.其他问题请随时欢迎提出,联系我(李航),围脖:http://weibo.com/lidaohang~

 

相关内容

热门资讯

徐巧芯剖析赖清德:最怕自己丢掉... 海峡导报综合报道 大罢免投票一周年纪念活动26日举行,台北市长蒋万安出席并怒轰,民进党一年过后仍没有...
中国红十字会总会紧急向广东调拨... 记者从中国红十字会总会了解到,针对台风“红霞”给广东造成的灾情,中国红十字会总会启动四级应急响应,紧...
这些少年,正被“毒蛋”围猎 李梦抽了几口电子烟,吐出了白色的烟雾,有一股浓烈的水果香味。随后,她看着自己握电子烟的手,跟身边人说...
蒋万安号召“倒阁”,卢秀燕认为... 海峡导报综合报道 台北市长蒋万安27日抛出震撼议题,表示多名民代向他提议推动“倒阁”,要求台行政机构...
特朗普将在白宫会见两位重要客人 俄乌战争仍未结束,美伊冲突又有升级风险。在此背景下,美国总统特朗普将在白宫接见乌克兰和以色列领导人。...
新租客打扫卧室柜子上掉落4万元... 近日,莲前西路某小区内,张倩签下一套房子的租赁合同。当天上午,她带着12岁的大女儿周馨怡和11岁的小...
六部门通告:禁止涉军队退役报废... 关于禁止涉军队退役报废装备销售活动的通告近年来,部分经营者在线上线下公开销售涉及我军退役报废装备(指...
九寨沟景区发生泥石流,部分道路... 7月26日,九寨沟风景名胜区管理局发布泥石流灾害通报:2026年7月26日15时50分,九寨沟景区局...
空调26度不凉是什么原因 从空调内部元器件来说,不凉的原因有可能是温度传感器出现故障了,也有可能是空调压缩机或者铜管出现问题,...
鲸鸿动能携手香港国际机场、鸿蒙...   2026 年 7 月 25 日,十余位鸿蒙车主组成的车队从珠海出发,经港珠澳大桥通关抵达香港国际...