mongodb集群配置

研究mongodb有一个多星期了,虽然总是有很多其他琐碎的事情要做,但是今天终于在虚拟机上把集群搭建成功了,现在我把我的学习经验总结一下,也算是巩固一下知识。

一、复制集群,这个相当于在同一服务器上实时备份数据库。

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}})

你可能感兴趣的:(数据库)