由于高磁盘负载,我们想要对我们的 PostgreSQL 数据库进行分片。首先,我们查看了django-sharding library,但是:
- 在我们的后端进行了很多重写
- 将所有表迁移到 64 位主键对 300-400gb 表来说是一项艰巨的工作
- 使用 Postgres 特定算法生成 id 使得无法将数据从一个分片移动到另一个分片。不仅如此,我们还有一个带有旧 ID 的大型数据库。更新所有这些也是一个大问题。
- 使用特殊表生成 id 使我们每次插入数据时都会对主数据库进行特殊的 SELECT 查询。我们的写入负载很高,所以不好。
考虑到所有这些,我们决定也看看 Postgres 数据库分片解决方案。我们发现了 2 个机会 - Citus 和 PostgresXL。Citus 让我们改变了太多的数据格式,同时重写了一大堆后端,所以我们将尝试使用 PostgresXL 作为更透明的解决方案。但是阅读文档,我无法理解一些事情,并且会很高兴推荐:
- 除了 Citus 和 PostgresXL 之外,还有其他分片解决方法吗?最好不要在迁移时对我们的数据库进行太多更改。
- 关于 PostgresXL 的一些问题:
- 我是否理解正确,它不是 Postgres 扩展,它是一个独立的分支?所以我应该从源头构建它的所有部分,而不是以某种方式移动数据?
- Postgres 和 PostgresXL 版本如何兼容?我们有 PostgreSQL 9.4。我在 PostgresXL 中没有看到这样的版本(9.2 或 9.5 没有中间?)。例如,我可以使用流复制进行迁移吗?
- 如果是/否,迁移数据的最佳解决方案是什么?如果我有大量写入的 2Tb 数据库,我可以以某种方式迁移它而无需长时间停止吗?
谢谢。