inicia o serviço mysql depois de sincronizar o diretório de dados para tmpfs

2

hej ai!

Estou mantendo uma rede de 8 Pandaboards. Um deles está agindo como servidor para hospedar um jogo de navegador baseado em php, outros são clientes que executam esse jogo.

O servidor roda o Debian Wheezy a partir do cartão SD, o que é bastante lento. Para melhorar o desempenho do jogo em clientes eu mudei dir de dados mysql e tmp dir para tmpfs e alterei my.cnf de acordo. Os dados não precisam ser sincronizados de volta para o SD porque não são alterados, apenas as estatísticas temporárias do jogo são gravadas no banco de dados.

Agora, isso é feito por meio de adições ao rc.local:

# mount tmpfs
sudo mount -t tmpfs tmpfs /var/tmpfs
# put a fresh copyy of mysql data there
sudo rsync -a /var/lib/mysql/ /var/tmpfs/mysql/
# restart mysql service
sudo service mysql restart

Esta solução está funcionando, mas suponho que não seja a mais elegante, já que o mysql começa com o my.cnf modificado, ainda não encontrará dados no tmpfs e produz erros na primeira inicialização. Eu trabalhei com isso atrasando a solicitação inicial da página do jogo por 3 segundos.

Como posso iniciar o mysql APÓS todos os dados são sincronizados com tmpfs? Adicione um script que monte e rsync a todo /etc/rc*.d onde há um Sxxmysql? Os diretórios rc * .d são apenas para serviços?

Qualquer ajuda é apreciada.

    
por ronso0 30.06.2014 / 14:59

2 respostas

1

Você pode usar um script de serviço (bom) ou incluí-lo no script mysql (temp. workarround, feio, não funcionará após as atualizações.)

algo como /etc/init.d/mysql deve existir.

então você procuraria start e, antes que o mysql fosse iniciado, você adicionaria sua parte do script.

(pode diferir um pouco nas versões mais recentes)

em um dos meus hosts, seria assim:

# 
# main()
#
>
case "${1:-''}" in
'start')
    sanity_checks;
    # Start daemon 
    log_daemon_msg "Starting MySQL database server" "mysqld"
    if mysqld_status check_alive nowarn; then
       log_progress_msg "already running"
       log_end_msg 0
    else
       setup_chroot
        # Could be removed during boot
        test -e /var/run/mysqld || install -m 755 -o mysql -g root -d /var/run/mysqld

        # mount tmpfs
        sudo mount -t tmpfs tmpfs /var/tmpfs
        # put a fresh copyy of mysql data there
        sudo rsync -a /var/lib/mysql/ /var/tmpfs/mysql/

        # Start MySQL!   
        /usr/bin/mysqld_safe > /dev/null 2>&1 &

Você pode querer considerar adicionar algumas verificações de integridade, etc.

Note que, como você disse, uma solução que realmente usaria as dependências do processo de inicialização seria mais elegante:

Assim, você poderia fazer da sua montagem um "serviço" e incluí-lo no processo booot, e fazer o mysql depender do serviço iniciado antes. (Eu acho que você poderia incluí-lo no serviço de montagem, mas não tenho certeza sobre isso)

    
por 30.06.2014 / 15:24
1

Dennis me apontou na direção certa. Nos comentários eu não posso mostrar claramente o que funcionou para mim, então eu vou responder a minha pergunta com base em sua opinião.

Backup & edite o / etc / fstab. Adicionado:

tmpfs  /path/to/mount/point  tmpfs  rw  0 0

Backup & edite /etc/init.d/mysql. Eu coloquei meu código no início das verificações de integridade, antes dos casos de [start | stop]:

sanity_checks() {
  # check wether /var/tmpfs/ already contains /mysql directory
  if [ ! -d /var/tmpfs/mysql ]; then
     # copy fresh mysql data to tmpfs
     rsync -a /var/lib/mysql/ /var/tmpfs/mysql/
     # temp log message for debugging
     log_daemon_msg "Just synced MySQL data directory to /var/tmpfs" "Cool!"
     log_end_msg 0
  # also optional:
  else
     log_daemon_msg "MySQL data dir already in sync" "Supercool!"
     log_end_msg 0
  fi

  [ other checks ]
}

Estou feliz com esta solução.

    
por 30.06.2014 / 23:05