전원이 무작위로 차단되는 기계에 데이터를 저장하는 방법


13

실제 머신 호스트에서 실행중인 가상 머신 (Debian)이 있습니다. 가상 머신은 로컬 네트워크를 통해 자주받는 데이터의 버퍼 역할을합니다 (이 데이터의 기간은 0.5 초이므로 상당히 높은 처리량). 수신 된 모든 데이터는 가상 머신에 저장되고 UDP를 통해 반복적으로 외부 서버로 전달됩니다. 외부 서버가 UDP를 통해 데이터 패킷을 수신했음을 확인하면 원래 데이터가 가상 시스템에서 삭제되고 외부 서버로 다시 전송되지 않습니다. VM과 외부 서버를 연결하는 인터넷 연결은 신뢰할 수 없으므로 한 번에 며칠 동안 다운 될 수 있습니다.

VM을 호스팅하는 물리적 시스템은 하루에 여러 번 전원이 임의로 차단됩니다. 언제 이런 일이 일어날 지 알 수 없으며 UPS, 배터리 또는 이와 유사한 솔루션을 시스템에 추가 할 수 없습니다.

원래 데이터는 가상 머신의 파일 기반 HSQLDB 데이터베이스에 저장되었습니다. 그러나 자주 전원이 꺼지면 데이터베이스 스크립트 파일이 손상됩니다 (파일 시스템 수준이 아닙니다. 즉 읽을 수 있지만 HSQLDB는 이해할 수 없습니다).

정전이 자주 발생하는 환경에 데이터를 어떻게 저장해야합니까?

내가 생각할 수있는 한 가지 옵션은 플랫 파일을 사용하여 각 데이터 패킷을 파일 시스템의 파일로 저장하는 것입니다. 이렇게하면 전원 손실로 인해 파일이 손상된 경우 무시해도되고 나머지 데이터는 그대로 유지됩니다. 그러나 이는 가상 머신에 저장 될 가능성이있는 데이터의 양과 관련하여 몇 가지 문제를 야기합니다. 각 데이터 사이에서 0.5 초에 10 일 안에 1,728,000 개의 파일이 생성됩니다. 이것은 최소한이 데이터를 저장하기 위해 증가 된 inode 수를 가진 파일 시스템을 사용하는 것을 의미합니다 (현재 파일 시스템 설정은 ~ 250,000 메시지 및 30 % 디스크 공간 사용으로 inode가 부족함). 또한 관리하기가 어렵습니다 (불가능하지는 않습니다).

다른 옵션이 있습니까? 전원 차단으로 손상되지 않는 데비안에서 실행되는 데이터베이스 엔진이 있습니까? 또한 어떤 파일 시스템을 사용해야합니까? ext3은 현재 사용되는 것입니다.

가상 머신에서 실행되는 소프트웨어는 Java 6을 사용하여 작성되었으므로 솔루션이 호환되지 않기를 바랍니다.


14
"VM을 호스팅하는 물리적 시스템은 하루에 여러 번 전원이 임의로 차단됩니다. 언제 이런 상황이 발생했는지 알 수 없으며 UPS, 배터리 또는 이와 유사한 솔루션을 추가 할 수 없습니다. 체계." 나는 정말 그 가능성 방법을 알고 싶어요. 국제 우주 정거장에 있습니까? UPS를 보내려면 2 천만 달러가 필요합니까?
ceejayoz

3
머신에 최소한 배터리 백업 캐시가있는 RAID 컨트롤러가 있습니까?
Zoredache

4
이 문제에 대해 매우 흥미롭고 창의적이며 이론적으로 올바른 솔루션을 추천 할 수 있습니다. 그러나 , 우리는 호스트에서 어떤 하이퍼 바이저와 하드웨어가 실행되고 있는지 모릅니다. 따라서 디스크 쓰기가 실제로 쓰여지거나 올바른 순서로 쓰여졌다는 보장은 없습니다.
pino42

5
@Sevas 그것은 귀하의 전화가 아닌 것처럼 들리지만 50 개의 기본 저렴한 UPS는 $ 2500가 들고 유지 보수가 필요하지 않다는 것을 지적하는 것이 좋습니다 (배터리가 갈 때 몇 년 후에 교체하십시오) ). 무료로 일하는 많은 코더를 알지 못한다면 소프트웨어 에서이 문제를 해결하는 데 드는 비용은 그보다 훨씬 높습니다. 시간당 3 ~ 3 개 @ 수십 또는 수백 명의 숙련 된 인력 시간 대신, 단위당 $ 50의 비용으로이 문제를 해결하는 데 도움이 될 수 있습니다.
HopelessN00b

9
이것은 실제로 악성 프로그램처럼 들립니다. 사용자는 자신의 컴퓨터에서 "VM"이 실행되고 있는지 알 수 없습니다. 전체 네트워크에서 데이터를 훔친 다음 한 번의 연결을 통해 데이터를 끌어내어 자신을 숨 깁니다. 사용자가 임의로 "컴퓨터를 껐다가 켜십시오"-UPS 만 추가 할 수는 없습니다.
Laurence

답변:


23

솔직히 여기서 가장 좋은 방법은 전원 차단을 수정하거나 더 나은 위치에 다른 시스템을 배포하는 것입니다.

그렇습니다. redis와 같은 시스템은 재생을 위해 추가 전용 로그에 데이터를 저장하지만 더 낮은 수준에서 손상 될 위험이 있습니다. 예를 들어 파일 시스템이 스크램블되면 디스크의 데이터가 잠재적으로 위험에 노출됩니다.

개선이 도움이 되셨지만, 실제로 설명한 시나리오를 통해 해결할 수있는 문제는 아닙니다.


8
+1 정답은 "하지 마십시오"
Chris S

6
+1 결국 임의 전원 차단은 파일 시스템을 손상시킵니다. 전자 장치는 정전으로 이상한 예측할 수없는 일을합니다.
부여

-1 (가상 -1). 그런 시스템 때때로 정전이 발생한다는 가정하에 구축 되어야 한다고 생각합니다 . 이 가정은 당신이 다루어야 할 실제 사실입니다.
Igal Serban

11

당신의 접근 방식이 효과가 있습니다. 개선 사항을 제안하겠습니다. 파일원자 쓰기를 할 때 스택 오버플로에 대한 질문이있었습니다 . 기본적으로 각 데이터 패킷을 임시 파일에 저장 한 다음 이름을 최종 이름으로 바꿉니다. 이름 바꾸기는 정전으로부터 안전 할 수있는 원 자성 작업입니다. 이렇게하면 최종 대상에있는 모든 파일이 손상없이 올바르게 저장됩니다.

그런 다음 수백만 개의 파일이있는 문제를 처리하기 위해 수행 할 수있는 작업입니다. cron은 1 시간 이후에 모든 파일을 가져 와서 원자 파일 작업을 다시 사용하여 하나의 큰 파일로 결합하여 매 시간마다 실행되는 작업으로 정전 중에도이 작업이 안전하게 실행 된 다음 이전 파일을 삭제합니다. 로그 회전과 비슷합니다. 한 시간 분량의 파일은 약 7,200 개의 파일입니다. 따라서 어느 시점 에나 디스크에 20,000 개 이상의 파일이 없어야합니다.


1
나쁜 대답은 아니지만 쓰기 문제는 원자 자체 연산이 아니라고 가정하는 것입니다. 따라서 잘못된 시간에 정전이 발생해도 데이터 또는 FS 손상이 발생할 수 있습니다. 아마도 전원을 고정하거나 UPS에 물건을 꽂지 않는 가장 좋은 옵션에 대해서는 아마도 +1입니다.
HopelessN00b


예, 일단 작성된 파일의 이름을 바꾸는 것은 원 자성 작업입니다. 처음에 파일을 작성하는 것은 아닙니다.
HopelessN00b

3
@ HopelessN00b 새 파일이 절반으로 작성되었거나 손상되었는지는 중요하지 않습니다. 이전 파일이 양호한 상태입니다. 시스템을 복구하면 반으로 쓴 파일이 삭제됩니다.
DJClayworth 2011

2
@ HopelessN00b 정확히! 임시 디렉토리의 임시 파일 만 쓸 수 있다고 말할 수 있습니다. 최종 대상 디렉토리의 모든 파일은 항상 디스크에 손상되지 않고 안전하게 보관됩니다
Marwan Alsabbagh

7

시스템에 배터리 백업 쓰기 캐시가 포함 된 UPS 또는 RAID 카드를 설치하고 최소 $ 49.95의 비용 으로 소프트웨어만으로는 불가능한 것을 달성합니다.

이 서버를 UPS 또는 배터리에 연결할 수 없다는 주장은 믿을 수 없습니다.


9
관료주의의 어리 석음은 항상 믿을 수 있습니다.
Dan은 Firelight에 의해

3
@DanNeely My PHB won't let me hook this up to a UPS/battery는 너무 비현실적이지 않다는 것과는 매우 다르지만 it is not possible to add a UPS, a battery, or a similar solution to the system. 사용 가능한 접근 방식과 솔루션을 변경하기 때문에 중요한 차이점입니다.
HopelessN00b

또는 다른 곳에서 언급했듯이, 납치 된 컴퓨터의 사용자는 UPS 설치를 요청하면 놀라게됩니다. 상황은 그렇지 않으면 조금 믿어지지 않습니다. 정당한 사유로 적절한 비즈니스 사례가있는 경우 손상된 데이터를 통해 UPS를 수락 할 수 있습니다.
WernerCD

@WernerCD CIO를 만나고 싶습니다. 나는 누군가의 컴퓨터를 납치하는 것이 이것의 가능한 사용 사례라는 것에 동의하지만, 합법적 인 컴퓨터도 생각할 수 있으므로 그 남자에게 의심의 혜택을 줄 것이다. 임베디드 시스템과 컨트롤러 또는 Raspberry Pi와 같은 것을 생각해보십시오. 사용중인 "컴퓨터"가 UPS에 연결하는 데 드는 $ 50 미만의 가치가있을 수 있습니다.
HopelessN00b

컴퓨터 가격이 $ 50 미만인 경우에도 실제로 가치가있는 것은 컴퓨터의 데이터입니다. Google은 "무가치 한"컴퓨터에 구축되었습니다. CPU 비용보다 더 중요한 것은 데이터 손실, 인력 손실 (이 프로그래밍 모험, 데이터 손상 추적, 기존 시스템의 버그 추적 및이 새로운 부분), 고객 가치 손실 (데이터 손실? 다음 회사에 문의하십시오.)
WernerCD

5

모든 데이터를 저장하는 블록 장치를 제외하고 전체 시스템을 읽기 전용으로 마운트하십시오. 해당 블록 장치를 직접 사용하고 해당 원시 블록 장치를 사용하여 고유 한 데이터 저장 메커니즘을 구현하십시오.


3
... 배터리 지원 디스크 컨트롤러 카드에 투자하고 디스크에 쓰기 캐시가 없는지 또는 여전히 망가져 있는지 확인하십시오.
voretaq7

플랫 파일 솔루션과 함께 사용되는 솔리드 스테이트 스토리지를 사용하여 Live-CD 또는 동등한 ROM 시스템으로 부팅해야한다고 말한 것입니다.
Mark Allen

쓰기 캐시를 비활성화 할 수 있습니다. 이 접근법은 실행 가능합니다. 추가 만 저장 메커니즘이 권장됩니다. 블록은 원자 적으로 작성되므로 (새로운 것으로 가정) 새 / 할 일 데이터로 섹션의 시작과 끝을 가리키는 두 개의 "포인터"블록을 가질 수 있습니다. 데이터 쓰기 / 마무리 후에 포인터가 업데이트됩니다. NCQ도 비활성화해야합니다.
sleeplessnerd
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.