上周玩了一下 rethinkdb 发现一些性能问题,导入2000万个文档后查询起来非常慢,哪怕是最简单的查询也很慢,试着把数据分片到 rethinkdb 集群的多个节点上还是慢。相比之下,其他几个比较成熟的产品 mongodb, couchdb, couchbase 就要快很多。 mongodb 可能
上周玩了一下 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 repositorybaseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/gpgcheck=0enabled=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 mongodmongodb 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 交互:
$ mongomongodb shell version: 2.4.9connecting to: test> dbtest> use geneswitched to db gene> dbgene> 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, stringdef 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()
原文地址:安装和使用 mongodb, 感谢原作者分享。