MYSQL所在机器磁盘满了以后,写入数据库会阻塞吗?
当磁盘空间写满了之后,MySQL是无法再写入任何数据的,包括对表数据的写入,以及binlog、binlog-index等文件。
当然了,因为InnoDB是可以把脏数据先放在内存里,所以不会立刻表现出来无法写入,除非开启了binlog,写入请求才会被阻塞。
当MySQL检测到磁盘空间满了,它会:
每分钟:检查空间是否得到释放,以便写入新数据。当发现有剩余空间了,就会继续写入数据,一切照旧。
每十分钟:如果还是发现没剩余空间,则会在日志中写入一条记录,报告磁盘空间满(这时候只写入几个字节还是够的)。
应该怎么办
那么,当发现磁盘空间满了之后,我们应该怎么处理呢,建议:
提高监控系统检测频率,预防再次发生;
图片来源:网络
及时删除不用的文件,释放空间;
若有线程因磁盘满的问题被阻塞了,可先杀掉,等到下一分钟重新检测时它可能又可以正常工作了;
可能因磁盘满导致某些线程被阻塞,引发其他线程也被阻塞,可把导致阻塞的线程杀掉,其他被阻塞的线程也就能继续工作了。
例外
有个例外的情况是:
当执行 REPAIR TABLE 或者 OPTIMIZE TABLE 操作时,或者执行完 LOAD DATA INFILE 或 ALTER TABLE 之后批量更新索引时,这些操作会创建临时文件,当执行这些操作过程中mysqld发现磁盘空间满了,就会把这个涉及到的表标记为crashed,删掉临时文件(除了 ALTER TABLE 操作,MySQL会放弃正在执行的操作,删除临时文件,释放磁盘空间)。
备注:当执行这些命令过程中mysqld进程被意外被杀掉的话,其所生成临时文件不会自动删除,需要手工删掉才能释放磁盘空间。
何时使用分布式消息队列?
就我的认知来看,消息队列目前有几类用途。
1.消除峰值,控制流速
比如这样一个场景,今日头条的百万答题,在结束之后需要分钱,分钱就需要写库。而你的mysql只允许你以300每秒写入,这时候消息队列是一个好的办法
2.离线计算
日志分析,图像处理,这些属于这类应用。
比如你想你能够根据web站点的日志做监控,这时候在不影响web服务的前提下,你可以定时通过消息队列传送日志流
3.解耦
想象一个用户上传图像的服务,用户只是想上传到空间,但是你需要加水印。如果加水印和用户记录在一起,会很慢。所以常见的做法是web服务接受图片,通过消息队列转发给水印服务,web服务本身不会阻塞住。
你所说的分布式队列,只是为了适应大吞吐的消息队列的优化实现,作用无非这几种。