Galera: Executar lento ALTER sem bloquear todo o servidor

3

Eu tenho um cluster galera de três nós com algumas centenas de bancos de dados atendendo vários clientes.

Estou apenas usando o galera como uma maneira fácil de lidar com replicação e fallover. Na verdade, não estou usando vários mestres de uma só vez.

Eu preciso executar um ALTER bastante caro em algumas tabelas em cada banco de dados. Normalmente, eu teria um script que executasse um script de atualização em cada banco de dados, um por um, e apenas desligasse cada site um de cada vez.

Mas com esse cluster galera, qualquer DDL lento resultou em um bloqueio completo em todos os bancos de dados, não apenas no que foi executado. Basicamente, isso significa que sempre que eu preciso executar uma atualização, todo mundo fica offline o tempo todo que leva para executar a atualização para todos.

Eu sei que há wsrep_OSU_method , mas alterá-lo para RSU problemas próprios e eu não acho que isso ajude.

Existe apenas uma maneira de desativar o bloqueio? Ou, pelo menos, torná-lo um bloqueio no nível do banco de dados, em vez de um bloqueio no nível do servidor?

E se eu desativasse meus outros nós no cluster enquanto executava a consulta - isso ainda resultaria em um bloqueio global? Como eu disse, na verdade eu não uso múltiplos masters, então neste caso, ter os outros nós offline por alguns minutos está ok (assumindo se o processo de reintegração automática acontece quando eu os trouxe de volta).

    
por chroder 02.02.2015 / 19:25

1 resposta

1

Você está com sorte! Percona faz uma ferramenta chamada pt-online-schema-change para exatamente esse tipo da situação.

pt-online-schema-change emulates the way that MySQL alters tables internally, but it works on a copy of the table you wish to alter. This means that the original table is not locked, and clients may continue to read and change data in it.

pt-online-schema-change works by creating an empty copy of the table to alter, modifying it as desired, and then copying rows from the original table into the new table. When the copy is complete, it moves away the original table and replaces it with the new one. By default, it also drops the original table.

Embora seja feito por Percona, ele funciona em qualquer uma das principais variantes do MySQL.

    
por 02.02.2015 / 19:46