Назад | Перейти на главную страницу

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

привет!

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

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

Сейчас это достигается за счет дополнений к 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 только для служб?

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

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

Сделайте резервную копию и отредактируйте / 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 ]
}

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

Вы можете использовать служебный сценарий самостоятельно (хорошо) или включить его в сценарий 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 зависел от ранее запущенной службы. (я думаю, вы могли бы включить его в службу монтирования, но я не уверен в этом)