전원 손실로 인한 SSD 손상을 방지 할 수있는 방법이 있습니까?


15

Linux, 로컬 웹 서버 및 PostgreSQL이 설치된 소비자 단말기 그룹이 있습니다. 문제가있는 기계에 대한 현장 보고서를 받고 있으며 조사 결과 정전이 발생한 것으로 보이며 이제 디스크에 문제가있는 것 같습니다.

문제는 데이터베이스가 손상되었거나 최근 변경 사항이있는 파일이 스크램블 된 것으로 가정했지만 다른 이상한 보고서가 있습니다.

  • 권한이 잘못된 파일
  • 디렉토리가 된 파일 (예 index.php: 이제 디렉토리 임)
  • 파일이 된 디렉토리
  • 스크램블 된 데이터가있는 파일

데이터베이스가 손상되는 데 문제가 있지만 예상했던 것입니다. 더 놀랍게도 권한이나 파일을 디렉토리로 변경하는 것과 같은보다 기본적인 파일 시스템 문제입니다. 최근에 변경되지 않은 파일 (예 : 소프트웨어 코드 및 구성)에서도 문제가 발생합니다.

이것이 SSD 손상에 대한 "정상"입니까? 원래 우리는 그것이 싼 SSD에서 일어나고 있다고 생각했지만, 이것은 유명 브랜드 (소비자 등급)에서 일어나고 있습니다.

FWIW, 우리는 부정한 부팅에서 autofsck을 수행하지 않습니다 (왜 새로운 지 모르겠습니다). 일부 지역에는 UPS가 설치되어 있지만 때로는 제대로 수행되지 않는 등의 경우도 있습니다.이 문제는 해결되어야하지만 사람들은 터미널의 전원을 불결하게 끄는 등의 작업을 수행 할 수 있습니다. 파일 시스템은 ext4입니다.

문제는 시스템 수준에서 문제를 완화하기 위해 할 수있는 일이 있습니까?

하드웨어 캐시를 끄거나 드라이브를 동기화 모드로 마운트하는 것에 관한 기사를 찾았지만이 경우 도움이 될지 확실하지 않습니다 (메타 데이터 손상 및 최근이 아닌 변경). 또한 파일 시스템을 읽기 전용 모드로 마운트하는 것에 대한 참조를 읽었습니다. 우리는 쓰기가 필요하기 때문에 그렇게 할 수 없지만 도움이된다면 코드와 구성을위한 읽기 전용 파티션을 만들 수 있습니다.

다음은 드라이브의 예입니다 sudo hdparm -i /dev/sda1.

Model=KINGSTON RBU-SMS151S364GG, FwRev=S9FM02.5, SerialNo=<deleted>
Config={ Fixed }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=0
BuffType=unknown, BuffSize=unknown, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=125045424
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes:  pio0 pio3 pio4
DMA modes:  mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
AdvancedPM=yes: disabled (255) WriteCache=enabled
Drive conforms to: Unspecified:  ATA/ATAPI-3,4,5,6,7

5
더 나은 SSD를 구입할 수 있습니다. 일반적인 엔터프라이즈 SSD에는 정전시에도 기내 데이터 쓰기를 완료 할 수 있도록 장치에 충분한 전원을 공급하기 위해 커패시터가 내장되어 있습니다. 완전히 뒤섞인 파일 시스템에서 복구 할 필요가 없기 때문에 절약하는 비용은 적당한 추가 비용을 쉽게 정당화 할 수 있습니다.
마이클 햄튼

1
글쎄, 아무도 당신이 그들 모두 를 교체해야한다고 말하지 않았습니다 . 그러나 교체 및 / 또는 신규 설치에 더 나은 SSD를 사용할 수 있습니다.
Michael Hampton

2
"모두 교체하는 것은 간단하지 않다"-완전히 그렇습니다. 그 사람에게 마지 못해 구매 결정에 심각한 태만과 무능력으로 인한 비용에 대해 책임을지게함으로써 시작하십시오.
TomTom

7
WriteCache=enabled. 이것은 큰 문제입니다. 데이터베이스가있는 하드 드라이브에서는 쓰기 캐시를 사용 하지 않아야합니다. 예를 들어 HP와 같은 일부 공급 업체는 실제로 이런 이유로 하드 드라이브 쓰기 캐싱을 사용하지 못하게합니다.
Greg Askew

3
@Yehosef는 OS에서 쓰기 캐싱을 비활성화해도 드라이브가 전원 손실시 데이터를 손상 시킨다는 사실을 수정하지는 않습니다. 더 빠른 속도와 내구성을 위해, 소비자 등급 SSD는 파일에 쓸 때 비 휘발성 메모리에 데이터를 쓰지 않을 수 있으며 불행히도 드라이브가 휘발성 캐시에서 비 휘발성 스토리지로 데이터를 가져갈 수있는 하드웨어 메커니즘 이 없습니다 . 정전은 엔터프라이즈 SSD 만 가능합니다. 누군가가 많은 소비자 용 SSD를 구입 한 비슷한 상황에 있었는지 믿거 나 말거나,이 하드웨어를 인용 한 공급 업체는 이것이 일어날 지 전혀 몰랐습니다.
jrh

답변:


14

갑자기 전원이 꺼지면 MLC / TLC / QLC SSD에는 두 가지 장애 모드가 있습니다.

  • 기내 및 DRAM 전용 쓰기를 잃습니다.
  • 프로그래밍중인 NAND 셀의 아래쪽 페이지에 저장된 미사용 데이터를 손상시킬 수 있습니다.

첫 번째 고장 조건은 분명합니다. 전원 보호가 없으면 안정적인 스토리지 (예 : NAND 자체)가 아닌 휘발성 캐시 전용 (DRAM)에있는 데이터가 손실됩니다. 고전적인 기계식 디스크에서도 마찬가지입니다 (그리고 fsync를 제대로 발행하지 않는 파일 시스템을 혼란스럽게 만들 수도 있습니다).

두 번째 실패 조건은 MLC + SSD입니다. 새로운 데이터를 저장하기 위해 높은 페이지 비트를 다시 프로그래밍 할 때 예기치 않은 전력 손실로 인해 하위 비트 (예 : 이전 커밋 된 데이터)도 파괴 / 변경 될 수 있습니다.

유일하고 진실한 유일한 해결책은 고급 RAID 컨트롤러가 영원히 사용했던 것처럼 전력 손실 방지 DRAM 캐시 (일반적으로 배터리 / 슈퍼 캡 사용)를 통합하는 것입니다. 그러나 이것은 드라이브 비용 / 가격을 증가시킵니다. 소비자 드라이브에는 일반적으로 전원 손실 보호 캐시가 없습니다. 오히려 다음과 같이보다 경제적 인 솔루션을 사용합니다.

  • 부분적으로 보호 된 쓰기 캐시 (즉 : Crucial M500 / M550 / M600 +);
  • NAND 변경 저널 (예 : 삼성 드라이브, SMART PoR 속성 참조);
  • 특별한 SLC / 의사 -SLC NAND 영역은 이전 데이터의 위험없이 새로운 쓰기를 흡수합니다 (예 : Sandisk, Samsung 등).

귀하의 질문으로 돌아가십시오 : Kingstone 드라이브는 지정되지 않은 컨트롤러를 사용하고 기본적으로 공개 사양이없는 매우 저렴한 드라이브입니다. 갑작스런 정전으로 인해 이전 데이터가 손상되었다는 것은 놀라운 일이 아닙니다. 불행히도, 디스크의 DRAM 캐시를 비활성화하더라도 (대량의 성능 손실 명령으로) 이전 데이터 (즉, 미사용 데이터)가 예기치 않은 전력 손실로 인해 손상 될 수 있으므로 문제를 해결 하지 못합니다 . 이들이 이전 Sandforce 컨트롤러를 기반으로하는 경우 "올바른"상황에서 전체 드라이브 브릭도 예상 할 수 있습니다.

UPS를 검토하고 중간에 이러한 노후화 드라이브를 교체 할 것을 적극 권장합니다.

PostgreSQL를 다른 리눅스 데이터베이스에 대한 마지막주의 사항 : 그들은 것 없는 디스크의 캐시를 비활성화해야 하지 그렇게 exptected한다. 오히려, 주요 데이터를 안정적인 스토리지에 커밋하기 위해 주기적 / 필수 fsync / FUA를 발행합니다. 이것은 매우 설득력있는 이유가 존재 하지 않는 한 (즉, ATA FLUSHES / FUA에 관한 드라이브) 수행하지 않는 방법 입니다.

편집 : 가능하면 체크섬 파일 시스템으로 ZFS 또는 BTRFS로 마이그레이션하는 것이 좋습니다. 최소한 저널 체크섬과 최근 메타 데이터 체크섬이있는 XFS를 고려하십시오. EXT4를 사용해야하는 경우 시작시 auto-fsck를 활성화하십시오 (fsck.ext4는 복구 손상에 매우 적합합니다).


훌륭한 답변입니다. 관련 질문 serverfault.com/questions/924054/…를 참조하십시오. 이 답변을 복사 / 적응하려면 의견을 올리거나 기꺼이 선택하십시오. 쓰기 캐시를 비활성화하면 첫 번째 경우에만 도움이됩니다. 두 번째 실패 모드에 대한 자세한 내용이 있습니까? 리 밸런싱 / 가비지 수집 또는 근접성에 연결되어 있습니까?
Yehosef

1
다음 "전력 손실"절에서, 여기 봐주세요 @Yehosef anandtech.com/show/8528/...
shodanshok

1
소프트웨어 솔루션의 문제점은 많은 SSD가 fsync / FUA 명령에 대한 응답을 포함하여 데이터가 안전하게 저장되는지 여부에 대해 운영 체제에 존재한다는 것입니다. 전력이 차단 될 때 캐시 플러시를 완료하기에 충분한 에너지 저장 공간이있는 엔터프라이즈 드라이브의 경우 문제가되지 않습니다.
BeowulfNode42

@ BeowulfNode42 ATA 장벽 및 FUA를 준수 해야 합니다. IDE / PATA 시대에는 일부 드라이브가 플러시 훼손되었지만, 오늘날 그러한 "거짓말"드라이브는 SATA / SAS 호환이 아니므로 즉시 버려야합니다.
shodanshok

그러나 이러한 비 호환 드라이브는 특히 소비자 시장 부문에서 판매됩니다.
BeowulfNode42

11

네. 초저가 SSD를 구입하지 마십시오. 저가형 소비자 시장 이외의 모든 제품에는 커패시터와 전력 손실에 대한 완벽한 보호 기능이 있습니다. Amd는 실제로 그렇게 많은 비용을 들이지 않습니다.


그들은 Kingston입니다-그래서 그것이 싼 것으로 간주되는지 또는 결함이 많은지 모르겠습니다. 더 큰 문제는 유닛 (~ 6k)이 이미 현장에 있고 대부분 고장이없는 것입니다 (아마도 전력 손실이 없었기 때문에). 그래서 그것들을 교체하는 것은 우리가 아직 치지 않은 비싼 최후의 수단입니다.
Yehosef

질문에 드라이브 정보를 추가했습니다.
Yehosef

5
그들은 매우 싸다. 가격 지향적 인 최종 사용자 드라이브입니다. 소규모 엔터프라이즈 드라이브를 찾으십시오. 사양을 읽으십시오. 일반적으로 정전 보호는 사양에 있습니다.
TomTom

1
@TomTom에 추가하려면 때로는 실제로 정전 보호라고도하지 않으며 때로는 정전 보호가 실제로 정전 보호가 아닌 경우도 있습니다! 각 제조업체에 대해 약간의 독서를 수행하고 특정 브랜드의 엔터프라이즈 SSD에 대해 무엇을 요구하는지 찾아야합니다. 내가 단일 구매 적어도 그것이 것을 발견했다 (이봐, 각 제조업체에 대한 백서를 위해 그들은. 자신의 기업의 SSD가 얼마나 진정으로 뛰어난에 작성했습니다) 그리고 않는 아주 조금 더 비용을. 그러나 나는 대량 구매를하지 않으며 100 이상 수량에 따라 다를 수 있다고 생각합니다.
davidbak

3
지금까지 읽은 내용에서이 제조업체의 이름은 DC400 시리즈와 같이 Kingston = "Pfail"입니다. 삼성 = "전력 손실 보호"; 인텔 = "향상된 전력 손실 데이터 보호"; Sandisk = "정전 보호를 통한 데이터 손실 보호". 다른 제조업체가 무엇을 부르는지 모르겠지만 사양 시트를 자세히 읽으십시오. 제조업체에서 제공하는 경우 펌웨어를 사용하여 얻을 수도 있습니다. 실제로 6000 개가 넘는 경우 Kingston에 연락하여 상황을 설명하고 드라이브 당 펌웨어 비용을 지불하도록 제안합니다.
BeowulfNode42

7

가장 먼저해야 할 일은 복구 시간과 복구 지점 목표를 정의하는 것입니다. 이 터미널 중 하나를 얼마나 오래 복구해야하며 어떤 데이터 시점이 허용됩니까? 아마도 몇 시간 내에 지난 주 백업으로 복구 할 수 있어야합니다.

비행 중 쓰기가 손실되면 모든 종류의 이상한 일이 파일에 발생할 수 있습니다. 파일 시스템 우선 순위는 고유 한 메타 데이터 일관성을 유지하므로 데이터에 대해 동일한 보장을 제공하지 않을 수 있습니다. 다시 말해, fsck데이터 복구가 보장되지는 않습니다. 그 일은 마운트 할 파일 시스템을 얻는 것입니다.

그래서 힘. UPS가 시스템을 정상적으로 종료하는지 설치, 구성 및 테스트하십시오. 이를 통해 파일 시스템 캐시 및 드라이브 자체에 쓸 수 있습니다.

그리고 디스크 쓰기의 내구성. PostgreSQL의 안정성 장을 읽으십시오 . diskchecker.pl여기에 링크 된 스크립트를 사용하여 충돌 테스트를 수행하고 쓰기가 비 휘발성 스토리지에 있는지 SSD가 거짓말하는지 판별하십시오. 손실이있는 경우 전력 손실 방지 기능이있는 것으로 알려진 SSD로 교체하는 것이 좋습니다.

편집 : 쓰기 캐시가 활성화 된 세부 정보를 추가했습니다. hdparm -W0 /dev/sda하드웨어 어레이에 해당 명령 또는 해당 명령 을 비활성화 할 수 있습니다 . 참조 : RHEL 스토리지 관리 안내서 .

파일 시스템 쓰기 장벽은 저널 커밋 순서를 강제합니다. 데이터가 손상되지 않는다고 보장하는 것은 아니지만 휘발성 캐시가있는 파일 시스템에 대해 더 안전합니다. 이것이 기본값이지만 "배리어"마운트 옵션을 추가하면 성능 대비 일관성을 중요하게 문서화 할 수 있습니다.

마지막으로 마지막 방어선. 응용 프로그램 및 데이터베이스를 원하는 시점으로 가져올 수 있도록 복원 테스트를 수행하십시오. 이것은 정전뿐만 아니라 모든 종류의 데이터 손실에 유용합니다.


이 디스크 쓰기 캐싱이 그 대답 일 것입니다. 알 수없는 이유로 Postgres가 디스크 쓰기 캐싱을 비활성화하지 않는 것 같습니다. 이는 끔찍한 기본 설정입니다.
Greg Askew

1
명확히하기 위해-매일 백업이 있고 데이터를 클라우드에 동기화하므로 문제가 Postgres 데이터 손실과 관련이 적습니다 (관심은 있지만 PG 구성 옵션이 도움이 될 수 있다고 생각합니다). 더 큰 문제는 메타 데이터의 이상성으로 인해 머신을 사용할 수 없게된다는 것입니다. FWIW, 일반적으로 컴퓨터가 부팅되고 연결할 수 있지만 파일이 스크램블되어 응용 프로그램이 실패합니다.
Yehosef

1
"Postgres가 디스크 쓰기 캐싱을 비활성화하지 않는 것 같습니다. 이는 끔찍한 기본 설정입니다." @GregAskew Coimsumer SSD에서 DRAM 캐시를 비활성화하는 방법을 설명하십시오. 비활성화 할 수 없습니다.
TomTom

4
SSD 작동 방식으로 인해. 쓰기 캐시가 없으면 SSD를 훨씬 빨리 태울 것입니다. SSD 셀은 크기가 크며 항상 완전히 기록해야하므로 여러 개의 작은 쓰기를 결합하는 기능은 SSD 수명에 중요합니다. 그렇기 때문에 소비자 드라이브에서 드라이브를 비활성화 할 수없고 (드라이브가 있거나 허용하지 않는 경우) 엔터프라이즈 드라이브에서 드라이브를 실행할 수 없습니다 (드라이브는 기본적으로 휘발성이 아니기 때문에 드라이브가 드램을 작성할 수있는 충분한 에너지가 있습니다) 밖으로 플래시합니다.
탐 탐

3
@Yehosef 아니요, Postgres는 드라이브에 데이터를 전송하면 복구 할 수있는 마법의 힘을 가지고 있으며 드라이브는 "Good, your data를 얻었습니다"라고 말한 다음 드라이브가 내부 임시 휘발성에서 해당 데이터를 쓰지 못했습니다. 실제 비 휘발성 스토리지에 캐시. 드라이브 또는 RAID 장치에 배터리 또는 커패시터로 내부 캐시를 지원하는 엔터프라이즈 급 스토리지 만 사용하는 것이 중요합니다. Postgres에는 아직 드라이브로 전송되지 않은 데이터 손실을 방지하는 기능 (WAL 파일 등)이 있지만 Postgres는 드라이브 내부 에서 손실 된 데이터를 복구 할 수 없습니다 .
Basil Bourque
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.