연재 시리즈

쿠버네티스 오퍼레이터 스터디 2주차 - mysql operator router설정 확인

악분 2022. 6. 4. 20:23
반응형

안녕하세요. 이 글은 mysql operator router설정을 살펴봅니다. mysql operator가 설치되어 있다는 전제로 내용을 소개합니다. mysql operator를 설치하지 않았더라면 이전글(https://malwareanalysis.tistory.com/341)을 참고해주세요.

 

 

1. router가 관리하는 mysql 인스턴스 목록

router가 관리하는 mysql인스턴스 목록은 메타데이터 캐시파일(state.json)파일에서 쉽게 확인할 수 있습니다. headless서비스를 이용하여 mysql pod목록을 관리합니다.

kubectl -n mysql-cluster exec -it deploy/mycluster-router -- cat /tmp/mysqlrouter/data/state.json

 

2.  router 로드밸런싱 설정

router는 사용자 요청을 InnoDB 클러스터로 분산부하합니다. 쓰기요청(rw)과 읽기요청(ro)을 설정에 따라 mysql pod로 라라우팅합니다. 라우팅 정책은 메타데이터 캐시(/tmp/mysqlrouter)파일에서 쉽게 확인할 수 있습니다.

Innodb는 디폴트 설정으로 primary 인스턴스 한개와 secondary 인스턴스 2개로 구성되어 있습니다. 그리고 primary만 쓰기작업이 가능합니다.
kubectl -n mysql-cluster exec -it deploy/mycluster-router -- cat /tmp/mysqlrouter/mysqlrouter.conf

 

router입장에서 쓰기 작업인지 읽기작업인지 구별하는 방법은 포트번호로 구분합니다. 포트를 설정하지 않으면 first-available에 설정된 라우팅 설정을 따릅니다.

 

지금까지 router설정을 도식화 하면 아래 그림과 같습니다.

 

3. router 로드밸런싱 실습

client를 생성하기 위해 mysql-client pod를 생성합니다.

cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
  name: myclient
  labels:
    app: myclient
spec:
  nodeName: k8s-m
  containers:
  - name: myclient
    image: mysql:8.0.29
    command: ["tail"]
    args: ["-f", "/dev/null"]
  terminationGracePeriodSeconds: 0
EOF

 

client pod에서 router을 이용하여 mysql pod에 접근해보겠습니다. rw, ro포트를 설정하지 않으면 first-available정책떄문에 rw라우팅 규칙이 적용됩니다. 결국, primary mysql pod로 접근합니다. 현재 primary msqyl pod가 1개이므로 부하분산이 되지 않습니다.

kubectl exec -it myclient -- mysql -h mycluster.mysql-cluster -uroot -psakila -e "select @@hostname, @@read_only, @@super_read_only";echo; done

 

client가 router에 요청할때 6447포트를 사용하면, secondary mysql 2개 중 1개로 부하분산됩니다.

for _ in $(seq 1 10);do kubectl exec -it myclient -- mysql -h mycluster.mysql-cluster --port=6447 -uroot -psakila -e "select @@hostname, @@read_only, @
@super_read_only"; done;

반응형