Closed whchoi83 closed 4 years ago
최종 결론은 아래와 같습니다.
operation 이동 시에 switchover 와 failover 를 구별할 수 있어야 하는데, failover 를 인지할 수 있는 방법을 찾아봤지만 현재로서는 마땅한 방법이 없습니다.
특정 node 가 비정상적으로 종료되는 경우 이것을 client 에서 항상 감지할 수 있는 방법이 없습니다.
해당 node 로 operation 을 수행 중이었다면, 정확히는 network 에 read/write 중이었다면 network exception 을 통해서 감지할 수 있지만
아무것도 수행하고 있지 않다면 cache list 를 통해 event 를 받기 전까지는 이것을 감지하지 못합니다.
@jhpark816 @MinWooJin 좀 바보 같은 질문일 수도 있는데 혹시나 해서 확인합니다. operation 을 처리하는 thread 와 switchover 를 수행하는 thread 가 별도로 동작하나요? 질문을 정확히 하면 요청받은 operation 의 response 를 client 에 전달하지 않았는데, switchover 를 수행할 가능성이 있는지 궁금합니다. (아마도 switchover 가 가능한지 판단하는 조건에 이 부분이 포함될 것 같은데 혹시나 해서 확인합니다) 즉, client 가 master node 에게 set 요청을 보냈는데, master node 가 STORED 혹은 SWITCHOVER reponse 를 client 에게 보내지 않은 상태에서 slave node 로 전환될 가능성이 있나요?
@jhpark816 @MinWooJin @minkikim89 현재 구현 상태에 대해 질문 하나 더 합니다.
master 와 slave node 사이에 현재 heart beat 통신을 하고 있나요? 만약에 하고 있다면, master 에 적용된 write operation 이 slave 로 적용되는 중에 master 가 (비정상)종료되면 slave 가 이것을 바로 인지하고 적용 중이던 operation 을 취소하나요? 혹은 가능한가요? 현재는 구현이 어떤 상태로 되어 있나요?
failover 시점에 operation 상태를 확인하고 싶어서 질문합니다.
@whchoi83 @MinWooJin @minkikim89
@whchoi83 replication에서 switchover 작업의 문서화가 필요한 데, 이 작업을 진행해 주면 좋겠어요.. 별도의 이슈로 올리도록 할께요...
논의 후 결정된 상태에 대해서 코멘트 남깁니다.
switchover 의 경우 전체 operation 을 move 하면 됩니다. failover 의 처리는 앞서 논의했던 것들이 무의미합니다. master 가 비정상적으로 종료되면 slave 가 이것을 인지하고 master 전환되기까지 최소 zookeeper session timeout 만큼이 필요하며 master 로 변경되기 이전에는 operation 의 move 가 의미 없습니다. 또한 master 가 비정상적으로 종료되었다는 것을 정확하게 판단할 수 있는 방법이 현재까지는 없습니다.
이 때문에 switchover 시에만 전체 operation 을 move 하도록하고 failover 는 updateConnection 에 의해 적절히 (reading state operation 은 cancel 후에) operation 을 move 하도록 합니다.
현재 구현 상태는 operation 에 의한 switchover 인지 시에는 모든 operation 을 move 하도록 되어있지만 updateConnection(ZooKeeper)에 의한 switchover 인지 시에는 reading status operation 을 cancel 하도록 되어있습니다. 그 외에 updateConnection 에 의한 replication group 의 변화는 reading status operation 을 cancel 한 후에 move 하도록 되어있습니다. updateConnection 을 통한 switchover 시 operation move 에 대한 처리를 수정 후 본 이슈는 close 하도록 하겠습니다.
본 이슈에 참고 comments 를 남기면
switchover 시에 server 에서 operation 처리가 제대로 되어있는지 점검이 필요합니다. event_handler 내에 state loop 를 확인해야 합니다.
updateConnection 코드를 보니, failover 하는 유일한 경우가 아래 경우인 것 같은데요..
Failover하는 다른 경우가 있을 수 있나요 ?
@jhpark816 updateConnections 에서는 2가지 경우가 있습니다.
newGroupAddrs.size() 가 1이 아닌 경우의 코드를 찾아보시면 됩니다.
결국, failover는 ZK event를 받아 인지할 수 밖에 없고, 위 2가지 경우가 failover에 해당됩니다. ZK event 통해 failover를 인지하므로(대부분 abnormal shutdown일 것이므로), reading state에 있는 operations들은 대부분 응용에 의해 cancel되었을 것입니다. 이는 서비스 응용이 그렇게 작성되었다고 가정 하에 얘기 입니다.
앞서 failover인 경우, 아래와 같이 처리하자는 의견이 있었는 데,
reading status에 있는 연산들은 대부분 cancel되었을 것이므로, move할 경우가 없을 것 같습니다. 하지만, 일부라도 있다면, 위 의견은 유효할 것 같습니다.
ARCUS 운영자가 실수로 master node를 normal shutdwon 시킬 수도 있으니까요..
@jhpark816
reading state에 있는 operations들은 대부분 응용에 의해 cancel되었을 것입니다.
가 어떤 의미로 말씀하신건가요? 혹시 Operation Timeout Exception 에 의한 cancel 처리를 말씀하신건가요?
@whchoi83 예.. operation timeout execption 발생 시, 응용에서 cancel()하는 경우를 말합니다.
본 이슈는 "[Java Client] switchover에서 reading operation 처리 개선"https://github.com/jam2in/arcus-task/issues/84 에서 처리하던 것을 옮겨왔습니다. 자세한 히스토리는 본래 이슈를 참고하시면 됩니다.