Запусти службу 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 ]
}
Я доволен этим решением.