Skip to main content

maxscale기반의 DB 이중화 운영

시작하는말

안녕하세요, 고니 입니다.
기존에 작성했던 컨텐츠들 업데이트를 하면서 문서의 리팩토링(Refactoring)을 진행해보려고 합니다.

이번엔 igoni.kr에서 제일 많이 검색해서 유입되는 db proxy인 maxscale 입니다.
igoni.kr 의 50%가 maxscale 이였는데요...(감사)(감사)
Opensource 기반의 DB Proxy에 그만큼 깊은 관심이 있으신것 같네요. 다들 비슷한 처지(?)인것 같습니다.

03bcc72f-aae4-43c5-b58d-6290b3bf83a9.png

perplexity에서 생성한 AI이미지

 

개 요

기존 Mysql + myql-mmm 구조기반에서의 DB이중화 구조에서의 문제점

  1. 비동기식 replication 구조에서 read / write가 많은 경우 replication이 깨지거나 지연되는 현상이 빈번함
  2. mmm의 버전 업데이트가 없음 ( latest버전인 2.2.1은 2012년 12월이 마지막)
  3. mmm 버그로 인한 failover / failback 이슈가 발생이 있음

Maxscale 소개

  1. Mariadb에서 제공하는 DB클러스터 구성
  2. glaera cluster를 이용한 데이터이중화, maxscale를 이용한 db proxy 구조로 되어 있음
  3. 기본적으로 BSD라이선스를 적용하고 있고, BSD라이선스의 경우 S/W 개발사가 적용한 날짜 이후에는 GPL 라이선스로 변경됨
    1. BSD 라이선스를 적용받는 경우 연동할 수 있는 노드수는 3대 미만, 즉 2대까지만 maxscale에 연결할 수 있고 그 수량을 넘는 경우 라이선스 비용 발생이 필요함
    2. GPL의 경우 연동 노드 수 제한없음
    3. '22년 2월 기준으로 확인된 메이저 버전별 BSD라이선스 유효기간은 다음과 같습니다.
      1. 2.0 → 2019-01-01 (BSD 라이선스 만료, 연결노드 수 제한없음)
      2. 2.1 → 2019-07-01 (BSD 라이선스 만료, 연결노드 수 제한없음)
      3. 2.2 → 2020-01-01 (BSD 라이선스 만료, 연결노드 수 제한없음)
      4. 2.3 → 2024-06-02
      5. 2.4 → 2026-01-04
      6. 2.5 → 2027-10-10
      7. 6.2 → 2026-03-08
      8. 6.3 - 2026-05-03
      9. 6.4 - 2027-11-30
      10. 23.0.8 - 2027-11-30
    4. 보다 상세한 내용은 https://github.com/mariadb-corporation/MaxScale 을 참고하면 됩니다
  4. 그외에 벤더사에서 제공하는 기능은 다음과 같다.
    1. scale out environment  - 별도 DB 다운타임없이 스케일-아웃이 가능, read / write spilit이 가능
    2. High availability - 장애 모니터링을 위해 read transction을 라우딩
    3. Secure database - app이 DB에 접근하는것이 아니라 maxsale로 접근하기 때문에 서버 접근 정보 확보가 가능, 방화벽 필터 사용시 클러스터 연결을 제안해서 DDos 공격으로부터 서버 보호가 가능
  5. MMM / Maxscale 비교
항 목 Mysql + Mysql-MMM Mariadb + Maxscale
서버 수량 2(DB) + 1(monitor) 3(DB) + 1(Maxscale)
DB버전 Mysql Mariadb 10 이상
데이터 동기화 방식 replication galera cluster
모니터링 방식 monitor → agent로 db상태 확인 maxscale → DB 방향으로 상태 확인
failover절차
  1. monitor에서 db health check
  2. Active DB 장애탐지
  3. Active DB에 적용된 VIP회수
  4. Standby DB에 VIP 할당
  1. maxscale에서 각 DB health check
  2. Active DB 장애탐지
  3. DB 접속 차단

S/W 설치하기

  1. 시스템 구성도 
    1. maxscale : 192.168.0.101
    2. db1 : 192.168.0.102
    3. db2 : 192.168.0.103
  2. Maxscale 설치 하기
    1. 리포지터리 구성
      $>  vi /etc/yum.repos.d/mariadb.repo
      [mariadb-main]
      name = MariaDB Server
      baseurl = https:~/~/downloads.mariadb.com/MariaDB/mariadb-10.5/yum/rhel/7/x86_64
      gpgkey = file:~/~//etc/pki/rpm-gpg/MariaDB-Server-GPG-KEY
      gpgcheck = 1
      enabled = 1
      [mariadb-maxscale]
      # To use the latest stable release of MaxScale, use "latest" as the version
      # To use the latest beta (or stable if no current beta) release of MaxScale, use "beta" as the version
      name = MariaDB MaxScale
      baseurl = https:~/~/dlm.mariadb.com/repo/maxscale/latest/yum/rhel/7/x86_64
      gpgkey = file:~/~//etc/pki/rpm-gpg/MariaDB-MaxScale-GPG-KEY
      gpgcheck = 1
      enabled = 1
      [mariadb-tools]
      name = MariaDB Tools
      baseurl = https:~/~/downloads.mariadb.com/Tools/rhel/7/x86_64
      gpgkey = file:~/~//etc/pki/rpm-gpg/MariaDB-Enterprise-GPG-KEY
      gpgcheck = 1
      enabled = 1
  3. 패키지 설치 후 설정하기
    $> yum install maxscale -y
    ...
    $> vi /etc/maxscale.cnf
    # MaxScale documentation:
    # https:~/~/mariadb.com/kb/en/mariadb-maxscale-25/
    # Global parameters
    #
    # Complete list of configuration options:
    # https:~/~/mariadb.com/kb/en/mariadb-maxscale-25-mariadb-maxscale-configuration-guide/
    [maxscale]
    threads=auto
    # Server definitions
    #
    # Set the address of the server to the network
    # address of a MariaDB server.
    #
    [server1]
    type=server
    address=192.168.0.102
    port=3306
    protocol=MariaDBBackend
    [server2]
    type=server
    address=192.168.0.103
    port=3306
    protocol=MariaDBBackend
    [server3]
    type=server
    address=192.168.0.101
    port=3306
    protocol=MariaDBBackend
    # Monitor for the servers
    #
    # This will keep MaxScale aware of the state of the servers.
    # MariaDB Monitor documentation:
    # https:~/~/mariadb.com/kb/en/maxscale-25-monitors/
    [MariaDB-Monitor]
    type=monitor
    #module=mariadbmon   #Replication으로 데이터 동기화시 선택
    module=galeramon     #GaleraCluster로 데이터 동기화시 선택
    servers=server1,server2,server3
    user=maxscale             #maxscale이 db접근할때 사용하는 계정명
    password=maxscale         #maxscale이 db접근할때 사용하는 계정패스워드
    monitor_interval=2000
    # Service definitions
    #
    # Service Definition for a read-only service and
    # a read/write splitting service.
    #
    # ReadConnRoute documentation:
    # https:~/~/mariadb.com/kb/en/mariadb-maxscale-25-readconnroute/
    [Read-Only-Service]
    type=service
    router=readconnroute
    servers=server1
    user=myuser
    password=mypwd
    router_options=slave
    # ReadWriteSplit documentation:
    # https:~/~/mariadb.com/kb/en/mariadb-maxscale-25-readwritesplit/
    [Read-Write-Service]
    type=service
    router=readwritesplit
    servers=server1,server2   #read / write 분산할 서버 정보
    user=maxscale             #maxscale이 db접근할때 사용하는 계정명
    password=maxscale         #maxscale이 db접근할때 사용하는 계정패스워드
    # Listener definitions for the services
    #
    # These listeners represent the ports the
    # services will listen on.
    #
    [Read-Only-Listener]
    type=listener
    service=Read-Only-Service
    protocol=MariaDBClient
    port=4008
    [Read-Write-Listener]
    type=listener
    service=Read-Write-Service
    protocol=MariaDBClient
    port=4006
  4. Mariadb 구성하기

    1.  패키지 내려받기
      $> wget https://downloads.mariadb.org/interstitial/mariadb-10.5.11/bintar-linux-x86_64/mariadb-10.5.11-linux-x86_64.tar.gz -O mariadb-10.5.11-linux-x86_64.tar.gz

    2. DB설치 후 galera clutser 구성
      $> tar -zxvf mariadb-10.5.11-linux-x86_64.tar.gz -C /usr/local/
      ...
      $> vi /etc/my.cnf
      [galera]
      # Mandatory settings
      wsrep_on=ON
      wsrep_provider=/usr/local/mariadb/lib/galera-4/libgalera_smm.so
      wsrep_cluster_address=gcomm:~/~/192.168.0.102,192.168.0.103,192.168.0.101
      binlog_format=row
      default_storage_engine=InnoDB
      innodb_autoinc_lock_mode=2
      wsrep_node_address=192.168.0.101
      #
      # Allow server to accept connections on all interfaces.
      #
      bind-address=0.0.0.0
      #
      # Optional setting
      #wsrep_slave_threads=1
      #innodb_flush_log_at_trx_commit=0
  5. 첫번째 노드에서 galera cluster master 선언 (mariadb 프로세스도 실행함)
    $>> galera_new_cluster
  6. 나머지 노드에서 mariadb 실행
    $>> ./mariadbd-safe
  7. DB권한 설정
    MariaDB [(none)]> grant select on mysql.* to maxscale@'%' identified by 'maxscale' with grant option;

모니터링

  1. maxscale서비스 실행
    $>> systemctl start maxscale
  2. maxscle에 등록된 서버 현항확인
    $>> maxctrl list servers
    ┌─────────┬───────────────┬──────┬─────────────┬─────────────────────────┬──────┐
    │ Server  │ Address       │ Port │ Connections │ State                   │ GTID │
    ├─────────┼───────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ server1 │ 192.168.0.102 │ 3306 │ 2           │ Slave, Synced, Running  │      │
    ├─────────┼───────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ server2 │ 192.168.0.103 │ 3306 │ 0           │ Slave, Synced, Running  │      │
    ├─────────┼───────────────┼──────┼─────────────┼─────────────────────────┼──────┤
    │ server3 │ 192.168.0.101 │ 3306 │ 0           │ Master, Synced, Running │      │
    └─────────┴───────────────┴──────┴─────────────┴─────────────────────────┴──────┘
  3. 서비스 상태 확인
    $>> maxctrl list services
    ┌────────────────────┬────────────────┬─────────────┬───────────────────┬─────────┐
    │ Service            │ Router         │ Connections │ Total Connections │ Servers │
    ├────────────────────┼────────────────┼─────────────┼───────────────────┼─────────┤
    │ Read-Write-Service │ readwritesplit │ 2           │ 4                 │ server1 │
    ├────────────────────┼────────────────┼─────────────┼───────────────────┼─────────┤
    │ Read-Only-Service  │ readconnroute  │ 0           │ 0                 │ server1 │
    └────────────────────┴────────────────┴─────────────┴───────────────────┴─────────┘

장애조치

  1. 전체DB서버 장애시 조치
    1. 각 DB서버 접속 후 데이터 경로 진입 후 "grastate.dat 파일 확인
      $>>  cat grastate.dat
      # GALERA saved state
      version: 2.1
      uuid:    7d985eca-de63-11eb-87c6-0ad28b9e1f30
      seqno:   -1
      safe_to_bootstrap: 0
    2. safe_to_bootstrap이 1인 값을 찾아서 해당 노드에서 galera_new__cluster 재실행
      safe_to_bootstrap이 1인 값이 전체 down전에 master 역활했던 node