MaxScale, 데이버베이스 서버 failover

Jeonghak Cho·2024년 12월 7일
0

MaxScale

목록 보기
6/8

MaxScale 을 사용하는 주 이유가 데이터베이스 서버 장애 시 자동 복구를 위함이다. 데이터 베이스 클러스터 내 Master 서버 장애 시 Slave 중 하나의 서버가 Master로 승격한다.

데이터베이스 노드 장애 테스트 시 MaxScale이 영향을 받는 것을 막기 위해 테스트 목적으로 Master 노드로 옮긴다. 노드를 직접 지정했다. nodeName: master

apiVersion: apps/v1
kind: Deployment
metadata:
  name: maxscale1
  labels:
    app: maxscale1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: maxscale1
  template:
    metadata:
      labels:
        app: maxscale1
    spec:
      containers:
      - name: maxscale1
        image: mariadb/maxscale:latest
        livenessProbe:
          httpGet:
            path: /v1
            port: 8989
          initialDelaySeconds: 2
          periodSeconds: 22
        volumeMounts:
          - name: maxscale
            mountPath: /etc/maxscale.cnf
            subPath: maxscale.cnf
        ports:
        - containerPort: 8989
      volumes:
      - name: maxscale
        configMap:
          name: maxscale
      nodeName: master

MaxScale이 master노드로 옮겨진것을 확인할 수 있다.

vagrant@slave3:~$ k get po -o wide
NAME                         READY   STATUS    RESTARTS        AGE     IP                NODE     NOMINATED NODE   READINESS GATES
mariadb-0                    1/1     Running   1 (4h54m ago)   21h     192.168.140.89    slave2   <none>           <none>
mariadb-1                    1/1     Running   1 (4h53m ago)   21h     192.168.77.37     slave3   <none>           <none>
mariadb-2                    1/1     Running   1 (4h55m ago)   21h     192.168.140.196   slave1   <none>           <none>
maxscale1-5d6c89b6f4-lnsw8   1/1     Running   0               5m40s   192.168.219.67    master   <none>           <none>
vagrant@slave2:~$ k exec -it maxscale1-5d6c89b6f4-lnsw8 -- maxctrl list servers;
┌─────────┬─────────────────────────────────────────────┬──────┬─────────────┬─────────────────┬──────────┬─────────────────┐
│ Server  │ Address                                     │ Port │ Connections │ State           │ GTID     │ Monitor         │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server1 │ mariadb-0.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Master, Running │ 0-3000-2 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server2 │ mariadb-1.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Slave, Running  │ 0-3000-2 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server3 │ mariadb-2.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Slave, Running  │ 0-3000-2 │ MariaDB-Monitor │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴─────────────────┴──────────┴─────────────────┘

Graceful Shutdown

데이터베이스 서버의 POD를 삭제할 경우 Master 의 상태가 Down 상태로 되었다가 이내 Master로 복귀한다. 쿠버네티스는 POD의 상태를 40초 마다 확인하는데, 이 시간 보다 빠르게 POD가 살아나서 Master서버 변경이 되지 않았다.

vagrant@slave3:~$ k delete po mariadb-0
pod "mariadb-0" deleted

vagrant@slave2:~$ k exec -it maxscale1-5d6c89b6f4-lnsw8 -- maxctrl list servers;
┌─────────┬─────────────────────────────────────────────┬──────┬─────────────┬────────────────┬──────────┬─────────────────┐
│ Server  │ Address                                     │ Port │ Connections │ State          │ GTID     │ Monitor         │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼────────────────┼──────────┼─────────────────┤
│ server1 │ mariadb-0.mariadb.default.svc.cluster.local │ 33060           │ Down           │ 0-3000-2 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼────────────────┼──────────┼─────────────────┤
│ server2 │ mariadb-1.mariadb.default.svc.cluster.local │ 33060           │ Slave, Running │ 0-3000-2 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼────────────────┼──────────┼─────────────────┤
│ server3 │ mariadb-2.mariadb.default.svc.cluster.local │ 33060           │ Slave, Running │ 0-3000-2 │ MariaDB-Monitor │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴────────────────┴──────────┴─────────────────┘

vagrant@slave2:~$ k exec -it maxscale1-5d6c89b6f4-lnsw8 -- maxctrl list servers;
┌─────────┬─────────────────────────────────────────────┬──────┬─────────────┬─────────────────┬──────────┬─────────────────┐
│ Server  │ Address                                     │ Port │ Connections │ State           │ GTID     │ Monitor         │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server1 │ mariadb-0.mariadb.default.svc.cluster.local │ 33060           │ Master, Running │ 0-3000-2 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server2 │ mariadb-1.mariadb.default.svc.cluster.local │ 33060           │ Slave, Running  │ 0-3000-2 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server3 │ mariadb-2.mariadb.default.svc.cluster.local │ 33060           │ Slave, Running  │ 0-3000-2 │ MariaDB-Monitor │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴─────────────────┴──────────┴─────────────────┘

NON Graceful Shutdown

노드를 재시작 할 경우 POD 상태 체크를 위한 40초 주기 보다 빠르게 복구될 경우 Master는 다시 살아난다. 기본적으로 Statefulset 의 경우 노드 장애 시 자동으로 타 노드로 복구가 되지 않는다. 여기서 MaxScale을 사용하면 자동 복구가 가능해 진다.

PO 상태를 확인하니 mariadb-0 가 Master이며, slave3 노드에 위치해 있다.

vagrant@slave3:~$ k get po -owide
NAME                         READY   STATUS    RESTARTS      AGE   IP                NODE     NOMINATED NODE   READINESS GATES
mariadb-0                    1/1     Running   0             20m   192.168.77.38     slave3   <none>           <none>
mariadb-1                    1/1     Running   0             20m   192.168.140.92    slave2   <none>           <none>
mariadb-2                    1/1     Running   1 (77s ago)   20m   192.168.140.203   slave1   <none>           <none>
maxscale1-5d6c89b6f4-lnsw8   1/1     Running   0             49m   192.168.219.67    master   <none>           <none>

vagrant@slave2:~$ k exec -it maxscale1-5d6c89b6f4-lnsw8 -- maxctrl list servers;
┌─────────┬─────────────────────────────────────────────┬──────┬─────────────┬─────────────────┬──────────┬─────────────────┐
│ Server  │ Address                                     │ Port │ Connections │ State           │ GTID     │ Monitor         │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server1 │ mariadb-0.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Master, Running │ 0-3000-1 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server2 │ mariadb-1.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Slave, Running  │ 0-3000-1 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server3 │ mariadb-2.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Slave, Running  │ 0-3000-1 │ MariaDB-Monitor │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴─────────────────┴──────────┴─────────────────┘

MaxScale은 기본적으로 Autofailover 옵션이 꺼져있다. 해당 기능을 사용하려면 다음처럼 maxscale conf 파일의 모니터 부분에 추가해야 한다.

auto_failover=true
auto_rejoin=true
monitor_interval=2000

다음은 갱신된 maxscale.cnf 파일이다.

[maxscale]
admin_secure_gui=false
threads=auto
maxlog=true
syslog=true
logdir=/var/log/maxscale/
log_debug=true
admin_host=0.0.0.0

[server1]
type=server
address=mariadb-0.mariadb.default.svc.cluster.local
port=3306
protocol=MariaDBBackend

[server2]
type=server
address=mariadb-1.mariadb.default.svc.cluster.local
port=3306
protocol=MariaDBBackend

[server3]
type=server
address=mariadb-2.mariadb.default.svc.cluster.local
port=3306
protocol=MariaDBBackend

[RW-Split-Router]
type=service
router=readwritesplit
servers=server1,server2,server3
user=repl
password=secret

[RW-Split-Listener]
type=listener
service=RW-Split-Router
protocol=MariaDBClient
port=3306

[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=server1,server2,,server3
user=repl
password=secret
auto_failover=true
auto_rejoin=true

변경 사항을 반영한다.

k delete cm maxscale
k create configmap maxscale --from-file=maxscale.cnf
k rollout restart deploy maxscale1

mariadb-2이 Master이고, slave3 노드에 위치한다.
노드 slave3 VM을 강제 종료한다.
PS C:\k8s\ubuntu> vagrant halt slave3
==> slave3: Attempting graceful shutdown of VM...

vagrant@slave2:~$ k exec -it maxscale1-5d6c89b6f4-lnsw8 -- maxctrl list servers;
vagrant@slave3:~$ k exec -it maxscale1-5b47c98f48-5kj8g maxctrl list servers;
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
┌─────────┬─────────────────────────────────────────────┬──────┬─────────────┬─────────────────┬──────────┬─────────────────┐
│ Server  │ Address                                     │ Port │ Connections │ State           │ GTID     │ Monitor         │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server1 │ mariadb-0.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Slave, Running  │ 0-3001-1 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server2 │ mariadb-1.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Slave, Running  │ 0-3001-1 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server3 │ mariadb-2.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Master, Running │ 0-3001-1 │ MariaDB-Monitor │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴─────────────────┴──────────┴─────────────────┘

얼마 후 slave3이 Down상태고 mariadb-2에서 mariadb-0로 Master가 변경된 것을 확인할 수 있다.
vagrant@slave3:~$ k exec -it maxscale1-5b47c98f48-5kj8g maxctrl list servers;
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
┌─────────┬─────────────────────────────────────────────┬──────┬─────────────┬─────────────────┬──────────┬─────────────────┐
│ Server  │ Address                                     │ Port │ Connections │ State           │ GTID     │ Monitor         │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server1 │ mariadb-0.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Master, Running │ 0-3001-1 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server2 │ mariadb-1.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Slave, Running  │ 0-3001-1 │ MariaDB-Monitor │
├─────────┼─────────────────────────────────────────────┼──────┼─────────────┼─────────────────┼──────────┼─────────────────┤
│ server3 │ mariadb-2.mariadb.default.svc.cluster.local │ 3306 │ 0           │ Down            │ 0-3001-1 │ MariaDB-Monitor │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴─────────────────┴──────────┴─────────────────┘

자동 복구 모드가 아닐 경우 노드를 살리면 자동 복구된다. 노드가 살아나지 않을 경우 MaxScale의 FailOver 메뉴를 통해 복구를 하면 Master 서버가 변경이 되면서 복구된다.

0개의 댓글