-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
특정 시점의 이벤트를 불러올 때 제대로 실행하지 못하는 부분 #5
Comments
멘토님께서 설명해주신 설명을 듣고 구현해도 좋을 것 같아서 올려보았습니다! |
이 이슈가 julien-duponchelle#404 요 이슈 맞나요? |
@BeautterLife 넵! 이부분 맞습니다 |
이거 멘토님께 설명 들었을 때 되게 흥미로운 문제라고 생각했습니다! 문제 해결에 있어 논점이 될 만한 부분을 잠시 생각해 보았습니다: 예전 binlog file에 있는 timestamp 정보 미리 취득해 주어야 이슈를 해결할 수 있으리라 생각합니다. 이를 위해 인덱스를 구현해야 할까요? 인덱스가 있다면 사용자 요청에 따라 이전 binlog file 매번 뒤적거릴 일도 없고, 사용자가 요청한 timestamp 찾을 때도 퍼포먼스 향상도 꾀할 수 있으리라 생각합니다. |
@jaehyeonpy 님, 말씀하신 인덱스의 이점을 활용할 수 있는 환경은 어떤 환경인가요? |
@jaehyeonpy @BeautterLife |
@BeautterLife, @dongwook-chan 님, 제가 의견을 제시하게 된 경위를 아래에 적어 두었습니다.
꼼꼼히 검토해서 해결책을 내놓은 것이 아니고 어디까지나 브레인스토밍 느낌으로다가 끄적인 것입니다. 많은 피드백 바랄게요! |
@jaehyeonpy |
구현까지 할 의향 있습니다! 다만, 이 이슈의 우선순위를 얼마로 두어야 하는지에 대해 질문을 드리고 싶습니다. 과제 1번도 병행해야 하고, 좀 더 best practice 찾을 시간도 필요할 것 같고요(혹시 DBMS 단에서 공수를 줄일 수 있을 만한 방법을 제공하고 있지는 않을지, 여러 자료구조, 알고리즘 중 최선은 없을지), 다른 분들과도 논의를 할 기회도 있으면 더욱 좋을 것 같기도 해서요. 이러면 필연적으로 어느 정도 시간이 소요되리라 생각합니다. 만일 이 이슈가 급박하게 해결해야 하는 이슈라면, 위 내용 중 어느 정도는 스킵해가며 구현을 시도해 볼 수 있을 겁니다. 반대라면 꼼꼼하게 검토해 본 이후 구현에 들어가 볼 생각이고요. 말씀주신 사항도 감사히 참고 하겠습니다. |
@jaehyeonpy |
말씀 주신대로 본 이슈의 논의를 여기서 이어나가거나 따로 분리를 하거나 하겠습니다. 다른 분들도 편하게 논의 주시면 감사하겠습니다! |
@BeautterLife 님, @dongwook-chan 님과 의논해 본 결과, 우선 binary search 이용해 구현하고, 추후 여유가 되면 다른 방식을 시도해 보는 것으로 의견을 수렴하였습니다. |
@jaehyeonpy님 넵 알겠습니다! 저도 구현해보고 싶은데 혹시 바로 구현하시나요..? |
당분간 다른 분들로부터 의견을 기다리다가 구현을 시작하는 것으로 의견을 교환 하였습니다만, 개인적인 생각으로는 바로 구현하시고 코드 리뷰를 신청하셔도 무방하리라 생각합니다. |
@jaehyeonpy 아하 넵 알려주셔서 감사합니다 ㅎㅎ 저는 추후 시간이 날 때 구현 할 것 같아서 조율이 힘들 것 같아 여쭤봤습니다! |
@dongwook-chan @BeautterLife @ebang091 이 이슈를 해결하기 위한 구현으로써 binary search 이용한 접근법이 아닌 다른 접근법을 사용해야 할 것 같습니다. pseudo code 수준에서 binary search 적용해 보려고 구상 중입니다만 어려움을 겪고 있습니다. binlog file은 bytearray로 작성되어 있기에, 곧바로 binary search 사용해서 사용자가 지정한 특정 timestamp 찾고 그 이후 이벤트를 fetch 할 수 없습니다. ‘사용자가 지정한 특정 timestamp 찾고 그 이후 이벤트를 fetch 하기 위해 binary search 사용한다’ 라는 방식으로 본 이슈를 해결하겠다고 저번에 논의를 하긴 했지만, 이는 timestamp와 그에 대응하는 이벤트가 이미 binlog file에서 파싱되어 python object화 되어 있다는 ‘암묵적’ 전제를 부지불식간에 하고 있었기 때문이라고 생각이 듭니다. 그리고 사용자가 지정한 특정 timestamp 찾고 그 이후 이벤트를 fetch 할 목적으로, timestamp_pos = (start_pos_of_binlog_file + end_pos_of_binlog_file)/2 하는 등의 binary search 하는 방식도 적절하지 않을 것 같습니다. timestamp_pos 계산한 값이 timestamp 바이트가 있는 곳이 아니라, server id 가리키는 바이트라면 일이 번거로울 듯 합니다. 결국엔 binlog file이 bytearray 형식이기 때문에 문제 해결에 어려움을 겪고 있는 것이며, binlog file 파싱하여 python object 만들어야 할 것 같습니다. 따라서 다음의 방식을 제안합니다:
이 때 우려되는 점은 다음과 같습니다:
|
@jaehyeonpy |
@jaehyeonpy binlog00001 file description timestamp 이렇게 순서대로 가져올수있지않을까요? 이걸 key : pair로 timestamp,binlog file_name 로 담고 |
제 방식보다 두 분께서 제시해 주신 방식이 훨씬 효율적이라 생각합니다. 의견 제시 감사합니다! 조만간 생각 다듬어서 다시 논의 올리겠습니다. |
@sean-k1님, @jaehyeonpy님과 예은님, 멘토님 의견 참고하여 의견 남겨보겠습니다. file description에 있는 timestamp를 조회하는 시점에서, 원하는 time과 비교할 수 있기 때문에, timestamp 값을 저장한 배열을 만들어 이진 탐색을 수행하지 않아도 된다고 생각합니다! 이를 기반으로 간단하게 수도코드 생각해보았습니다.
|
잠시 다른 이슈 작업하다, 본 이슈 해결 위한 구체적인 코드 구상에 들어간 상태입니다. 제 방식에 대해 의견이 있으시면 말씀 주세요.
|
@jaehyeonpy 구현의 차이겠지만 모든 binlog event 를 다 읽을 필요가없습니다. binlog 000001 2023 -09-01-00(file description timestamp) 만약 사용자가 원하는 시간이 2023-09-03-00-30 이라고 가정한다면 위에서 말씀드린것처럼 이 방법은 네트워크 비용이 많이들어가는 작업일거같습니다. 저도 다른 접근방법은 떠오르지않네요..! |
@jaehyeonpy 네트워크 비용 측면에서는 캐시를 사용하면 좋을 것 같습니다. 다만 python-mysql-replication이 다시 실행될 때, 기존에 존재하던 binlog file이 Master에 그대로 저장되어 있다고 가정해도 되는걸까요? 만약 그렇지 않다면 캐시를 적용하기는 어려울 것 같습니다..! |
@sean-k1 @yangbaechu 님 의견 감사합니다! 주신 의견 찬찬히 잘 살펴 보며 제 의견을 다시 보았습니다. 두 분 의견은 제 의견과 거의 일치하지만 한 가지 다른 지점이 존재합니다. 제 저번 의견이 불명확해서 다시 한 번 더 정리해 보겠습니다.
제가 말씀을 드리고 싶었던 것은, 'binlog000002의 이벤트를 모두 읽어 디테일한 timestamp비교 후 거기서부터 사용자에게 보여주면됩니다.' 라는 대목에서 time cost 발생 시 이를 감수할 의도가 있는 것이 맞느냐는 것입니다. 아시다시피 binlog file 개수는 적지만, 각각 binlog file 내 이벤트의 개수는 많은데, 파일 내 이벤트를 읽어가며 사용자가 원하는 timestamp 도달하는 것도 상당한 시간이 걸릴 수 있다는 점입니다. 이 지점을 제외하고 두 분 의견과 저의 의견이 일치합니다. network cost 관련해서는 두 분 다 캐시 얘기를 주셨습니다. 제 생각에는 redis 등 이용한 캐시보다 파일을 이용한 캐시가 좋아 보입니다. binlog file 개수가 적어 file I/O 이용해 저장하고 불러올 FORMAT_DESCRIPTION_EVENT의 timestamp 개수도 적어 부담 얼마 없을 듯하고, 반면 redis 사용 시 이를 위한 테스트용 workflow 파일 작성 등 파일에 비해 추가적인 공수 부담이 생길 것 같습니다.
다만, 이 경우에 대해서는 추가적인 논의가 필요할 것 같습니다. 이 부분 관련해서 생각을 더 해보고 추가적으로 의견 드리도록 하겠습니다. 우선은 시간이 급하니 캐시 부분은 제외하고 구현을 진행해 보도록 하겠습니다. |
현재 기록중인 binary log file에서만 찾기 때문에 발생하는 문제 해결
The text was updated successfully, but these errors were encountered: