MySQL DB를 Kubernetes Operator를 통해 InnoDB Cluster 배포를 진행해보겠습니다.
Kubernetes용 MySQL Operator는 MySQL 서버와 MySQL 라우터 그룹으로 구성된 하나 이상의 MySQL InnoDB 클러스터를 관리합니다. Operator는 Kubernetes 클러스터 내에서 실행되며, Kubernetes 배포를 통해 제어되어 지속적으로 사용 가능하고 실행 상태를 유지합니다.
MySQL Operator는 기본적으로 mysql-operator라는 Kubernetes 네임스페이스에 배포되며, 클러스터 내 모든 InnoDB 클러스터와 관련 리소스를 모니터링합니다. 이를 위해 Operator는 Kubernetes API 서버를 구독하여 이벤트 업데이트를 수신하고, 필요에 따라 관리되는 MySQL 서버 인스턴스와 연결합니다. Kubernetes 컨트롤러 위에서 운영되며, MySQL 서버, Group Replication을 활용한 복제 및 MySQL Router의 구성을 담당합니다.
MySQL InnoDB 클러스터
InnoDB 클러스터(InnoDBCluster) 리소스가 Kubernetes API 서버에 배포되면, MySQL Operator for Kubernetes는 다음과 같은 리소스를 생성합니다.
- MySQL 서버 인스턴스를 위한 Kubernetes StatefulSet
- 이 StatefulSet은 Pod를 관리하고 해당 스토리지 볼륨을 할당합니다. 여기서 관리하는 각 Pod는 여러 컨테이너를 실행하는데, 초기화 단계에서는 MySQL 서버 구성 및 데이터 디렉토리 준비를 위한 여러 컨테이너가 실행됩니다. 이후 두 개의 컨테이너가 운영 모드에서 활성 상태로 유지됩니다. 하나는 'mysql'이라는 이름으로 MySQL 서버를 실행하며, 다른 하나는 'sidecar'이라는 이름으로, Operator와 협력하여 노드의 로컬 관리를 담당하는 Kubernetes 사이드카입니다.
- MySQL 라우터를 위한 Kubernetes 배포
- MySQL 라우터는 애플리케이션이 현재 Primary 또는 Replica로 트래픽을 라우팅할 수 있도록 지원하는 상태 없는 서비스입니다. Operator는 클러스터의 작업 부하에 따라 라우터의 수를 조절할 수 있습니다.
- MySQL InnoDB 클러스터 배포를 위한 Kubernetes 서비스
- InnoDB 클러스터의 이름을 가진 서비스는 애플리케이션의 기본 진입점 역할을 하며, MySQL 라우터로 들어오는 연결을 처리합니다. 이 서비스는 '{clustername}.svc.cluster.local' 형식의 안정적인 이름을 제공하고, 특정 포트를 노출합니다.
MySQL Opeartor Helm 배포
Helm으로 배포를 진행해보겠습니다.
helm repo add mysql-operator <https://mysql.github.io/mysql-operator/>
helm repo update
Operator를 배포합니다.
helm install mysql-operator mysql-operator/mysql-operator \\
--namespace mysql-operator --create-namespace
배포가 정상적으로 되었는지 확인합니다.
kubectl get all -nmysql-operator
다음 명령어로 InnoDBCluster 설치를 진행합니다.
helm install mysql-cluster mysql-operator/mysql-innodbcluster \\
--set credentials.root.password='fancianapi2024!@#' \\
--set tls.useSelfSigned=true --namespace mysql-cluster \\
--create-namespace
다음 명령어로 배포가 정상적으로 되었는지 확인합니다.
kubectl get all -nmysql-cluster
---
NAME READY STATUS RESTARTS AGE
pod/mysql-cluster-0 2/2 Running 0 6m27s
pod/mysql-cluster-1 2/2 Running 0 6m27s
pod/mysql-cluster-2 2/2 Running 0 6m27s
pod/mysql-cluster-router-813c7b4df-912cz 1/1 Running 0 6m27s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mysql-cluster ClusterIP 10.105.10.158 <none> 3306/TCP,33060/TCP,6446/TCP,6448/TCP,6447/TCP,6449/TCP,6450/TCP,8443/TCP 6m27s
service/mysql-cluster-instances ClusterIP None <none> 3306/TCP,33060/TCP,33061/TCP 6m27s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mysql-cluster-router 1/1 0 0 6m27s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mysql-operator-router-813c7b4df 0 0 0 6m27s
NAME READY AGE
statefulset.apps/mysql-operator 3/3 6m27s
...
다음 명령어를 통해 InnoDBCluster라는 CR이 생성된 것을 확인할 수 있습니다.
master@dev 🦄 ~ kubectl get InnoDBCluster -nmysql-cluster
NAME STATUS ONLINE INSTANCES ROUTERS AGE
mysql-cluster RUNNING 3 3 1 6m30s
kubectl describe InnoDBCluster -nmysql-cluster mysql-cluster
삭제하는 방법은 다음과 같습니다.
helm uninstall --namespace mysql-cluster mysql-cluster
master@dev 🦄 ~ helm uninstall --namespace mysql-cluster mysql-cluster
release "mysql-cluster" uninstalled
StorageClass 변경을 위해 CR을 직접 작성해보겠습니다.
apiVersion: mysql.oracle.com/v2
kind: InnoDBCluster
metadata:
name: mysql-cluster
namespace: mysql-cluster
spec:
secretName: mypwds
tlsUseSelfSigned: true
instances: 3
version: 9.0.0
router:
instances: 1
version: 9.0.0
datadirVolumeClaimTemplate:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 40Gi
storageClassName: nfs
volumeMode: Filesystem
mycnf: |
[mysqld]
max_connections=1000
추가적으로 DB 유저와 패스워드 작성을 위한 Secret을 배포합니다.
kubectl create secret -nmysql-cluster generic mypwds \\
--from-literal=rootUser=root \\
--from-literal=rootHost=% \\
--from-literal=rootPassword="fancianapi2024"
위의 CR을 배포합니다.
kubectl create -f innodbcluster-cr.yaml
kubectl get all -nmysql-cluster
MySQL 접속
kubectl get pod -nmysql-operator
kubectl exec -it -nmysql-operator mysql-operator-[YOUR_POD] -it -- mysqlsh
kubectl exec -it -nmysql-operator mysql-operator-786c5c9d57-xt7g8 -it -- mysqlsh
\\connect root@mysql-cluster.mysql-cluster.svc.cluster.local:3306
SHOW databases;
Multi-Primary mode 변경
- 기존은 하나의 Primary와 여러 개의 Secondary 인스턴스로 이루어져 있는 Single_prmiary mode로 되어있습니다.
- Multiple Replica 들이 하나의 Primary를 통해 복제를 수행하는 방식의 replication 모드입니다.
- Write 명령어는 Primary에만 수행이 되고, Read 명령어는 부하를 분산하게 되어 Secondary에서도 수행됩니다.
SELECT member_host,member_state,member_role FROM performance_schema.replication_group_members;
Multi-Primary mode는 모든 node들이 Primary로 동작되는 replication 모드입니다.
SELECT group_replication_switch_to_multi_primary_mode();
읽어주셔서 감사합니다.
'MySQL' 카테고리의 다른 글
MySQL DB backup 정책 (1) | 2024.10.29 |
---|---|
Kubernetes MySQL Cluster DB Migration using mysqldump (0) | 2024.08.16 |