Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Contadores de atualização de alto volume Mysql


Você dividiu o cliente em uma máquina separada do servidor? Esse é um primeiro passo menor na escala.

Você tem consultas de replicação e somente leitura enviadas para Slaves? Isso pode permitir leitura ilimitada dimensionamento. (Mas isso não aborda a questão UPDATE, além de aliviar a carga no Master.)

115 IOPs em um único disco giratório praticamente o saturarão. O padrão innodb_flush_log_at_trx_commit é 1, o que leva a pelo menos 1 IOP por transação. Algumas soluções temporárias (até que seu tráfego cresça mais 10x)...

SSDs -- talvez 1000 IOPs.

Agrupe as atualizações (como mencionado por @N.B.) Isso reduz em 100x o número de "flushes".

innodb_flush_log_at_trx_commit =2 -- para eliminar virtualmente os flushes (com alguma perda de segurança).

Mas -- Mesmo que você possa fazer os UPDATEs rápido o suficiente, você também não precisa ler os valores? Ou seja, haverá disputa. Quantos SELECTs no mesmo mesa você está fazendo? 100/s pode estar ok; 1000/seg pode causar tanta interferência que não funcionará.

Qual o tamanho da mesa? Para que isso funcione, ele precisa ser pequeno o suficiente para ser armazenado em cache o tempo todo.

O Reddit é outra abordagem - capture as atualizações lá. Em seguida, retire continuamente as contagens acumuladas e faça as ATUALIZAÇÕES necessárias.

Sharding -- É aqui que você divide os dados em várias máquinas. A divisão em um hash ou pesquisa (ou combinação dos dois) do ID do usuário é comum. Em seguida, o UPDATE precisa descobrir qual máquina atualizar e executar a ação lá. Se você tiver 10 shards (máquinas), poderá sustentar quase 10 vezes a taxa de atualização. Em última análise, esta é a única maneira que todos os pesos pesados ​​podem lidar com mais de 100 milhões de usuários e bilhões de consultas/dia.

PARTICIONAR provavelmente não ajudará. O código de remoção de partição ainda não é eficiente o suficiente para evitar muita sobrecarga para uma consulta tão pequena.