MongoDB安装使用简介

监控一切能监控的,记录一切能记录的!

公司网站的系统日志、bash日志已经通过rsyslog实时、统一记录处理,web访问日志还是零散存放。为了结局这个问题,准备启用Fluentd+MongoDB+……处理,现在开始逐步做一些准备工作。

简介

MongoDB是一个高性能,开源,无模式的文档型数据库,它在许多场景下可用于替代传统的关系型数据库或键/值存储模式。
一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(binary json)的形式存放于硬盘中,因此可以存储比较复杂的数据类型。
它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。
跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。
Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
Mongo还可以解决海量数据的查询效率,根据官方文档,当数据量达到50GB以上数据时,Mongo数据库访问速度是MySQL10 倍以上。

MongoDB是用C++开发,提供了以下功能:

  • 面向集合的存储:适合存储对象及JSON形式的数据。
  • 动态查询:Mongo支持丰富的查询表达式。查询指令使用JSON形式的 标记,可轻易查询文档中内嵌的对象及数组。
  • 完整的索引支持:包括文档内嵌对象及数组。Mongo的查询优化 器会分析查询表达式,并生成一个高效的查询计划。
  • 查询监视:Mongo包含一个监视工具 用于分析数据库操作的性能。
  • 复制及自动故障转移:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务 器之间的相互复制。复制的主要目标是提供冗余及自 动故障转移。
  • 高效的传统存储方式:支持二进制数据及大型对象(如照片或图片)。
  • 自动分片以支持云级别的伸缩性(处于早期alpha阶段):自动分片功能支持水平的数据库集群 ,可动态添加额外的机器。

MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统 (丰富的功能)架起一座桥梁,集两者的优势于一 身。

根据官方网站的描述,MongoDB适合用于以下场景:

  • 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
  • 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
  • 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对MapReduce引擎的内置支持。
  • 用于对象及JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储及查询。

MongoDB的使用也会有一些限制,例如它不适合:

  • 高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用 程序。
  • 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
  • 需要SQL的问题

其他:

  • BSON
    BSON是Binary JSON 的简称,是一个JSON文档对象的二进制编码格式。BSON同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型。如:BSON有Date类型和BinDate类型。
    BSON被比作二进制的交换格式,如同Protocol Buffers,但BSON比它更“schema-less”,非常好的灵活性但空间占用稍微大一点。
    BSON有以下三个特点:
    轻量级 跨平台 效率高

  • 命名空间
    MongoDB存储BSON对象到collections,这一系列的数据库名和collection名被称为一个命名空间。如同:java.util.List;用来管理数据库中的数据。

  • 索引
    mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引,建立索引就意味着增加空间开销。默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个unique的key为_id,通常用对象的ID比较合适,比如商品的ID。

MongoDB下载:

http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.4.9.tgz

MongoDB安装:

tar xvzf mongodb-linux-x86_64-2.4.9.tgz
mv mongodb-linux-x86_64-2.4.9 /usr/local/mongodb
echo 'PATH=$PATH:/usr/local/mongodb/bin/' >>  /etc/profile
source /etc/profile

只需要解压到相关目录即可,不需要编译安装

MongoDB启动与关闭:

在启动mongoDB之前,必须新建一个存放mongoDB数据和日志的目录

mkdir -pv /data/mongodb/data
touch /data/mongodb/logs

启动mongodb

mongod --dbpath=/data/mongodb/data /data/mongodb/logs --logappend &

查看mongodb的端口是否启动,默认是 27017,在启动服务器时,可以通过—port来指定

netstat -an -t|grep 27017
tcp    0    0 0.0.0.0:27017    0.0.0.0:*    LISTEN

关闭方法:

Killall mongod 或者是  kill [pid]

使用方法:

mongo
MongoDB shell version: 1.2.4-
url: test
connecting to: test
type "help" for help
> help
HELP
Show  dbs                    显示数据库名
show  collections            显示当前数据库中的集合集
show  users                  显示当前数据库的用户
show  profile                显示最后系统用时大于1ms的系统概要
use <db name>                切换到数据库
db.help()                    help on DB methods
db.foo.help()                help on collection methods
db.foo.find()                list objects in collection foo
db.foo.find( { a : 1 } )     list objects in foo where a == 1
it                           result of the last line evaluated; use to further iterate

> show dbs                   默认情况下有2数据库
admin
local
> use admin                  切换到admin数据库
switched to db admin
> show collections           显示admin数据库下面的集合集
system.indexes

新建数据库的方法
新建集合集:

> db.createCollection("user");
{ "ok" : 1 }
> show collections
system.indexes
user
>

插入数据:

> db.user.insert({uid:1,username:"Falcon.C",age:25});
> db.user.insert({uid:2,username:"aabc",age:24});  

查询数据:

> db.user.find();
{ "_id" : ObjectId("4b81e74c1f0fd3b9545cba43"), "uid" : 1, "username" : "Falcon.C", "age" : 25 }
{ "_id" : ObjectId("4b81e74d1f0fd3b9545cba44"), "uid" : 2, "username" : "aabc", "age" : 24 }

查询uid为1的用户信息

> db.user.find({uid:1});
{ "_id" : ObjectId("4b81e74c1f0fd3b9545cba43"), "uid" : 1, "username" : "Falcon.C", "age" : 25 }

更新数据

> db.user.update({uid:1},{$set:{age:26}})
> db.user.find();                        
{ "_id" : ObjectId("4b81e76f1f0fd3b9545cba45"), "uid" : 1, "username" : "Falcon.C", "age" : 26 }
{ "_id" : ObjectId("4b81e7701f0fd3b9545cba46"), "uid" : 2, "username" : "aabc", "age" : 24 }

> db.user.update({uid:1},{$inc:{age:-1}})

> db.user.find();                        
{ "_id" : ObjectId("4b81e76f1f0fd3b9545cba45"), "uid" : 1, "username" : "Falcon.C", "age" : 25 }
{ "_id" : ObjectId("4b81e7701f0fd3b9545cba46"), "uid" : 2, "username" : "aabc", "age" : 24 }

出 了以上的2种用法,更新的条件还有$unset、$push 、$pushAll 、$pop 、$pull 、$pullAll

其他

启动参数

mongod --help
** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
**       see http://blog.mongodb.org/post/137788967/32-bit-limitations for more
Allowed options:
General options:
-h [ --help ]             show this usage information
--version                 show version information
-f [ --config ] arg       configuration file specifying additional options
--port arg                specify port number
--bind _ip arg             local ip address to bind listener - all local ips bound by default
-v [ --verbose ]          be more verbose (include multiple times for more verbosity e.g. -vvvvv)
--dbpath arg (=/data/db/) directory for datafiles    指定数据存放目录
--quiet                   quieter output   静默模式
--logpath arg             file to send all output to instead of stdout   指定日志 存放目录
--logappend               appnd to logpath instead of over-writing  指定日志是以追加还是以覆盖的方式写入日志文件
--fork                    fork server process   以创建子进程 的方式运行
--cpu                     periodically show cpu and iowait utilization  周期性的显示cpu和io的使用情况
--noauth                  run without security  无认证模式运行
--auth                    run with security  认证模式运行
--objcheck                inspect client data for validity on receipt  检查客户端输入数据的有效性检查
--quota                   enable db quota management   开始数据库配额的管理
--quotaFiles arg          number of files allower per db, requires --quota  规定每个数据库允许的文件数
--appsrvpath arg          root directory for the babble app server  
--nocursors               diagnostic/debugging option  调试诊断选项
--nohints                 ignore query hints  忽略查询命中率
--nohttpinterface         disable http interface  关闭http接口,默认是28017
--noscripting             disable scripting engine  关闭脚本 引擎
--noprealloc              disable data file preallocation  关闭数据库文件大小预分配
--smallfiles              use a smaller default file size  使用较小的默认文件大小
--nssize arg (=16)        .ns file size (in MB) for new databases 新数据库ns文件的默认大小
--diaglog arg             0=off 1=W 2=R 3=both 7=W+some reads 提供的方式,是只读,只写,还是读写都行,还是主要写+部分的读模式
--sysinfo                 print some diagnostic system information 打印系统诊断信息
--upgrade                 upgrade db if needed  如果需要就更新数据库
--repair                  run repair on all dbs  修复所有的数据库
--notablescan             do not allow table scans  不运行表扫描
--syncdelay arg (=60)     seconds between disk syncs (0 for never)  系统同步刷新磁盘 的时间,默认是60s
Replication options:
--master              master mod e 主复制模式
--slave               slave mode  从复制模式
--source arg          when slave: specify master as <server:port> 当为从时,指定主的地址和端口
--only arg            when slave: specify a single database to replicate 当为从时,指定需要从主复制的单一库
--pairwith arg        address of server to pair with
--arbiter arg         address of arbiter server  仲裁服务器,在主主中和pair中用到
--autoresync          automatically resync if slave data is stale 自动同步从的数据
--oplogSize arg       size limit (in MB) for op log 指定操作日志的大小
--opIdMem arg         size limit (in bytes) for in memory storage of op ids指定存储操作日志的内存 大小
Sharding options:
--configsvr           declare this is a config db of a cluster 指定shard中的配置服务器
--shardsvr            declare this is a shard db of a cluster 指定shard服务器

告警

登入mongo后出现如下提示

** WARNING: You are running on a NUMA machine.
** We suggest launching mongod like this to avoid performance problems:
** numactl --interleave=all mongod [other options]

此问题是由于NUMA问题引起的,关于NUMA请移步这里

官方对此问题的解释:http://www.mongodb.org/display/DOCS/NUMA

解决办法:

  1. /proc/sys/vm/zone_reclaim_mode=0
  2. 启动命令前添加 numactl –interleave=all