我们正在运行自定义广告服务器解决方案,在某些情况下,我们会在 MySQL 中存储和递增/递减计数和聚合值,以进行优化。
我知道在 MySQL 中进行计数并不理想,尽管我不能 100% 确定原因。我的猜测是,写入磁盘比写入内存慢,因此在 Redis 中保存计数比在 MySQL 中保存计数效果更好。但这会给我们的系统增加一些额外的复杂性,并且意味着对多个组件进行重大更改。
过去,我们看到连接计数不断增加,CPU 利用率不断上升,但在缓存大部分请求并切换到更快的磁盘后,我们成功提高了这一限制。目前,我们每天使用主从 MySQL 配置处理 10-2000 万个请求,其中写入发送到主服务器,大部分读取从从服务器完成。另外,添加另一个从服务器根本不是问题。
我关心的是 master 上的写入,尽管它们只是在 5 个表中每一个中增加一行的微小操作。
所以我的问题是:根据您的经验,在达到限制之前,我每秒可以在 MySQL 中安全执行多少次这样的小写入?我听说人们同时处理 100k 个连接,但是如果所有这些连接都尝试在同一秒内增加一行怎么办?在需要时扩大规模的好策略是什么?
谢谢!
Ric*_*mes 12
对于 InnoDB,您可能会同意 SSD。
UPDATEs每天20M = 230/秒;如果有尖峰则更多。
旋转磁盘 (HDD):每秒 100 次写入。
SSD:也许 1000/秒。
批量INSERTs运行速度更快。
某些 RAID 变体运行速度更快。
具有电池支持写入缓存的 RAID 控制器运行速度非常快(对于写入)(直到缓存饱和)。
为了保留“喜欢”或“查看”或“点击”,最好将计数器与有关页面/产品/其他内容的其余列保存在单独的表中。这样,更新计数器和处理其他数据的干扰就会减少。
有几个设置需要考虑调整:
innodb_flush_log_at_trx_commit = 2 (权衡速度而不是安全)
sync_binlog = OFF
将多个操作合并到一个BEGIN..COMMIT事务中。但要小心死锁等问题。
也许你说的不是100K连接?这是一个巨大的数字。超过几十个正在运行的线程(不管休眠线程的数量)是相当多的。
另一种计算点击次数的方法不是实时记录点击次数,而是每隔(比如每小时)抓取一次网络服务器日志。有一个单独的过程来将一小时(或每 5 分钟或其他)的所有点击计数为一个数字,以提供给UPDATE. 对于单独的服务器来说,这将需要更多的工作,但对于数据库来说,工作量却很小。