0

我正在编写一个 db logging ruby​​ gem,它将简单地从 Beanstalk 队列中取出一个作业并将其写入数据库。

那是服务器 A 上的一个进程在服务器 B 上的 Beanstalk 队列中放置一个作业(它想要记录),而我在服务器 B 上的日志记录进程将其取出并将其写入服务器 B 上的 mysql DB。

我想知道这是否值得?将作业放入 Beanstalk 队列比写入数据库更快。或者我想要记录到数据库的进程可以直接将其写入数据库而不是使用记录过程。

请注意,beantalk 服务器和数据库都在另一台服务器上。

Beanstalk 在内部进行从服务器 A 到服务器 B 的套接字调用。我相信 mysql 也需要这样做吗?

因此,mysql 到另一台服务器会比放入 beanstalk 队列慢。

4

1 回答 1

4

它会快得多,主要是因为默认情况下 Beanstalkd 作业存储在内存中,并且在例如服务器断电时会丢失,而 MySQL 是一个强 ACID 兼容的关系数据库,因此将付出很多努力并将每个日志刷新到磁盘。

我想您会发现,在对系统生成的大量日志进行一些基准测试之后,磁盘 I/O 将成为您的限制因素,而不是 TCP/IP 套接字的速度。您当前系统的优势在于,当服务器 A 在服务器 B 的 beanstalkd 实例上记录日志时,它占用服务器 A 的时间非常少,并且服务器 B 可以定期将我们的许多日志一次从 beanstalkd 刷新到 MySQL,从而使过程更加高效。缺点是,您对日志进行批处理的次数越多,在发生软件/电源故障时丢失的日志就越多,除非您使用 beanstalkd 的“-b”参数,该参数通过将作业写入磁盘来使作业持久(因此使过程变慢)。

当然,真正解决这个问题的唯一方法是对标!

于 2011-08-13T08:38:21.420 回答