본문 바로가기

MySQL/MySQL Admin

percona toolkit - pt-online-schema-change 기본 설명

MySQL 컬럼 변경, 컬럼 추가, 삭제, 인덱스 추가 등의 이유로 점검을 수시로 하는 것을 무리라고 생각이 되었습니다.

그래서 대체할 만한 것을 찾다가 pt-online-schema-change를 테스트하게 됐는데요..

 

막상 하려고 하니까 옵션은 많은데 각각 무슨 역할인지 나와 있는 곳이 없는 것 같아서 쓰기 시작합니다..

제가 쓰는 글은 percona toolkit pt-online-schema-change document를 기반으로 번역해서 쓰는 것임을 먼저 말씀드리겠습니다.

 

기본적으로 percona tookit pt-online-schema-change는 어떻게 돌아갈까요?

 

어떻게 동작하기에 Lock이 걸리지 않고 컬럼 추가나 인덱스 생성이 되는 걸까요?

 

percona 측에서는 아래와 같이 말하고 있습니다.

pt-online-schema-change Mysql alter table을 내부적으로 변환시켜줍니다. alter가 적용된 신규테이블에 원본데이터를 복사합니다. 이 말은 원본 테이블에 락이 걸리지 않고 client들이 계속 데이터를 읽고 바꿀 수 있다는 것을 의미합니다.

pt-online-schema-change alter명령어로 수정이 된 테이블을 빈 테이블로 생성을 하고, 원본테이블에서 신규테이블로 데이터를 복사합니다. 복사가 완료되었을 때, 새로운 테이블과 원본테이블을 바꾸어줍니다. Default Setting에서는 원본테이블을 지우게끔 되어있습니다.

 

데이터 복사 프로세스는 실시간으로 변화되고 있는 데이터를 작은 크기로 쪼개어서 복사를 하게끔 되어있는데, 이 단위를 청크라고 합니다. (see --chunk-time). 이 프로세스는 pt-table-checksum 같은 툴과 유사하게 동작합니다. 복사가 되는 동안 원본테이블에 데이터가 수정이 되면 새로운 테이블에도 반영이 됩니다. 왜냐하면 이 툴은 새로운 테이블에 데이터를 update하여 반영시키기 위한 Trigger를 원본 테이블에 생성하기 때문입니다. Trigger를 사용한다는 것은 이미 원본 테이블에 다른 Trigger가 있을 경우엔 제대로 동작하지 않을 수 있다는 것을 의미합니다.

 

pt-online-schema-change가 복사를 끝냈을 때, 새로운 테이블과 원본 테이블의 rename table이 이루어져 있습니다. 이것이 완료가 되면 원본 테이블은 삭제하게 되는데, 옵션을 주면 삭제되지 않습니다.

 

외래키(foreign key)는 툴의 동작을 복잡하게 만들고 추가적인 위험성이 더 있습니다. 원본테이블과 신규테이블을 rename시키는 기술은 제공하는 테이블에 foreign key가 있을 경우 동작하지 않습니다. 이 툴은 schema 변경이 완료된 후에 반드시 신규테이블에 제공하기 위해서 외래키를 update 해야 합니다. 이 툴은 이것을 완성하기 위해 두 가지 방법을 지원합니다. 자세한 정보는 --alter-foreign-keys-method. 세션에서 설명하고 있습니다.

 

또한 외래키는 몇 가지 부수적인 효과를 야기합니다. 최종 테이블은 원본테이블과 같이 외래키와 인덱스를 가질 것입니다. (unless you specify differently in your ALTER statement), 하지만 MySQL Innodb에선 object name 충돌을 피하기 위해서 object name을 조금 바꿔주어야 할 수 있습니다.

 

안전하게 하기 위해서, 이 툴은 --excute를 입력하기 전까지는 테이블을 수정하지 않습니다. 이것은 default로 되어 있습니다. 이 툴은 불필요한 부하나 기타 문제, 자동으로 slave를 연결하여 안정적으로 체크해서replication 보호 하는 것과 같이 다양한 문제에 대해 지원합니다.

· 현재 테이블에 primary key, unique index 설정하지 않는 한 동작이 거부됩니다. --alter 에서 상세히 볼 수 있습니다.

· 이 툴은 replication filter를 발견한다면 동작을 거부할 것입니다. --[no]check-replication-filters 옵션에서 상세히 볼 수 있습니다.

· 이 툴은 replication delay가 관찰되면 데이터 복사작업을 일시 중지 할 것입니다. --max-lag 옵션에서 상세히 볼 수 있습니다.

· 이 툴은 너무 많은 부하가 발견되면 일시 정지되거나 종료될 수 있습니다. --max-load --critical-load 옵션에서 상세히 볼 수 있습니다.

· 이 툴은 innodb_lock_wait_timeout=1 (for MySQL 5.5 and newer) lock_wait_timeout=60을 적용시켜야 합니다. --set-vars에서 자세히 볼 수 있습니다.

· 이 툴은 외래키 참조가 일어난다면 --alter-foreign-keys-method 옵션을 명시하지 않는 한alter table을 거부할 것입니다.

· 이 툴은 Percona XtraDB Cluster 노드에서 MyISAM테이블 alter를 할 수 없습니다.

이게 pt-online-schema-change에 대한 percona 측의 설명입니다.

 

더 간단히 말하자면 alter문이 적용된 테이블이 생성이 되고 insert select 문으로 데이터 insert가 되면서 trigger로 실시간 데이터를 복사한다.

가 되겠네요 ㅎ

 

이렇게만 생각하면 shell이나 python이나 perl로 만들 수 있을 것 같다! 라고 생각되네욤ㅎㅎㅎ

 

하지만 부하량이나 replication에 대한 고려가 충분해야 쓸 수 있는 툴인 것 같습니다.

이러한 값들은 option으로 이루어져 있는데 다음 글에서는 옵션에 대한 나열을 쫙 하겠습니다 ㅎ

 

우선 문서로는 정리해두었는데 실제 사례를 만들고 또 글을 써야 할수도..ㅎ 직접 테스트해보고 진행도 시켜보고 트리거가 어떻게 생성이 되는 지도 보겠습니다!