
배경-
HA 목적으로 NAS를 DR_NAS와 동기화하려고 합니다.
불행히도 합병증이 있습니다.
- NAS는 Alibaba Cloud에 있습니다. 아직 NAStoNAS 동기화를 지원하지 않습니다.
- 제가 아는 가장 좋은 방법은 2개의 NAS 사이에 동기화 프로토콜을 설치하는 것인데 NAS에 직접 연결할 수 없습니다. 알리바바가 통제합니다.
- 단일 시스템에 설치하고 두 NAS 간에 lsyncd/rsync를 사용해 보았습니다. 그러나 그것은 실패했습니다.
- lsyncd의 주요 작성자에 따르면 lsyncd는 Linux 커널을 사용하여 파일 시스템을 모니터링하는 Inotify Wait를 사용합니다. 그러나 Linux 커널은 NFS 파일 시스템을 모니터링하지 않습니다. 서버 자체가 NAS에 파일을 쓰는 시기는 알지만 다른 시스템이 파일에 쓰는 시기는 알지 못합니다.
- 따라서 NAS에 파일을 쓰는 모든 시스템에 lsyncd를 설정해야 합니다. 이것이 Inotify Wait가 아는 유일한 방법이기 때문입니다.
- 동기화가 설정되었습니다. 시스템이 (PROD NAS):/data/A/에 파일을 쓰면 lsyncd가 이를 감지하여 rsync 서버에 보고합니다. 그런 다음 rsync 서버는 해당 디렉터리(DR NAS)에 파일을 씁니다: /data/A/
현재 상태 -
어느 날 동기화가 깨졌다는 사실을 발견하기 전까지는 잘 작동하는 것 같았습니다.
작성자가 동일한 디렉터리를 동기화할 수 없는 것 같습니다.
- rsync 서버는 SystemA가 /data/A에 쓰고 SystemB가 /data/B에 쓸 때도 이 작업을 수행합니다.
- SystemA와 SystemB가 동시에 /data/C에 쓰는 경우 동기화 중 하나가 중단되고 이후에는 한 시스템만 /data/C에 쓸 수 있습니다.
질문
- 여러 lsyncd 클라이언트가 rsync 서버와 동기화하고 동일한 디렉터리를 사용할 수 있습니까?
- 두 개의 원격 NFS 디렉터리를 동기화하는 더 좋은 방법이 있습니까?
답변1
문제는 "Inotify Wait를 사용하는 lsyncd"에 있습니다. 아마도 /data 디렉토리 수준(?)에서 발생합니다. 이로 인해 대상 데이터가 변경되어 lsync 프로그램이 시작됩니다.
두 소스가 동시에 동일한 대상을 업데이트하는 경우 해당 업데이트가 유효하더라도 해당 업데이트를 신뢰할 수 없습니다.문서. 동일한 디렉토리를 사용하는 데에는 문제가 없습니다.
inotify가 더 세분화된 수준(예: 파일 수준)에서 지정되면 하나의 소스만 파일에 쓰는 한(그리고 다른 프로그램이 파일을 읽을 수도 있음) 문제가 없습니다.
따라서 하나의 SystemX만 /data/X에 쓰면 충돌이 발생하지 않습니다.
inotify
그러나 두 SystemX가 /data/SAME에 쓸 때 일부 디렉터리 수준 트리거 이벤트가 누락되어 lsync가 일부 업데이트를 누락하게 됩니다.
두 개의 NAS 디렉터리를 동기화하는 방법에 답하려면 시스템에 대한 자세한 지식이 필요합니다. 그러나 정기적인 동기화는 rsync
두 NAS 시스템 모두에 대해 (별도적으로) 실행됩니다.할 수 있다작동 - 해당 디렉토리에 중복 파일이 없는 경우.
답변2
같은 디렉토리에 쓰면 동기화가 깨지는 이유를 찾았습니다.
Rsync 동작:
Rsyncd는 루트 사용자가 실행하는 데몬 프로세스입니다. 디렉터리 권한은 rsyncd.conf에서 구성됩니다. 구성된 UID가 대상 디렉터리의 UID와 일치하지 않으면 대상 디렉터리에 모든 권한이 있어도 동기화가 중단됩니다.
내 상황: 파일은 /data/2021/07/20, /data/2021/07/21 등과 같은 날짜 롤링 디렉터리에 저장됩니다.
시스템은 결코 동일한 파일에 쓰지 않지만 동일한 "새" 디렉터리에 기록되도록 운명지어져 있습니다.
예를 들어,
lsyncd 서버 중 하나가 "source:/data/2021/07/25/A"에서 새 파일을 감지했지만 "target:/data/2021/07/25/" 디렉터리가 아직 존재하지 않는 경우 rsync 서버는 먼저 "target:/data/2021/07/25" 디렉터리를 생성합니다.루트 권한 아래를 누른 다음 파일 A를 복사합니다. "target:/data/2021/07/25" 디렉터리의 권한은 파일 "A"가 완전히 복사될 때까지 소스의 권한과 일치하지 않습니다. 파일이 전송되면 rsync는 디렉터리 권한을 동기화합니다.
이 동작으로 인해 동기화 연결 끊김이 발생할 수 있습니다. 소스 A가 여전히 루트 권한으로 디렉터리에 쓰고 있는 동안 소스 B가 "source:/data/2021/07/25"를 감지하면 소스 B 및 대상과의 동기화가 중단됩니다.
이 문제를 미리 일일 디렉토리를 생성하여 해결하려고 했으나 오늘 0바이트 파일을 작성한 후 정지 후 동기화 중 하나가 깨졌습니다.