Sempre haverá uma troca entre resiliência e desempenho.
Com o MySQL no ext4, o padrão barrier = 1, na verdade, causa uma lentidão, no entanto, a primeira ação não deve ser desabilitar o registro em diário ou ativar dados = writeback.
Primeiro, se a resiliência é de grande importância, um RAID apoiado por bateria certamente vale a pena.
As opções de montagem que eu escolhi, especialmente em RAID não suportado por bateria, são:
/dev/mapper/vg-mysql--data /var/lib/mysql/data ext4 defaults,noatime,nodiratime,barrier=1,data=ordered 0 0
Isso intencionalmente não está usando dados = writeback porque eu não quero arriscar a corrupção do sistema de arquivos, resultando em "dados antigos que aparecem em arquivos após uma falha e recuperação de diário" (a citação é de man mount
).
A configuração ideal em my.cnf para resiliência total em torno de configurações relacionadas a E / S é:
[mysqld]
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
Eu optei pela seguinte sequência de trade-offs para aumentar o desempenho:
-
sync_binlog = 0
: esta é a primeira configuração do MySQL que eu mudo para longe da resiliência total. A razão para isso é que ele proporciona uma melhoria significativa no desempenho, especialmente quandobinlog_format=row
(infelizmente necessário para Jira). Estou usando bastante réplicas do MySQL no cluster que, se o log binário fosse corrompido por um cenário de perda de energia, eu faria uma cópia binária de outra réplica. -
innodb_flush_log_at_trx_commit = 2
: Enquanto um valor de 1 é necessário para total conformidade com o ACID, com um valor de 2 "o buffer de log é gravado no arquivo em cada confirmação, mas a operação de flush para disco não é executada nele. No entanto, o fluxo no arquivo de log ocorre uma vez por segundo também quando o valor é 2. Observe que a liberação de uma vez por segundo não é 100% garantida para acontecer a cada segundo, devido a problemas de agendamento do processo. " (citação da documentação do MySQL) - Atualize as opções de montagem para usar
data=writeback
. Note que se este for o seu sistema de arquivos raiz, você também precisará passar uma opção de linha de comando do kernel. Eu juntei alguns passos sobre isso em coderwall . - Teste vários valores de
innodb_flush_method
. O_DIRECT é mostrado para melhorar o desempenho em algumas cargas de trabalho, mas não é certo que isso funcionará em seu ambiente. - Faça o upgrade para SSDs. Nesse caso, você também deseja aumentar
innodb_io_capacity
e ajustar configurações comoinnodb_adaptive_flushing
,innodb_read_io_threads
,innodb_write_io_threads
,innodb_purge_threads
e outras configurações possíveis.