MongoDB 集群(四)

原创
2016/11/21 22:40
阅读数 126

MongoDB Sharding集群

 

Diagram of a sample sharded cluster for production purposes.  Contains exactly 3 config servers, 2 or more ``mongos`` query routers, and at least 2 shards. The shards are replica sets.

sharding通过将数据集分布于多个也称作分片(shard)的节点上来降低单节点的访问压力。每个分片都是一个独立的数据库,所有的分片组合起来构成一个逻辑上的完整意义的数据库。因此,分片机制降低了每个分片的数据操作量及需要存储的数据量

A。shards:分片,即数据结点,存储数据和执行计算。为了保证高可用和数据一致性,生产环境中shards应该做成 replicasets(防止丢失数据)。集群中有一个primary shards,执行非分片的任务。

B。mongos(query routers):查询路由,负责client的连接,并把任务分给shards,然后收集结果。一个集群中可以有多个query routers(replica sets),以分担客户端请求(负载均衡)。

C。config server:配置服务器。保存了集群的元数据(比如数据放在哪个shards上),query router通过config server中的配置信 息决定把任务分配到哪个shards上。从3.2开始,config servers可以做成replica sets

shares:

    node1  mongodb.conf

  • dbpath=/usr/data/mongodb/shares/shares/node1/data/db
  • logpath=/usr/data/mongodb/shares/shares/node1/log/mongodb.log
  • logappend=true
  • fork=true
  • bind_ip=192.168.1.1
  • port=27033
  • replSet=shareset
     

    node2 mongodb.conf

  • dbpath=/usr/data/mongodb/shares/shares/node2/data/db
  • logpath=/usr/data/mongodb/shares/shares/node2/log/mongodb.log
  • logappend=true
  • fork=true
  • bind_ip=192.168.1.1
  • port=27034
  • replSet=shareset

    node3 mongodb.conf

  • dbpath=/usr/data/mongodb/shares/shares/node3/data/db
  • logpath=/usr/data/mongodb/shares/shares/node3/log/mongodb.log
  • logappend=true
  • fork=true
  • bind_ip=192.168.1.1
  • port=27035
  • replSet=shareset

启动并初始化副本集:rs.initiate({"_id":"shareset",members:[{"_id":1,"host":"192.168.1.1:27033"},{"_id":2,"host":"192.168.1.1:27034"},{"_id":3,"host":"192.168.1.1:27035"}]})

config: 

   config  mongodb.conf

  • dbpath=/usr/data/mongodb/shares/config/data/db
  • logpath=/usr/data/mongodb/shares/config/log/mongodb.log
  • logappend=true
  • fork=true
  • bind_ip=192.168.1.1
  • port=27032
  • configsvr=true
  • replSet=configset

   config1 mongodb.conf

  • dbpath=/usr/data/mongodb/shares/config1/data/db
  • logpath=/usr/data/mongodb/shares/config1/log/mongodb.log
  • logappend=true
  • fork=true
  • bind_ip=192.168.1.1
  • port=27031
  • configsvr=true
  • replSet=configset

 启动并初始化副本集:rs.initiate({"_id":"configset",members:[{"_id":1,"host":"192.168.1.1:27032"},{"_id":2,"host":"192.168.1.1:27031"}]})

mongos:

    mongodb.conf

  • #dbpath=/usr/data/mongodb/shares/mongos/data/db
  • logpath=/usr/data/mongodb/shares/mongos/log/mongodb.log
  • logappend=true
  • fork=true
  • bind_ip=192.168.1.1
  • port=27030
  • configdb=configset/192.168.1.1:27031,192.168.1.1:27032
  • #replSet=mongosconfig
     

启动  mongos --config mongodb.conf

把分片shares加入到集群,并观察状态

  • mongos> sh.addShard("shareset/192.168.1.1:27033")
  • { "shardAdded" : "shareset", "ok" : 1 }
  • mongos> sh.status()
  • --- Sharding Status --- 
  •   sharding version: {
  •     "_id" : 1,
  •     "minCompatibleVersion" : 5,
  •     "currentVersion" : 6,
  •     "clusterId" : ObjectId("583407ec56229b3fb91c7d4e")
  • }
  •   shards:
  •     {  "_id" : "shareset",  "host" : "shareset/192.168.1.1:27033,192.168.1.1:27034,192.168.1.1:27035" }
  •   active mongoses:
  •     "3.2.11" : 1
  •   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:
     

设置数据库分片

在设置集合分片之前,必须设置要分片的数据库。连接mongos:

mongo --host <hostname of machine running mongos> --port <port mongos listens on>

执行:

sh.enableSharding("<database>")或者db.runCommand( { enableSharding: <database> } )

设置集合分片

1)确定集合的shard key。如果集合已经有数据,那么在shard key上创建index。如果没有数据,集群会自动为shard key创建索引

2)将集合加入分片

sh.shardCollection("<database>.<collection>", shard-key-pattern)

如:

sh.shardCollection("records.people", { "zipcode": 1, "name": 1 } )  shard key 为zipcode,如果有相同的zipcode再根据name来分

sh.shardCollection("people.addresses", { "state": 1, "_id": 1 } )      同上

sh.shardCollection("assets.chairs", { "type": 1, "_id": 1 } )               同上

sh.shardCollection("events.alerts", { "_id": "hashed" } )                  hash分片

 

 

 

备注

  mongoos没有副本集,假如挂了,应用都不能用了

 

 查看分片信息,分片是作用到集合上(表上)  看到区间,分片在哪个地方,哪个字段上

   db.chunks.find().toArray() 

   db.collection.find().toArray();

   db.database.find().toArray();  primary 数据库没有指定分片,会找主的分片进行存储               sh.status();

db.spring.status();

 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部