这两天在做mongodb集群的实验,然后写下这篇文章来总结一下也算是个笔记吧。

机器有限,就在一台机器上面做了,还是台虚拟机。。。

图就不画了(其实是画了,但是很难看就不帖出来了)

                                        IP:192.168.47.131

#########这三台实例组成shard1ReplSet####################

shard11:10011 

shard12:10012 

shard13:10013

#########这三台实例组成shard2ReplSet####################

Shard21:10021

Shard22:10022

Shard23:10023

#########三台nongos和三台configsvr的端口信息############

mongos   10041 10042 10043

configsvr 10031 10032 10033

#######################################################################

以上是本次搭建的端口信息

##################################################################

常规步骤:

tar xf mongodb-linux-x86_64-rhel62-3.4.2.tgz  解压

mv mongodb-linux-x86_64-rhel62-3.4.2 /mongodb 移动到根目录并重命名


添加环境变量(mongodb需要用到jdk,请自行安装,并添加环境变量)

JAVA_HOME=/usr/java/jdk1.8.0_121

CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

MONGO_HOME=/mongodb/bin

创建本次集群需要的目录:

mkdir -p /mongodb/data/{config1,config2,config3,shard1ReplSet11,shard1ReplSet12,shard1ReplSet13,shard2ReplSet21,shard2ReplSet22,shard2ReplSet23}

mkdir -p /mongodb/logs/{config1,config3,mongos42,shard1ReplSet11,shard1ReplSet13,shard2ReplSet22,config2,mongos41,mongos43,shard1ReplSet12,shard2ReplSet21,shard2ReplSet23}

创建log文件:

touch /mongodb/logs/config1/config1.log

touch /mongodb/logs/config2/config2.log 

touch /mongodb/logs/config3/config3.log

touch /mongodb/logs/shard1ReplSet11/10011.log

touch /mongodb/logs/shard1ReplSet12/10012.log

touch /mongodb/logs/shard1ReplSet13/10013.log 

touch /mongodb/logs/shard2ReplSet21/10021.log

touch /mongodb/logs/shard2ReplSet22/10022.log

touch /mongodb/logs/shard2ReplSet23/10023.log

touch /mongodb/logs/mongos41/10041.log

touch /mongodb/logs/mongos42/10042.log

touch /mongodb/logs/mongos43/10043.log

开始啦

1、分别启动各个configServer服务,分别占10031 10032 10033端口:

mongod --configsvr --replSet cfgReplSet --dbpath /mongodb/data/config1 --port 10031 --logpath /mongodb/logs/config1/config1.log --fork

mongod --configsvr --replSet cfgReplSet --dbpath /mongodb/data/config2 --port 10032 --logpath /mongodb/logs/config2/config2.log --fork

mongod --configsvr --replSet cfgReplSet --dbpath /mongodb/data/config3 --port 10033 --logpath /mongodb/logs/config3/config3.log --fork

看到提示successfully就是成功啦


连接到任意一台configsvr去创建configsvr的副本集(Replica Set)

连接:mongo --host 192.168.47.131 --port 10031

创建:rs.initiate({_id:"cfgReplSet", configsvr:true, members:[{_id:0,host:"192.168.47.131:10031"},{_id:1,host:"192.168.47.131:10032"},{_id:2,host:"192.168.47.131:10033"}]})

上面的端口是上面已经规划好了的,这个里面填的是configsvr的IP和端口


2、创建两个shard的副本集以及初始化

创建第一个Replica Set

以集群的方式启动分片shard11,shard12,shard13  占10011,10012,10013端口:

mongod --shardsvr --replSet shard1ReplSet --dbpath /mongodb/data/shard1ReplSet11 --port 10011 --logpath /mongodb/logs/shard1ReplSet11/10011.log --fork

mongod --shardsvr --replSet shard1ReplSet --dbpath /mongodb/data/shard1ReplSet12 --port 10012 --logpath /mongodb/logs/shard1ReplSet12/10012.log --fork

mongod --shardsvr --replSet shard1ReplSet --dbpath /mongodb/data/shard1ReplSet13 --port 10013 --logpath /mongodb/logs/shard1ReplSet13/10013.log --fork

连接任意一台分片服务器

mongo --host 192.168.47.131 --port 10011

将上面的三台启动好了的分片设置为一个Raplica Set

rs.initiate({_id:"shard1ReplSet",members:[{_id:0,host:"192.168.47.131:10011"},{_id:1,host:"192.168.47.131:10012"},{_id:2,host:"192.168.47.131:10013"}]})


创建第二个Replica Set

以集群的方式启动分片shard21,shard22,shard23,占10021,10022,10023端口:

mongod --shardsvr --replSet shard2ReplSet --port 10021 --dbpath /mongodb/data/shard2ReplSet21 --logpath /mongodb/logs/shard2ReplSet21/10021.log --fork

mongod --shardsvr --replSet shard2ReplSet --port 10022 --dbpath /mongodb/data/shard2ReplSet22 --logpath /mongodb/logs/shard2ReplSet22/10022.log --fork

mongod --shardsvr --replSet shard2ReplSet --port 10023 --dbpath /mongodb/data/shard2ReplSet23 --logpath /mongodb/logs/shard2ReplSet23/10023.log --fork

连接任意一台分片服务器

mongo --host 192.168.47.131 --port 10021

将上面的三台分片设置为Replica Set

rs.initiate({_id:"shard2ReplSet",members:[{_id:0,host:"192.168.47.131:10021"},{_id:1,host:"192.168.47.131:10022"},{_id:2,host:"192.168.47.131:10023"}]})



3、分别启动mongos,分别占:10041 10042 10043端口:

启动服务:

mongos --configdb cfgReplSet/192.168.47.131:10031,192.168.47.131:10032,192.168.47.131:10033 --port  10041  --logpath  /mongodb/logs/mongos41/10041.log --fork

mongos --configdb cfgReplSet/192.168.47.131:10031,192.168.47.131:10032,192.168.47.131:10033 --port  10042  --logpath  /mongodb/logs/mongos42/10042.log --fork

mongos --configdb cfgReplSet/192.168.47.131:10031,192.168.47.131:10032,192.168.47.131:10033 --port  10043  --logpath  /mongodb/logs/mongos43/10043.log --fork

上面填的是configsvr的信息(参照前面configsvr的定义)

登录一台路由:

mongo --host 192.168.47.131 --port 10041

添加分片到集群

sh.addShard("shard1ReplSet/192.168.47.131:10011,192.168.47.131:10012,192.168.47.131:10013")

sh.addShard("shard2ReplSet/192.168.47.131:10021,192.168.47.131:10022,192.168.47.131:10023")

将上面做的两个Replica Set 添加到路由

上面都没报错的话,mongodb的Replica Set和sharding就已经搭建好了。三个configsvr,mongos和六个分片随便down哪个都不会影响到数据


测试(连接到路由去测,如何登录路由看上面)

创建一个数据库

sh.enableSharding("test")

sh.shardCollection("test.Log", { id: 1})


插入10W条数据

use test

for(var i = 1; i <= 100000; i++){

  db.Log.save({id:i,"message":"message"+i});

}


db.Log.stats() 查看数据的存储情况

如果没做hashed的话shard1ReplSet这个分片里面应该只有1条数据,而剩下的99999条则存在shard2ReplSet上面(或者相反),这违背了我们的搭建初衷,所以

db.Log.drop()  删库

sh.shardCollection("test.Log",{id: "hashed"}) 重建一个库,并且定义id字段为hashed


for (var i = 1; i<= 100000; i++){

db.Log.save({id:i,"message":"message"+i});

}

再次查看就能发现数据均匀的分布在两个Replica Set上面。


排除的话:

1。看日志

2。OR: child process failed, exited with error number 100 这个是上面目录启动重合了,里面已经有一个mongod.lock了,所以换一个目录或者删掉这个lock文件(按照我的实验步骤来的话不建议)

3。OR: child process failed, exited with error number 1   这个是你命令里面定义了log的位置,但是没有定义到具体的文件,定义到具体文件后解决。


大概步骤的总结和我对mongodb集群的理解(我只是个初学者,理解错了请各位大神轻喷)

理解mongodb:

Replica Set 官方解释是副本集,本人理解,他就是多台机器的集合,这个集合内的机器有自动容错功能和自动恢复功能,一台挂了之后不影响业务

shard 这个是用来存放实际数据的节点

mongodb集群的话就是讲一堆shard设置为replica set。让这堆shard拥有读写分离以及replica set的其他功能。然后呢,就是configsvr了,后台一堆节点,配置文件放哪?数据存哪?读写来了怎么走?

这些都是由configsvr来解决的,再然后就是mongos(router),前面一堆的shard对外提供数据存储服务,对于客户端的连接来说,我到底连哪台呢?这个是个问题,所以,设置mongos之后就不用纠结这些问题了直接连router就好了,具体读写啥的在哪台shard上面就不用你来操心了。

步骤的总结:

1.所有的配置文件服务器,连接到其中一台并创建一个配置文件服务器的Replca Set(保证配置文件服务器高可用)

2.所有的分片节点,连接到任意一台并创建shard节点的Replca Set(节点的高可用,可以设置多个shard的replica set)

3.置文件服务器的信息启动所有的路由mongos,连接到任意一台mongos并把分片的添加到集群