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

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

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

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

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

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

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

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



답변

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

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

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


답변

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

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


답변

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

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


답변

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