视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
安装和使用MongoDB
2020-11-09 13:15:26 责编:小采
文档

上周玩了一下 RethinkDB 发现一些性能问题,导入2000万个文档后查询起来非常慢,哪怕是最简单的查询也很慢,试着把数据分片到 RethinkDB 集群的多个节点上还是慢。相比之下,其他几个比较成熟的产品 MongoDB, CouchDB, Couchbase 就要快很多。 MongoDB 可能

上周玩了一下 RethinkDB 发现一些性能问题,导入2000万个文档后查询起来非常慢,哪怕是最简单的查询也很慢,试着把数据分片到 RethinkDB 集群的多个节点上还是慢。相比之下,其他几个比较成熟的产品 MongoDB, CouchDB, Couchbase 就要快很多。

MongoDB 可能是当前最流行的 NoSQL 数据库,就不用多介绍了,下面的安装步骤在 Ubuntu Server 12.04.4 LTS (-bit) 和 CentOS 6.5 Minimal (-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_/
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 85501 ? 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_/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()
下载本文
显示全文
专题