Запусти службу mysql после синхронизации данных dir с tmpfs

Хей там!

Я поддерживаю сеть из 8 Pandaboards. Один из них выступает в роли сервера для размещения браузерной игры на основе php, другие - клиенты, запускающие эту игру.

Сервер запускает Debian Wheezy с SD-карты, что довольно медленно. Чтобы улучшить производительность игры на клиентах, я переместил mysql data dir и tmp dir в tmpfs и соответственно изменил my.cnf. Данные не нужно синхронизировать обратно на SD, потому что они не изменены, в БД записывается только временная статистика игры.

Прямо сейчас это достигается путем добавления в 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

Это решение работает, но я полагаю, что оно не самое элегантное, поскольку mysql запускается с измененным my.cnf, пока не находит данные в tmpfs и выдает ошибки при первом запуске. Я работал над этим, задерживая начальный запрос страницы игры клиентов на 3 секунды.

Как я могу запустить mysql ПОСЛЕ того, как все данные синхронизируются с tmpfs? Добавить скрипт, который монтирует и rsync для всех /etc/rc*.d, где есть Sxxmysql? Каталоги rc *.d предназначены только для служб?

Любая помощь приветствуется.

2 ответа

Решение

Вы можете использовать служебный скрипт самостоятельно (хорошо) или включить его в сценарий mysql (временный обходной путь, некрасиво, не будет работать после обновлений).

что-то вроде /etc/init.d/mysql должно существовать.

тогда вы будете искать start и прежде чем MySQL действительно запустится, вы добавите свою часть скрипта.

(может немного отличаться с более новыми версиями)

на одном из моих хостов это будет выглядеть так:

# 
# 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 &

Вы можете рассмотреть возможность добавления некоторых проверок работоспособности и т. Д.

Обратите внимание, что, как вы сказали, решение, которое фактически использует зависимости процесса загрузки, будет более элегантным:

Таким образом, вы можете сделать свой монтирование "сервисом" и включить его в процесс загрузки, и сделать так, чтобы mysql зависел от того, какой сервис был запущен ранее. (Я думаю, что вы могли бы включить его в службу монтирования, но я не уверен в этом)

Деннис указал мне в правильном направлении. В комментариях я не могу четко показать, что сработало для меня, поэтому я отвечу на мой вопрос, основываясь на его мнении.

Резервное копирование и редактирование / etc / fstab. Добавлено:

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

Резервное копирование и редактирование /etc/init.d/mysql. Я поместил свой код в начале проверок работоспособности, до [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 ]
}

Я доволен этим решением.

Другие вопросы по тегам