Database/Mysql

[Real MySQL] 17-4. InnoDB 클러스터: 구축

noahkim_ 2024. 9. 7. 20:24

백은빈, 이성욱 님의 "Real MySQL" 책을 정리한 포스팅 입니다.

 

1. 요구사항

  • 그룹 복제에서 요구하는 사항을 만족해야 함
    • MySQL 서버 5.7.17~
    • MySQL 셸 1.0.8~
    • MySQL 라우터 2.1.2~
  • Performance 스키마 활성화
  • MySQL 셸 사용을 위한 파이썬 2.7 버전 이상 사용

 

2. InnoDB 클러스터 생성

1. 사전 준비

primary/js> dba.configureInstance("root@localhost:3306")
  • mysql-shell에서 InnoDB 클러스터 설정 
  • 적용을 위해 restart 필수

 

2. 클러스터 생성

primary/js> var cluster = dba.createCluster("testCluster")
  • 클러스터에 대한 정보를 저장할 메타데이터 데이터베이스 생성 및 메타데이터 설정
    • 그룹 복제 설정 및 시작
    • 그룹 복제 분산 복구에서 사용될 DB 계정 생성
  • 기본적으로 싱글 프라이머리 모드로 생성됨

 

3. 클러스터 인스턴스 추가

primary/js> cluster.addInstance("secondary1:3306");
primary/js> cluster.addInstance("secondary2:3306");
  • 바로 추가가 가능한지 혹은 클러스터에 있는 기존 서버와 데이터 동기화가 필요한지 판단.
    • 현재 클러스터에 존재하는 서버와 추가될 서버의 상태를 비교해서
  • 데이터 동기화가 필요한 경우 분산 복구 수행.
    • 기본 분산복구 방식은 원격 클론 방식.
    • 선택 가능
  • 반드시 프라이머리 서버에서 추가해야 하는 것은 아님

 

4. MySQL 라우터 설정

mysqlrouter --bootstrap [user]@[node_ip]:3306 --name router \
--dictionary [mysqlrouter 관련 디렉토리 경로] \
--account [라우터에서 InnoDB 클러스터에 접속할 때 사용할 DB 계정] \
--user [라우터를 실행할 시스템 사용자 계정]

 

myrouter/mysqlrouter.conf

[metadata_cache]

[metadata_cache:bootstrap]
cluster_type=gr
router_id=1
user=mysql_router1_76fpjb99tsq4
metadata_cluster=testCluster
ttl=0.5
auth_cache_ttl=-1
auth_cache_refresh_interval=2
use_gr_notifications=0
  • ttl
    • 라우터가 내부적으로 캐싱하고 있는 클러스터 메타데이터를 갱신하는 주기 (초)
  • user_gr_notifications
    • 그룹 복제에서 발생하는 변경사항에 대해 라우터가 알림을 받을 수 있음
      • 그룹 복제에서 정족수 손실이 발생한 경우
      • 그룹 멤버 구성에 변경이 발생한 경우
      • 그룹 멤버의 역할이 변경된 경우
      • 그룹 멤버의 상태가 변경된 경우
    • 각 클러스터 인스턴스에 X 프로토콜로 연결되어 있어야 함

 

[routing]

[routing:bootstrap_rw]
bind_address=0.0.0.0
bind_port=6446
destinations=metadata-cache://testCluster/?role=PRIMARY
routing_strategy=first-available
protocol=classic

[routing:bootstrap_ro]
bind_address=0.0.0.0
bind_port=6447
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=classic

[routing:bootstrap_x_rw]
bind_address=0.0.0.0
bind_port=6448
destinations=metadata-cache://testCluster/?role=PRIMARY
routing_strategy=first-available
protocol=x

[routing:bootstrap_x_ro]
bind_address=0.0.0.0
bind_port=6449
destinations=metadata-cache://testCluster/?role=SECONDARY
routing_strategy=round-robin-with-fallback
protocol=x
  • destionations
    • 라우터에서 쿼리 요청을 전달할 대상 MySQL 서버를 지정하는 옵션
    • role: 어떤 타입의 MySQL 서버로 연결할 것인지 설정할 옵션
      • PRIMARY, SECONDARY, PRIMARY_AND_SECONDARY
    • disconnect_on_prompted_to_primary: 세컨더리 서버가 프라이머리로 승격됬을 때 해당 서버에 대한 기존 클라이언트 연결을 어떻게 처리할 것인지
    • disconnect_on_metadata_unavailable: 과부하로 인해 라우터에서 클러스터의 메타데이터 갱신이 불가할 때 클러스터에 대한 기존 클라이언트 연결을 모두 종료할 것인지 여부를 처리함
    • routing_strategy: 라우터가 어떤 서버에 연결해서 쿼리요청을 전달할 것인지 대상 서버를 선택하는 전략
      • round-robin
      • round-robin-with-fallback: 세컨더리 서버들에 대해 라운드 로빈으로 선정함
      • first-available: 연결 대상 서버 목록에서 사용가능한 첫번째 서버를 선택
      • next-available: first-available과 동일. 만약 연결 시 오류가 발생하면, 연결 불가로 표시하고 연결 대상에서 제외함