嗨呀!
我维护着一个由 8 个 Pandaboard 组成的网络。其中一个用作服务器来托管基于 php 的浏览器游戏,其他则是运行该游戏的客户端。
服务器从 SD 卡运行 Debian Wheezy,速度非常慢。为了提高客户端的游戏性能,我将 mysql 数据目录和 tmp 目录移至 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 秒来解决此问题。
在所有数据同步到 tmpfs 后,如何启动 mysql?添加一个脚本,该脚本执行 mount 和 rsync 到所有有 Sxxmysql 的 /etc/rc*.d?rc*.d 目录仅用于服务吗?
任何帮助都将受到赞赏。
答案1
您可以自己使用服务脚本(好)或将其包含在 mysql 脚本中(temp.workarround,丑陋,更新后无法工作。)
应该存在类似 /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 依赖于之前启动的服务。(我认为您可以将其包含在挂载服务中,但我不确定这一点)
答案2
Dennis 为我指明了正确的方向。在评论中我无法清楚地展示哪些方法对我有用,所以我将根据他的意见回答我的问题。
备份并编辑 /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 ]
}
我对这个解决方案很满意。