MongoDB 集群(四)
MongoDB Sharding集群
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();