MongoDB集群与分片搭建

Mongodb集群与分片
说明
架构图:
               Server1             Server2                Server3

Shard1

Shard2

              






注释:
1. 分别在3台机器上运行一个mongod实例(称为mongod shard11,mongod shard12,mongod shard13) 组成replica set1,作为cluster的shard1。
2. 分别在3台机器上运行一个mongod实例(称为mongod shard21,mongod shard22,mongod shard23) 组成replica set2,作为cluster的shard2。
3. 分别在3如机器上运行一个mongod实例,作为3个config server。
4. 在一个机器上运行一个mongos实例,用于客户端连接。
主机 IP 端口信息
Server1 172.26.2.88 Mongod shard11:27017
Mongod shard12:27018
Mongod shard1:20000
Mongos:30000
Server2 172.26.2.89 Mongod shard11:27017
Mongod shard12:27018
Mongod shard1:20000
Mongos:30000
Server3 172.26.2.99 Mongod shard11:27017
Mongod shard12:27018
Mongod shard1:20000
Mongos:30000

步骤
创建数据目录:
Server1:
mkdir –p /home/mongo/data/shard11
mkdir –p /home/mongo/data/shard21
Server2:
mkdir –p /home/mongo/data/shard12
mkdir –p /home/mongo/data/shard22
Server3:
mkdir –p /home/mongo/data/shard13
mkdir –p /home/mongo/data/shard23

配置shard1用到的replSet
Server1:
  ./mongod -shardsvr -replSet shard1 -port 27017 -dbpath /home/mongo/data/shard11/ -oplogSize 100 -logpath /home/mongo/log/shard11.log -logappend –fork
Server2:
./mongod -shardsvr -replSet shard1 -port 27017 -dbpath /home/mongo/data/shard12/ -oplogSize 100 -logpath /home/mongo/log/shard12.log -logappend –fork
Server3:
./mongod -shardsvr -replSet shard1 -port 27017 -dbpath /home/mongo/data/shard13/ -oplogSize 100 -logpath /home/mongo/log/shard13.log -logappend –fork

初始化replSet
  连接任意一台机器的mongo:
  ./mongo localhost:27017
  config = {_id:"shard1",members:[{_id:0,host:'172.26.2.88:27017'},{_id:1,host:'172.26.2.89:27017'},{_id:2,host:'172.26.2.99:27017'}]}  或
config={_id:"shard1",members:[{_id:0,host:'172.26.2.88:27017',priority:2},{_id:1,host:'172.26.2.89:27017'},{_id:2,host:'172.26.2.99:27017'}]}

rs.initiate(config)
rs.status()

配置shard2用到的replSet:
Server1:
  ./mongod -shardsvr -replSet shard2 -port 27018 -dbpath /home/mongo/data/shard21/ -oplogSize 100 -logpath /home/mongo/log/shard21.log -logappend –fork
Server2:
./mongod -shardsvr -replSet shard2 -port 27018 -dbpath /home/mongo/data/shard22/ -oplogSize 100 -logpath /home/mongo/log/shard22.log -logappend –fork
Server3:
./mongod -shardsvr -replSet shard2 -port 27018 -dbpath /home/mongo/data/shard23/ -oplogSize 100 -logpath /home/mongo/log/shard23.log -logappend –fork

初始化replSet:
  连接任意一台机器的mongo:
  ./mongo localhost:27018
config={_id:"shard2",members:[{_id:0,host:'172.26.2.88:27018',priority:1},{_id:1,host:'172.26.2.89:27018',priority:2},{_id:2,host:'172.26.2.99:27018'}]}
rs.initiate(config)
rs.status()

配置3机器的config
Server1:
./mongod -configsvr -dbpath /home/mongo/data/config -port 20000 –logpath /home/mongo/config/config.log -logappend –fork
Server2:
./mongod -configsvr -dbpath /home/mongo/data/config -port 20000 -logpath /home/mongo/config/config.log --logappend --fork
Server3:
./mongod -configsvr -dbpath /home/mongo/data/config -port 20000 -logpath /home/mongo/config/config.log --logappend –fork

配置mongos
./mongos -configdb 172.26.2.88:20000,172.26.2.89:20000,172.26.2.99:20000 -port 30000 -chunkSize 1 -logpath /home/mongo/log/mongos.log -logappend –fork

配置分片
登陆mongos  admin
./mongo 172.26.2.88:30000/admin

加入shards
如果shard是单台服务器,用:
>db.runCommand({ addshard :“<serverhostname>[:<port>]”})

如果shard是replica sets,用:
>db.runCommand({ addshard : “replicaSetName/<serverhostname>[:<port>],<serverhostname>[:<port>]..”})
如本机执行:
db.runCommand({ addshard:"shard1/172.26.2.88:27017,172.26.2.89:27017,172.26.2.99:27017",name:"p1",maxsize:20480})

db.runCommand({ addshard:"shard2/172.26.2.88:27018,172.26.2.89:27018,172.26.2.99:27018",name:"p2",maxsize:20480})
注释:
name为用于置顶shard的名字,不指定的话系统自动分配
maxsize为指定各个shard可用的最大磁盘空间

查看shard是否添加成功
>db.runCommand({listshards:1})
如果列出了以上两个shards,表示添加成功

激活数据库分片
>db.runCommand({enablesharding:”<dbname>”})
通过执行以上命令,可以让数据库跨shard,如果不执行这步,数据库只会存放在一个shard,一旦激活数据库分片,数据库中不同的 collection将被存放在不同的shard上,但一个collection仍旧存放在同一个shard上,要使单个collection也分片,还 需单独对collection作些操作

如:

>db.runCommand({enablesharding:"test"})
查看数否生效:

>db.printShardingStatus()
   sharding version: { "_id" : 1, "version" : 3 }
    shards:
       {  "_id" : "s1",  "host" :        "shard1/192.168.10.207:27017,192.168.10.208:27017,192.168.10.209:27017" }
       {  "_id" : "s2",  "host" : "shard2/192.168.10.207:27018,192.168.10.208:27018,192.168.10.209:27018" }
         databases:
       {  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
       {  "_id" : "test",  "partitioned" : true,  "primary" : "s1" }
注释:

一旦enable了个数据库,mongos将会把数据库里的不同数据集放在不同的分片上。除非数据集被分片(下面会设置),否则一个数据集的所有数据将放在一个分片上。

Collection分片
db.runCommand({ shardcollection : "<namespace>",key : <shardkeypatternobject>})
例如:
db.runCommand({shardcollection:”test.colle1”,key:{id:1}})
常用命令:
设置从库可读
从库执行:db.getMongo().setSlaveOk();
  创建Collections
db.createCollection(name, { size : ..., capped : ..., max : ... } )创建非分布式数据集,相当于关系型数据库中的表,别看后面一堆参数,其实通常用的就db.createCollection(name)这个命令,比如db.createCollection(“coll_1”)
  创建Collection索引
db.coll_1.ensureIndex({"id":1}),第一个参数为字段名,第二参数值为1则索引为升序;-1则为降序
  删除Collections
       db.coll_1.drop(),删数据集
删除数据
db.coll_1.remove(query)
删除索引
db.coll_1.dropIndex(name) 删除指定的索引;
db.coll_1.dropIndexes()删除所有索引;
db.coll_1.getIndexes()查看索引信息
删除带有分片的Collection
         db.colle2.drop()
查询插入相关
db.coll_1.count(query);db.coll_1.find(query );db.coll_1.insert(obj);db.coll_1.update(query, object[, upsert_bool]);db.coll_1.save(obj);
查看分片状态
       db.printShardingStatus();
查看Collection状态
       db.collect2.stats()
  

导入导出
导出:
   ./mongoexport -h localhost -p 30000 -d test -c colle3 -o /home/mongo/colle3.dat
-h 服务器
-p 端口号
-d 数据库名
-c  Collection名
-o 导出路径
-f  指定要导出的字段
-csv 导出为csv格式
导入:
./mongoimport -h localhost -p 30000 -d test -c collec2 /home/mongo/colle3.dat
隐式创建collection.
备份恢复
备份:
     ./mongodump -h localhost -p 30000 -d test -o /home/mongo/test.dmp
-h 服务器
-p 端口号
-d 数据库名
-c  Collection名
-o 导出路径
   默认创建test.dmp目录

恢复:
./mongorestore -h localhost -p 30000 -d test  /home/mongo/test.dmp/*
    可通过./mongorestore –help 查询

猜你喜欢

转载自jason0606.iteye.com/blog/1945790