【问题标题】:Galera Mariadb Multi-Master ReplicationGalera Mariadb 多主复制
【发布时间】:2020-10-12 15:42:21
【问题描述】:

我正在尝试在 3 个不同的位置设置一个由 3 个服务器组成的集群;达拉斯-美国、伦敦-英国、孟买-印度。在每个位置我都设置了一个网络服务器和数据库服务器。在数据库服务器上,我配置了 Galera Mariadb 多主集群以在所有三台服务器之间复制数据库。我的每个网络服务器都通过本地 IP 连接到他们的区域数据库服务器。我期待我的达拉斯网络服务器将从达拉斯数据库服务器获取数据库记录;来自伦敦数据库服务器的伦敦网络服务器和来自孟买数据库服务器的孟买网络服务器。

一切都运行良好,但我发现 mysql 查询在获取记录时需要超过 100 秒的时间。我已经尝试过使用单实例的 Mariadb 并在 5 秒内获取数据。

我做错了什么?

【问题讨论】:

    标签: mysql mariadb


    【解决方案1】:

    可以将 Galera 配置为单主控。听起来你没有这样做,但建议仔细检查。

    鉴于所有节点都是可写的,下面是每个事务发生的简化视图。

    1. 完成所有工作以存储/更新您所连接的 Master 上的数据。 (推测是本地机器。)
    2. 在 COMMIT 时,对其他节点进行一次往返(可能约为 200 毫秒),让它们有机会说“等等!这会导致冲突”。
    3. 通常第 2 步会返回“没关系”。此时COMMIT向客户端返回成功。

    (注意:如果您使用的不是BEGIN...COMMIT,而是auto_commit=ON,那么每个DML 语句的末尾都有一个隐含的COMMIT。)

    对于本地读取,默认操作应“立即”返回。

    但是,也许您担心“批判性阅读”问题。 (cf wsrep_sync_wait)在这种情况下,您要确保写入已传播到您的服务器。这可能会导致读取延迟 200 毫秒,因为它等待“gcache”被赶上。

    如果您可以假设只从他们写入的同一服务器读取,请考虑设置wsrep_sync_wait=0。如果有人进行跨数据中心写入,然后读取,他可能会遇到“关键读取”问题。 (这是他写东西的地方,但可能在下次阅读时看不到。)

    【讨论】:

    • 感谢您的宝贵意见。我只使用从我的网络服务器到本地数据库服务器的 SELECT 语句。某些 SELECT 查询会出现延迟,但并非所有查询都会出现延迟。但是,当我关闭 wsrep 时,这种意外延迟永远不会发生。
    • 我刚刚尝试在 my.cnf 中设置 wsrep_sync_wait=0 但没有运气。但这是默认值。
    • @codelearner - “关闭 wsrep”是指禁用 Galera? “不走运”是指它给出了语法错误?还是未能加快 SELECT 的速度?
    • 是的,我关闭了 Galera。它不会给出错误,但由于出于安全原因,我在 PHP 中的 request_timeout 限制设置为 100 秒,因此它会超时。如果我关闭 Galera,那么查询会及时完成。
    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多