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.16;8.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信息;
利用延迟备份节点恢复数据
- 先把延迟备份节点的数据,备份到各节点的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/
- 把备份的数据导入到个节点的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
全量备份(添加延迟备份节点)
- 写好脚本定期凌晨备份数据,如:
./mongodump -h 10.168.0.187:40000 -d weibo -o /data/mongoback/
- 恢复数据
- 建议先修复下,压缩空间
- 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)的更多相关文章
- MongoDB高可用架构:Replica Sets+Sharding
MongoDB的sharding解决了海量存储和动态扩容的问题.但是遇到单点故障就显得无能为力了.MongoDB的副本集可以很好的解决单点故障的问题.所以就有了Sharding+Replica Set ...
- MongoDB整理笔记のReplica Sets + Sharding
MongoDB Auto-Sharding 解决了海量存储和动态扩容的问题,但离实际生产环境所需的高可靠.高可用还有些距离,所以有了"Replica Sets + Sharding" ...
- 部署Replica Sets及查看相关配置
MongoDB 支持在多个机器中通过异步复制达到故障转移和实现冗余.多机器中同一时刻只有一台是用于写操作.正是由于这个情况,为MongoDB 提供了数据一致性的保障.担当Primary 角色的机器能把 ...
- 利用Mongodb的复制集搭建高可用分片,Replica Sets + Sharding的搭建过程
参考资料 reference: http://mongodb.blog.51cto.com/1071559/740131 http://docs.mongodb.org/manual/tutori ...
- Replica Sets+Sharding方案之真枪实弹篇
话说在虚拟机中会报各种错误.在真实的环境中就不会那么痛苦了. 想了一下虚拟机中报错的原因有. 机器卡,处理的时间长就会抛出错误 还有虚拟机假设给的空间太小.也会报异常. 此处讲讲我的大致思路. 第一, ...
- Mongodb集群搭建之 Sharding+ Replica Sets集群架构
1.本例使用1台Linux主机,通过Docker 启动三个容器 IP地址如下: docker run -d -v `pwd`/data/master:/mongodb -p 27017:27017 d ...
- NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署
NoSQL数据库Mongodb副本集架构(Replica Set)高可用部署 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MongoDB 是一个基于分布式文件存储的数据库.由 C ...
- Mongo的Replica Sets (复制集)的配置全过程和心得体会
http://blog.csdn.net/bloggongchang/article/details/7272403 一.MongoDB Replica Sets(副本集)简单的说就是有自动故障恢复功 ...
- 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 ...
随机推荐
- Codeforces Round #483 (Div. 2) D. XOR-pyramid
D. XOR-pyramid time limit per test 2 seconds memory limit per test 512 megabytes input standard inpu ...
- Archlinux安裝指南(uefi+gpt)
1.系统安装前的一些准备 首先在Archlinux官网下载镜像文件,然后刻录到U盘或光盘上.在我的机器上刻录arch镜像文件到U盘后启动不了,因为时间问题我没做过多的探索,所以后面直接刻录到光盘,用光 ...
- Shell脚本中获取select值
最近做一个数据清理,根据行号清理,所以需要查出这个行的最大最小值出来进行删除,如果靠手动每次去查,太麻烦所以就用在sh脚本当中执行SELECT语句,并将结果赋值给一个变量. sh脚本如下 #! /bi ...
- MYSQL数据库设计规范与原则
MYSQL数据库设计规范 1.数据库命名规范 采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; 命名简洁明确(长度不能超过30个字符); 例如:user, stat ...
- PAT1115:Counting Nodes in a BST
1115. Counting Nodes in a BST (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- Activity的生命之路
activity的生命周期这张图是最经典的了,下面我就说一下 这张图的脉络: 第一条线我们这么走 onCreate→onStart→onResume→onPause→onStop→onDestroy ...
- sql server 高可用日志传送
一. 日志传送概述 SQL Server使用日志传送,可以自动将主服务器的事务日志备份发送到一个或多个辅助数据库上.可选的监视服务器,记录备份和还原操作的历史记录及状态. 优点 提供灾难恢复解决方案 ...
- VM虚拟机安装centos详细图文教程
本教程贴,采用VM虚拟机进行安装, Ps:不懂VM使用的,可以百度一下 第一步,启动虚拟机,并进行新建---虚拟机·· 选择 从镜像安装,吧里有6.3镜像下载的链接的 然后, 下一步 . 选择客户机版 ...
- 深入js隐式类型转换
前言 相信刚开始了解js的时候,都会遇到 2 =='2',但是 1+'2' == '1'+'2'为false的情况,这时候应该会是一脸懵逼的状态,不得不感慨js弱类型的灵活让人发指,隐式类型转换就是这 ...
- 内连接查询 (select * from a join b on a.id = b.id) 与 关联查询 (select * from a , b where a.id = b.id)的区别
转自https://blog.csdn.net/l690781365/article/details/76261093 1.首先了解 on .where 的执行顺序以及效率? from a join ...