极限分片:每个用户一个 SQLite 数据库

2023-12-20

我正在开发一个介于电子邮件服务和社交网络之间的网络应用程序。我觉得它未来有潜力变得非常大,所以我担心可扩展性。

我决定为每个活动用户创建一个单独的 SQLite 数据库:每个“分片”一个活动用户,而不是使用一个集中式 MySQL/InnoDB 数据库,然后在那时对其进行分区。

这样备份数据库就像复制每个用户的数据库一样简单small每天一次将数据库文件发送到远程位置。

扩展就像添加额外的硬盘来存储新文件一样简单。

当应用程序增长到超出单个服务器时,我可以使用 GlusterFS 在文件系统级别将服务器链接在一起并不变地运行应用程序,或者安装一个简单的 SQLite 代理系统,该系统将允许每个服务器操作相邻服务器中的 sqlite 文件。

并发问题将是最小的,因为每个 HTTP 请求一次只会触及一到两个数据库文件(数千个),而且 SQLite 无论如何都只会阻塞读取。

我敢打赌,这种方法将使我的应用程序能够优雅地扩展并支持许多很酷的功能unique特征。难道我赌错了?我错过了什么吗?

UPDATE我决定采用一个不太极端的解决方案,到目前为止效果很好。我使用固定数量的分片 - 准确地说是 256 个 sqlite 数据库。每个用户都通过一个简单的哈希函数分配并绑定到一个随机分片。

我的应用程序的大多数功能只需要每个请求访问一两个分片,但有一个特别需要对 256 个分片中的 10 到 100 个不同分片执行简单查询,具体取决于用户。测试表明,如果所有数据都缓存在 RAM 中,大约需要 0.02 秒或更短的时间。我想我可以忍受!

更新2.0我将该应用程序移植到 MySQL/InnoDB,对于常规请求能够获得大约相同的性能,但对于需要分片遍历的请求,innodb 的速度要快 4-5 倍。由于这个原因和其他原因,我放弃了这个架构,但我希望有人在某个地方找到它的用途......谢谢。


如果您必须执行所谓的“分片遍历”,即找出一堆不同用户的所有数据,则会失败。这种特殊类型的“查询”必须以编程方式完成,依次询问每个 SQLite 数据库 - 并且很可能是站点中最慢的部分。在数据被“分片”到单独的数据库的任何系统中,这是一个常见问题。

如果所有数据对于用户来说都是独立的,那么这应该可以很好地扩展 - 使其成为一种有效设计的关键是了解数据可能将如何使用以及来自一个人的数据是否会进行交互与来自另一个人的数据(在您的上下文中)。

您可能还需要注意文件系统资源 - SQLite 很棒、很棒、速度很快等 - 但是在使用“标准数据库”(即 MySQL、PostgreSQL 等)时,您确实会获得一些缓存和写入的好处,因为它们如何是被设计的。在您提出的设计中,您将错过其中的一些内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

极限分片:每个用户一个 SQLite 数据库 的相关文章

  • 一个大连接或多个查询哪个提供更好的性能?

    我有一个名为订单的表 订单上的一列是 customer id我有一个名为 customers 的表 有 10 个字段 给定两个选项 如果我想构建订单对象数组并嵌入订单对象中的是客户对象 我有两个选择 选项1 A 首先查询订单表 b 循环遍历
  • 如何处理 SQLite 缺少的功能:禁用触发器?

    如何处理 SQLite 缺失的功能 disable triggers 我没有让它存储特定表的触发器名称 例如 我如何删除所有触发器 你会怎么办 现在已经是 2015 年了 SQLite 中仍然没有 禁用触发器 对于移动应用程序来说 这可能会
  • 在 MySQL 中对连续值进行分组并向这些组添加 id

    我有一个简单的表 我需要确定四行的组 这些组不是连续的 但每行的每一行的值都有 1 例如 language id C 16 C 17 Java 18 Python 19 HTML 65 JavaScript 66 PHP 67 Perl 6
  • Django - 没有名为 _sqlite3 的模块

    我在 rhel 5 上安装了 django 1 4 默认情况下 rhel 5 中有 python 2 4 但要使用 django 1 4 我手动安装了 python 2 7 3 开发服务器运行良好 但是当我创建一个新项目并将 setting
  • 环回:原子读取和更新

    有没有办法在环回中实现类似的东西 LOCK READ INCREMENT UNLOCK 我想将计数器保留为数据库值 每个键都是一个计数器 或一个设置 并且它们不应该同时访问我的多个请求 此外 这也应该适用于本地请求 无 RemoteHook
  • Hibernate 乐观锁..它是如何工作的?

    我正在阅读下面关于休眠乐观锁定的博客 我打算将它与休眠一起使用 但是 我有一个担忧 我们有java代码和c 代码 都连接到一个数据库 虽然java代码可以使用hibernate来实现乐观锁定 但我想让c 代码做同样的事情 此外 C 代码正在
  • 从数据库中删除重复的行

    我需要从数据库中删除重复的行 我可以用简单的sql查询来完成吗 如果没有 请告诉我一些快速算法来做到这一点 Example id field one field two 1 0000000 11111111 2 2222222 333333
  • python sqlite3从excel创建数据库

    我正在尝试从 Excel 电子表格创建数据库 我有下面的代码 问题是当我运行代码时 我的数据库为每列创建一个表 我想为工作簿中列出的每个电子表格创建一个表格 工作表名称为工作表 1 和工作表 2 import sqlite3 import
  • 时间序列数据的键值存储?

    我一直在使用 SQL Server 存储数十万个对象的历史时间序列数据 每天观察大约 100 次 我发现查询 给我时间 t1 和时间 t2 之间对象 XYZ 的所有值 太慢 对于我的需要 慢超过一秒 我按时间戳和对象 ID 建立索引 我考虑
  • DB2连接授权失败原因:Java不支持安全机制

    我正在尝试使用 DB2JDBC Type4 驱动程序配置 DB2 连接 但我收到这个错误 线程 main 中的异常 com ibm db2 jcc am SqlInvalidAuthorizationSpecException jcc t4
  • PostgreSQL 中字符串列类型的索引数组

    是否可以在类型为的列上创建索引文本数组 尝试使用GIN索引 但查询似乎没有使用这些索引 Example CREATE TABLE users name VARCHAR 100 groups TEXT Query SELECT name FR
  • JSON 解析器从大型 JSON 文件中逐条读取

    我有一个巨大的 JSON 文件 1GB 它基本上是以下格式的对象数组 x y p q x1 y1 p1 q1 我想解析这个文件 这样所有的数据都不会加载到内存中 基本上我想获取例如 数组中的前 1000 个对象进行内存处理 然后将接下来的
  • 如何使用 Sqlite3 用列表中的值更新整个列

    我有一个数据集本地存储在 sqlite3 数据库中 我提取了一列 执行了一些操作 现在想要替换数据库列中的所有值 我怎样才能做到这一点 保证列和列表的长度相同 我只想用新值更新表 有没有一种简单的方法可以一次性完成这一切 使用Python
  • 应用程序内的 SQLite 文件版本兼容性

    我有一个 C NET 应用程序 一种复杂的计算应用程序 其中用户输入数据 处理后的信息使用 JSON 序列化和 EF 保存到 SQLite 文件中 需要时可以将其加载到我们的应用程序中 应用程序在开发过程中经历了很多变化 类也被修改 因此
  • 社交应用程序的数据库设计和优化注意事项

    通常的情况 我有一个简单的应用程序 允许人们上传照片并关注其他人 因此 每个用户都会有类似 墙 或 活动源 的东西 他或她可以在其中看到他 她的朋友 他或她关注的人 上传的最新照片 大多数功能都很容易实现 然而 当涉及到这个历史活动源时 由
  • SQLite - 左连接

    我需要进行这样的查询 SELECT table1 table2 column FROM table1 LEFT JOIN table2 ON table1 column table2 column 但这不起作用 如果我尝试相同的查询但替换第
  • SQlite 获取最近的位置(带有纬度和经度)

    我的 SQLite 数据库中存储有纬度和经度的数据 我想获取距我输入的参数最近的位置 例如我当前的位置 纬度 经度等 我知道这在 MySQL 中是可能的 并且我已经做了相当多的研究 SQLite 需要一个自定义外部函数来实现半正弦公式 计算
  • Neo4j Desktop DB 无法启动,状态为“KILLED”

    运行 Neo4j Desktop 版本 1 0 15 尝试启动DB导致启动失败 数据库启动失败 DB database f8950fdd 6b5f 4fea 8c9f e8457ee1da9a v3 3 1 退出 状态为 已杀 检查日志 主
  • 使用 where 进行 select 语句时,HSQLDB 用户缺乏权限或未找到对象错误

    我的数据库使用 SQuirrel SQL 客户端版本 3 5 3 和 HSQLDB 我已经能够为其指定相应的驱动程序 内存中 并创建一个别名 我创建了一个表 CREATE TABLE ENTRY NAME VARCHAR 100 NOT N
  • 在 SQL 数据库中存储“列表”的最正确方法是什么?

    因此 我读了很多关于如何将多个值存储到一个列中是一个坏主意 并且违反了数据标准化的第一条规则 令人惊讶的是 这不是 不要谈论数据标准化 所以我需要一些帮助 目前我正在为我工 作的地方设计一个 ASP NET 网页 我想根据此人所属的 Act

随机推荐