一、环境

要构建一个 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.tgz为mongodb

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库密码权限)

5、rs.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/

  1. 把备份的数据导入到个节点的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/

  1. 恢复数据
  2. 建议先修复下,压缩空间
  3. 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的位置。

Mongo之架构部署(Replica Sets+Sharding)的更多相关文章

  1. MongoDB高可用架构:Replica Sets+Sharding

    MongoDB的sharding解决了海量存储和动态扩容的问题.但是遇到单点故障就显得无能为力了.MongoDB的副本集可以很好的解决单点故障的问题.所以就有了Sharding+Replica Set ...

  2. MongoDB整理笔记のReplica Sets + Sharding

    MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠.高可用还有些距离,所以有了"Replica Sets + Sharding" ...

  3. 部署Replica Sets及查看相关配置

    MongoDB 支持在多个机器中通过异步复制达到故障转移和实现冗余.多机器中同一时刻只有一台是用于写操作.正是由于这个情况,为MongoDB 提供了数据一致性的保障.担当Primary 角色的机器能把 ...

  4. 利用Mongodb的复制集搭建高可用分片,Replica Sets + Sharding的搭建过程

    参考资料 reference:  http://mongodb.blog.51cto.com/1071559/740131  http://docs.mongodb.org/manual/tutori ...

  5. Replica Sets+Sharding方案之真枪实弹篇

    话说在虚拟机中会报各种错误.在真实的环境中就不会那么痛苦了. 想了一下虚拟机中报错的原因有. 机器卡,处理的时间长就会抛出错误 还有虚拟机假设给的空间太小.也会报异常. 此处讲讲我的大致思路. 第一, ...

  6. Mongodb集群搭建之 Sharding+ Replica Sets集群架构

    1.本例使用1台Linux主机,通过Docker 启动三个容器 IP地址如下: docker run -d -v `pwd`/data/master:/mongodb -p 27017:27017 d ...

  7. NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署

    NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MongoDB 是一个基于分布式文件存储的数据库.由 C ...

  8. Mongo的Replica Sets (复制集)的配置全过程和心得体会

    http://blog.csdn.net/bloggongchang/article/details/7272403 一.MongoDB Replica Sets(副本集)简单的说就是有自动故障恢复功 ...

  9. Simple Automated Backups for MongoDB Replica Sets

    There are a bunch of different methods you can use to back up your MongoDB data, but if you want to ...

随机推荐

  1. java 保留字段volatile、transient、native、synchronized

    1.volatile Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程.当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享 ...

  2. Git Submodule简单操作

    基于组件的项目很多,但是如果直接用包的方式直接引用到项目中,如果出现问题很难进行调试的操作,也很难进行组件的优化和管理,所以写了一篇文章来介绍下git submodule的用法,用submodule可 ...

  3. Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)

    在前面章节的讨论中,我们一直基于一个假设:Linux中的时钟事件都是由一个周期时钟提供,不管系统中的clock_event_device是工作于周期触发模式,还是工作于单触发模式,也不管定时器系统是工 ...

  4. 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法

    比如Json.NET的JObject明明实现了IEnumerable<T>,具体来说是IEnumerable<KeyValuePair<string, JToken>&g ...

  5. log4j的配置与使用

    配置log4j的步骤如下: 1.导入jar包 如log4j-1.2.15.jar 2.在src下添加log4j.properties 使用时把下面内容中的注释去掉: //日志级别及位置 log4j.r ...

  6. pymysql和 SQLAlchemy在python下的使用

    #!/usr/bin/env python # -*- coding:utf-8 -*- from sqlalchemy import create_engine, Table, Column, In ...

  7. 【Richard 的刷(水)题记录】

    大概想了想,还是有个记录比较好. 9/24 网络流一日游: 最大流:bzoj1711[Usaco2007 Open]Dining 拆点 BZOJ 3993 Sdoi2015 星际战争 二分 P.S.这 ...

  8. bzoj2437 [Noi2011]兔兔与蛋蛋

    二分图博弈果然都是一个套路,必经点必胜,非必经点必败, 但是肯定不能每走一步就重新建图判断必胜还是必败,那么我们可以这样:每走一步就把这个点删掉,然后find他原来的匹配,如果找不到,就说明他是必经点 ...

  9. LuoguP4234_最小差值生成树_LCT

    LuoguP4234_最小差值生成树_LCT 题意: 给出一个无向图,求最大的边权减最小的边权最小的一棵生成树. 分析: 可以把边权从大到小排序,然后类似魔法森林那样插入. 如果两点不连通,直接连上, ...

  10. BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配

    BZOJ_4443_[Scoi2015]小凸玩矩阵_二分+二分图匹配 Description 小凸和小方是好朋友,小方给小凸一个N*M(N<=M)的矩阵A,要求小秃从其中选出N个数,其中任意两个 ...