admin管理员组

文章数量:1565258

一次在启动虚拟机的时候,发现有如下提示,drive cache: write through. 这究竟是什么意思呢?

 Write-Through 模式: 
1. DB向Cell发送一个写请求, cellsrv进行验证确认其请求有效; 
2. cellsrv将发送指令将其写入到物理磁盘; 
3. 写完成以后,给DB确认已经写成功; 
4. cellsrv判断次数据是否适合缓存到cache中,如果满足条件则缓存,否则不缓存。

Write-Back 模式: 
1. DB向Cell发送一个写请求, cellsrv进行验证确认其请求有效; 
2. cellsrv将发送指令将其写入到磁盘Cache; 
3. 将此数据的状态置为dirty的状态。(直到下次临界条件将脏数据刷新到磁盘,并判断此数据是否适合缓存,如果不适合,刷新完成以后会丢弃,刷新和缓存过程是异步的,并不在步骤3来完成) 
4. 写完成以后,给DB确认已经写成功;

应用使用缓存作为主要的数据存储,将数据读写到缓存中,而缓存负责从数据库中读写数据。

应用向缓存中添加/更新数据
缓存同步地写入数据存储
返回所需内容
应用代码:

set_user(12345, {"foo":"bar"})
缓存代码:

def set_user(user_id, values):
    user = db.query("UPDATE Users WHERE id = {0}", user_id, values)
    cache.set(user_id, user)
由于存写操作所以直写模式整体是一种很慢的操作,但是读取刚写入的数据很快。相比读取数据,用户通常比较能接受更新数据时速度较慢。缓存中的数据不会过时。

直写模式的缺点:
由于故障或者缩放而创建的新的节点,新的节点不会缓存,直到数据库更新为止。缓存应用直写模式可以缓解这个问题。
写入的大多数数据可能永远都不会被读取,用 TTL 可以最小化这种情况的出现。

Write-Back 模式明显更高效,因为写数据到cache的速度比写到物理磁盘速度要快几个数量级。但是cache属于挥发性设备,无法持久的保存数据,所以需要磁盘控制器/Flash卡有独立的电源模块作为驱动将cache中的数据写回到磁盘。如果没有电源模块,则原本保存在cache中的数据并无法保障总能成功写入到磁盘,如果这个时候主机发生掉电,则可能造成数据不一致。为了保证数据的一致性,如果磁盘控制器或者flash卡的电量不足,则会自动从write-back模式转到write through 模式, 进而对系统的I/O造成影响。在exadata中可以使用exachk工具来检查,以下是Exachk中磁盘raid控制器电池不足导致自动切换到write-through的告警。

 

实际上可以在BIOS中强行修改磁盘控制器的wirte-back或者write-through模式,但是为了保证数据的一致性,我们并不建议这么做。如果出现了以上问题,正确的做法应该是开一个sr,上传对应的exachk报告要求更换电池。

在回写模式中,应用执行以下操作:

在缓存中增加或者更新条目
异步写入数据,提高写入性能。
回写模式的缺点:
缓存可能在其内容成功存储之前丢失数据。
执行直写模式比缓存或者回写模式更复杂。

 

本文标签: Linuxwrite