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 ...
随机推荐
- SQL语句的CRUD
一.基础 .说明:创建数据库 CREATE DATABASE database-name .说明:删除数据库 drop database dbname .说明:备份sql server --- 创建 ...
- sqlserver两种分页方法比较
-- 3000 page(从1开始) 10 pagesize -- 方法1(效率不高): SELECT TOP 10 * FROM [xxx].[oooo] WHERE id NOT IN (SELE ...
- 在Mac OS X中配置Apache + PHP + MySQL 很详细
这是一篇超级详细的配置mac os下面php+mysql+apache的文章.非常详细我的大部分配置就是参考上面的内容的,比如,PHP不能连接数据库,就是改一下默认的php.ini中pdo_mysql ...
- Oracle-13:Oracle中的表分区
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客记录了表分区 表分区的含义: 典型的拿空间换时间的案例! 表分区对一张表进行分区,分区之后表中的数据存 ...
- Python爬虫-尝试使用人工和OCR处理验证码模拟登入
刚开始在网上看别人一直在说知乎登入首页有有倒立的汉字验证码,我打开自己的知乎登入页面,发现只有账号和密码,他们说的倒立的验证码去哪了,后面仔细一想我之前登入过知乎,应该在本地存在cookies,然后我 ...
- 基于 HTML5 OpenLayers3 实现 GIS 电信资源管理系统
前言 通过结合 HTML5 和 OpenLayers 可以组合成非常棒的一个电信地图网络拓扑图的应用,形成的效果可以用来作为电信资源管理系统,美食定位分享软件,片区找房,绘制铁轨线路等等,各个领域都能 ...
- Kafka元数据缓存(metadata cache)
经常有人问的一个问题就是:Kafka broker到底是不是无状态的?网上有这样的说法: 正常情况下consumer会在消费完一条消息后线性增加这个offset.当然,consumer也可将offse ...
- rabbitmq 脑裂(网络分区)
1.产生的原因 https://blog.csdn.net/zyz511919766/article/details/45198055 2.相关配置.如何规避 https://blog.csdn.ne ...
- 求第n个丑数
参考http://www.cppblog.com/zenliang/articles/131094.html 什么是因子:因子*因子=乘积数如果一个数是丑数,那么这个数是2,3,5的乘积的结果.比如: ...
- 将函数声明为Static的作用
表示静态函数,它为所有类共有的.调用该函数直接使用类名加上修饰符,如:Windows win;Windows::W_SIZE();而不是:win.W_SIZE();静态函数只能处理静态数据成员,不能处 ...