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