Name
Last commit
Last update
..
README.md DBMS Replication 구성

logo

MariaDB Slave의 Dockerize 구성

이미 DBMS Zone 시스템에 Dockerize MariaDB가 운용중이다. 아래의 과정은 DBMS Replication의 적용 및 현황을 확인하는 과정이다.

Docker 이미지 Build

  • [ Skip ] Dockerfile을 이용한 Image Build
  • [ Skip ] Build된 이미지의 Container Registry 등록
  • docker-compose를 이용한 컨테이너 실행
  • mariabackup을 이용한 Replication 구성 (Docker Host에서 수행필요)
  • Portainer를 이용한 관리

docker-compose를 이용한 컨테이너 실행

# cat docker-compose.yml
version: '3'
services:
  hongsnet-centos76-mariadb103:
       image: registry.hongsnet.net/joohan.hong/docker/mariadb:centos7-10.3_20201211
       #image: centos7.6-mariadb10.3-hongsnet
       restart: always
       hostname: 'centos7-mariadb103'
       container_name: hongsnet-centos7.6-mariadb10.3
       environment:
        - MYSQL_ROOT_PASSWORD=패스워드
       volumes:
        - "/PDS/DOCKERS/mariadb/centos7-mariadb-10.3/DB:/var/lib/mysql"
        - "/PDS/DOCKERS/mariadb/centos7-mariadb-10.3/CONFIG/my.cnf:/etc/my.cnf"
        - "/PDS/DATABASE_BACKUP:/BACKUP"
       ports:
        - "3306:3306"
        #- "2225:22"
       extra_hosts:
        - "localhost:127.0.0.1"
        - "mariadb.hongsnet.net:127.0.0.1"

MariaDB 10.3 설정 내역

# cat CONFIG/my.cnf

[client]
port            = 3306
socket          = /var/lib/mysql/mysql.sock

[mysqld_safe]
socket          = /var/lib/mysql/mysql.sock
nice            = 0

[mysqld]
log-error = /var/lib/mysql/mysql.err
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake

default-storage-engine=InnoDB
max_allowed_packet = 1024M
net_read_timeout=120
net_write_timeout=120
#wait_timeout=86400
wait_timeout=30

user            = mysql
port            = 3306
basedir         = /usr
datadir         = /var/lib/mysql
tmpdir          = /tmp
skip-external-locking
skip-name-resolve

key_buffer_size         = 64M
max_allowed_packet      = 1024M
thread_stack            = 192K
thread_cache_size       = 256
max_connections        = 4096
table_cache            = 1024
tmp_table_size          = 32M
max_heap_table_size     = 32M

query_cache_size        = 128M
query_cache_type        = 1
sort_buffer_size = 256K
read_buffer_size = 256K
read_rnd_buffer_size = 512K

long_query_time = 2

server-id               = 135
log_bin                 = mysql-bin
expire_logs_days        = 3
max_binlog_size         = 1024M
read_only              = 1

innodb_buffer_pool_size = 4096M
innodb_flush_log_at_trx_commit = 0
innodb_lock_wait_timeout = 50
innodb_thread_concurrency = 8
innodb_log_buffer_size = 8M
innodb_log_file_size = 64M
innodb_log_files_in_group = 2
innodb_file_per_table=1

[mysqldump]
quick
quote-names
max_allowed_packet      = 1024M

[mysql]
max_allowed_packet      = 1024M

[isamchk]
key_buffer_size         = 16M

[client-server]

!중요 : 다음의 설정은 반드시 Master와 다른 값으로 설정되어야 한다.

  • read_only = 1
  • server-id = 135

mariabackup을 이용한 Replication 구성

컨테니어 내부에서 작업을 진행하며, 다음과 같이 NFS로 파티션이 Export 되어 있다.

# docker exec -it centos7.6-mariadb10.3 /bin/bash
# df -h
Filesystem                           Size  Used Avail Use% Mounted on
overlay                              200G  7.4G  193G   4% /
tmpfs                                 64M     0   64M   0% /dev
tmpfs                                 32G     0   32G   0% /sys/fs/cgroup
192.168.200.62:/PDS/DATABASE_BACKUP  2.3T  1.8T  525G  78% /BACKUP
/dev/mapper/DATABASE-VIRT            3.0T  987G  2.0T  33% /etc
/dev/sda3                            200G  7.4G  193G   4% /etc/hosts
shm                                   64M     0   64M   0% /dev/shm
tmpfs                                 32G     0   32G   0% /proc/acpi
tmpfs                                 32G     0   32G   0% /proc/scsi
tmpfs                                 32G     0   32G   0% /sys/firmware

NFS로 마운트 된 파티션에 백업을 수행할 디렉토리를 생성한다.

# mkdir /BACKUP/2021-01-03

!중요 : mariabackup 시 서비스 디렉토리에 지정할 수는 없고, 반드시 백업되는 용량보다 같거나 큰 용량의 파티션이 필요하다.

준비가 되었으면, mariabackup을 이용해서 백업을 진행한다.

  • maraiabackup의 백업 옵션은 두 가지가 존재하며,
    • --no-lock : Master 시스템에서 백업을 수행하며, Table Locking을 수행하지 않는다. 즉, Live로 백업을 수행할 수 있다.
    • --slave-info : Slave 시스템에서 백업을 수행하며, 백업 시점까지의 Replication 정보를 그대로 유지한다.

!참고 : mariabackup 진행 과정

  • [ STEP 1 ] : mariabackup을 이용한 백업을 수행한다.
  • [ STEP 2 ] : 데이터복원(prepared)을 준비한다.
  • [ STEP 3 ] : mariabackup의 copy-back 옵션을 통해 MariaDB $DATADIR 위치에 복사한다.
  • [ STEP 4 ] : 백업 DATA를 참조하여, Replication을 구성한다.
  • [ STEP 1 ] : mariabackup을 이용한 백업을 수행한다.
[MASTER 또는 Slave]# mariabackup --backup --no-lock --target-dir /BACKUP/2021-01-03 --user 아이디 --password 패스워드
...하략
[00] Redo log (from LSN 123437010701 to 123438091183) was copied.
[00] completed OK!
  • [ STEP 2 ] : 데이터복원(prepared)을 준비한다.
[MASTER 또는 Slave]# mariabackup --prepare --target-dir /BACKUP/2021-01-03 --user 아이디 --password 패스워드
...하략
[00] Last binlog file ./mysql-bin.000032, position 283375354
[00] completed OK!
  • [ STEP 3 ] : mariabackup의 copy-back 옵션을 통해 MariaDB $DATADIR 위치에 복사한다.

먼저 신규 Slave의 NFS 마운트 포인트를 확인한다.

# df
Filesystem                1K-blocks       Used Available Use% Mounted on
overlay                   209612800   42476840 167135960  21% /
tmpfs                         65536          0     65536   0% /dev
tmpfs                      32895784          0  32895784   0% /sys/fs/cgroup
/dev/mapper/HONGSNET-PDS 2410700800 1864705512 545995288  78% /BACKUP
/dev/sda3                 209612800   42476840 167135960  21% /etc/hosts
shm                           65536          0     65536   0% /dev/shm
tmpfs                      32895784          0  32895784   0% /proc/acpi
tmpfs                      32895784          0  32895784   0% /proc/scsi
tmpfs                      32895784          0  32895784   0% /sys/firmware

다시 한버 백업된 내역을 확인한다.

# ls -al /BACKUP/2021-01-03/
total 144748
drwxr-xr-x 12 root root      4096 Mar  2 14:09 .
drwxr-xr-x  7 root root        92 Mar  2 14:00 ..
-rw-r-----  1 root root     32768 Mar  2 14:09 aria_log.00000001
-rw-r-----  1 root root        52 Mar  2 14:09 aria_log_control
-rw-r-----  1 root root       324 Mar  2 14:09 backup-my.cnf
drwx------  2 root root      8192 Mar  2 14:09 edu
drwx------  2 root root      8192 Mar  2 14:09 hjh
-rw-r-----  1 root root   1268090 Mar  2 14:09 ib_buffer_pool
-rw-r-----  1 root root 146800640 Mar  2 14:13 ibdata1
-rw-r-----  1 root root         0 Mar  2 14:13 ib_logfile0
drwx------  2 root root      4096 Mar  2 14:09 ldswork
drwx------  2 root root      8192 Mar  2 14:09 MATTERMOST
drwx------  2 root root      4096 Mar  2 14:09 mysql
drwx------  2 root root     16384 Mar  2 14:09 newhongsystem
drwx------  2 root root        20 Mar  2 14:09 performance_schema
drwx------  2 root root      8192 Mar  2 14:09 tech
drwx------  2 root root        28 Mar  2 14:09 test
-rw-r-----  1 root root        42 Mar  2 14:09 xtrabackup_binlog_info
-rw-r-----  1 root root        85 Mar  2 14:13 xtrabackup_checkpoints
-rw-r-----  1 root root       583 Mar  2 14:09 xtrabackup_info
drwx------  2 root root     12288 Mar  2 14:09 ZABBIXDB

위와 같이 정상적으로 확인되었으면, copy-back 옵션이 아닌 컨테이너 볼륨을 기준으로 작업한다.

!참고 : mariabackup의 --copy-back이나 hot-copy 방식이나 결과는 서로 동일하다.

먼저, 컨테이너 볼륨의 디렉토리가 비어있는지(empty)를 확인한다.

# ls /PDS/DOCKERS/mariadb/centos7-mariadb-10.3/DB/
#

호스트에서 컨테이너 볼륨경로에 Hot Copy를 수행한다.

# cp -rf /PDS/DATABASE_BACKUP/2021-01-03/* .
  • [ STEP 4 ] : 백업 DATA를 참조하여, Replication을 구성한다.

컨테이너로 접속한 후 다음과 같이 Replication을 설정한다.

# cat /var/lib/mysql/xtrabackup_binlog_info
mysql-bin.000032        283375354       0-250-25082472
# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 11
Server version: 10.3.27-MariaDB-log MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>

Replication 구성 시 다음과 같이 두 가지 로그를 기준으로 설정할 수 있다.

  • binlog의 Position 설정
  • GTID 설정

여기서는 GTID 기반으로 설정한다.

MariaDB [(none)]> SET GLOBAL gtid_slave_pos='0-250-25082472';
Query OK, 0 rows affected (0.025 sec)

위의 설정한 gtid_slave_pos 값이 제대로 적용되었는지를 검증한다.

MariaDB [(none)]> show variables like 'Gtid%';
+------------------------+----------------+
| Variable_name          | Value          |
+------------------------+----------------+
| gtid_binlog_pos        |                |
| gtid_binlog_state      |                |
| gtid_current_pos       | 0-250-25082472 |
| gtid_domain_id         | 0              |
| gtid_ignore_duplicates | OFF            |
| gtid_pos_auto_engines  |                |
| gtid_seq_no            | 0              |
| gtid_slave_pos         | 0-250-25082472 |
| gtid_strict_mode       | OFF            |
+------------------------+----------------+
9 rows in set (0.039 sec)

마지막 단계로써 CHANGE MASTER 쿼리문을 적용하고, Replication을 시작한다.

MariaDB [(none)]> CHANGE MASTER TO MASTER_HOST='180.180.180.250', MASTER_USER='hongsrepl', MASTER_PASSWORD='패스워드', MASTER_USE_GTID=slave_pos;
Query OK, 0 rows affected (0.004 sec)
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.003 sec)

최종적으로 MASTER -> SLAVE 간의 Replication 상태 및 데이터가 정상적으로 동기화되는 것을 확인할 수 있다.

MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 180.180.180.250
                   Master_User: hongsrepl
                   Master_Port: 3306
                 Connect_Retry: 60
               Master_Log_File: mysql-bin.000032
           Read_Master_Log_Pos: 302848024
                Relay_Log_File: centos7-mariadb103-relay-bin.000002
                 Relay_Log_Pos: 19353534
         Relay_Master_Log_File: mysql-bin.000032
              Slave_IO_Running: Yes
             Slave_SQL_Running: Yes
               Replicate_Do_DB:
           Replicate_Ignore_DB:
            Replicate_Do_Table:
        Replicate_Ignore_Table:
       Replicate_Wild_Do_Table:
   Replicate_Wild_Ignore_Table:
                    Last_Errno: 0
                    Last_Error:
                  Skip_Counter: 0
           Exec_Master_Log_Pos: 302848024
               Relay_Log_Space: 19353856
               Until_Condition: None
                Until_Log_File:
                 Until_Log_Pos: 0
            Master_SSL_Allowed: No
            Master_SSL_CA_File:
            Master_SSL_CA_Path:
               Master_SSL_Cert:
             Master_SSL_Cipher:
                Master_SSL_Key:
         Seconds_Behind_Master: 0
 Master_SSL_Verify_Server_Cert: No
                 Last_IO_Errno: 0
                 Last_IO_Error:
                Last_SQL_Errno: 0
                Last_SQL_Error:
   Replicate_Ignore_Server_Ids:
              Master_Server_Id: 250
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: Slave_Pos
                   Gtid_IO_Pos: 0-250-25098799
       Replicate_Do_Domain_Ids:
   Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: conservative
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 16327
1 row in set (0.000 sec)