일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Kafka
- JavaScript
- 알고리즘
- react
- 자료구조
- 네트워크
- 파이썬
- Java
- Data Structure
- C
- OS
- 자바
- Algorithm
- 컴퓨터구조
- Heap
- Spring
- spring webflux
- 디자인 패턴
- JPA
- redis
- 백준
- Proxy
- MySQL
- 운영체제
- Galera Cluster
- mongoDB
- design pattern
- MSA
- IT
- c언어
- Today
- Total
시냅스
Galera Cluster 상태 전송에 대한 이해 본문
이 글에서는 MySQL 의 Galera cluster 의 상태 전송에 대한 이해와 그 방법에 대해서 알아봅니다.
https://liltdevs.tistory.com/201
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 의 영향을 받지 않습니다.
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
'데이터베이스 > MySQL' 카테고리의 다른 글
MariaDB 설치부터 Galera Cluster 구성까지 (0) | 2024.01.17 |
---|---|
Galera Cluster 의 Boostrap 과 구성 파일 이해 (0) | 2023.10.24 |
GTID 와 Galera Cluster (1) | 2023.10.09 |
검색기능 개발 (MySQL Full-Text Index, Search) (0) | 2023.08.03 |
페이징 성능 최적화 - No Offset 은 왜 빠를까? (0) | 2023.06.10 |