目录
  1. 1. 安装
  2. 2. 配置
    1. 2.1. 创建目录
    2. 2.2. 配置文件
    3. 2.3. 启动/停止
  3. 3. MongoDB用户管理
    1. 3.1. 创建用户
    2. 3.2. 删除用户
    3. 3.3. 修改用户角色
  4. 4. MongoDB数据库操作
    1. 4.1. 创建数据库
    2. 4.2. 查询
    3. 4.3. 删除
  5. 5. Python操作MongoDB
    1. 5.1. pymongo操作MongoDB
  6. 6. MongoDB主从复制
    1. 6.1. 无验证主从配置
    2. 6.2. 有验证的主从配置
  7. 7. MongoDB备份恢复

 最近需要用Python对MongoDB进行操作,所以简单对MongoDB做了些了解,记录以备方便查阅。

安装

 从官网上下载源码包(在CentOS6.4 64bit上安装MongoDB2.6.11)。下载完后直接解压到目标目录(这里使用的是/usr/local/mongodb)

 配置环境变量,这步非必要,配上只是为了方便,不配的话就要写绝对路径

1
2
3
4
5
6
7
8
9
10
#添加环境变量
$ vim /etc/profile
export MONGODB_HOME=/usr/local/mongodb
export PATH+=:$MONGODB_HOME/bin

#使环境变量生效
$ source /etc/profile

#检查环境变量是否生效
$ mongod --version

配置

 配置及设置都来源于MongoDB2.6官方文档

创建目录

 创建相关目录

1
2
mkdir /usr/local/mongodb/{log,etc}
mkdir -p /data/dbdata

配置文件

 配置文件/usr/local/mongodb/etc/mongodb.conf

1
2
3
4
5
6
7
8
9
10
11
dbpath=/data/dbdata
logpath=/usr/local/mongodb/log/mongodb.log
pidfilepath=/usr/local/mongodb/mongodb.pid
logappend=true
port=27017
fork=true
smallfiles = true
#noauth=true
auth=true
#nojournal = true
#noprealloc = true

  • dbpath:指定数据存储路径
  • logpath:指定日志路径
  • logappend:写日志模式,true为追加,默认覆盖
  • port:指定监听端口
  • fork:后台运行,true为守护进程运行,默认false
  • noauth:用户认证,默认true
  • nojournal:禁止操作日志,64位系统2.0版本后默认是启用journal日志(journal=true)。journal是redo log,开启journal日志可确保数据安全,开启journal日志后默认100ms会将内存中的数据写入到journal日志文件中。
  • smallfiles:使用较小的默认数据文件大小,smallfiles会减少数据文件的初始大小,并限制到512M,也减少了日志文件的大小,并限制到128M。假若数据库很大,各持有少量的数据,会导致mongodb创建很多文件,会影响性能
  • noprealloc:禁用预分配方式。预分配方式是为了保证写入性能的稳定,预分频会预先生存若干文件并都用0进行填充。让MongoDB始终保持额外的空间和空余的数据文件,从而避免IO阻塞。假若禁用预分频(noprealloc=true)会使得MongoDB启动时间缩短但写入性能可能会下降。

 MongoDB默认是没有权限验证的!在生产环境下,为安全考虑必须启用验证。生产环境下可如下操作:

  1. 首次启动MongoDB前不配置auto=true选项(MongoDB默认noauth=true),启动MongoDB进入MongoDB Shell创建用户
  2. 创建完用户后停止MongoDB,开启auto=true选项,启用用户验证后再启动MongoDB。

启动/停止

启动MongoDB

1
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf

停止MongoDB

1
2
3
4
5
6
7
8
9
#方法一:
$ kill -2 pid

$ kill -4 pid

#方法二:
$ /usr/local/mongodb/bin/mongo
> use admin;
> db.shutdownServer();

MongoDB用户管理

 MongoDB默认是不会进行安全验证也没有管理员账号,为了安全考虑需要创建用户及权限设置
 MongoDB默认就是noauth,先启动后直接登录MongoDB shell,然后使用MongoDB内置方法createUser(addUser为旧方法)添加账号
createUser方法包含四个参数:

  • user:用户名
  • pwd:密码
  • roles:指定用户的角色,此选项必须为数组可为空[]。所有内置角色详见这里
    Example:
    1
    2
    3
    4
    5
    6
    7
    8
    roles: [
    { role: "read", db: "reporting" },
    { role: "readWrite", db: "accounts" },
    { role: "userAdminAnyDatabase", db: "admin" }
    ]

    roles: [{ role: "userAdminAnyDatabase", db: "admin" }] #管理员权限,有用户管理权限但各个数据库仍需要再各自授权
    roles: [{ role: "root", db: "admin" }] #管理员权限,最大权限

创建用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$  mongo
> use admin
> db.createUser({
... user: "test",
... pwd: "mogl",
... roles: [{role: "read", db: "admin"}, {role: "readWrite", db: "local"}]
... });
Successfully added user: {
"user" : "test",
"roles" : [
{
"role" : "read",
"db" : "admin"
},
{
"role" : "readWrite",
"db" : "local"
}
]
}
> show collections;
system.indexes
system.users
system.version
> db.system.users.find();
{ "_id" : "admin.test", "user" : "test", "db" : "admin", "credentials" : { "MONGODB-CR" : "dce6309d11410ce1bdd249fecd9700a5" }, "roles" : [ { "role" : "read", "db" : "admin" }, { "role" : "readWrite", "db" : "local" } ] }

 创建用户后,停止MongoDB,注释noauth=true语句,添加auto=true。启动MongoDB后进行认证登陆

1
2
3
$> mongo 127.0.0.1/admin -utest -p
#或
$> mongo admin -utest -p

 如果是在admin库对其他库授权,登陆的时候需要制定认证的admin库。如上例子中,用户test是在库admin对库local授权,登陆时则需:

1
$> mongo local -u test -p --authenticationDatabase admin

 旧版的MongoDB使用的是db.addUser('username', 'password'),默认拥有所有数据库所有权限。db.addUser('username', 'password', true),拥有所有数据库的只读权限。

删除用户

1
> db.dropUser("username");

修改用户角色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> show users;
{
"_id" : "admin.root",
"user" : "root", "db" : "admin",
"roles" : [ {
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}

> db.updateUser('root',
... {roles: [{role: 'root', db: 'admin'}]}
... );

MongoDB数据库操作

 记录MongoDB数据库的增删查改等操作

创建数据库

 MongoDB创建数据库只需要use database_name即可,但创建库后必须插入一条数据,否则离开后库系统自动删除刚刚use的库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
> use mydb
> switched to db mydb

#usr是collection_name,可理解为'表名'
> db.usr.insert({'name': 'mogl'});
WriteResult({ "nInserted" : 1 })

> show collections;
system.indexes
usr
> db.usr.find();
{ "_id" : ObjectId("55ed032aaaabebb7d6ffb58e"), "name" : "mogl" }
> show dbs;
admin 0.031GB
local 0.031GB
mydb 0.031GB
test (empty)

查询

1
> db.zabbix_log.find().limit(5).pretty();
  • zabbix_log:collection名
  • limit(5):限制输出5个记录
  • pretty():格式化显示
1
>db.zabbixLog.find().sort({$natural: -1}).limit(1).pretty();
  • sort({$natural: -1}):逆序

删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
> use mydb
#删除一条记录
> db.foo.remove({"id":"bar"})

#清空foo中所有记录,但foo这个collection不会被删除
> db.foo.remove()

#仅删除一条符合查询的记录
> db.restult.remove({'error_code': 9}, {justOne: true});
WriteResult({ "nRemoved" : 1 })

#删除foo这个collection.show collections不会有foo,但查看数据文件发现大小不变,Mongodb不会自动释放文件空间
> db.foo.drop()
#使MongoDB释放不需要的空间
> db.repairDatabase()

Python操作MongoDB

 安装pymongo

1
pip install pymongo

pymongo操作MongoDB

 详细内容查看pymongo文档

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/python

import pymongo

host = 'mongodb.host'
port = 27017
user = 'username'
pwd = 'password'
db_name = 'mydb'
collection_name = 'mycollection'

#noauth
#mongo_con = pymongo.Connection(host, port)

#auth
mongo_client = pymongo.MongoClient("%s:%d" % (host, port))
mongo_client[db_name].authenticate(user, pwd, db_name, mechanism='MONGODB-CR')
mongo_db = mongo_client[db_name]
mongo_collection = mongo_db[collection_name]

#操作
count = mongo_collection.count()


insert_data = {'pv': pv,
'code_200': code_200,
'error_code': error_code
}
mongo_collection.insert(insert_data)

MongoDB主从复制

 一个MongoDB主从复制集群里只能有主节点,主节点将所有collection的变动记录到oplog(类似MySQL的binlog),从节点将oplog复制并应用操作实现数据一致。

  • 主节点:负责接收数据并写入数据库
  • 从节点:通过复制主节点的oplog保持数据一致。若主节点挂了,有多个从节点时会从中选举新的主节点。
  • 投票节点:不包含数据,仅在选举中起作用,当选举结果出现平局时通过投票节点选出新的主节点。

无验证主从配置

  • 主节点
    /usr/local/mongodb/etc/mongodb.conf配置文件上新增,主节点启动后在local库下会生成oplog.$main的collection

    1
    2
    master=true
    oplogSize=2048 #oplog日志大小,单位M
  • 从节点
    /usr/local/mongodb/etc/mongodb.conf配置文件上新增

    1
    2
    3
    4
    slave=true
    source=host:port #指定主mongodb server
    slavedelay=10 #延迟复制,单位为s
    autoresync=true #从节点数据不是最新时,自动向主节点同步数据

有验证的主从配置

官方文档
 需要验证的主从涉及到keyFile的验证,需要利用openssl生成keyFile(可不用openssl而选择其他工具)
 在主节点生成keyFile并在配置文件指定路径,将keyFile复制到从节点并在配置文件指定路径

1
2
3
4
$> cd /usr/local/mongodb
$> openssl rand -base64 741 > mongodb-keyfile
$> chmod 600 mongodb-keyfile
$> echo 'keyFile=/usr/local/mongodb/mongodb-keyfile' >> /usr/local/mongodb/etc/mongodb.conf

MongoDB备份恢复

  • MongoDB备份

    1
    2
    3
    4
    5
    6
    7
    8
    #备份特定collection
    $> mongodump --host mongodb.example.net --port 27017 --db test --collection some --username backup --password passwd

    #备份所有数据库
    $> mongodump --host mongos3.example.net --port 27017

    #备份特定数据库
    $> mongodump --host mongodb.example.net --port 27017 --db test --username backup --password passwd
  • MongoDB恢复

    1
    2
    #从/data/backup中恢复test库的名为some的collection
    mongorestore --host mongodb.example.net --port 27017 --db test --collection some --username backup --password password /data/backup

Powered: Hexo, Theme: Nadya remastered from NadyMain