将数据目录同步到 tmpfs 后启动 mysql 服务

将数据目录同步到 tmpfs 后启动 mysql 服务

嗨呀!

我维护着一个由 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 ]
}

我对这个解决方案很满意。

相关内容