Category Archives: NoSQL

MongoDB-Shard

关于MongoDB的分片,网上有许多资料。象Sharding IntroductionSimple Initial Sharding ArchitectureSharding Administration配置mongodb分片群集(sharding cluster)。但是这些文档对分片数据服务器mongod、配置服务器(config server)和路由服务器mongos的关系,都是一带而过。让我搜了半天才明白。现把我的理解记下来,要不然过几天我又忘了。 配置服务器实际上保持的是一个路由表。而路由服务器自己没有保存任何配置数据。路由服务器将什么数据在哪个分片(数据服务器)的信息保存到配置服务器中。配置服务器和分片数据服务器之间没有任何的物理连接关系。他们之间的逻辑关系也完全通过路由服务器来建立。不需要手工往配置服务器中添加有哪些分片数据服务器。而是再启动路由服务器时指定配置服务器,再往路由服务器服务器添加分片数据服务器。 试着用mongo连接到数据服务器,往里面插几条记录。那么基本上会发现,这些记录会保持到其中一个分片中。那是因为MongoDB会写完一个数据块才会分区。数据块的默认大小为64M,具体在config.settings中保存,可以直接修改这个值来修改数据块大小。所以平常要测试分区效果还是需要比较多的数据的。也不要试着用mongo连接到其中一个分片上,然后插入数据,试图从路由服务器上能够取到。因为在配置服务器里根本就没有这些数据保持在哪个分片的信息。只有通过路由服务器才会将这些信息保持到配置服务器中。 配置服务器只能是奇数个。可以是一个,也可以3个。我的理解就是一个复制集(replicate set)。 下面是用来建立测试环境的系统配置。有三个分片,每个分片两个数据服务器,一个仲裁服务器。3个配置服务器。一个路由服务器。按照时间情况可以将这些服务器配置到几个物理机器上,不需要美个服务器对应一个物理服务器。在脚本中有一个sleep语句。这个sleep配置在我的2010年的MBA上可以成功,如果机器不一样可以使用不一样的sleep值。

MongoDB-Security

在企业环境下开发应用,安全性往往是非常看重的。MongoDB的安全性设计理念就是依赖操作系统。这种设计理念可以使系统非常简单。而这种设计理念客户是否赞同就不得而知了。如果客户对此有所担心,如何给客户解释?如何提供更高一个层次的安全性? 关于怎么配置安全验证网上有不少人已经有翻译了。MongoDB本身的安全验证文档也写的很详细。本来打算用一个js脚本来设置安全验证。但是发现无法使用。从交互时shell可以使用use admin,use test之类的命令,但是使用js脚本却不行。在js里用下面这样的命令会报没有认证。 admin=connect(“192.168.0.100:27018/admin”) admin.addUser(“admin”, “admin”); admin.auth(“admin”, “admin”) test=admin.getDB(“test”) test.addUser(“test”, “test”); MongoDB本身提供了验证机制Authentication。假设应用部署在应用服务器A上,MongoDB部署在数据服务器S上。启动MongoDB时可以通过–bind_ip A来绑定只有A能访问。所有最终用户都要通过这个应用A来访问MongoDB。这种安全验证机制只有在两种情景下有用。 如果攻破应用服务器A和数据服务器S的难度不一样。攻破数据服务器要难一些 有多个系统用户(是系统用户,不是最终用户)。需要在系统用户之间隔离 否则就没有价值配置安全验证。因为MongoDB是否使用验证可以通过命令行来设置。服务器S被攻破,只要再次启动一下MongoDB把安全验证关掉,就可以完全控制了。如此我们只能说操作系统的安全性是牢不可破的。 那么如果客户对此还是不放心怎么办。那么只有从应用层入手了。在驱动层上加密,部分或者所有数据存到MongoDB时加密,读取时再解密。

MongoDB-建立复制集ReplicateSet

虽然MongoDB有相当不错的文档。但是要建立复制集还是要花点时间。所以我就写了一个脚本来建立复制集。复制集建立好了之后可以通过Rest 接口来查看状态。 在建立复制集合的时候有几个疑问。目前没有搞清楚。哪位牛人知道请告知一声。 如何使用localhost来添加节点。在生产环境下使用具体的IP地址非常正常。但是在测试环境下使用localhost就比较方便了。但是当我使用localhost的时候碰到下面问题。Google了一下也没有搜到答案。 rs.add(“127.0.0.1:27018”) { “assertion” : “can’t use localhost in repl set member names except when using it for all members”, “assertionCode” : 13393, “errmsg” : “db assertion failure”, “ok” : 0 } 用rs.initiate不带参数有时会成功,有时会不成功。原因应该也是在localhost上执行的问题。 如何同步执行js脚本。MongoDB中一个命令执行直接就返回了,是异步的。象初始化replicateSet这样的操作,需要几秒才能完成。如果用getLastError,那么又需要一个循环。所以我就简单的用了一个sleep。不知道有没有更好的方法来实现。 有三个节点的ReplicateSet,如果杀掉一个,能够自动将一个副节点变成主节点。但是杀掉两个之后,第三个就没有办法自动变成主节点了。不知道这算不算一个问题 建立复制集脚本如下。该脚本建立三个等同节点,也就是会有三份拷贝。 #!/bin/bash export bindir=/opt/mongodb-osx-x86_64-1.8.2/bin export datadir=/opt/mongodb-osx-x86_64-1.8.2/data killall mongod rm -rf “$datadir”/data1 “$datadir”/data2 “$datadir”/data3 mkdir -p “$datadir”/data1 “$datadir”/data2 […]

MongoDB-相关资料

这段时间在做一个软件模块。Review的时候一个牛人质疑为什么不用NoSQL。所以顺便看了一下MongoDB,看MongoDB的原因是她和关系型数据库比较类似。 MongoDB本身的文档组织的相当不错。基本的东西看一下就能明白。还有一本《MongoDB权威指南》,翻译的也不错。MongoDB开始使用非常简单。这应该是和无模式有关。这种组织方式在模式经常变化的时候就非常方便。 有几篇文章写的也不错。 Introduction to MongoDB MongoDB (Single-Server) Data Durability Guide MySQL和MongoDB设计实例对比 MongoDB与内存 MongoDB安全性初探 记一次MongoDB性能问题(在NoSQLFan上还有对NUMA的解释http://huoding.com/2011/08/09/104) MongoDB internals Inside MongoDB

MongoDB-为什么使用复制

本文意译自Why Replica Sets 网上有不少如何使用复制的文章,但是对为什么要使用复制却没找到。MongoDB官方文档有对为什么有详细的描述。我就顺手意译一下,因为一字一句的翻译我的能力不够。 复制集和单节点相比有五个优势。如果系统需要这五个特性当中的一个或几个,可以考虑使用复制集。 数据冗余:复制集会将应用数据自动保持多份。支持的驱动允许控制人们所关心的写是否持久问题。由于MongoDB将存储操作交给操作系统处理。至于操作系统多长时间会将数据刷到磁盘中,每个操作系统各有不同,但是一般都会有一定的时间间隔。所以操作返回了,数据并不保证会写到磁盘当中去。采用数据集方式就会将数据保持到多个节点中,以至于一个节点死掉还可以有节点保持数据。 自动故障恢复:复制集会协调是在一个集合中只有一个主节点。驱动会检测到集合中主节点的变化。在大部分情况下,这意味着客户端能够自动处理主节点失败,而不需要修改任何配置。从冷备份恢复通常会是一个相当耗时的操作。冷备份还有可能会导致数据丢失,因为备份会有一个时间间隔,这段时间的数据就有可能丢失了。而复制集相当于提供一个热备份,这通常会比冷备份更快,数据丢失也会更少。 读伸缩性:缺省情况下,所有的读写操作只会访问复制集当中的主节点。但是大部分驱动都提供一个slaveOkay的方式,用于指定特定操作可以在次节点执行。当使用slaveOkay时,读操作可以在多个节点之间共享。这种模式适合在单次写多次读时使用。 维护性:当系统升级、压缩、备份时,经常需要从系统中移除一个节点。复制集允许这样的操作在生产环境中使用。只要生产环境能够忍受移除单个节点就可以了,而是否能够忍受可以通过部署方案来实现。这也可以使系统可以实现象滚动升级这样的特性。 灾难恢复:复制集允许延迟副节点。操作在这个副节点上会延迟一段时间。这使在一些灾难时间时有一个恢复窗口时间,如错误的部署、删除了集合。

MongoDB-casbah驱动

MongoDB是一个不错的文档型NoSQL。MongoDB是NoSQL当中最流行的实现之一。她的简洁强大是我的最爱。 Scala是一个很不错的语言。不象Java那样冗余繁琐,使用起来纯粹为了工作,没有乐趣可言。Scala虽然目前还没有那么流行,但是我相信她会流行起来。 Casbah是MongoDB的官方驱动。所以先拿它玩玩。Casbah文档写的不错。 试着使用Casbah的时候,东搜西搜,让Casbah在Maven里使用起来。下面是我的pom文件。这当中casbah的type需要是pom,要不然无法编译通过。因为casbah本身没有jar,而只依赖一些子包。