티스토리 뷰
MariaDB 마스터 서버에서 쓰기 작업중이면 100% 깨짐.!
문제 개선방안 제안 3가지!
* 제안 1 : vm 웨어를 3대 띄워서 작업가능은 하나 API 도달의 한계
장점 : 현장에 남아도는 VM가능(빠르게 설치 , 복구 재현 테스트 가능
이슈 : API 도달의 한계를 넘기위해선 멤먼스 15명(구축시 필요했던 구축멤버) 투입필요
현재 남아 있는 멤버는 2명이고, 확인할수 있는 API DB 쪽의 리스트업 요청
받아보고 진행예정
------------------------------------------ 아래구성방법으로 진행 -----------------------------------------------------
* 제안 2 : 기존의 상태를 재구현하여 여러형태로로 테스트 구현중
1) InnoDB 플러시 설정
2) StatefulSet 및 Pod 종료 처리(설정완료)
3) 스토리지 선택 및 성능 최적화
장점 : 시도중에 여러형태의 확인가능성 확장
단점 : K8S 의 마리아 DB 의 레퍼런스 한계성과 실제 물리적은 성능보장필요(특히 스토리지)
4) 고가용성(HA) 및 자동 Failover 구성
방법 : Maxscale , 갈레라
5) 백업 및 복구 전략 수립
* 방법 : 매일 01:00 에 백업을 진행중이며, 백업파일을 복구하는데
소요되는 시간은 10분내외 입니다.
장점 : Database 6개, Table 약 70개 구성됨
(k8s DKS 현황 자료 구성, User, Project, enduser, namespace 등 ) DB file 로 구성되어 빠른
백업및 복구 가능
단점 : 소요시간동안 downtime 이 전체복구 30분 소요!(전제조건)
6) 프로메테우스와 같은 모니터링 시스템 구축(구축완료) 모니터링중.
* 제안3 : kind cluster(Contaner k8s) 이용하여 현상을 local 재구현 가능
장점 : 빠르게 설치 , 복구 재현 테스트는 완료
단점 : 현장과 똑같은 환경재현은 불가(kubepray로 구성됨)
Kubernetes(K8s) 환경에서 설치된 MariaDB의 마스터 서버에서 쓰기 작업 중 서버가 중단되면 리플리케이션이 깨지거나 데이터가 손상되는 문제가 발생할 수 있습니다. 특히 쓰기 작업 중단은 MariaDB의 트랜잭션과 스토리지 문제로 이어질 수 있기 때문에, 이 문제를 해결하기 위한 다양한 방법을 고려해야 합니다. 아래는 그 원인과 해결 방안을 제시한 내용입니다.
문제 원인
6월 정상
8월 비정상 (원인파악)
- 비정상적인 Pod 종료: 마스터 서버에서 쓰기 작업 중 Pod가 비정상적으로 종료되거나, 네트워크 문제 등으로 인해 MariaDB가 정상적으로 종료되지 않으면 트랜잭션이 불완전하게 끝나 데이터 손상이 발생할 수 있습니다.
- 트랜잭션 불일치: 쓰기 작업 중에는 여러 트랜잭션이 진행되며, 작업이 중간에 중단되면 데이터 불일치가 발생할 수 있습니다. 트랜잭션이 롤백되지 않거나, 미완성 상태로 남으면 리플리케이션 과정에서 문제가 발생합니다.
- 스토리지 성능 문제: 스토리지(I/O)가 지연되거나 충돌이 발생하면, MariaDB가 데이터를 정상적으로 쓰지 못하여 데이터 손상이 발생할 수 있습니다. 특히, 비동기 리플리케이션을 사용하는 경우 마스터와 슬레이브 간의 데이터 불일치가 심해질 수 있습니다.
해결 방법
1. 트랜잭션 설정 최적화
MariaDB에서 트랜잭션의 안정성을 높이기 위해 InnoDB 관련 설정을 최적화하는 것이 중요합니다.
https://minsql.com/mysql/mysql-innodb_flush_method/
- InnoDB 플러시 설정: MariaDB는 데이터를 디스크에 쓰기 전에 메모리에 데이터를 저장합니다. 이를 적절하게 설정하지 않으면 비정상 종료 시 데이터가 손실될 수 있습니다. 특히, 다음과 같은 설정을 고려해야 합니다.
- innodb_flush_log_at_trx_commit = 1: 각 트랜잭션이 커밋될 때마다 로그를 디스크에 플러시하여 데이터 안전성을 보장합니다.
- sync_binlog = 1: 각 트랜잭션 커밋 시점에 바이너리 로그를 디스크에 동기화합니다. 이는 장애 시 데이터를 잃지 않도록 보장합니다.
[mysqld]
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
2. StatefulSet 및 Pod 종료 처리
Kubernetes에서 MariaDB와 같은 상태 저장 애플리케이션은 StatefulSet으로 배포해야 합니다. StatefulSet은 Pod의 순차적 종료 및 재시작을 지원하며, 특정 Pod가 종료될 때 상태를 보존할 수 있는 메커니즘을 제공합니다.
- StatefulSet graceful shutdown 설정: Pod가 종료될 때 MariaDB가 안전하게 쓰기 작업을 완료할 수 있도록 preStop 훅을 설정합니다.이를 통해, Pod가 종료될 때 MariaDB가 정상적으로 종료되어 트랜잭션이 완료되거나 롤백됩니다.
lifecycle: preStop: exec: command: ["sh", "-c", "mysqladmin shutdown"]
- terminationGracePeriodSeconds 설정: Pod가 종료될 때 K8s에서 충분한 시간을 부여하여 안전하게 종료할 수 있도록 합니다.이를 통해 Pod 종료 시 MariaDB가 트랜잭션을 안전하게 마무리할 수 있습니다.
terminationGracePeriodSeconds: 60
3. 스토리지 선택 및 성능 최적화
K8s 환경에서 **Persistent Volume (PV)**와 **Persistent Volume Claim (PVC)**을 사용하여 스토리지를 구성할 때, 스토리지 성능이 매우 중요합니다. 특히, MariaDB와 같은 데이터베이스는 빠른 쓰기/읽기 성능이 요구되므로 고성능 스토리지를 사용해야 합니다.
- 스토리지 클래스 선택: 스토리지 클래스를 설정할 때 고성능 SSD나 NVMe 기반의 스토리지를 사용하도록 설정합니다. 이를 통해 I/O 성능을 높이고, 쓰기 작업 중에 발생할 수 있는 병목을 줄일 수 있습니다.
- IOPS 및 스토리지 용량 조정: MariaDB가 사용하는 스토리지의 IOPS(Input/Output Operations Per Second)와 용량을 적절히 조정하여 데이터베이스가 처리량에 맞는 성능을 낼 수 있도록 해야 합니다.
storageClassName: fast-ssd
4. 고가용성(HA) 및 자동 Failover 구성
마스터 서버에서 쓰기 작업 중 다운되는 것을 방지하거나, 다운되었을 때 빠르게 복구할 수 있는 고가용성(HA) 구성을 도입해야 합니다.
- Galera Cluster 도입: MariaDB에서 Galera Cluster를 사용하면 동기식 마스터-마스터 복제를 통해 고가용성을 구축할 수 있습니다. Galera Cluster는 모든 노드에 동일한 데이터를 유지하며, 하나의 마스터가 다운되더라도 다른 마스터에서 계속해서 쓰기 작업을 수행할 수 있습니다.
- Galera Cluster는 데이터 손실 방지와 자동 복구 기능을 제공하므로, 쓰기 작업 중 발생하는 장애를 줄일 수 있습니다.
https://yunhyeonglee.tistory.com/46
- Galera Cluster는 데이터 손실 방지와 자동 복구 기능을 제공하므로, 쓰기 작업 중 발생하는 장애를 줄일 수 있습니다.
- MHA (Master High Availability) 도입: MHA는 마스터 서버가 다운되면 자동으로 새로운 마스터를 선출하는 Failover 솔루션입니다. MHA는 슬레이브 노드를 마스터로 승격시키고, 리플리케이션을 재설정하여 서비스 중단을 최소화할 수 있습니다.
- MHA를 사용하면 마스터 서버에서 쓰기 작업 중 다운되는 문제를 자동으로 해결할 수 있으며, 새로운 마스터가 지정되어 쓰기 작업이 지속됩니다.
5. 백업 및 복구 전략 수립
백업 형태 :
a. 전체 백업(Full Backup) 복구 b. 증분 백업(Incremental Backup) 복구
d. 컨테이너(Container) 기반 MariaDB의 증분백업,복구 e. Binary_Log 를 이용 백업, 복구
https://velog.io/@tkfrn4799/mariadb-mariabackup
쓰기 작업 중 장애가 발생해도 데이터를 복구할 수 있는 백업과 복구 전략을 반드시 수립해야 합니다.
- 정기 백업: K8s 환경에서 CronJob을 Crontab 사용하여 MariaDB 데이터를 정기적으로 백업합니다. 이때, 모든 트랜잭션 로그와 데이터를 백업해야 하며, 장애 발생 시 데이터를 신속히 복구할 수 있도록 준비해야 합니다.
- 즉시 복구: 데이터 손실이나 장애가 발생한 경우, MariaDB의 백업 파일과 바이너리 로그를 이용해 복구할 수 있는 절차를 준비해야 합니다. 이를 통해 쓰기 작업 중 손상된 데이터를 복구할 수 있습니다.
apiVersion: batch/v1
kind: CronJob
metadata:
name: mariadb-backup
spec:
schedule: "0 3 * * *" # 매일 새벽 3시에 백업
jobTemplate:
spec:
template:
spec:
containers:
- name: mariadb-backup
image: mariadb:10.5
command: ["sh", "-c", "mysqldump --all-databases > /backup/db-backup.sql"]
volumeMounts:
- name: backup-storage
mountPath: /backup
restartPolicy: OnFailure
6. 프로메테우스와 같은 모니터링 시스템 구축
MariaDB와 Kubernetes 환경에서 발생하는 문제를 빠르게 감지하고 대응하기 위해 Prometheus와 Grafana 같은 모니터링 시스템을 구축합니다. MariaDB 상태 및 성능을 실시간으로 모니터링하고, 장애 발생 시 알림을 통해 빠르게 대응할 수 있습니다.
결론
K8s 환경에서 MariaDB 마스터 서버가 쓰기 작업 중 중단되는 문제를 해결하려면 트랜잭션 안전성, 스토리지 성능 최적화, 고가용성(HA) 구축, 백업 및 복구 전략을 수립하는 것이 필수!!!
이를 통해 MariaDB의 데이터 무결성과 서비스 가용성을 유지하고, 장애 발생 시 신속하게 대응가능!!
기타참조 : https://docs.3rdeyesys.com/docs/database/mysql-mariadb/replication/mariadb-multi-source-replication/
- Total
- Today
- Yesterday
- 오라클
- [오라클 튜닝] sql 튜닝
- 앤시블
- 우분투
- CVE 취약점 점검
- ORACLE 트러블 슈팅(성능 고도화 원리와 해법!)
- 키알리
- pod 상태
- 쿠버네티스
- 코로나19
- 여러서버 컨트롤
- 설치하기(HP-UX)
- [오라클 튜닝] instance 튜닝2
- ubuntu
- 트리이스
- 오라클 홈디렉토리 copy 후 startup 에러
- K8s
- 5.4.0.1072
- 버쳐박스
- 스토리지 클레스
- directory copy 후 startup 에러
- 오라클 인스턴트클라이언트(InstantClient) 설치하기(HP-UX)
- 커널
- 테라폼
- 튜닝
- MSA
- Oracle
- 오라클 트러블 슈팅(성능 고도화 원리와 해법!)
- startup 에러
- (InstantClient) 설치하기(HP-UX)
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |