원래 DB하다가 DE로 넘어왔고
개발자만 있던 회사고 인프라테크는 내 팀이 처음으로 구성된 팀이었음
난 개발하러 왔는데 코꿰여서 울며 겨자먹기로 탈출한 인프라 다시 함 ....
기존 개발자들은 Psql을 많이 썼는데
나도 몇번 건드려보니 개발자들이 좋아할 만한 기능은 꽤 많음
DB현업때 Psql 느낌은 C 함수 매핑 가능한 커스터마이징 디비 느낌이었는데
요즘은 쪼오금 다르더라.
어쨌거나 고객사에 그게 들어가 있었는데
인프라 관리가 이쪽으로 넘어(짬맞음씨발)오다 보니 관리를 해야하는데
Dead tuple 문제가 계속해서 발목을 처 잡음
난 단순히 empty node나 세그먼트 해제 등 데이터 마이그레이션이나 세그먼트 삭제 등 하면 해결 날 이슈일 줄 알았는데
이새끼가 생각보다 문제가 큼..
그리고 '해결할 수 있는 문제가 아님'
서비스하는 내내 영원히 너의 발목을 잡을 수 있음
그래서 지금은 psql 다 빼자고 하고 올전환함.
개발자들이 잘쓰면 문제가없다 ㅎㅎ 하지만 그렇지않다는건 개발자들도 잘알고있음.
참고:
https://www.cs.cmu.edu/~pavlo/blog/2023/04/the-part-of-postgresql-we-hate-the-most.html
The Part of PostgreSQL We Hate the Most // Blog // Andy Pavlo - Carnegie Mellon UniversityAs much as Andy loves PostgreSQL, there is one part that is terrible and causes many headaches for people. Learn what it is and why it sucks.www.cs.cmu.edu(MVCC)
MVCC의 자세한 작동 구조에 대해서는 알아서 알아 보고
어쨌거나 이 MVCC 1황은 오라클인데
MVCC의 기본 개념은 '스냅샷'임.
이 스냅샷을 오라클은 undo 공간을 두는 것으로 해결했고
멀티 버전 컨커런시 머시기라고 하는 만큼 트랜잭션 시점 관리를 위해 필요함
isolation level이니 뭐니 알지? 사실 난 네개 읊으라고 하면 못 읊음 ㅎ
기본적으로 이 undo의 스냅샷은 DB 내부 시간으로 관리되는데 이것이 오라클에서는 LSN으로 대표되고 뭐..마리아디비는 TID인가? 뭐 그런거 있더라
그 내부 시간 단위로 관리되고 dml transaction이 발생하면 그 트랜잭션이 해소될 때까지 해당 트랜잭션에 해당하는 LSN 버전의 데이터를 undo에 저장해 놓는다.
그리고 그건 linked list로 관리되고, 이것도 순서가 오라클하고 Psql하고 다른데 뭐 이건 참고사이트 본문에 적혀 있음.
쉽게 말해서 오라클은 '가장 첫 node가 최신 데이터' psql은 '가장 마지막 node가 최신 데이터임'
일단 여기서부터 좀 병신같은 점이 보이지?
여기서 파생되는 모든 mvcc 기반의 DBMS에서 문제점은
1. 트랜잭션 해소 안되면 undo는 계속 쌓이게 될 것이다(해당 버전 이후에는 transaction log를 undo에 반드시 기록해야 한다. 가지고 있어야되니까)
2. undo가 계속 쌓이면 linked list의 순회 코스트가 발생한다
즉 트랜잭션이 해소되지 않으면 디스크(메모리), 성능 압력이 추가로 발생하게 된다는 뜻임.
근데 Psql은 오라클과 반대 순서대로 리스트를 만들어서 '가장 마지막 node가 최신 데이터임' 느릴 수밖에 없다. 다순회해야됨.
솔직히 이거 순회비용이 아주 많이 들진 않을것 같다는 생각인게 transaction lock때문에 데이터가 끝없이 밀리는 경우가 흔치 않고 이건 사용자 문제라고 넘어갈 수 있거든. 아마 존나존나 옛날엔 성능이 느리니까 이걸 해결해야 된다고 생각했을 수도 있어.
문제는 Psql이 '고작' 이걸 해결하기 위해서 최악의 악수를 둬버림
응 그럼 모든 데이터 version을 걍 인덱스에 때려처넣어보자~
라는 미친 발상을 해 버린것임...
(몬가..몬가 엄청난 일이 일어나버림..)
여기서 파생되는 문제
1. 자원 활용도가 개병신같아짐
2. index 순회 코스트가 늘어남
3. 트랜잭션 끝나고 안 쓰는 구버전 노드 데이터가 인덱스에 떡하니 붙어있음
그리고 이것이 Dead Tuple임.
DBMS의 모든 데이터는 기본적으로 세그먼트, 블록, 페이지로 어느 정도 계획되어 관리됨.
그렇기 때문에 사용하지 않는 공간이 있다고 '반환하지 않음'
내부적으로 aging하는 것들이 있고 이것이 주기적으로 돌면서 정리하는데
이것도 정리 안되는 것들이 있고 이부분은 사용자들이 충분히 인지하고 있어야함. 대부분은 DBA가 알고 있으니까 개발자한테 시어머니질을 한다.
대표적으로, delete dml 연산으로 지운 데이터들은 세그먼트가 바로 반환되지 않는다.
어떤 DB는 반환할 수 없는 경우도 있음. Truncate 해야 반환된다.
애초에 세그먼트를 재구성 하기 때문에, 기능이 있다고 해도 운영관리측면에서도 리스크가 커서 함부로 막 날릴 수 없다.
아까 얘기한 Psql에서의 dead tuple 문제는 굉장히 치명적인데, dead tuple을 정리해주는 vacuum이라는 개념이 있으나 이것이 dead tuple을 완벽히 정리해주지 못한다.
dead tuple은 DB의 성능 비율에서 가장 높은 비중인 인덱스의 순회 코스트를 늘리는 행위이기 때문에, 이것이 엄청난 악영향을 불러옴.
dead tuple로 인해 성능이 느려지면, 트랜잭션 수행 시간도 늘어나게 되고, 다시 dead tuple이 더 많이 늘어나는 부정적 피드백으로 돌아온다.
그리고 느려지면 또 vacuum이 더 안된다! 인덱스 물고 있는놈이 많아지면 또 해제 못하고 주기적으로 다시 돌면서가능할 때만 vacuum된다. 그 예시가 위의 그래프임.
autovacuum은 저 사이에 수백번은 족히 돌았지만, 실제로 수행된 건 얼마 안됨.
그리고 그 결과는 데이터 폭발로 인한 디스크 부족, 그리고 운영 장애로 이어지게 되는것임.
참고로, 이건 파일 세그먼트를 다 붙잡고 있는 문제라서
'다시 껐다 켠다고 해결되지 않는다'
디스크 풀로 인한 데드 튜플은 해제도 잘 안되더라.
논리 마이그레이션으로 해결하는 수밖에 없다. 그리고 그건 매우 족같은 업무 중 하나임.
지금 보면 이런 개멍청한 찐빠구조를 왜 만들었나 싶을 수도 있을 건데
Psql 만들어진 시기 보면 나름대로 그 시기 최선의 구조로 만들어서 이론상 성능은 빠를 수 밖에 없었다
근데 그 성능 확보하자고 하는 일이
영원히 Psql의 발목을 붙잡을 약점이 됐으니
소프트웨어 설계라는것이 장기적인 안목에서 생각하기는 참 어렵구나 하는 생각이 들 때가 있다
근데 그래서 난 안써 ㅋㅋ
실제로 사용해보면 update가 자주 발생하는 종류의 서비스 아니면 거의 영향도 없음. 물론 오라클에 비빌 수야 없지만 mvcc 메커니즘은 오라클과 mysql이 동일하고 psql이 본문에서 말한대로 update 발생시 실제 insert 해버리고 나중에 vacuum해버리는 방식인데 동일한 데이터로 다양한 쿼리를 실험해보면 대부분의 경우 오라클 > psql >> mysql 임. update 자주 발생하는 서비스면 이 영향이 클 수도 있겠으나 내 생각에는 서비스 디비에 update가 많이 일어나는 것 자체가 구조적으로 좀 잘못됐다고 보여짐.
정확한 지적임. 그래서 '잘 써야 하는데' 현실적으로 그런 기업이 얼마나 될지가 관건임. DB관리하는사람이 모든 로직을 알수없고 관리할수 없어서...
왠일로 깃갤에 멀쩡한 글이 - dc App
ㅇㄱㄹㅇ - dc App
이래서 구조적해결이 중요하구나 그 시대상에서 급하게 최적해결 땜질하건 후에 감당해야되넹 - dc App
바로 개추 박음
그럼 지금은 뭐씀 ?
답은 YugabyteDB다
나 PostgreSQL 전도사였는데 이런 구조적인 문제가 있었네... 그래서 DB 뭐 추천함?
사실 DB 뭐 추천하냐고 물으면 지식이 일천해서 뭐가 좋냐고 말하긴 힘듬 마리아디비가 P보다 성능 딸리는데 안정성으로는 좀 더 낫거든 1황은 오라클인데 이새낀 성능도 1황이라서 이게 존나 신기함 하지만 조온나 비싸죠?
뇌빼고 쓸수있는 오라클 개추ㅋㅋ
깃갤답지 않은 글 오랜만이네
그렇게.. 그렇게 업데이트를 하지마라
PostgreSQL은 MVCC를 구현할 때 각 레코드에 xmin과 xmax라는 트랜잭션 ID를 사용하여 버전을 관리합니다. 이는 오라클의 Undo 공간을 사용하는 방식과는 다르지만, 효과적으로 동시성을 제어하고 일관성을 유지합니다. 또한 PostgreSQL에서 최신 데이터가 마지막 노드에 위치한다는 것은 사실이지만, 이는 성능 저하로 직접 연결되지 않습니다. PostgreSQL은 힙 스캔과 인덱스 스캔 시 효율적인 접근을 위해 다양한 최적화를 적용하고 있습니다.
PostgreSQL은 테이블의 각 레코드 버전에 대해 인덱스 엔트리를 생성하지 않습니다. 인덱스는 최신 버전의 레코드를 가리키며, Dead Tuple은 인덱스에 영향을 주지 않습니다. 따라서 인덱스 순회 비용이 증가한다는 주장은 정확하지 않습니다.
ㅕ - dc App
Vacuum 프로세스는 Dead Tuple을 효율적으로 정리하는 역할을 합니다. Autovacuum 설정을 적절히 조정하면 Dead Tuple로 인한 디스크 공간 문제나 성능 저하를 방지할 수 있습니다. 최근 PostgreSQL 버전에서는 Vacuum의 성능과 효율성이 크게 향상되었으며, 병행 Vacuum 등의 기능을 통해 운영 중인 시스템에서도 부담 없이 실행할 수 있습니다.
PostgreSQL은 지속적인 개선을 통해 리소스 활용도와 성능 면에서 뛰어난 성능을 보여주고 있습니다. 대용량 데이터베이스나 고부하 환경에서도 안정적으로 운영될 수 있도록 다양한 기능과 최적화 기법이 적용되어 있습니다.
모든 DBMS는 삭제된 데이터를 즉시 디스크에서 해제하지 않는 방식으로 동작합니다. 이는 성능과 일관성 유지 측면에서 합리적인 선택입니다. PostgreSQL은 필요에 따라 VACUUM FULL이나 pg_repack 등의 도구를 사용하여 디스크 공간을 회수할 수 있습니다.
Dead Tuple로 인한 디스크 부족 현상은 적절한 모니터링과 관리로 예방 가능합니다. 또한 문제가 발생하더라도 데이터베이스 재구성이나 재시작 없이도 해결할 수 있는 방법이 제공됩니다.
결론적으로, PostgreSQL의 구조적인 설계는 수십 년간의 발전과 검증을 거친 결과입니다. 제기하신 문제들은 대부분 설정이나 운영상의 이슈로, 적절한 관리와 최신 정보의 활용으로 충분히 해결할 수 있습니다. PostgreSQL은 전 세계적으로 많은 기업과 기관에서 사용하고 있는 안정적이고 신뢰할 수 있는 DBMS입니다. 문제를 근본적인 결함으로 보기보다는, 현재 시스템에 맞는 최적의 설정과 운영 방안을 찾아보시는 것을 권장드립니다.
ㅂㅅ 좃도모르면서 챗지피티 띡 돌린거 복붙해놨네 ㅋㅋㅋㅋ
ㄹㅇㅋㅋ db 좃도 모를거 같은놈이 왜 껄쩍대지
GPT말이 맞는데 위에 두놈 뭐지 ㅋㅋㅋㅋㅋㅋ 놀랍다. 단순히 GPT 답변이면 디테일하지 않을거라 생각한건가
쉽게 말해서 '잘 쓰면 됨' 근데 작게 쓸거 아니고 크게 쓸건데 '잘 쓰면 됨'이라는 전제조건 들어가는게 존나 안좋음. 이건 모든 인프라 조직의 가장 큰 고민임. 잘 쓰면 된다는 말은 못 쓰면 조진다는 거임. 그리고 vacuum full 이런거 함 날려 봐라 잘 되는가... 그리고 주장을 하려면 써보니 이랬다 라고 하면 됨 첫댓글은 내가 시원하게 인정함 근데 지피티 돌려서 자아의탁은 인정 안함 지피티가 개쓰레기니 쓰지마세요~ 하는게 있긴하냐?
그리고 최신 데이터가 마지막 노드에 위치하는 단점을 해결하기 위해서 인덱스 버저닝 데이터를에 다 때려박았다는거임. 당연히 해결됐지. 그로 인해 생기는 문제점을 말하고 있는건데? 지피티가 말하고 있는 것 두개가 이미 본문에 충분히 설명된 내용임. 1. O2N N2O 문제를 해결했으나 그로인한 단점이 dead tuple이다. 2. vacuum이 좋아졌다. 이건 심지어 본문 참고글에도 있음. 그럼에도 세그먼트 정리란 것은 언제나 위험성을 내포하고 있고, 실제 '이상적이지 않은 환경'에서는 치명적인 문제가 발생할 수 있음. 뭔가 얘기를 하려면 참고글이라도 좀 봤으면 함. 적어도 예의는 차리자.
뭐든 잘쓰면 좋은거 맞는데 그게 쉽나 ㅋㅋ 위에 병신들은 그럼 왜 어셈블리나 c 안쓰고 객체지향 처함?
대박이네
스레드 도입전에는 안씀ㅋㅋ
업데이트 많을수밖에 없는 시스템에 궁합이 안좋은거임? 내 회사껀 아닌데 지금 당장 개발중인거가 떠오르네
일반적으로 업데이트 많은 데라면 금융권인데 여긴 진짜로 잘안씀. (금융권은 오라클만 쓰진않음) 업데이트를 '대량으로' 때리면(사실 이건 이렇게 짠 개발자 새끼 태형 때려야되는데 의외로 왕왕있는문제) 상기의 문제가 크게 발생할 가능성이 높고 걍 쫌쫌따리로 치고빠지는 OLTP성일 경우 아주 큰 문제는 발생하지 않을거임 하루종일 조금씩 빠지다가 휴식타이밍에 쭉 정리될거라서
하지만 이거 아니면 쓸 수 있는게 먼데 ㅋㅋ;; ㅜㅜㅜㅜ