环境:Debian 11.3
百无聊赖,折腾一下。自己的库里有300多表,想着法子加速一下吧。。。
很明显,放内存里是最快的,但是有一个安全性问题,比如死机和异常断电。不过这个在我这里还好,因为每天有完整备份,还做着同步复制,所以数据是不会丢的。
折腾了几个小时,起初思路是一个内存盘,一个物理盘,两者构成一个raid 0,设置只从内存读取。这个并不复杂,但我这个raid太大了,要缩减出来一点空间的话万一文件系统出问题就要很长时间重建,所以只能放弃。
然后想着是一个内存盘,一个用文件构成的虚拟盘,两者raid 0 或者类似的路子,可惜这个事我不熟,没搞成,尴尬。
最后只能纯内存盘了,反正数据安全是没问题的。
于是又有几个思路。
起初考虑是系统启动和关机时处理,但时机不好把握,很难精确的注入到mysql启动前和关闭后这个时间点,还有个问题就是中途重启数据库无法掌控。
考虑了几种办法,最终是创建一个自己的系统服务,注册成为mysql服务的周期前后两个点,这样就完美了。
==============
经长时间测试,外部服务的方式并不稳定。目前更稳定的新方法是把动作注入mysql的systemd配置文件。
具体做法:
1,创建存放目录和内存盘
mkdir /mysqldb mkdir /mysqldb2 echo "" >> /etc/fstab echo "tmpfs /var/lib/mysql tmpfs rw,noatime,mode=1777,size=3g,nr_inodes=500K 0 0" >> /etc/fstab
这里我弄了两个,mysqldb2是为了避免操作失误的,当一切就绪并且重启测试没问题就可以删了。
2,停止mysql/mariadb,挂上内存盘,同步数据
systemctl stop mysql rsync -a --delete /var/lib/mysql/ /mysqldb/ rsync -a --delete /var/lib/mysql/ /mysqldb2/ mount --types tmpfs --options rw,noatime,mode=1777,size=3g,nr_inodes=500K --source tmpfs --target /var/lib/mysql rsync -a --delete /mysqldb/ /var/lib/mysql/
注意,这里必须关掉mysql,后面说具体原因。
3,注册自己的服务 (此步骤更新在后面)
cat > /lib/systemd/system/mariadbonramdisk.service <<- _EOF1_ [Unit] Description=mysql/mariadb on ramdisk Before=mysql.service [Service] Type=oneshot ExecStart=/usr/bin/rsync-a --delete /mysqldb/ /var/lib/mysql/ ExecStop=/usr/bin/rsync-a --delete /var/lib/mysql/ /mysqldb/ [Install] RequiredBy=mysql.service _EOF1_ systemctl enable mariadbonramdisk.service systemctl daemon-reload
3,修改mysql/mariadb的服务文件
在/usr/lib/systemd/system/mariadb.service里面[Service]单元增加两行即可:
ExecStartPre=/usr/bin/rsync -a --delete /mysqldb/ /var/lib/mysql/ ExecStopPost=/usr/bin/rsync -a --delete /var/lib/mysql/ /mysqldb/
ExecStartPre需要放在所有现存ExecStartPre之前。然后重载并且重启mysql/mariadb:
systemctl daemon-reload systemctl restart mysql
注意,可能需要根据你的实际情况修改路径什么的。强烈建议先在虚拟机上测试,自己不够熟悉的话就别直接干上生产环境去。
嗯,完成了以后看起来就很简单了,但必须按本文流程走,不然很容易丢数据,别问我怎么知道的。。。不过我测试的时候是在虚拟机,呵呵。
在第二步的时候,必须关掉mysql/mariadb,因为一旦自己的服务注册上,就会随着mysql的启动/停止而产生动作,所以有些步骤需要事先做好。
这几步完成以后,可以试一下重启机器、重启mysql、修改数据什么的,速度应该飞起了,很爽的。