我有一个 3 节点的 galera 集群,其中有几百个数据库为各种客户提供服务。
我只是使用 galera 作为处理复制和故障转移的简单方法。我实际上并没有同时使用多个主服务器。
我需要在每个数据库中的某些表上运行相当昂贵的 ALTER。通常,我会编写一个脚本,逐个在每个数据库上运行升级脚本,然后一次关闭一个站点。
但是对于这个 galera 集群,任何缓慢的 DDL 都会导致所有数据库被完全锁定,而不仅仅是它所针对的数据库。基本上,这意味着每当我需要运行升级时,在我为所有人运行升级的整个时间内,所有人都会离线。
我知道wsrep_OSU_方法但是将其更改为 RSU 本身存在问题,而且我认为没有帮助。
有没有办法禁用该锁?或者至少使其成为数据库级锁而不是服务器级锁?
如果我在运行查询时禁用集群中的其他节点,会怎么样?这是否仍会导致全局锁定?就像我说的那样,我实际上并不使用多个主节点,因此在这种情况下,让其他节点离线几分钟是可以的(假设当我将它们带回来时,通常会发生自动重新加入过程)。
答案1
你真幸运!Percona 制作了一款名为pt-online-schema-change
就是针对这种情况。
pt-online-schema-change 模拟 MySQL 内部修改表的方式,但它在您要修改的表的副本上工作。这意味着原始表未被锁定,客户端可以继续读取和更改其中的数据。
pt-online-schema-change 的工作原理是创建要更改的表的空副本,根据需要对其进行修改,然后将原始表中的行复制到新表中。复制完成后,它会移走原始表并用新表替换它。默认情况下,它还会删除原始表。
虽然它是由 Percona 制作的,但它可以在任何主要的 MySQL 变体上运行。