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.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/
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~