ag切换后辅助节点大量misaligned log IOs
[TOC]
故障上报
2018.09.07 在对alwayson group做了故障转移后,在新的辅助节点SQL Server日志中看到大量如下信息,而且这个misaligned log IOs数字在不断变大:
消息 There have been 295168 misaligned log IOs which required falling back to synchronous IO. The current IO is on file e:\sqllog\xxx_Log.ldf.
如下是版本信息:
- OS版本:Windows Server 2012 x64
- SQL版本:SQL Server 2014 SP2
- 磁盘型号:Memblaze NVMe SSD 3.2T
目前ag共3个节点,执行 fsutil fsinfo ntfsinfo c:
和 fsutil fsinfo ntfsinfo e:
看到的信息如下:
- 节点A:C盘(每个扇区字节数512,每个物理扇区字节数512),E盘(每个扇区字节数512,每个物理扇区字节数4096)
- 节点B:C盘(每个扇区字节数512,每个物理扇区字节数512),E盘(每个扇区字节数512,每个物理扇区字节数512)
- 节点C:C盘(每个扇区字节数512,每个物理扇区字节数512),E盘(每个扇区字节数512,每个物理扇区字节数4096)
注意:只有节点B的E盘物理扇区字节数与别的磁盘不同。
- 场景1:当节点A为主副本、B和C为辅助副本的时候,所有SQL Server日志无上述信息;
- 场景2:当节点B为主副本、A和C为辅助副本的时候,在A和C的SQL Server日志出现大量上述信息;
原厂回复
根据微软工程师的回复,此case是由于ag中主副本与辅助副本存放日志文件的磁盘(case中为e盘)物理扇区不兼容导致的。
故障原因
在AG或Logshipping环境中,当主副本日志文件位于512字节的物理扇区大小的磁盘上。但是,辅助副本日志文件位于有4K字节的扇区大小的磁盘上。
在这种情况下,辅助副本的SQL Server日志中就会记录如下错误信息:
There have been X misaligned log IOs which required falling back to synchronous IO. The current IO is on file ....
关于512原生、512E、4K原生:
每个扇区字节数 | 每个物理扇区字节数 | Drive type | 备注 |
---|---|---|---|
4096 | 4096 | 4K native | 4K原生: 逻辑扇区=物理扇区=4096字节 |
512 | 4096 | Advanced Format (also known as 512E) | 512E:逻辑扇区=512字节,物理扇区=4096字节 |
512 | 512 | 512-byte native | 512原生:逻辑扇区=物理扇区=512字节 |
比如:512E的物理扇区就是:逻辑扇区(每个扇区字节数)为512,物理扇区为4096:
解决方案
建议所有副本的磁盘使用相同的sector size,推荐方案2
方案1:在逻辑层面将io控制在4KB [不推荐]
打开 trace flag 1800 让 SQL Server 从逻辑层面将io控制在4KB,步骤如下:
1.安装修复该问题的SQL Server累积更新包
2.在物理扇区为512字节原生的副本上,打开trace flag 1800
DBCC TRACEON(1800)
3.在主副本的SQL Server日志中,会看到如下信息:
The tail of the log for database '<database name>' is being rewritten to match the new sector size of 4096 bytes
方案2:所有副本的磁盘使用相同的sector size [推荐]
通过工具修改Memblaze的nvme SSD设备的物理扇区为4096字节,步骤如下:
1.首先用memblaze驱动代替原生驱动
- 上传附件nvme_Win8.1&2012r2_Release_x64.0300-mns.zip,解压、点击按步骤完成安装
- 安装完成后,在Windows "设备管理器'下会看到,"storage controllers" ---"Memblaze NVMe 1.2 ..."
2.上传附件 windows_nvmemgr.zip 到计算机,并解压
3.进入到nvmemgr文件夹,点左上角 file--open command prompt--open command prompt as administrator,进入powershell界面
4.执行如下命令,擦除nvme SSD上所有的分区和内容,执行之前请做好必要的备份。若只有一片nvme SSD则默认为nvme0
nvmemgr formatnvm -l 1 -c nvme0
5.命令执行完成后,按提示重启机器
6.再次进入系统后,对nvme SSD做格式化等操作,然后查看物理扇区会变成4096了