Month: May 2015

  • 如何准备MongoDB 认证DBA考试 MongoDB certified DBA

    MongoDB公司最近启动了其技术人员认证程序。这里分享一些准备MongoDB DBA认证考试的技巧。 为什么要获得MongoDB DBA认证? 按照MongoDB官方的介绍:“认证可以帮助用户建议技术上的可靠性和MongoDB的能力,进而对用户运行在该平台上的应用程序提供可靠、熟练的技术支持。” MongoDB正发展为市场上最受青睐的NoSQL数据库。在支持海量数据以及易于横向扩展和管理的场景中十分灵活。不管是在云中还是非云的架构,许多公司都认为MongoDB将成为下一代的领头数据库。 随着mongodb用户的进一步增长,Mongodb的认证显然会让你在一段时间内有着求职优势。由于该认证考试仅仅在一年中的几个礼拜中可以考试,真正获得mongodb认证的开发人员和DBA数目并不会太多。 所以是时候开搞弄一个MongoDB认证了!   MongoDB公司提供的认证考试 MongoDB现在提供如下的认证: C100DBA: MongoDB Certified DBA Associate C100DEV: MongoDB Certified Developer Associate 不管是DBA还是DEV,mongoDB认证均会有三个级别:Associate、Professional和Master。目前为止MongoDB仅仅提供了其Associate专员级别(最低级别)的认证考试,其他的级别Professional和Master还在规划中(类似于OCP和OCM)。这里我们主要讨论MongoDB的DBA认证考试,其他的开发者Developer考试在今后的博客中讨论。 MongoDB DBA考试由哪几个部分组成? 按照MongoDB官方的说法:”一个MongoDB数据库管理员应当产品环境的mongodb数据库的运行时配置、进程、扩展、备份恢复、监控、和性能调优有着深入的理解。“ 我的看法是该dba考试设计的初衷是考验参考者的MongoDB配置、管理和监控技巧的动手能力。我已经在AWS上管理mongoDB的分片和复制集集群有好几年了,这样我就很有信心去通过认证考试。大多数问题都需要MongoDB的动手经验。 认证考试题目具有普遍的综合性,而且被分成了多个部分,每一个部分分钟7~10个小题目。 题目一般都是选择题,分成多选和单选题。也有部分题目是需要在模拟的Mongodb终端里输入正确的答案。 整个考试时长为90分钟,题目的总数并不确定,应当是动态生成的。没有分值比重,每一道题目的分数应当是一样的。 MongoDB特性 这个部分是测试考生对NOSQL和MongoDB的基本概念了解的。大部分题目都是关于JSON格式、collection和document,复制和分片的原理。如果你对NOSQL概念,RDBMS和noSQL的区别, Document Store文档存放与Key-value键值存放之间的区别都很了解的话,则该环节并不太困难。  CRUD操作 CRUD即create、read、update、delete4种操作,本环节讨论MongoDB中的所有CRUD操作。 主要集中在如何部分更新文档,更新mongodb中document的一系列知识 www.askmac.cn。该环节的问题直接了当,选项之间都是有着轻微的语法区别而已; 但如果完全没有动手经验仍很难取得佳绩。 Indexing 索引 此环节的问题主要测试用户对索引知识的深度; 大多数问题是从用户实际场景出发,如何为用户场景采用合适的索引是问题的关键。需要重点强调的是该环节更重视在适当的场景下配置合适的索引,而非关于语法正确与否。常规数据库和查询调优经验在本环节会有所帮助。 Aggregation聚集 Aggregation framework聚集框架在mongodb中算比较进阶的概念。此环节的问题很全面,有关于在使用聚集管道aggregation pipeline的场景。该场景为后续的多个题目提供背景。清楚的理解多个reducers操作 包括$match, $project, $group以及其语法在本环节十分重要。 Replication复制 本环节考察mongodb高可用特性replica set复制集的概念。问题主要围绕replica set的配置技术和最佳实践。 MongoDB的replica sets复制集,在复制集中的优先级,primary…

  • 快速部署有身份验证和授权的MongoDB Replica SET复制集

    在启用身份验证后, MongoDB将强制所有客户端在访问数据库前先做身份验证authentication。 Authorization, 授权允许管理员限制用户使用的资源和允许做的操作。 对于产品环境中使用mongodb replica set 复制集,必须启用Authentication 和Authorization。   所有的MongoDB部署均支持身份验证。 默认情况下MongoDB不检测是否授权用户。对于现有部署和新部署都可以启用身份验证和授权。 但是要启用它们必须有停机时间,无法对在线的mongodb做修改。 以下我们将部署一个三节点的replica set复制集,其中的三个节点: rep0.dbdao.com    默认的primary rep1.dbdao.com    Secondary rep2.dbdao.com   Secondary 注意以下所有操作均在ubuntu 上以root用户执行,如果你要以其他用户执行,请注意权限。 ubuntu启用-root账号 可以参考: https://www.askmac.cn/archives/ubuntu%E5%90%AF%E7%94%A8-root%E8%B4%A6%E5%8F%B7.html   1、首先创建必要的目录 三个节点均运行 su – root                                            …

  • MongoDB 用户角色授权与AUTH启用

    MongoDB中几种常用用户角色: dbAdmin 在db范围内包括下面的权限: collStats dbHash dbStats find killCursors listIndexes listCollections dropCollection 和 createCollection on system.profile only userAdmin在db范围内包括如下权限: changeCustomData changePassword createRole createUser dropRole dropUser grantRole revokeRole viewRole viewUser readAnyDatabase  对所有数据库中的collection可读,同时包含listDatabases权限 readWriteAnyDatabase  对所有数据库中的collection可读且可写,同时包含listDatabases权限 userAdminAnyDatabase 对所有数据库拥有userAdmin角色,同时包含listDatabases权限 dbAdminAnyDatabase 对所有数据库拥有dbAdmin角色,同时包含listDatabases权限 cluster相关的权限  clusterMonitor、hostManager、clusterManager、clusterAdmin root权限, 包含 readWriteAnyDatabase, dbAdminAnyDatabase, userAdminAnyDatabase 和 clusterAdmin 等角色。 但不能访问system. 开头的collection(root does not include any access to collections that begin with…

  • 【MySQL学生手册】MySQL架构概览 – MySQL架构

    章节中会介绍MySQL所使用的客户/服务器模型。你会了解:   对MySQL C/S模式的描述 理解通信协议(Communication Protocols) 理解服务器如何支持存储引擎 关于MySQL如何使用内存和磁盘空间的基础知识   2.1 MySQL架构概览   MySQL架构实际上是一组为了完成数据库服务器任务而协同工作的相关功能组合。这些功能集包含超过50,0000行代码。下图中对其中的功能子系统进行了分层展示,层级之间通过相应API进行交互。多数情况下,每个子系统会对信息进行接收,处理然后再传送给下一个子系统以完成所分配的任务。子系统之间相对独立,这样就会有更大的自由度(如由于执行语句的存储引擎独立性,客户端不必知道哪个存储引擎执行其请求)。   2.1.1 核心共享子系统(Core Shared Subsystems) 在MySQL中的每个子系统都能自成一章。由于篇幅所限,这里仅对每个核心共享子系统进行简单描述,以给大家对其性能特点有一个概括性理解。   进程,线程和资源管理器(Process, Thread and Resource Management): MySQL使用了一个基于线程的服务器架构,允许各种执行线程(或称为轻量级进程)访问核心共享资源。MySQL这种的多线程单进程架构能保证多个执行线程之间不会相互冲突或覆盖重要数据。使用基于线程的服务器架构最值得注意的优点是: 节约成本 – 和进程相比,线程的建立和销毁成本更低。新的线程可使用其父进程的地址空间而不需要额外的地址空间。 切换代价低 – 由于线程运行于相同的服务器进程空间中, 因此线程之间的切换代价很小。 极小的开销 – 由于线程可对父进程地址空间进行访问,因此在共享资源下开销也变得极小。   缓存(Cache/Buffer)管理: 此子系统专注于缓冲并取回服务器进程中所有线程执行所用的大量数据类型。由于已经将返回的数据进行内存缓存,因此数据缓存使得MySQL可以降低大量对于基于磁盘I/O代价昂贵的操作。   网络管理(Networking Management): 此子系统的职责是通过处理在多平台间发送和接收带有MySQL连接请求和命令的网络数据包这样的工作,使得各种通信协议(TCP/IP, 命名管道Named Pipes等)对连接线程变得透明。它也包括了处理安全套接字层(Secured Socket Layers: SSL)这样的工作。   日志管理: 这个子系统是为了将各种日志事件子类被维护在一个日志类下而建立的。这样能使得开发者能在不破坏系统核心功能的情况下增加日志和日志事件。通过对日志系统中子系统的区分。各种系统活动(启动,多语句事务,自动增量auto-increment值改变等)就可以通过子类事件进行记录。   访问及授权管理: 此子系统定义了所有为执行命令所需的GRANT权限并主要用于保证客户端和服务器间的安全。它会验证用户在登陆过程中的访问权限及查询权限。此子系统也包含了一些对授权表的内存版本修改功能及密码生成功能。  …

  • 快速部署MongoDB Replica Set复制集

    本文介绍如何快速部署MongoDB  Replica Set复制集,注意本文中的配置是不涉及授权验证的。 MongoDB版本为3.0.2 , 该部署全部在同一台服务器上完成,实际产品环境 Replica Set 中master和slave显然应当在不同的服务器上, 仅仅需要对本文中涉及IP的地方有所修改即可 我们假定用户已经成功安装mongoDB 3.0.2   启动 replica set的primary节点上的mongodb sudo mkdir -p /m01/mongo1 sudo mkdir -p /m01/mongo2 sudo mkdir -p /m01/mongo3 mongod -dbpath /m01/mongo1 –replSet “rs_maclean” –port 35001 –storageEngine wiredTiger & mongod -dbpath /m01/mongo2 –replSet “rs_maclean” –port 35002 –storageEngine wiredTiger & mongod -dbpath /m01/mongo3 –replSet “rs_maclean” –port 35003 –storageEngine…

  • MongoDB BSONObj size is invalid错误一例

    某个MongoDB数据库出现如下错误”assertion 10334 BSONObj size: 1684627202 (0x64695F02) is invalid. Size must be between 0 and 16793600(16MB) First element: EOO ns:local.oplog.$main query:{ query: {}, orderby: { $natural: -1 } }”一例:     2015-05-12T16:12:43.872+0800 I – ***** SERVER RESTARTED ***** 2015-05-12T16:12:43.883+0800 I – [initandlisten] MongoDB starting : pid=1697 port=27019 dbpath=arb/mongodb master=1 64-bit host=ubuntu 2015-05-12T16:12:43.883+0800 I – [initandlisten] 2015-05-12T16:12:43.884+0800…

  • MongoDB Aggregation聚集测试

    db.alpha.insert({_id:1, region:”NW1″, leads:1 , email: “[email protected]”}); db.alpha.insert({_id:2, region:”NW1″, leads:1 , email: “[email protected]”}); db.alpha.insert({_id:3, region:”NW1″, leads:2 , email: “[email protected]”}); db.alpha.insert({_id:4, region:”SE1″, leads:8 , email: “[email protected]”}); db.alpha.insert({_id:5, region:”SE2″, leads:4 , email: “[email protected]”}); db.alpha.insert({_id:6, region:”SE2″, leads:2 , email: “[email protected]”}); db.alpha.insert({_id:7, region:”SE2″, leads:4 , email: “[email protected]”}); db.alpha.insert({_id:8, region:”SW1″, leads:1 , email: “[email protected]”}); db.alpha.insert({_id:9, region:”SW1″, leads:2 , email: “[email protected]”}); db.alpha.insert({_id:10,…

  • MongoDB索引与排序

    对于下面的例子而言,mongoDB会如何处理这个查询?   ongos> db.users.insert({user: { login:”maclean”, desc:”maclean liu” , date : new Date(“2015-01-01”) }}); mongos> mongos> db.users.findOne(); { “_id” : ObjectId(“555179f2315a40007db97d3c”), “user” : { “login” : “maclean”, “desc” : “maclean liu”, “date” : ISODate(“2015-01-01T00:00:00Z”) } } mongos> db.users.ensureIndex( { “user.login” :1 , “user.date” :-1} , “myIndex” ); { “raw” : { “shard0.dbdao.com:35001” : { “createdCollectionAutomatically”…

  • MongoDB sharding collection 与 unique index

      MongoDB中对于已经分片的collection ,仅有索引对应的field是shard key is a prefix的情况才可以建unique index唯一索引,否则不能建为唯一索引。 例如: mongos> sh.status(); — Sharding Status — sharding version: { “_id” : 1, “minCompatibleVersion” : 5, “currentVersion” : 6, “clusterId” : ObjectId(“554b241f4df23a46a60f6a9c”) } shards: { “_id” : “shard0000”, “host” : “shard0.dbdao.com:35001” } { “_id” : “shard0001”, “host” : “shard1.dbdao.com:35001” } { “_id” : “shard0002”, “host” : “shard2.dbdao.com:35001″…

  • E11000 duplicate key & mongorestore

    mongorestore 可以将mongodump工具导出的数据导入到其他mongodb数据库中。 由于mongoDB中有_id字段总是作为主键存在,所以对于一般不会覆盖完全相同(包括_id)也相同的数据,因为如果导入的数据有重复的_id,那么会触发E11000 duplicate key错误。   例如     ac:~ maclean$ mongo MongoDB shell version: 3.0.2 connecting to: test > db.abc db.abc > db.duptest.insert({_id:10,x:10}); WriteResult({ “nInserted” : 1 }) > > ac:~ maclean$ mongodump -h localhost -p 27017 -d test -c duptest –out duptest 2015-05-11T22:22:36.743+0800 writing test.duptest to duptest/test/duptest.bson 2015-05-11T22:22:36.744+0800 writing test.duptest metadata to duptest/test/duptest.metadata.json…