MongoDB的分发模式和部署

MongoDB是近期一直在研究的No-SQL,作为No-SQL来说,Mongo做的反而更像传统的关系型数据库,可以利用弱关系进行查询。作为网站应用来说,毫不客气地说,如果你的查询复杂程度到了MongoDB无法支持的程度,只能说明你的数据结构设计的有问题。

作为No-sql的强项,MongoDB的数据分发/同步机制相对比MySQL灵活的多,支持传统上的主从同步和趋向于高性能的ShareSet,而且对于程序端来说改动相对较小,代价几乎可以不计。现在就从这两种分发机制方式说起。

Master-slaver机制

不同于MySQL的主从同步,MongoDB的主备同步有3种角色,primary(相当于Master), secondary(相当于Slave),Arbite(选举机)。正常情况下primary与secondary的配置要相当,因为很有可能主备切换,Arbite则没有被升格的可能(只有选举权,没有被选举权),正常情况下只是相当于一个心跳监控机而已。一旦p出现故障或者整个拓扑结构发生变化,导致P不能联系上大多数M之后,如果存在多台S需要升格成P的时候就需要A来进行选举。

Master-Slaver的部署

假设3台主机,主机名分别是 P S A,请注意Shell提示符

P# mongod –rest –replSet testSet

P# mongo

>cfg = {member:{host: “P:27017”}}
>  rs.initiate(cfg)

S# mongod –rest –replSet testSet
p#mongo

>rs.add(“S”)

{ “ok” : 1 }

A# mongod –rest –replSet testSet –oplogSize 8

p# mongo

>rs.add( { host:”A”, arbiterOnly:true } )

{ “ok” : 1 }

宣告成功!就这么简单!

如果之前一直按照此步骤的话,你就可以直接通过访问http://P:28017/来查看整个系统的状态。

理论上MongoDB可以支持互为主备,但个人觉得没有意义,反而会出现较多的一致性问题,没有在这里测试。

Sharding机制

不知道你会怎么理解”Sharding”这个单词,我的第一反应是罐头装的沙丁鱼。从拓扑结构上看,真的很像!

沙丁鱼有3种角色,shard,参与存储和运算的节点,要求数量多;config ,控制节点,保存有各个数据的哈希映射,及负载信息,相对来说是整个环节中的关键应用;mongos,路由节点,负责前端分发和数据汇总,相对来说是整个环节中的中央应用。客户端向任意一个Mongos发起请求,mongs首先从config上获取哈希映射,再通过哈希映射获取所有的数据后汇总给客户端。config不断的维系全局的数据分片,又有点类似心跳监视的意思。更加夸张的是,这种沙丁鱼结构支持嵌套,同样也支持嵌套上面的主从结构。

sharding的部署

这次还是3台机器,S1 S2 MS,S1 S2在做shard服务器的同时也兼作config,shard是27018口,config是27019口,都是默认的端口。

s1# mongod –shardsvr –replSet s1

s1# mongo

> cfg = { _id : “s1”, members : [ {_id : 0, host : “S1:27018”}, ] }

> rs.initiate(cfg)

s2# mongod –shardsvr –replSet s2

s2# mongo

> cfg = { _id : “s1”, members : [ {_id : 0, host : “S2:27018”}, ] }
> rs.initiate(cfg)

s1# mongod –configsvr

s2# mongod –configsvr

MS# mongos –configdb s1:27019,s2:27019

MS#mongo

> db.adminCommand( { addShard : “s1/s1:27018” } )

> db.adminCommand( { addShard : “s2/s2:27018” } )

恭喜完成了这么复杂的系统!需要注意的是整个系统中尽量使用主机名,通过hosts指向还是通过DNS无所谓,这是因为系统一旦启动就很难修改主机信息,IP地址远没有主机名灵活。

客户端的配置

算了,照贴PHP官档!

<?php

// 连接池方式,主机名之间用逗号隔开,然后添加array(“replicaSet” => true)
$m1 = new Mongo(“mongodb://sf2.example.com,ny1.example.com”, array(“replicaSet” => true));

// 可以只写一个连接,然后添加array(“replicaSet” => true)表示这是一个集群,系统将会获取完整的服务器列表
$m2 = new Mongo(“mongodb://ny1.example.com”, array(“replicaSet” => true));

?>

推荐阅读:
之前已经弄过许多篇关于LAMP
之前接触到的基于LAMP平台的
对于网站来说,琐碎文件是一个很
作为MySQL对于Web应用的

发表评论

电子邮件地址不会被公开。 必填项已用*标注

请补全下列算式: *

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据