« AnyMongo在高版本perl下的编译Bug | (回到Blog入口) | Ubuntu 14下降级mysql遇见的问题 »

简单的实现mongodb集群

最近有个项目需求要用到mongodb集群和切片,网上有很多不错的文章,但对原理感兴趣的可以看下http://www.lanceyan.com/tech/arch/mongodb_shard1.htm 

本人以实战为主,以下是干货设置部分

以下操作只是在一台机器上做的,如果有多台机器则需要每台机器都按这样的步骤操作

首先要规划到数据库位置,我这里启用了一个mongos,2个配置服务器,3个数据库切片。

习惯上大家都是放在/data中,所以以下为创建所需目录的部分

mkdir -p /data/mongo/mongos/log

mkdir -p /data/mongo/config/data

mkdir -p /data/mongo/config/log

mkdir -p /data/mongo/config1/data

mkdir -p /data/mongo/config1/log

mkdir -p /data/mongo/shard1/data

mkdir -p /data/mongo/shard1/log

mkdir -p /data/mongo/shard2/data

mkdir -p /data/mongo/shard2/log

mkdir -p /data/mongo/shard3/data

mkdir -p /data/mongo/shard3/log

这样就创建好了我们所需要的目录。

 

 

 接下来就是启动服务了

mongod --configsvr --dbpath /data/mongo/config/data --bind_ip 127.0.0.1,192.168.0.1 --port 21000 --logpath /data/mongo/config/log/config.log --fork

mongod --configsvr --dbpath /data/mongo/config1/data --bind_ip 127.0.0.1,192.168.0.1--port 21001 --logpath /data/mongo/config1/log/config.log --fork

mongos --configdb 192.168.0.1:21000,192.168.0.2:21000,192.168.0.1:21001 --bind_ip 127.0.0.1,192.168.0.1--port 20000 --logpath  /data/mongo/mongos/log/mongos.log --fork

mongod --shardsvr --replSet shard1 --bind_ip 127.0.0.1,192.168.0.1--port 22001 --dbpath /data/mongo/shard1/data --logpath /data/mongo/shard1/log/shard1.log --fork

mongod --shardsvr --replSet shard2 --bind_ip 127.0.0.1,192.168.0.1--port 22002 --dbpath /data/mongo/shard2/data --logpath /data/mongo/shard2/log/shard2.log --fork

mongod --shardsvr --replSet shard3 --bind_ip 127.0.0.1,192.168.0.1 --port 22003 --dbpath /data/mongo/shard3/data --logpath /data/mongo/shard3/log/shard3.log --fork

注意bind_ip这参数,这个很关键,如果没有的话,则mongod默认监听所有的ip地址,也就是说,如果你的服务器正好有外网地址的话,相当于直接就暴漏了。

另外一个就是mongos中的configdb参数,这里的ip地址数可以为1个,也可以为奇数个,当为偶数个的时候会提示你地址错误,如果你可用的机器没有3台(本例中其实可用的机器sh2台),那就本地起三个不同端口的mongos服务然后就类似这样的配置就OK了。

如果所有服务都启动正常了,就可以开始进行集群配置了。

首先,我们要通过mongos去连接,而不是直接去操作数据库。简单的说,我们要去连接2000的端口,而不是22001,22002,22003。

在提醒一下,后继操作都需要在mongos里,千万不要直接连接到数据库去做任何与创建数据有关的操作。 

以下操作只需要操作一次就行了,不需要每台机器都这样。

连接到mongos

mongo  127.0.0.1:20000

 

切换到admin表

use admin

db.runCommand( { addshard : "shard1/192.168.0.1:22001,192.168.0.2:22001"});

db.runCommand( { addshard : "shard2/192.168.0.1:22002,192.168.0.2:22002"});

db.runCommand( { addshard : "shard3/192.168.0.1:22003,192.168.0.2:22003"});

这样集群就做好了,理论上来说,建议至少3台机器来做集群比较好,如果没钱的话,用单台机器去做反而性能更好些。毕竟文件同步,复制什么的都是需要开销的。

剩下的就是切片什么了,因为涉及切片规则,每个人的应用不一样,而且上面的文章里面人家也都写的很明确,我就略过了。

最后最后就是我对mongodb的一些个人意见。mongodb确实很好,但并不适用每个项目,它跟关系数据库直观上最大的区别就是要改变关系数据库的范式理念,否则开发起来将会是你的噩梦。

mongo适合于,数据内容不确定,很杂乱,无规律,无组织,无纪律,无xx,扯远了点。简单点说,如果把关系数据库看成一个必须要穿西装打领带才能进入的餐厅的话,那mongo则是路边的大排档,不管你穿的啥样,有钱没钱都可以平等对待。

最后就至少有2个人跟我抱怨过mongo会莫名其妙的丢失数据的问题,但具体发生的细节我也不清楚,所以我把这个问题留给你们来思考吧。

 

 

关于

此页面包含了发表于2016年2月 4日 09:56的 Blog 上的单篇日记。

此 Blog 的前一篇日记是 AnyMongo在高版本perl下的编译Bug

此 Blog 的后一篇日记是 Ubuntu 14下降级mysql遇见的问题

更多信息可在 主索引 页和 归档 页看到。

Creative Commons License
此 Blog 中的日记遵循以下授权 Creative Commons(创作共用)授权.
Powered by
Movable Type 6.3.2