Database 自动切分postgresql?

Database 自动切分postgresql?,database,postgresql,partitioning,sharding,Database,Postgresql,Partitioning,Sharding,我有一个问题,我需要非常快地将大量数据(50多亿行)加载到数据库中(理想情况下不到30分钟,但更快更好),最近有人建议我研究postgresql(我在mysql方面失败了,正在研究hbase/cassandra)。我的设置是,我有一个集群(目前有8台服务器),可以生成大量数据,我考虑在集群中的每台机器上本地运行数据库,它可以在本地快速写入数据,然后在最后(或在整个数据生成过程中)将数据合并在一起。数据不是按任何顺序排列的,所以我不在乎它在哪个特定的服务器上(只要它最终在那里) 我的问题是,有没有

我有一个问题,我需要非常快地将大量数据(50多亿行)加载到数据库中(理想情况下不到30分钟,但更快更好),最近有人建议我研究postgresql(我在mysql方面失败了,正在研究hbase/cassandra)。我的设置是,我有一个集群(目前有8台服务器),可以生成大量数据,我考虑在集群中的每台机器上本地运行数据库,它可以在本地快速写入数据,然后在最后(或在整个数据生成过程中)将数据合并在一起。数据不是按任何顺序排列的,所以我不在乎它在哪个特定的服务器上(只要它最终在那里)

我的问题是,有没有关于PostgreSQL自动切分的好教程或学习的地方(我发现像sykpe这样的公司做自动切分的结果,但没有教程,我想自己玩)?我想做的事可能吗?因为数据不是按任何顺序排列的,所以我打算使用自动递增的ID号,如果数据被合并,会不会导致冲突(这不再是一个大问题)


更新:下面弗兰克的想法消除了我所问的自动递增冲突问题。现在的问题基本上是,我如何了解自动分片,以及它是否支持将数据分布式上传到多个服务器?

以下是一些可能有帮助的事情:

  • 每台服务器上的数据库都应该有一个具有该服务器独特特性的小型元数据表。例如它是哪个服务器;服务器可以按顺序编号。除了该表的内容之外,尽量保持每台服务器上的模式尽可能相似可能是明智的

  • 对于数十亿行,您将需要bigint id(或UUID等)。使用bigint,您可以为每台服务器分配一个宽泛的范围,并设置其使用顺序。例如,服务器1得到1..10000000000000,服务器2得到10000000000001到20000000000000等

  • 如果数据是简单的数据点(比如每秒正好从10台仪器读取的温度),您可以通过将其存储在带有列的表中(时间戳,值双精度[])而不是更正确的
    (时间戳,仪器id int,值双精度)
    来提高效率。这是一个显式的非规范化,有助于提高效率。(我想谈谈我自己在这项计划中的经验。)


很抱歉,我手头没有教程,但这里列出了一个可能的解决方案:

  • 将八个数据加载到每个服务器上的PG实例中
  • 为了获得最佳加载速度,不要使用插入件,而是使用该方法
  • 加载数据时,不要将八个数据库合并为一个数据库。相反,可以使用启动一条语句来一次查询所有数据库(或使用正确的语句来满足您的查询)
如前所述,密钥可能是一个问题。使用非重叠序列、UUID或带有字符串前缀的序列号,应该不太难解决


您应该从其中一台服务器上的副本测试开始,看看您离30分钟目标有多近。如果您的数据不重要,并且您有一个最新的Postgresql版本,那么您可以尝试使用更快的版本(但不是崩溃安全的)。听起来是个有趣的项目,祝你好运。

首先:你真的需要将从集群生成的数据直接插入关系数据库吗?您不介意在最后合并它,那么为什么还要麻烦插入数据库呢?在你的位置上,我会让你的集群节点写平面文件,可能是gzip的CSV数据。然后,我会使用类似于的工具批量导入和合并这些数据

如果您确实需要直接插入到关系数据库中:这就是and(特别是)的(部分)用途。将PgBouncer配置为跨不同节点的负载平衡,您应该可以进行大致排序

请注意,PostgreSQL是一个事务性数据库,具有强大的数据持久性保证。这也意味着,如果你以一种简单的方式使用它,那么大量的小写操作可能会很慢。你必须考虑你愿意在数据持久性、速度和硬件成本之间做出权衡。 在一个极端情况下,每个
INSERT
都可以是自己的事务,在返回成功之前同步提交到磁盘。这将每秒的事务数限制为磁盘子系统可以执行的fsync()数,通常仅为每秒数十或数百个(没有电池备份RAID控制器)。如果您不做任何特殊操作,也不将
INSERT
s包装在
BEGIN
COMMIT
中,则这是默认设置

在另一个极端,你说“我真的不在乎我是否丢失了所有这些数据”,并用于插入。这基本上给了数据库在不能保证数据正常的情况下丢弃数据的权限——比如,在操作系统崩溃、数据库崩溃、断电等情况下

中间地带是你可能想去的地方。这涉及到(和)批处理插入到显式
BEGIN
END
等包装的组中的一些组合。代替插入批处理,您可以执行
复制
一次加载几千条记录。所有这些都是在数据持久性和速度之间进行权衡


对于快速批量插入,除了主键之外,还应该考虑在没有任何索引的情况下插入表。甚至可能不是那样。批量插入完成后创建索引。这将快得多。

您可以使用mySQL,它支持跨集群自动分片。

用于PostgreSQL自动分片。也很有帮助。

我在
中已将约1000万行加载到postgres数据库中,我打算使用自动递增的ID号,如果合并数据会导致冲突吗?
只需递增10,并从不同的偏移开始。服务器1使用ids1,11,21,31;服务器2使用ids 2,12,22,32@FrankFarmer谢谢你的邀请