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 │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴─────────────────┴──────────┴─────────────────┘
데이터베이스 서버의 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 │ 3306 │ 0 │ Down │ 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 │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴────────────────┴──────────┴─────────────────┘
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 │
└─────────┴─────────────────────────────────────────────┴──────┴─────────────┴─────────────────┴──────────┴─────────────────┘
노드를 재시작 할 경우 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 서버가 변경이 되면서 복구된다.