这是个问题
考虑到192万亿条logging,我应该考虑什么?
我主要关心的是速度。
这是桌子…
CREATE TABLE `ref` ( `id` INTEGER(13) AUTO_INCREMENT DEFAULT NOT NULL, `rel_id` INTEGER(13) NOT NULL, `p1` INTEGER(13) NOT NULL, `p2` INTEGER(13) DEFAULT NULL, `p3` INTEGER(13) DEFAULT NULL, `s` INTEGER(13) NOT NULL, `p4` INTEGER(13) DEFAULT NULL, `p5` INTEGER(13) DEFAULT NULL, `p6` INTEGER(13) DEFAULT NULL, PRIMARY KEY (`id`), KEY (`s`), KEY (`rel_id`), KEY (`p3`), KEY (`p4`) );
这是查询…
SELECT id, s FROM ref WHERE red_id="$rel_id" AND p3="$p3" AND p4="$p4" SELECT rel_id, p1, p2, p3, p4, p5, p6 FROM ref WHERE id="$id" INSERT INTO rel (rel_id, p1, p2, p3, s, p4, p5, p6) VALUES ("$rel_id", "$p1", "$p2", "$p3", "$s", "$p4", "$p5", "$p6")
这里有一些笔记…
更新(08/11/2010)
有趣的是,我得到了第二个select…
而不是192万亿我可以存储2.6 * 10 ^ 16 (15个零,意思是26万亿)…
但在第二个选项中,我只需要在表格中存储一个bigint(18)作为索引。 就是这样 – 只有一列。 所以我只是要检查一个值的存在。 偶尔添加logging,不要删除它们。
所以这让我觉得必须有一个更好的解决scheme,然后用mysql来存储数字
鉴于第二种select,我应该采取还是坚持第一…
刚刚获得了一些已经完成的testing的新闻 – 使用此设置的1亿行将在0.0004秒内返回查询[/编辑]
pQd对7PB的估计似乎是合理的,对于RDBMS来说这是很多数据。 我不确定我听说过有人用任何共享磁盘系统做7PB,更不用说MySQL了。 使用任何共享磁盘系统查询这一卷数据的速度将会非常慢。 最快速的SAN硬件最高速度为20GB /秒,即使是针对大型stream式查询进行调整。 如果你能承受这个规格的SAN硬件,你可以使用比MySQL更适合的工作。
事实上,我正在努力设想一个场景,你可以有一个这个规范的磁盘子系统的预算,但不是一个更好的DBMS平台。 即使使用600GB磁盘(目前市场上最大的15K“企业级”磁盘),你也可以使用12000个物理磁盘来存储7PB。 SATA磁盘将会更便宜(2TB的磁盘需要大约1/3的数量),但速度要慢很多。
来自EMC或日立等主要供应商的此规格的SAN将运行数百万美元。 上次我与一家大型厂商的SAN设备合作,IBM DS8000上的空间转移成本超过了1万英镑/ TB,不包括控制器的任何资本补贴。
对于这么多的数据,你真的需要一个像Teradata或Netezza这样的共享系统。 分割一个MySQL数据库可能会工作,但我会build议一个特制的VLDB平台。 无共享系统也可以让你在节点上使用更便宜的直接连接磁盘 – 看看Sun的X4550(Thumper)平台的可能性。
你还需要考虑你的性能要求。
简而言之,反对MySQL的最强有力的论据是,如果可能的话,你将会做后空翻,以获得超过7PB数据的良好查询性能。 这一卷的数据真的让你进入无共享领域,做出一些能够合理快速地进行查询的东西,而且你可能需要一个从一开始就用于无共享操作的平台。 光盘本身就会使任何合理的DBMS平台的成本黯然失色。
注意:如果您将操作数据库和报告数据库分开,则不必为两者都使用相同的DBMS平台。 从同一个7PB表中获得快速插入和分秒的报告至less是一个技术挑战。
根据您的意见,您可以忍受报告中的一些延迟,您可能会考虑单独的捕获和报告系统,并且您可能不需要在操作捕获系统中保留所有7PB的数据。 考虑一个像Oracle这样的操作平台(MySQL可以通过InnoDB来实现这个function)进行数据捕获(同样,磁盘的成本将会降低DBMS的成本,除非拥有大量的用户)以及像Teradata, Sybase这样的VLDB平台IQ, RedBrick, Netezza (注:专有硬件)或Greenplum进行报告
碎片。 在这个规模下,有一个大案例是自杀 – 考虑可能的备份恢复,表空间损坏,增加新的列或任何其他“pipe理”过程 – 所有这些都不可能在这个规模的合理时间内完成。
简单的包络计算 – 假设32位整数除了64位ID以外的所有列; 没有包括指标:
8 * 4B + 8B = 40B每行[这是非常乐观的]
192万亿行40B每个给我们几乎7 PB
也许你可以重新思考整个事情,总结信息进行快速报告,以及当有人需要深入细节时,将压缩的logging存储在给定的时间间隔内。
问题回答:
随机链接 – 插入速度:
打电话给Percona 。 不要通过“去”。 不要收200美元。
也许还有另外一种方法,如果你想要做的就是看看它们是否在集合中,而不是存储四倍的数字。 布隆filter是一种概率方法,通过多种哈希方式。 另外,假阳性是可能的,但是假阴性不是。 (所以,可能会说这个数字是在这个集合中 – 是错误的,但是如果真的存在的话,它不会说不存在)。 还有大量项目需要存储的问题,但至less可以使工作数据集的大小有所下降。
编辑:实际上,如果只是位于整数范围内的位置X处的“logging”的存在或不存在,则可以消除数据存储并仅使用位图…因此,具有100TB磁盘空间的10台机器(所以你有10个位图的性能和备份副本),如果你做了每台服务器128GB的内存,你可以在内存中的高分辨率顶层blockgroup索引进行第一次检查之前,点击X的26 Quadrillion 。
我会去选项#2如果你拿:
375台带有64TB(32个2TB驱动器)的机器(实际上是400台机器出现故障),然后将logging映射到每个2TB的ZVOL。 然后,在一个或多个索引服务器上,存储Judy数组或临界数组或简单位图,如果已将logging添加到26个Quadrillion位置中的1个,则映射。 索引将在50到100TB之间,甚至可以有一个二级索引,如果有任何logging写入某个64k的地址块,那么这个logging可以放在less于64GB的RAM中,并且可以提供快速的初始检查如果一个“邻居”是空的或不是。
然后阅读该logging,您将首先检查是否有一条logging通过查看索引find。 如果存在,则根据简单指标计算,在该机器/logging位置#(Z)内,在该2TB块内转到#(X)/ ZOL#(Y)机器。 单个logging的查找速度非常快,您可以testing将数据存储的某些部分加载到不同的数据存储区(在您使用数据存储区进行实际工作时),并进行性能testing以查看它们是否能够支持您的整个数据库 – 只是使用数据存储的方式。
一个ZOL是一个ZFS的东西,可以被认为是在其他文件系统中的稀疏文件,所以类似的东西将适用。 或者你可以索引到一个磁盘上的某个字节数,但是如果磁盘大小不同,如果你不限制每个磁盘使用的字节数在所有磁盘上都适用 – 即每2TB磁盘1.75TB 。 或者创build一个固定大小的元设备等
除了像疯了一样调整你的数据库参数(使用mysqltuner来帮助)来尽可能保持你的SELECT被caching,你可能会研究的一件事是START TRANSACTION / CoMMIT(假设InnoDB)插入你的几百条logging以避免逐行locking开销,并将您的插入时间降低一个巨大的因素。 我也将创build表作为MyISAM和InnoDB,并在其上运行testing,看看哪一个是真正更快,一旦你得到caching收紧 – 这并不总是MyISAM会更快的读取 – 检查了这一点:
http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/
在testing过程中,并发线程的数量也应该上下变化,直到您发现他可以在服务器上承担多less内存,以专门调整caching为止, 你可能会发现虽然你可以通过math来支持更多的线程,但是如果线程数量太高的话,数据库本身可能会更糟。
另外,如果使用MyISAM和/或InnoDB file-per-table,则可以研究为/ var / lib / mysql创build一个不同的文件系统挂载点,并将其调整为较小的块大小,并调整fstypes的参数 – 即ext3 / ext4 / resiserfs可以使用日志的data = writeback,并禁止更新文件系统访问时间的I / O速度。
对于第二个选项,实际可能放置多less个数字?
如果只有千分之一,或10K,100K等,则存储已使用(或未使用)数字的范围可以节省数万亿的条目。 例如:存储('free',0,100000),('taken',100000,100003),('free',100004,584234) – 根据需要将行分成两行或三行,并对第一个数字进行索引,searchx <= {针}以查看包含所search的数字的范围是被采用还是自由的。
你甚至可能不需要这两个状态。 只要存储最不可能的状态即可。