Skip to main content

maxscale기반의 DB 이중화 운영

개 요

기존 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