Amazon EC2和S3在使用Python / SQLite时的应用?

4
假设我有一个巨大的SQLite文件(比如500[MB]),存储在亚马逊S3中。一个运行在小型EC2实例上的Python脚本能否直接访问和修改该SQLite文件?还是必须先将文件复制到EC2实例中,在那里进行更改,然后再复制到S3中?
I/O是否有效率?
这是我要做的事情。正如我所写的,我在S3中有一个500[MB]的SQLite文件。我想启动10个不同的Amazon EC2实例,每个实例将读取文件的一个子集并进行一些处理(每个实例将处理500[MB] SQLite文件的不同子集)。然后,一旦处理完成,每个实例将仅更新其处理的数据子集(如上所述,进程之间不会重叠)。
例如,假设SQLite文件有1M行:
instance 1将处理(并更新)0-100000行
instance 2将处理(并更新)100001-200000行
..........................
instance 10将处理(并更新)900001-1000000行
这是否可能?听起来可以吗?欢迎提出任何建议/想法。
5个回答

6
我想启动10个不同的Amazon EC2实例,每个实例将读取文件的一个子集并进行一些处理(每个实例将处理500[MB] SQLite文件的不同子集)。
你不能使用SQLite来做到这一点;在亚马逊基础设施或其他情况下都是如此。SQLite执行数据库级写锁定。除非所有十个节点都在执行独占读取,否则您将无法获得任何类型的并发性。即使SQLite网站也是如此。 其他关系型数据库管理系统可能更适合以下情况:
  • 客户端/服务器应用程序
  • 高流量网站
  • 非常大的数据集
  • 高并发性
你考虑过使用PostgreSQL吗?

我怀疑 OP 是因为处理需求而想要扩展,而不是由于数据库并发性。如果是这种情况,那么锁定数据库将(可能)不会成为问题。 - Michael Anderson
即便如此,如果SQLite感觉到事务可能是并发的,它往往会中止事务。唯一的方法是使用互斥锁(这是SQLite范围之外的东西)来获取写入数据库。实际上,任何除SQLite之外的关系型数据库管理系统都更加实用/方便。 - SingleNegationElimination
大家好,谢谢。事情是这样的,在我的处理完成后,我想发送结果(即SQLite文件)。虽然MySQL等可以帮助将结果存储在亚马逊端,但我该如何将结果检索回我的计算机? - user3262424
@user3262424:本地数据库二进制格式并不理想。您应该优先选择易于在不同应用程序之间转换的交换格式。数据库交换的黄金标准是CSV。您可以使用mysqldump轻松实现这一点。http://dev.mysql.com/doc/mysql-backup-excerpt/5.5/en/mysqldump-delimited-text.html - SingleNegationElimination

2

由于S3不能直接挂载,最好的方法是创建一个包含SQLite文件的EBS卷,并直接从另一个(控制器)实例中使用EBS卷。您可以创建卷的快照,并将其归档到S3中。使用类似boto(Python API)的工具,您可以自动化创建快照和将备份移动到S3的过程。


Beringer:谢谢。那么让我确认一下:EBS Volume可以同时从这10个实例中访问(并修改/更新其内容)吗? - user3262424
如果它被附加到一个实例上,您可以使用NFS将其提供给其他实例。 - serialworm

2
您可以在Linux机器上挂载S3存储桶。请参见下面的说明:
s3fs-http://code.google.com/p/s3fs/wiki/InstallationNotes,这对我很有用。它使用FUSE文件系统+rsync来同步S3中的文件。它在本地系统中保留所有文件名的副本,并使其看起来像一个文件/文件夹。
如果系统已经存在并且拥有大量数据集,则这很好。但是,如果您从头开始构建,则建议您为SQLite使用EBS卷,并使用此脚本创建EBS卷的快照。

https://github.com/rakesh-sankar/Tools/blob/master/AmazonAWS/EBS/ebs-snapshot.sh


谢谢。唯一的问题是,我在某个地方读到过,一个EBS卷只能挂载到一个实例上,而我想要一个可以在所有10个实例之间共享的卷。我该怎么做? - user3262424
我怀疑你做不到,Amazon EBS 不能在不同的 EC2 实例之间共享。但是你可以使用 Amazon S3 存储桶,将其用作驱动器并与任意数量的 EC2 实例共享。 - Rakesh Sankar
谢谢。根据您的评论,看起来挂载 S3 存储桶是在不同的 EC2 实例之间共享数据的唯一方法(也就是说,EBS 卷在这种情况下没有帮助)。这正确吗? - user3262424
是的,您不能在不同的EC2机器上共享EBS卷,但可以使用S3存储桶。 - Rakesh Sankar
太好了,这澄清了事情。 - user3262424

2
如果您的数据库结构很简单,为什么不使用AWS simpledb呢?或者在您的实例之一上运行mysql(或另一个数据库)。

1
此外,如果您担心管理DBMS的难度,亚马逊提供了一个名为RDS的托管MySQL服务,非常容易使用。 - SingleNegationElimination
@TokenMacGuy:谢谢。问题在于,处理完成后,我想发送结果(即 SQLite 文件)。虽然 MySQL 或其他工具可以帮助将结果存储在亚马逊端 -- 但是如何将结果检索回我的计算机呢? - user3262424

0

Amazon EFS可以在ec2实例之间共享。它是一个托管的NFS共享。但是,SQLITE在写入时仍会锁定整个数据库。

尽管如此,SQLITE网站不建议使用NFS共享。但是,根据应用程序的不同,您可以将数据库只读共享给多个ec2实例,并将处理结果存储在其他地方,然后在下一步中连接结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接