安装和使用 MongoDB
2014年03月20日 | 标签: mongodb, nosql
上周玩了一下 RethinkDB 发现一些性能问题,导入2000万个文档后查询起来非常慢,哪怕是最简单的查询也很慢,试着把数据分片到 RethinkDB 集群的多个节点上还是慢。相比之下,其他几个比较成熟的产品 MongoDB, CouchDB, Couchbase 就要快很多。
MongoDB 可能是当前最流行的 NoSQL 数据库,就不用多介绍了,下面的安装步骤在 Ubuntu Server 12.04.4 LTS (64-bit) 和 CentOS 6.5 Minimal (64-bit) 上完成。
安装 MongoDB 服务器
在 Ubuntu 上安装 GPG key 后添加 mongdb 源,然后安装 mongodb-10gen:
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 $ echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list $ sudo apt-get update $ sudo apt-get install mongodb-10gen
在 CentOS 上使用 root 账号,添加 mongdb 源,然后安装 mongo-10gen 和 mongo-10gen-server:
$ su # vi /etc/yum.repos.d/mongodb.repo [mongodb] name=MongoDB Repository baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/ gpgcheck=0 enabled=1 # yum update # yum install mongo-10gen mongo-10gen-server # service mongod restart # chkconfig mongod on
在 CentOS 上如果用 yum install 安装完 mongodb 发现 /etc/init.d/ 里面没有 mongod 启动脚本的话,需要从 /etc/rc.d/init.d/ 拷贝一个:
# cp /etc/rc.d/init.d/mongod /etc/init.d/ # service mongod restart
检查一下 mongodb 服务是否已经在运行,如果没有的话重启一下 mongodb 服务:
$ ps aux | grep mongod mongodb 1165 8.2 99.9 25407520 8550164 ? Ssl 04:02 17:10 /usr/bin/mongod --config /etc/mongodb.conf $ sudo service mongodb restart # 在 ubuntu 上 # service mongod restart # 在 centos 上
如果启动 mongodb 过程报错,查看日志寻找蛛丝马迹:
$ sudo vi /var/log/mongodb/mongodb.log
如果发现日志里有如下错误,可能是因为 /tmp 权限问题,mongd 进程无权限法写 /tmp,chmod 777 就可以了:
... Tue Mar 18 08:03:55.061 [initandlisten] ERROR: listen(): bind() failed errno:13 Permission denied for socket: /tmp/mongodb-27017.sock ... # chmod -R 777 /tmp
使用 mongo 客户端
MongoDB 自带的 mongo 客户端程序(相当于 MySQL 的 mysql)可以用来简单的与 mongod 交互:
$ mongo MongoDB shell version: 2.4.9 connecting to: test > db test > use gene switched to db gene > db gene > help ...
安装 Python 客户端驱动
我们一般用程序和 MongoDB 交互,MongoDB 支持多种语言的客户端驱动,比如:JavaScript, Python, Ruby, PHP, Perl, C, C++, Java, Scala 等。下面的部分仅是安装 MongoDB 的 Python 驱动,其他语言可以参考官方文档。
在 Ubuntu 上安装 pymongo:
$ sudo apt-get install python-pip $ sudo apt-get install build-essential python-dev $ sudo pip install pymongo
在 CentOS 上安装 pymongo:
# rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm # yum update # yum install python-pip # yum install gcc python-devel # pip install pymongo
gene_info.txt 是一个含有基因数据的文本文件,大概1000多万行记录,格式如下:
$ head -2 gene_info.txt #Format: tax_id GeneID Symbol LocusTag Synonyms dbXrefs chromosome map_location description type_of_gene Symbol_from_nomenclature_authority Full_name_from_nomenclature_authority Nomenclature_status Other_designations Modification_date (tab is used as a separator, pound sign - start of a comment) 7 5692769 NEWENTRY - - - - - Record to support submission of GeneRIFs for a gene not in Gene (Azorhizobium caulinodans Dreyfus et al. 1988; Azotirhizobium caulinodans. Use when strain, subtype, isolate, etc. is unspecified, or when different from all specified ones in Gene.). other - - - - 20071023
写个简单程序把 gene_info.txt 的数据导入到 MongoDB 里:
#!/usr/bin/python # -*- coding: UTF-8 -*- import os, os.path, sys, csv, string def import_to_db(): data = csv.reader(open('gene_info', 'rb'), delimiter='\t') data.next() import pymongo mongo = pymongo.Connection('127.0.0.1') genedb = mongo['gene'] gene_info = genedb['geneinfo'] for row in data: gene_info.insert({ 'tax_id': row[0], 'GeneID': row[1], 'Symbol': row[2], 'LocusTag': row[3], 'Synonyms': row[4], 'dbXrefs': row[5], 'chromosome': row[6], 'map_location': row[7], 'description': row[8], 'type_of_gene': row[9], 'Symbol_from_nomenclature_authority': row[10], 'Full_name_from_nomenclature_authority': row[11], 'Nomenclature_status': row[12], 'Other_designations': row[13], 'Modification_date': row[14] }) def main(): import_to_db() if __name__ == "__main__": main()