最近需要用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
2mkdir /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
11dbpath=/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默认是没有权限验证的!在生产环境下,为安全考虑必须启用验证。生产环境下可如下操作:
- 首次启动MongoDB前不配置
auto=true
选项(MongoDB默认noauth=true
),启动MongoDB进入MongoDB Shell创建用户 - 创建完用户后停止MongoDB,开启
auto=true
选项,启用用户验证后再启动MongoDB。
启动/停止
启动MongoDB1
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/etc/mongodb.conf
停止MongoDB1
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
8roles: [
{ role: "read", db: "reporting" },
{ role: "readWrite", db: "accounts" },
{ role: "userAdminAnyDatabase", db: "admin" }
]
roles: [{ role: "userAdminAnyDatabase", db: "admin" }] #管理员权限,有用户管理权限但各个数据库仍需要再各自授权
roles: [{ role: "root", db: "admin" }] #管理员权限,最大权限
创建用户
1 | $ mongo |
创建用户后,停止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 | > show users; |
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 | > use mydb |
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
的collection1
2master=true
oplogSize=2048 #oplog日志大小,单位M从节点
在/usr/local/mongodb/etc/mongodb.conf
配置文件上新增1
2
3
4slave=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 passwdMongoDB恢复
1
2#从/data/backup中恢复test库的名为some的collection
mongorestore --host mongodb.example.net --port 27017 --db test --collection some --username backup --password password /data/backup