Commit de486174 authored by nuxer's avatar nuxer

DBMS Replication 구성

parent ad39a229
[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)
# 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를 이용한 컨테이너 실행
```bash
# 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 설정 내역
```bash
# 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 되어 있다.
```bash
# docker exec -it centos7.6-mariadb10.3 /bin/bash
```
```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로 마운트 된 파티션에 백업을 수행할 디렉토리를 생성한다.
```bash
# 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을 이용한 백업을 수행한다.
```bash
[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)을 준비한다.
```bash
[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 마운트 포인트를 확인한다.
```bash
# 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
```
다시 한버 백업된 내역을 확인한다.
```bash
# 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)를 확인`한다.
```bash
# ls /PDS/DOCKERS/mariadb/centos7-mariadb-10.3/DB/
#
```
`호스트에서 컨테이너 볼륨경로에 Hot Copy를 수행한다.`
```bash
# cp -rf /PDS/DATABASE_BACKUP/2021-01-03/* .
```
- [ **STEP 4** ] : 백업 DATA를 참조하여, Replication을 구성한다.
컨테이너로 접속한 후 다음과 같이 Replication을 설정한다.
```bash
# cat /var/lib/mysql/xtrabackup_binlog_info
mysql-bin.000032 283375354 0-250-25082472
```
```bash
# 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 기반으로 설정한다.
```bash
MariaDB [(none)]> SET GLOBAL gtid_slave_pos='0-250-25082472';
Query OK, 0 rows affected (0.025 sec)
```
위의 설정한 gtid_slave_pos 값이 제대로 적용되었는지를 검증한다.
```bash
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을 시작한다.
```bash
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)
```
```bash
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.003 sec)
```
최종적으로 MASTER -> SLAVE 간의 Replication 상태 및 데이터가 정상적으로 동기화되는 것을 확인할 수 있다.
```bash
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)
```
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment