시냅스

Galera Cluster 상태 전송에 대한 이해 본문

데이터베이스/MySQL

Galera Cluster 상태 전송에 대한 이해

ted k 2024. 1. 10. 23:11
이 글에서는 MySQL 의 Galera cluster 의 상태 전송에 대한 이해와 그 방법에 대해서 알아봅니다.

 

 

 

 

https://liltdevs.tistory.com/201

 

GTID 와 Galera Cluster

GTID 글로벌 트랜잭션 식별자, Global Transaction ID 는 서버에서 커밋된 각 트랜잭션에 대한 식별을 가능하게 합니다. 서버 내에서만 유일한 것이 아니라 모든 복제 서버에서도 식별을 가능하게 합니

liltdevs.tistory.com

 

Galera Cluster 는 Multi Master 의 운영을 쉽게 도와주는 도구입니다.

각각의 노드에서 Read-Write 가 가능하고, 논리적인 동기 방식을 지원하므로 선형성을 갖출 수 있습니다.

다만 운영하며 상태 이전에 대한 이해는 필요할 것입니다.

상황에 따라 데드락이 발생하기도하고 scale-out 이 어렵기 때문입니다.

아래에서 추가적인 설명을 하도록 하겠습니다.

 

Galera Cluster 에서 데이터를 동기화 할 때에는 두 가지 방법을 제공합니다.

  • SST
  • IST

 

SST, State Snapshot Transfer

SST 는 한 노드(Donor)에서 다른 노드(Joiner)로 전체 데이터 복사본을 전송하여 동기화합니다.

SST 방식은 다시 2가지 방식으로 나눠집니다.

  • 논리적 방식
    • mysqldump 가 사용합니다.
    • joiner 가 전송을 받을 준비가 되도록 요구하고 스냅샷을 전송할 때 Donor 를 Read-Only 로 만듭니다.
    • 이 방법은 가장 느리고, 권장되지 않습니다.
  • 물리적 방식
    • rsync, rsync_wan, xtrabackup 에서 사용합니다.
    • Donor 에서 Joiner 로 파일 자체를 보냅니다.
      • Donor 는 변경사항을 데이터베이스 파일(.ibd)을 직접 복사하여 Joiner 에게 보냅니다.
      • 이때 Donor 는 읽기 전용상태가 될 수 있지만 xtrabackup 기반의 방식은 Donor 를 차단하지 않습니다.
    • 따라서 상태 전송시에 gcache 의 영향을 받지 않습니다.

 

각 SST 방식 별 성능 차이

 

 

IST, Incremental State Transfer

IST 는 Joiner 의 누락된 트랜잭션을 식별하여 전체 상태 대신 해당 트랜잭션만 보냅니다.

다음과 같은 2가지 조건을 만족해야 합니다.

  • grastate.dat 에 명시된 UUID 가 그룹의 UUID 와 일치하는 경우
    • Clustering 이 지속된 경우
    • 만약 group 의 UUID 와 같지 않다면 많은 양의 상태 전송이 필요하므로 SST를 수행합니다.
  • GCache 보다 작은 사이즈의 데이터 세트

만약 네트워크 순단, 혹은 기동 중지 후 재기동 시 grastate.dat 에 명시된 seqno 가 cluster 보다 뒤떨어져 있고,

전달 받을 데이터가 GCache 가 허용가능한 범위라면 IST 를 사용한 상태 전송을 실시하게 됩니다.

IST 를 사용하기 위해선 wsrep_provider_options="gcache.size=${size}" 와 같이 설정하시면 됩니다.

 

  • 참고 : GCache
    • GCache 는 각 노드에서 생성된 Write-set (bin log 라고 생각하면 편함...) 를 임시로 저장합니다.
    • 모든 노드가 트랜잭션을 수행할 때마다 ws 을 GCache 에 저장하고 주고 받습니다.
    • 이 GCache 를 사용한 데이터 전송을 IST 라고 부릅니다.
    • memory-mapped page 를 사용합니다.
    • grastate.dat 이 저장된 같은 장소에 galera.cache 라는 파일로 생성됩니다.
    • default size 는 128M 입니다.

 

참고

이 내용은 검증되지 않았으므로 보고 넘어가셔도 좋습니다.
혹시 제가 틀렸거나 추가적인 사항이 있다면 알려주세요.
많은 도움이 될 것 같습니다!

 

운영 중 새로운 노드를 추가해야 될 상황이 생겼습니다.

새로운 노드를 또한 기존 Cluster SST 방식인 mariabackup 을 사용하도록 설정하였습니다.

이 때 새로운 노드가 cluster 에 join 되지 않는 상황이 생겼습니다.

1935 WSREP_SST: [ERROR] xtrabackup_checkpoints missing, failed mariadb-backup/SST on donor (20240110 17:35:12.430)
1936 WSREP_SST: [ERROR] Cleanup after exit with status: 2 (20240110 17:35:12.431)
1937 WSREP_SST: [ERROR] Removing /var/lib/mysql/.sst/xtrabackup_galera_info file due to signal (20240110 17:35:12.433)
1938 WSREP_SST: [INFO] Removing the sst_in_progress file (20240110 17:35:12.435)
1939 WSREP_SST: [INFO] Cleaning up temporary directories (20240110 17:35:12.437)
1940 2024-01-10 17:35:12 0 [Warning] WSREP: 0.0 (node1): State transfer to 1.0 (node2) failed: -22 (Invalid argument)
1941 2024-01-10 17:35:12 0 [ERROR] WSREP: /builddir/build/BUILD/galera-26.4.14/gcs/src/gcs_group.cpp:gcs_group_handle_join_msg():1207: Will never receive state. Need to abort.
1942 2024-01-10 17:35:12 0 [Note] WSREP: gcomm: terminating thread
1943 2024-01-10 17:35:12 0 [Note] WSREP: gcomm: joining thread
1944 2024-01-10 17:35:12 0 [Note] WSREP: gcomm: closing backend
1945 2024-01-10 17:35:12 0 [ERROR] WSREP: Process completed with error: wsrep_sst_mariabackup --role 'joiner' --address 'xxx.xxx.xxx.xxx' --datadir '/var/lib/mysql/' --parent 3292471 --     progress 0 --mysqld-args --basedir=/usr: 2 (No such file or directory)
1946 2024-01-10 17:35:12 0 [ERROR] WSREP: Failed to read uuid:seqno and wsrep_gtid_domain_id from joiner script.
1947 2024-01-10 17:35:12 3 [Note] WSREP: SST received
1948 2024-01-10 17:35:12 3 [Note] WSREP: SST received: 00000000-0000-0000-0000-000000000000:-1
1949 2024-01-10 17:35:12 3 [Note] WSREP: SST succeeded for position 00000000-0000-0000-0000-000000000000:-1
1950 2024-01-10 17:35:12 0 [Note] WSREP: Joiner monitor thread ended with total time 10 sec
1951 2024-01-10 17:35:12 2 [ERROR] WSREP: Application received wrong state:
1952         Received: 00000000-0000-0000-0000-000000000000
1953         Required: 70144629-796c-11ee-8e4e-abf5d64bbb9b
1954 2024-01-10 17:35:12 2 [ERROR] WSREP: Application state transfer failed. This is unrecoverable condition, restart required.

 

위의 로그와 같이 xtrabackup_checkpoint 파일을 생성하지 못했고,

SST의 GTID:seqno 또한 에러 상황일 때와 같은 형식을 띄웠습니다. (00000000-...:-1)

또한 galera.cache 파일이 설정한 GCache 와 같은 size 로 설정되었습니다.

(GCache Size 를 변경할 때마다 GCahce Size 와 같은 사이즈의 galera.cache 파일 새로 추가되는 노드에 생성되었습니다.)

 

따라서 자세히는 모르지만, mariabackup 방식의 SST 는 GCahce 를 적극적으로 사용하고 있고,

만약 전송하려는 Write-set 혹은 추가적인 구성 파일이 GCache 의 사이즈를 넘어가게 되면 상태 전송을 하지 못한다고 판단하였습니다.

이에 SST 방식을 rsync 로 바꾼 후 노드간의 싱크를 얼추 맞춘 뒤 SST 방식을 다시 mariabackup 으로 변경하여 해결하였습니다.

 

공식문서나 관련된 자료를 찾을 수 없어 정확한 내용은 아니지만 

운영상에 겪었던 문제와 해결방법을 공유드리며 글을 마무리 합니다.

 

 

끝!

 

https://galeracluster.com/library/documentation/state-transfer.html#state-transfer-sst

 

State Transfers — Galera Cluster Documentation

State Transfers The process of replicating data from the cluster to the individual node, bringing the node into sync with the cluster, is known as provisioning. There are two methods available in Galera Cluster to provision nodes: State Snapshot Transfer (

galeracluster.com

 

Comments