目前我有一个系统(服务器),它一次接收来自1000个设备(客户端)的消息,每个消息每分钟发送一次消息。
每封邮件将有超过2000条记录。
所以每分钟系统将收到1000 X 2000 => 2,000,000条记录
与此同时,我期待频繁的选择请求(大约1000)
查询
设置数据库服务器(Mysql / postgres)以处理这种频繁的批量插入和读取操作的最佳方法是什么?
答案 0 :(得分:3)
您的千台设备如何连接?如果每个人都与服务器建立TCP / IP连接,则需要确保在他们连接的机器中有足够的文件描述符。查看/proc/sys/fs/file-max
以查看最大值。与单个服务器计算机的一千个客户端连接被认为是一个很大的数字。
每条记录中有多少数据?你会压倒你的网络硬件吗?如果每个记录是十个字节,那么你说的是每秒进入两千万个字节,或者一亿六千万个字节。每秒100兆比特的以太网接口将不够用。即使是千兆位接口也是值得怀疑的:很难保持巨大的吞吐量。请记住,如果DBMS与接收数据的服务器位于不同的计算机上,则这些记录必须同时进入和退出,从而使网络吞吐量翻倍。
您如何处理您的DBMS或系统的其他部分将落后于其工作负载的可能性? DBMS在接受INSERT命令时偶尔会有三十二秒的延迟,但在此期间会积累大量未处理的数据。
您应该考虑将此问题划分为可能是50或100个设备的组,以及20或10个收集数据的中央服务器设置。如果你这样做,你不会有单点故障,你不会非常努力地推动你的网络硬件,如果你丢失了一些硬件,你可能能够制定出某种故障转移策略。您还可以使用更便宜,更具成本效益的服务器和网络设备。
在MySQL上,使用尽可能少的索引来支持您需要执行的查询。请记住,执行摘要查询(如SELECT COUNT(*) FROM raw WHERE timestamp > NOW() - INTERVAL 1 HOUR
)可能会大大减慢INSERT操作的运行速度。
您可能需要考虑使用排队系统(如ActiveMQ)来处理数据流。
答案 1 :(得分:3)
所以我只是将1M假行(一个字符和一个int从1到1000000)分批并将其插入到笔记本电脑上的postgresql中的一个事务中。花了4秒钟。至少在开始时,每分钟插入1M分钟很容易。然而,还有更多需要担心的问题。例如,更新索引可能很昂贵。我在整数字段上添加了一个唯一索引,插入时间从4s增加到9s。插入另外1M行需要14秒。随着指数的增长,这个数字将继续攀升。一旦指数不再适合记忆,它就会飙升。
处理这么多数据的最佳方法通常是将其填充到离散的文本文件中,然后在没有索引的情况下批量上传它。然后添加索引。
Ollie在他关于MySQL的回答中提到的所有内容也适用于大多数其他数据库。
PostgreSQL特定的东西:
使用连接池和持久连接,保持总连接低,比如低于100。
使用FAST存储媒体。您遇到的问题是您可能需要大量存储空间,因此SSD可能无法正常工作。如果您必须使用旋转驱动器,则将其中的大量驱动器置于RAID控制器下,并在RAID-10中使用电池支持的硬件缓存,以获得最佳性能和良好的可靠性。 RAID-5或6将是一场灾难,因为它们的写入性能非常糟糕。
尽可能多地批量写入。与一些将在大型事务中呕吐的dbs不同,PostgreSQL在交易中一次只能处理1M行或更多行。
根据需要使用少量索引。
答案 2 :(得分:0)
您通常可以优化 写或读取,但不能同时针对两者进行优化。所以在这种情况下,仔细修剪表的大小,只声明所需的索引,并将它放在快速机器上,可能是你唯一的选择。您是否需要长时间保存数据,还是可以清除旧数据?否则你的桌子会变得很大。