docker-compose로 MySQL Master/Slave 구성 배우기

docker-compose로 MySQL Master/Slave 구성 배우기



Kubernetes상에서 공식 StatefulSet의 사용 예을 보면서 MySQL의 Master/Slave 구성을 만들려고 하면, 여러가지 벽이 너무 많았기 때문에 사전에 예비 지식을 획득해 둔다.

이번 목표로는
  • Master/Slave 만드는 법
  • xtrabackup 의 움직임
  • ncat 의 움직임

  • 근처를 밝혀 간다.

    구성


  • master 측, slave 측에서 각각 MySQL 서비스와 xtrabackup 서비스를 실행한다.
  • mysql 서비스와 xtrabackup 서비스는 같은 데이터 디렉토리와 설정 파일을 마운트하고 있다.
  • 1Pod 당 mysql 컨테이너와 xtrabackup 컨테이너를 기동하는 사이드카 구성을 이미지하고 있다.



  • 이번에 사용하는 docker-compose는 이쪽

    docker-compose.yml
    version: '3.4'
    
    # mysqlの共通設定
    x-template: &mysql-template
      image: mysql:5.7
      environment:
        MYSQL_DATABASE: sample
        MYSQL_ROOT_USER: root
        MYSQL_ROOT_PASSWORD: pass
    
    # xtrabackupの共通設定
    x-template: &xtra-template
      image: gcr.io/google-samples/xtrabackup:1.0
      tty: true
    
    # volumeの作成
    volumes:
      master-volume:
        driver: local
      slave-volume:
        driver: local
    
    services:
      # master側のMySQLサービス
      master:
        <<: *mysql-template
        volumes:
          - master-volume:/var/lib/mysql # データディレクトリ
          - ./master/conf:/etc/mysql # 設定ファイル
      # master側バックアップを取得、送信するためのxtrabackupサービス
      master-xtra:
        <<: *xtra-template
        volumes:
          - master-volume:/var/lib/mysql
          - ./master/conf:/etc/mysql # 設定ファイル
        # ncat でバックアップリクエストを受け付ける
        entrypoint: >
          ncat --listen --keep-open --send-only --max-conns=1 3307 -c 
          "xtrabackup --backup --slave-info --stream=xbstream --host=master --user=root --password=pass"
    
      # slave側のMySQLサービス
      slave:
        <<: *mysql-template
        volumes:
          - slave-volume:/var/lib/mysql
          - ./slave/conf:/etc/mysql/conf.d
      # slave側バックアップを作成するためのxtrabackupサービス
      slave-xtra:
        <<: *xtra-template
        volumes:
          - slave-volume:/var/lib/mysql
          - ./slave/conf:/etc/mysql/conf.d
    

    conf는 음, 잘 만들 것이다.

    Step1. Master 시작



    우선은 master측 MySQL을 기동한다.
    보통으로 기동해 버려 OK.
    docker-compose up -d master
    

    Step2. ncat 시작



    xtrabackup 서비스로 master측 MySQL의 데이터 디렉토리를 마운트해 두는 것으로, xtrabackup으로 백업을 취득할 수 있다.
    slave 측에 백업을 전송할 수 있도록 ncat로 요청을 접수하고 slave 측의 요청을 트리거로 백업을 취득·송신한다.

    master측의 xtrabackup 서비스를 기동하면(자) ncat가 포그라운드에서 요구를 대기한다.
    docker-compose up -d master-xtra
    

    ncat의 명령에 대해서는 이런 느낌?


    옵션
    내용


    --listen
    청취 모드에서 시작

    --send-only
    데이터 전송만

    --max-conns=1
    최대 동시 연결 수 1

    3307
    포트 번호

    -c
    지정된 명령 실행


    Step3. 백업 얻기



    slave의 작성에 있어서는, 작성 시점의 내용으로 master의 데이터의 백업을
    취득·복원하고 나서 차분의 로그를 적용해 둔다.
    마스터 측의 ncat에 요청을 보내 백업 데이터를 보냅니다.
    취득한 결과를 slave측의 데이터 디렉토리에 보존한다.

    slave 측 xtrabackup 서비스를 시작하고
    docker-compose up -d slave-xtra
    

    slave-xtra에 연결
    docker-compose exec slave-xtra bash
    

    백업을 얻고 로그를 적용합니다.
    ncat --recv-only master-xtra 3307 | xbstream -x -C /var/lib/mysql/
    xtrabackup --prepare --target-dir=/var/lib/mysql
    

    이것으로 백업 검색 및 복원이 완료되었습니다.

    Step4. Slave 시작



    slave MySQL을 시작하십시오.
    docker-compose up -d slave
    

    취득한 백업으로부터 slave의 기동에 필요한 정보를 취득한다.
    docker-compose exec slave-xtra bash
    cat /var/lib/mysql/xtrabackup_binlog_info
    

    내용은
    바이너리 로그 이름 [[:space:]] 로그 위치
    LOG_INFO=(`cat /var/lib/mysql/xtrabackup_binlog_info`)
    

    slave 설정하기
    mysql -u root -ppass -h slave <<EOF
        CHANGE MASTER TO MASTER_LOG_FILE='${LOG_INFO[0]}',
        MASTER_LOG_POS=${LOG_INFO[1]},
        MASTER_HOST='master',
        MASTER_USER='root',
        MASTER_PASSWORD='pass',
        MASTER_CONNECT_RETRY=10;
        START SLAVE;
    EOF
    

    이제 슬레이브가 움직일 것이므로 master 측을 적절하게 업데이트하십시오.
    mysql -u root -ppass -h master -D sample -e 'create table test(id int(5)); insert into test values(1)';
    

    slave 측에서 확인
    mysql -u root -ppass -h slave -D sample -e 'select * from test;'
    

    할 수 있었다!

    다음은 Kube에서 제대로 움직일지 확인하지 않으면 ...

    좋은 웹페이지 즐겨찾기