DB 크래시 이후에 WAL을 사용해서 복구를 진행하는 경우에 commit된 데이터까지만 복구가 되는 것으로 알고있습니다.
그런데 아래와 같은 테스트 케이스에서 제가 이해하고있는 방식으로 동작을 하지 않아 정상적인 과정인지 문의드리고 싶습니다.
1) create table A(a int);
2) insert into A values(generate_series(1,10000000));
3) 인서트 진행중에 kill -9 pid 사용 DB 정지
4) DB 재기동 (복구) 후 select count(*) from A;
-> 1000만건 조회됨
몇번 테스트해도 동일하길래 kill -9로 마스터 프로세스 죽인 이후에 확인해보니 아래와 같은 프로세스가 계속해서 동작중이었습니다.
postgres 11100 1 8 15:40 ? 00:00:03 postgres: postgres postgres [local] INSERT
조금 찾아보니 kill -9 으로 프로세스를 종료하게되면 하위 프로세스에 종료 시그널을 보내지 못하여 해당 프로세스가 계속 살아있는 것 같은데
복구 시점에서는 롤백처리가 되어야 하는게 아닌가 싶어서요.
만약 복제가 진행중인 상황이었다고 하면 복제서버는 walsender가 종료되었으니 해당 데이터를 수신하지 못했을 것이라고 생각합니다.
그러면 이 상황에서는 복제서버의 데이터를 기준으로 해야하는건지, 아니면 비정상 종료가 되었지만 계속 데이터 삽입을 진행한 원본 서버를 기준으로 해야하는 건지도 애매합니다.
postgresql이 의도한대로 WAL데이터 기록등이 다 된 것으로 보아야 할까요?
그리고 APP단에서 보면 원본 서버가 요청에 대한 응답을 진행하지 않은 상황으로 보고 다시 요청을 날리게되면 데이터 자체가 틀어지게 될건데, 혹시 이런 경우에는 어떤 데이터를 기준으로 해야하는지도 궁금합니다.
|