MongoDB 的分布式属性(replication and sharding)

来源:互联网 发布:大学软件开发专业课程 编辑:程序博客网 时间:2024/06/03 19:16

Replica Set (cluster)

A replica set in MongoDB is a group of mongod processes that maintain the same data set. 

其中,一个primary,多个secondary,写只能在primary上

arbiter:不存数据,只参与选举

一致性:写操作返回可以配置为

1)全部副本写成功(complete),2)多数(majority),3)只是primary写成功,4)仅仅是成功交给primary(fire and forget)




一个replica set 配置:

var replConfig = {_id: replSet1,members: [{_id: 0, host: "localhost:30001", priority: 10},{_id: 1, host: "localhost:30002", priority: 9},{_id: 2, host: "localhost:30003", priority: 9}]}rs.initiate(replConfig)
配置很简单,就是起了个replica set名字,列出哪些mongod 实例属于这个replica set, 每个mongod 指定一个priority。这些mongod之间相互rpc,心跳,fault detect, 自动发起选举。


Sharding(partition)

Sharding is a method for distributing data across multiple machines



MongoDB的 sharding模型:



多个Router(mongos) ,以及Shard和Config Server一般对应一个replica set而非一个mongod,都是体现了HA。精简一下,基本的关系可以是



shard server和 config server都是普通的mongod,其实无需--shardsvr或 --configsvr参数,只需显示指定端口号就行了。

Shard Server

即存储实际数据的分片,每个Shard可以是一个mongod实例,也可以是一组mongod实例构成的Replica Set。为了实现每个Shard内部的auto-failover,MongoDB官方建议每个Shard为一组Replica Set。

 

Config Server

为了将一个特定的collection存储在多个shard中,需要为该collection指定一个shard key,例如{age: 1} ,shard key可以决定该条记录属于哪个chunk。Config Servers就是用来存储:所有shard节点的配置信息、每个chunk的shard key范围、chunk在各shard的分布情况、该集群中所有DB和collection的sharding配置信息。

 

Route Process

这是一个前端路由,客户端由此接入,然后询问Config Servers需要到哪个Shard上查询或保存记录,再连接相应的Shard进行操作,最后将结果返回给客户端。客户端只需要将原本发给mongod的查询或更新请求原封不动地发给Routing Process,而不必关心所操作的记录存储在哪个Shard上


Router process相当于一个DAL,shard server, config server都是普通的mongoDB 实例。基本db + 外层DAL路由和代理,这是所有sharding实现的基本原理。

配置sharding的关键步骤

1)配置启动shard server, config server,

mongod --port 3001 --dbpath /data/shard0

mongod --port 3002 --dbpath /data/shard1

mongod --port 4000 --dbpath /data/shardconfig

2)启动mongos,关键参数:config server的end point 

mongos --port --configdb localhost:4000

3) 用mongo shell连上 mongos进行配置:

mongo admin --port 40000

a) 添加shard server

> db.runCommand({ addshard:"localhost:3001" }) 

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

> db.runCommand({ addshard:"localhost:3002" })

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

b) 设置分片存储的数据库

> db.runCommand({ enablesharding:"test" }) 

{ "ok" : 1 }

b) 设置分片的集合名称。且必须指定Shard Key,系统会自动创建索引

> db.runCommand({ shardcollection: "test.users", key: { id:1 }}) 

{ "collectionsharded" : "test.users", "ok" : 1 }



参考文献:

https://docs.mongodb.com/manual/sharding/

https://docs.mongodb.com/manual/replication/

http://gong1208.iteye.com/blog/1622078




0 0
原创粉丝点击