django - 使用 PostgresXL 分片现有的 postgresql 数据库

标签 django postgresql postgres-xl

由于磁盘负载高,我们想对 PostgreSQL 数据库进行分片。首先,我们查看了 django-sharding library ,但是:

  1. 在我们的后端进行大量重写
  2. 将所有表迁移到 64 位主键对于 300-400GB 的表来说是一项艰巨的工作
  3. 使用 Postgres 特定算法生成 ID 使得无法将数据从一个分片移动到另一个分片。不仅如此,我们还有一个包含旧 ID 的大型数据库。更新所有这些也是一个大问题。
  4. 使用特殊表生成 ID 使我们每次插入数据时都对主数据库执行特殊的 SELECT 查询。我们的写入负载很高,所以不好。

考虑到所有这些,我们也决定考虑 Postgres 数据库分片解决方案。我们发现了 2 个机会——Citus 和 PostgresXL。 Citus 让我们改变数据格式太多,同时重写一大堆后端,所以我们准备尝试 PostgresXL 作为更透明的解决方案。但是阅读文档,我无法理解一些东西,并且会非常适合推荐:

  1. 除了 Citus 和 PostgresXL 之外,还有其他分片解决方法吗?最好不要在迁移时对我们的数据库进行太多更改。
  2. 关于 PostgresXL 的一些问题:
    • 我的理解是否正确,它不是 Postgres 扩展,而是一个独立的分支?所以我应该从源构建它的所有部分,而不是以某种方式移动数据?
    • Postgres 和 PostgresXL 版本如何兼容?我们有 PostgreSQL 9.4。我在 PostgresXL 中没有看到这样的版本(9.2 或 9.5 没有中间版本?)。那么我可以使用例如流复制来进行迁移吗?
    • 如果是/否,迁移数据的最佳解决方案是什么?如果我有 2Tb 的数据库且写入量很大,我能否以某种方式迁移它而不会长时间停止?

谢谢。

最佳答案

首先,为了让自己省去很多麻烦,您是否考虑过亚马逊的 Auora、Dynomo、Red Shift 等服务?它们在规模上非常具有成本效益,并且为您进行了优化和管理。

实际上,Amazon 的直接 Postgress 数据库可以处理大量的读取或写入。我们可以在读取时达到 2,000-6,000 IOPS,在写入时达到 2,000 到 6,000 IOPS 没有问题。我真的会考虑这个选项。 Azure、甲骨文和谷歌也有相互竞争的服务。

另请注意,Postgres-XL 毫无理由地不支持 HA。如果你失去一个节点,你就失去了一切。节点不能故障转移。

it's a standalone fork?

是的,它们是非常不同的应用程序,并且彼此独立开发。

How are Postgres and PostgresXL versions compatible?

它们不兼容。您不能只将 Postgres 迁移到 Postgresl-XL。他们的工作方式非常不同。

Generating ids with Postgres Specific algorithm makes it impossible to >move data from shard to shard

不遵循这一点,但通过共享,您不应该将数据从一个分片移动到另一个分片。所使用的 key 通常需要特定且唯一的东西来拆分/隔离您的数据。像日期,或“类型”字段,或其他一些(希望有序的)字段/列。这打破了事情,但在 a$$ 限制方面有明显的痛苦。

Are there any other sharding workarounds except for Citus and PostgresXL? It would be good not to change much in our database on >>migrating.

有很多选择,但从标准 RDS 到 NoSql 或 MPP 数据库的快速迁移将是一次重大迁移,需要付出大量努力,并且无论您做什么,都会有很多限制。

Next Postress-XL和Citus是MPP(massive parallel processing)集群应用,具体不分享。这是他们可以做的一部分,但这不是他们的重点。

MPP 的其他选项

pgPool——(不适合大量写入)

haProxy——(没有做过但读过它。失去了设置和维护的工作。)

MySql Cluster --(使用 OSS 版本的巨大痛苦和商业版本的主要 $$$)

绿铅

天睿数据

垂直

what is the best solution to migrate data?

不太可能找到这种开关的简单迁移。您可能需要自己从现有 RDS 导出数据并将其导入新数据库,并且可能需要自己编写一些内容才能按照您想要的方式获取数据。

关于django - 使用 PostgresXL 分片现有的 postgresql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47791806/

相关文章:

javascript - 在 django 中获取 javascript 数组

ubuntu - postgres-xl中的水平分区?

postgresql - 我们可以在同一个系统上有多个 Postgres XL 集群吗?

python - 如何获取列中的最新时间戳?

django - 在 settins.py 中注册的 Django 应用程序的自动发现小部件

sql - 为什么 count(*) 在此子查询 (postgresql) 中返回多个结果?

postgresql - 连接系统,包括 OPC UA IoT Agent、Orion Context Broker。 Cygnus 和 Postgres 的历史数据

django - 如何在 Django 中返回自定义响应/状态代码?

php - 第二种意见的安全性优势,我通过 postgresql 散列和加盐用户密码的计划是否存在缺陷?