一、复制集群,这个相当于在同一服务器上实时备份数据库。
1、创建数据文件存储路径,即数据库存储路径
# mkdir -p /data/data/r0
# mkdir -p /data/data/r1
# mkdir -p /data/data/r2
2、创建日志文件路径
# mkdir -p /data/log
3、创建主从key文件,用于标识集群的私钥的完整路径,如果各个实例的key file内容不一致,程序将不能正常用。
# mkdir -p /data/key
# echo "this is rs1 super secret key" > /data/key/r0
# echo "this is rs1 super secret key" > /data/key/r1
# echo "this is rs1 super secret key" > /data/key/r2
# chmod 600 /data/key/r*
4、启动3个实例
# cd /mongo/bin
#./mongod --replSet rs1 --keyFile /data/key/r0 --fork --port 27017 --dbpath /data/data/r0 --logpath=/data/log/r0.log --logappend
#./mongod --replSet rs1 --keyFile /data/key/r1 --fork --port 27018 --dbpath /data/data/r1 --logpath=/data/log/r1.log --logappend
#./mongod --replSet rs1 --keyFile /data/key/r2 --fork --port 27019 --dbpath /data/data/r2 --logpath=/data/log/r2.log --logappend
启动三个实例相当于启动了三个mongodb服务器进程
5、配置及初始化Replica Sets(复制集群)
# ./mongo --port 27017
>config_rs1={_id:'rs1',members:[
{_id:0,host:'localhost:27017',priority:1},
{_id:1,host:'localhost:27018'},
{_id:2,host:'localhost:27019'}]
}
>rs.initiate(config_rs1);
6、查看复制集状态
>rs.status()
或者
>rs.isMaster()
7、从主库插入数据,从库进行查询操作
#./mongo --port 27017
>db.c1.insert({age:30})
ctrl+c退出
#./mongo --port 27018
>db.getMongo().setSlaveOk()
8、增减节点,即从复制集中增加或删除一个数据库
配置并启动新节点,启动27020这个端口给新的节点
#mkdir -p /data/data/r3
#echo "this is rs1 super secret key">/data/key/r3
#chmod 600 /data/key/r3
#./mongod --replSet rs1 --keyFile /data/key/r3 --fork --port 27020 --dbpath /data/data/r3 --logpath=/data/log/r3.log --logappend
添加此节点到现有的Replica Sets
>rs.add("localhost:27020"}
进行数据同步:
>rs.status()
减少节点:
>rs.remove("localhost:27020")
二、分片(sharding)
分片可以将海量数据水平扩展到不同的数据库中,数据分表存储在sharding的各个节点上,MongoDB的数据分块称为chunk。每个chunk都是collection(集合)中一段连续的数据记录,通常最大尺寸是200MB,超出则生成新的数据块。
1、启动Shard Server(分片服务器)
#mkdir -p /data/shard/s0
#mkdir -p /data/shard/s1
#mkdir -p /data/shard/log
#cd /mongo/bin
#./mongod --shardsvr --port 20000 --dbpath /data/shard/s0 --fork --logpath /data/shard/log/s0.log --directoryperdb
#./mongod --shardsvr --port 20001 --dbpath /data/shard/s1 --fork --logpath /data/shard/log/s1.log --directoryperdb
2、启动config server(服务器进程)
#mkdir -p /data/shard/config
#./mongod --configsvr --port 30000 --dbpath /data/shard/config --fork --logpath /data/shard/log/config.log --directoryperdb
3、启动route process(路由服务器进程)
#./mongos --port 40000 --configdb localhost:30000 --fork --logpath /data/shard/log/route.log --chunkSize 1 //如果是不同的服务器可将localhost修改为当前服务器ip且每台服务器执行一次此命令
4、配置sharding
#./mongo admin --port 40000 //如果是两台服务器可选择一台作为主服务器执行此命令,只需执行一次,localhost分别为两台服务器的ip
>db.runCommand({addshard:"localhost:20000"})
>db.runCommand({addshard:"localhost:20001"})
>db.runCommand({enablesharding:"test"})
>db.runCommand({shardcollection:"test.users",key:{_id:1}})
5、验证sharding正常工作
#./mongo --port 27017
>use test
>for(var i=1;i<=500000;i++)db.users.insert({age:i,name:"wangwenlong",}) //此处会等上几秒钟或者更长时间
>db.users.stats()
三、Replica Set+Sharding(集群+分片)
使用Replica Sets,确保每个数据节点都具有备份、自动容错转移、自动恢复能力。
使用3个配置服务器,确保元数据完整性
使用3个路由进程,实现负载平衡,提高客户端接入性能
1、创建数据目录
在ServerA上:
#mkdir -p /data/shard1_1
#mkdir -p /data/shard2_1
#mkdir -p /data/config
在ServerB上:
#mkdir -p /data/shard1_2
#mkdir -p /data/shard2_2
#mkdir -p /data/config
在ServerC上:
#mkdir -p /data/shard1_3
#mkdir -p /data/shard2_3
#mkdir -p /data/config
2、配置shard1所用到的Replica Sets
在ServerA上:
#cd /mongo/bin
#./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_1 --logpath /data/shard1_1/shard1_1.log --logappend --fork
在ServerB上:
#./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_2 --logpath /data/shard1_2/shard1_2.log --logappend --fork
在ServerC上:
#./mongod --shardsvr --replSet shard1 --port 27017 --dbpath /data/shard1_3 --logpath /data/shard1_3/shard1_3.log --logappend --fork
用mongo连接其中一台服务器的27017端口的mongodb,初始化Replica Sets “shard1”:
#./mongo --port 27017
>config={_id:'shard1',members:[{_id:0,host:'192.168.53.85:27017'},{_id:1,host:'192.168.53.94:27017'},{_id:2,host:'192.168.53.100'}]}
>rs.initiate(config)
2、配置shard2所用到的Replica Sets
在ServerA上:
#cd /mongo/bin
#./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_1 --logpath /data/shard2_1/shard2_1.log --logappend --fork
在ServerB上:
#./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_2 --logpath /data/shard2_2/shard2_2.log --logappend --fork
在ServerC上:
#./mongod --shardsvr --replSet shard2 --port 27018 --dbpath /data/shard2_3 --logpath /data/shard2_3/shard2_3.log --logappend --fork
用mongo连接其中一台服务器的27018端口的mongodb,初始化Replica Sets “shard2”:
#./mongo --port 27018
>config={_id:'shard2',members:[{_id:0,host:'192.168.53.85:27018'},{_id:1,host:'192.168.53.94:27018'},{_id:2,host:'192.168.53.100'}]}
>rs.initiate(config)
3、配置3台config server
在serverA、B、C上执行:
./mongod --configsvr --dbpath /data/config --port 20000 --logpath /data/config/config.log --logappend --fork
4、配置3台route process
./mongos --configdb 192.168.53.85:20000,192.168.53.94:20000,192.168.53.100:20000 --port 30000 --chunkSIze 1 --logpath /data/mongos.log --logappend --fork
5、配置shard cluster
连接其中一台机器的端口30000的mongos进程,并切换到admin数据库做以下配置:
./mongo --port 30000
>usr admin
>db.runCommand({addshard:"shard1/192.168.53.85:27017,192.168.53.94:27017,192.168.53.100:27017"});
>db.runCommand({addshard:"shard2/192.168.53.85:27018,192.168.53.94:27018,192.168.53.100:27018"});
>db.runCommand({enablesharding:"test"})
>db.runCommand({shardcollection:"test.users",key{_id:1}})