我想将我的统计跟踪系统转换为不直接写入数据库,因为我们遇到了瓶颈。
我们目前在站点的某些方面使用 memcached,我想用它来存储统计信息并定期将它们提交到 mysql DB。
然而,问题在于项目的数量(以百万计),这些项目可能会在 cronjob 运行之间收集到将它们提交到数据库中的统计信息。除了运行 aSELECT * FROM data
并检查每个 memcache 键是否存在,然后更新表....还有其他方法可以做到这一点吗?
(我不是说下面是福音,这只是我的直觉。如后所述,我不知道你的系统的细节:)显然没有冒犯的意思等等:))
我建议不要为此使用 memcached。Memcached 用于快速检索您之前获得的值,而不是存储值。最大的区别是您的缓存已满,您将丢失数据。
通常,您的缓存中没有数据,然后从源中重新收集数据,在这种情况下这是不可能的。仅此一项就是我试图劝阻你的理由。
现在您说主要问题是您遇到的mysql连接限制。如果你做一些简单的事情(就像我们在评论中谈到的那样:the insert delayed
),这只是增加限制的一个例子。您可能应该有足够的能力让您的脚本/用户访问数据库一次并说“最终应该添加”,然后离开。如果您的用户甚至无法为此打开 1 个连接,那么您可能无法通过添加额外的缓存层来解决严重的资源问题?
显然很难说没有任何系统、软件和硬件规格,但我的建议是看看你是否可以通过增加限制来让他们打开连接,并稍微调整一下服务器变量,而不是猴子补丁通过使用 memcached 作为中间层来构建您的系统。
我对统计数据也有类似的问题。但请不要使用 memcached。您不能确定您的所有项目都将移至数据库。您可以丢失数据和/或双重处理数据。
您应该根据正在写入/读取的数据量以及需要多少连接来分析瓶颈。而不是切换到可扩展的东西,如 Hadoop、Cassandra、Scripe 和其他系统。
您需要提供有关您正在运行的平台的其他信息:操作系统、数据库(版本)、存储引擎、RAM、CPU(如果可能)?
您是插入一个表还是多个表?
您能否禁用要插入的表上的索引,因为这会减慢插入功能。
您是否在插入原始数据时运行任何触发器或存储过程来计算值?