【问题标题】:What is the purpose of MySQL's BLACKHOLE Engine?MySQL的黑洞引擎的目的是什么?
【发布时间】:2021-12-28 19:35:38
【问题描述】:

为什么要保存以后无法检索的内容?有什么意义?

【问题讨论】:

    标签: mysql blackhole


    【解决方案1】:

    它在所有 SQL 语句都在所有节点上运行的复制环境中很有用,但您只希望某些节点实际存储结果。这是文档中给出的一个用例:http://dev.mysql.com/doc/refman/5.0/en/blackhole-storage-engine.html

    文档中给出的其他用途包括:

    • 转储文件语法验证。
    • 开销的测量 来自二进制日志,通过比较使用 BLACKHOLE 的性能和 未启用二进制日志记录。
    • BLACKHOLE 本质上是“无操作” 存储引擎,因此可用于查找性能 与存储引擎本身无关的瓶颈。

    【讨论】:

      【解决方案2】:

      假设您有两台计算机,每台计算机都运行一个 MySQL 服务器。一台计算机托管主数据库,第二台计算机托管您用作备份的replicating slave

      另外假设您的主服务器包含一些您不想备份的数据库或表。也许它们是高流失率的缓存表,如果丢失它们的内容也没关系。因此,为了节省磁盘空间并避免不必要地使用 CPU、内存和磁盘 IO,您可以使用 replication options 配置从属服务器以忽略影响您不想备份的表的语句。

      但是由于复制过滤器只在从服务器上应用,所以在主服务器上执行的所有语句的二进制日志仍然需要通过网络传输。这里浪费了带宽;主服务器正在发送事务的二进制日志,从属服务器在接收到它们后就会丢弃它们。我们能否做得更好,并避免不必要的带宽使用?

      是的,我们可以,这就是 BLACKHOLE 引擎的用武之地。在运行主服务器的同一台计算机上,我们运行第二个虚拟 mysqld 进程,这个进程托管黑洞数据库。我们将这个虚拟进程配置为从主进程的 binlog 进行复制,使用与真正的从属相同的复制选项,并生成自己的 binlog。虚拟进程的 binlog 现在只包含真正的 slave 需要的语句,除了从 binlog 中过滤掉不需要的语句(因为它使用 BLACKHOLE 引擎)之外,它没有做任何实际的工作。最后,我们将真正的从属配置为从虚拟进程的 binlog 中复制,而不是从原始主进程的 binlog 中复制。我们现在已经消除了托管主服务器和从服务器的两台计算机之间不必要的网络流量。

      the BLACKHOLE docs 的这段和图表正在描述和说明(更简洁)此设置:

      假设你的应用需要slave端过滤规则,但是先将所有二进制日志数据传输到slave会导致流量过大。在这种情况下,可以在 master 主机上设置一个“dummy”从属进程,其默认存储引擎为 BLACKHOLE,如下所示:

      除了过滤之外,文档还隐晦地暗示使用启用了 binlogging 的 BLACKHOLE 服务器“可以用作中继器......机制”。这个用例在文档中的充实较少,但可以想象一个有意义的场景。例如,假设您有很多从属服务器,它们都位于本地网络上的计算机上,彼此之间具有快速的本地连接,它们都需要从只能通过 Internet 连接的远程从属服务器复制大量数据。您不想让它们全部直接从主盒复制,因为从那时起,您会多次获得相同的数据,并且使用的 Internet 带宽是您必须使用的数倍。但是假设您不希望只有一个现有的从服务器从主服务器复制,而其他从服务器复制从该从服务器,可能是因为您的从服务器运行在比主服务器更不可靠的机器上,或者正在运行一些其他进程,这些进程可能会通过吃掉它的所有 CPU 或内存来杀死盒子,并且您不想冒中间从属设备上的软件或硬件故障导致整个从属网络瘫痪的风险。你是做什么的?

      一种可能的折衷方案是在您的从属网络中引入一个额外的盒子作为中介,针对可靠性和性能而不是存储进行优化。给它一个小型、可靠的 SSD 驱动器,除了从远程主机复制的mysqld 进程之外什么都不运行,并让它生成其他从属可以订阅的二进制日志。当然,还要设置这个中间从站来使用 BLACKHOLE 引擎,这样它就不需要存储空间了。

      这和文档中详细描述的中间过滤从属都是边缘情况;大多数 MySQL 用户永远不会发现自己会从使用这些策略中的任何一个中受益,更不用说受益到足以证明进行实际设置它们的工作的合理性了。但至少在理论上,BLACKHOLE 引擎可用于在复制从属网络中创建一个中间节点作为带宽节约策略,而无需该节点将数据实际存储在磁盘上。

      【讨论】:

        【解决方案3】:

        对于在您不想保留的数据上运行触发器很有用。

        例如,mysql 目前不支持遍历查询结果 - 因此您可以通过使用“insert into (select col1, col2, col3 from where ) 来实现执行相同工作的解决方案"

        然后将 am on-insert 触发器添加到该黑洞表中,该表执行您希望在所选数据的“for each”操作中执行的任务。

        blackhole 不存储结果,因此无需事后清理,您最终会得到一个简单的 for-each 解决方案..

        【讨论】:

        • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-02-27
        • 2021-11-24
        • 2023-04-10
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多