转载

MongoDB-集群搭建

条件有限,只在一台机器上模拟部署一下,相关参数就不写在配置文件里了,直接使用命令指定参数

这里我模拟三个服务器分别为 serverA,serverB,serverC

我是通过修改/etc/hosts 将他们d绑定到 127.0.0.1

# cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1   serverA serverB serverC

首先说明一下集群规划:

2个副本集用来分片

3个mongos路由服务

3个config配置服务器

如果是三台不同的服务器,完全可以用相同的端口号,这里都在同一个机器上,分配一下端口号:

serverA serverB serverC
mongos 30000 31000 32000
config 20000 21000 22000
rs0 27100 27200 27300
rs1 28100 28200 28300

整体规划图:

MongoDB-集群搭建

创建各自数据文件目录

# mkdir -p /data/serverA /data/serverB /data/serverC

# mkdir -p /data/serverA/config /data/serverB/config /data/serverC/config

# mkdir -p /data/serverA/rs0 /data/serverA/rs1 /data/serverB/rs0 /data/serverB/rs1 /data/serverC/rs0 /data/serverC/rs1

然后分别启动分片服务器副本集,配置服务器,路由服务器

启动serverA 服务器相关mongo服务

mongod --shardsvr --replSet rs0 --port 27100 --dbpath /data/serverA/rs0 --logpath /data/serverA/rs0.log --logappend --directoryperdb --fork

mongod --shardsvr --replSet rs1 --port 28100 --dbpath /data/serverA/rs1 --logpath /data/serverA/rs1.log --logappend --directoryperdb --fork

mongod --configsvr --port 20000 --dbpath /data/serverA/config --logpath /data/serverA/config.log --logappend --directoryperdb --forkmongos --configdb serverA:20000,serverB:21000,serverC:22000 --port=30000 --chunkSize=1 --logpath=/data/serverA/mongos.log --logappend --fork

其他服务器启动只是更改端口号和数据文件存储目录,这里就不再赘述,这里指定了分片时的块chunks大小为1M,能够更块的实现分片,其大小默认为64M

全部启动完成后,接下来配置副本集,配置分片。

配置副本集rs0:

连接到rs0任意一个节点

# mongo --port 27100

> use admin

switched to db admin

> config = {_id:"rs0", members:[{_id:0, host:"serverA:27100"}, {_id:1, host:"serverB:27200"}, {_id:2, host:"serverC:27300"}]}

> rs.initiate(config)

{ "ok" : 1 }

rs0:PRIMARY> rs.status()   查看副本集状态

默认情况下,次要节点是不能读取的,对每个副本集成员连接mongo shell 执行一下命令开启读取> db.getMongo().setSlaveOk()

rs1配置的步骤一样config = {_id:"rs1", members:[{_id:0, host:"serverA:28100"}, {_id:1, host:"serverB:28200"}, {_id:2, host:"serverC:28300"}]}

配置分片服务器:

连接到任意路由服务器

# mongo --port 30000

mongos> use admin

switched to db admin

mongos> db.runCommand({"addshard":"rs0/serverA:27100,serverB:27200,serverC:27300", allowLocal:true})

{ "shardAdded" : "rs0", "ok" : 1 }

mongos> db.runCommand({"addshard":"rs1/serverA:28100,serverB:28200,serverC:28300", allowLocal:true})

{ "shardAdded" : "rs1", "ok" : 1 }

mongos> sh.status()

--- Sharding Status ---

sharding version: {

"_id" : 1,

"minCompatibleVersion" : 5,

"currentVersion" : 6,

"clusterId" : ObjectId("571cacbe3b647b1179b65adf")

}

shards:

{  "_id" : "rs0",  "host" : "rs0/serverA:27100,serverB:27200,serverC:27300" }

{  "_id" : "rs1",  "host" : "rs1/serverA:28100,serverB:28200,serverC:28300" }

balancer:

Currently enabled:  yes

Currently running:  no

Failed balancer rounds in last 5 attempts:  0

Migration Results for the last 24 hours:

No recent migrations

databases:

{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }

Ok配置完毕,现在激活一个集合进行测试

mongos> sh.enableSharding("foo")

{ "ok" : 1 }

mongos> sh.shardCollection("foo.bar",{inc:1})

{ "collectionsharded" : "foo.bar", "ok" : 1 }

向集群插入50万条记录,文档格式为{"inc":i, "timestamp":new Date()}

# mongo --port 30000

mongos> use foo

switched to db foo

mongos> for(var i=1; i<=500000; i++){ db.bar.insert({"inc":i, "timestamp":new Date()}) }

插入完毕我们查看一下mongodb的状态,数据已经均匀分布到两个分片服务器上

MongoDB-集群搭建

那么每个副本集就都应该拥有一份数据的副本,来查看一下,如果连接不是副本集的主节点,并且在读取时报错,请执行> db.getMongo().setSlaveOk()

分别连接到27100和27200副本集的成员

查看foo数据库中,bar集合的总数

# mongo --port 27100

rs0:PRIMARY> use foo

switched to db foo

rs0:PRIMARY> db.bar.count()

251002

# mongo --port 27200

rs0:SECONDARY> db.getMongo().setSlaveOk()

rs0:SECONDARY> use foo

rs0:SECONDARY> db.bar.count()

251002

可以看到,数据已经成功复制

访问控制

默认情况下,MongoDB不启动访问控制,对于单机模式启动访问控制,只需在启动mongod 服务时添加 --auth 参数即可,但是在分片集群时,只能使用 keyfile的方式启动访问控制

首先生成 keyfile文件,并把这个文件复制到其他服务器上

# openssl rand -base64 741 > /data/mongodb/mongodb-keyfile

# chmod 600 mongodb-keyfile 重要

在启动访问控制之前,先添加一个超级管理员用户admin密码111111

连接任意一个mongos

# mongo --port 30000

mongos> use admin

switched to db admin

mongos> db.createUser({user:"admin", pwd:"111111", roles:[{role: "root", db: "admin" }]})

Successfully added user: {

"user" : "admin",

"roles" : [

{

"role" : "root",

"db" : "admin"

}

]

}

开启访问控制很简单,只需要重启集群,并在每个服务启动时添加 --keyFile /data/mongodb/mongodb-keyfile 即可

mongod --configsvr --port 20000 --dbpath /data/serverA/config --logpath /data/serverA/config.log --logappend --directoryperdb --fork --keyFile /data/mongodb/mongodb-keyfile

mongod --shardsvr --replSet rs0 --port 27100 --dbpath /data/serverA/rs0 --logpath /data/serverA/rs0.log --logappend --directoryperdb --fork --keyFile /data/mongodb/mongodb-keyfile

mongod --shardsvr --replSet rs1 --port 28100 --dbpath /data/serverA/rs1 --logpath /data/serverA/rs1.log --logappend --directoryperdb --fork --keyFile /data/mongodb/mongodb-keyfile

mongos --configdb serverA:20000,serverB:21000,serverC:22000 --port=30000 --chunkSize=1 --logpath=/data/serverA/mongos.log --logappend --fork --keyFile /data/mongodb/mongodb-keyfile

这样在连接到集群时,操作前前就需要验证用户身份了,验证有两种方式

一个是在连接时验证:mongo --port 30000 -u "admin" -p "111111" --authenticationDatabase "admin"

一个是连接后验证:> use admin > db.auth("admin", "111111")

end

接下来使用Java驱动对集群操作一下

原文  http://www.cnblogs.com/cyhe/p/5428436.html
正文到此结束
Loading...