【问题标题】:Amazon EC2 & S3 When using Python / SQLite?Amazon EC2 和 S3 使用 Python / SQLite 时?
【发布时间】:2016-08-02 02:04:29
【问题描述】:

假设我在 Amazon S3 中存储了一个巨大的 SQLite 文件(例如 500[MB])。 在小型EC2 实例上运行的python 脚本可以直接访问和修改SQLite 文件吗?还是我必须先将文件复制到EC2 实例,在那里进行更改,然后再复制到S3

I/O 会高效吗?

这就是我想要做的。正如我所写,我在S3 中有一个 500[MB] SQLite 文件。我想开始说10 different Amazon EC2 instances,每个都会读取文件的一个子集并进行一些处理(每个实例将处理500 [MB] SQLite 文件的不同子集)。然后,一旦处理完成,每个实例将只更新它所处理的数据子集(如前所述,进程之间不会有数据重叠)。

例如,假设 SQLite 文件有说 1M 行

instance 1 将处理(和更新)行 0 - 100000

instance 2 将处理(和更新)行 100001 - 200000

.......................

instance 10 将处理(并更新)行 900001 - 1000000


有可能吗?听起来好吗?欢迎任何建议/想法。

【问题讨论】:

    标签: python sqlite amazon-s3 amazon-ec2


    【解决方案1】:

    我想先说 10 个不同的 Amazon EC2 实例,每个实例将读取文件的一个子集并进行一些处理(每个实例将处理 500[MB] SQLite 文件的不同子集)

    你不能用 SQLite 做到这一点;在亚马逊基础设施或其他方面。 sqlite 执行数据库级别的写锁定。除非所有十个节点都专门执行读取,否则您将不会获得任何类型的并发。 Even the SQLite website says so.

    另一个 RDBMS 可能会更好地工作的情况

    • 客户端/服务器应用程序
    • 大容量网站
    • 非常大的数据集
    • 高并发

    你考虑过 PostgreSQL 吗?

    【讨论】:

    • 我怀疑 OP 由于处理要求而不是数据库并发性而正在寻求扩展。如果是这种情况,那么锁定数据库将(可能?)不是问题。
    • 即便如此,如果 SQLite 认为事务可能是并发的,它还是倾向于中止事务。这样做的唯一方法是使用互斥锁(SQLite 范围之外的东西)来获取数据库以进行写入。实际上,除了 SQLite 之外的任何 RDBMS 都可能更实用/方便。
    • 各位,谢谢。问题是,在我的处理结束后,我想发送结果(=SQLite 文件)。虽然MySQL 左右可以帮助将结果存储在亚马逊端——我将如何将结果检索回我的计算机?
    • @user3262424:本机数据库二进制格式是不可取的。您应该更喜欢易于从一个应用程序转换到另一个应用程序的交换格式。数据库交换的黄金标准是 CSV。您可以使用 mysqldump dev.mysql.com/doc/mysql-backup-excerpt/5.5/en/… 轻松做到这一点
    【解决方案2】:

    由于无法直接挂载 S3,最好的办法是创建一个包含 SQLite 文件的 EBS 卷,并直接使用来自另一个(控制器)实例的 EBS 卷。然后,您可以创建卷的快照,并将其存档到 S3。使用 boto (Python API) 之类的工具,您可以自动创建快照以及将备份移动到 S3 的过程。

    【讨论】:

    • Beringer:谢谢。所以让我确保我理解:可以同时从所有 10 个实例访问EBS Volume(及其内容修改/更新)吗?
    • 如果它附加到一个实例上,您可以使用 nfs 使其对其他实例可用。
    【解决方案3】:

    您可以在您的 linux 机器上挂载 S3 存储桶。见下文:

    s3fs - http://code.google.com/p/s3fs/wiki/InstallationNotes - 这对我有用。它使用 FUSE 文件系统 + rsync 来同步文件 在 S3 中。它保留了所有的副本 本地系统中的文件名 & make 它看起来像一个文件/文件夹。

    如果系统已经就位并运行大量数据,这很好。但是,如果您是从头开始构建它,那么我建议您为 SQLite 创建一个 EBS 卷并使用此脚本创建 EBS 卷的快照:

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

    【讨论】:

    • 谢谢。唯一的一点是,我在某处读到EBS Volume 只能挂载到一个实例,而我想要一个在所有10 instances 之间共享的卷。我该怎么办?
    • 我怀疑你能做到这一点,Amazon EBS 不能在不同的 EC2 实例之间共享。但是您可以使用 Amazon S3 存储桶,将其用作驱动器并与您想要的任意数量的 EC2 实例共享。
    • 谢谢。因此,从您的评论来看,安装 S3 存储桶似乎是在不同的 EC2 实例之间共享数据的唯一方法(意思是,EBS 卷在这种情况下无济于事)。对吗?
    • 是的,您不能在不同的 EC2 机器上共享 EBS 卷,而是在 S3 存储桶上共享。
    • 很好,这说明了一切。
    【解决方案4】:

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

    【讨论】:

    • 此外,如果您担心管理 DBMS 的难度,亚马逊提供了一个托管 MySQL 服务,称为 RDS,使用起来非常简单。
    • @TokenMacGuy:谢谢。问题是,在我的处理结束后,我想发送结果(= SQLite 文件)。虽然MySQL 左右可以帮助将结果存储在亚马逊端——我将如何将结果检索回我的计算机?
    【解决方案5】:

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

    不过,SQLITE 网站不推荐 NFS 共享。但根据应用程序,您可以在多个 ec2 实例之间以只读方式共享数据库,并将处理结果存储在其他地方,然后在下一步中连接结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 1970-01-01
      • 2011-01-08
      • 2014-09-13
      • 2011-04-16
      • 1970-01-01
      • 2013-01-01
      相关资源
      最近更新 更多