[MariaDB] replication 세팅

Seunghyun Moon·2022년 10월 26일
0

database

목록 보기
1/5

DB를 안전하게 운영하기 위해서 이중화하여 페이백 처리가 가능하다, 다음 설정은 단방향 이중화 설정을 서술한다.

작업을 하기 위해서는 반드시 동일한 버전의 DB 서버가 필요하며 최소 각 각 1대씩 총 2대가 필요 하다.


이중화 작업
1. Database를 일치시키기 위해 DB#1 서버에서 db dump

[root@DB#1]# mariadb-dump -u root -p --all-databases > astronbak.sql
  1. astronbak.sql dump파일을 DB#2 서버에 database inset
[root@DB#2 ]# mysql -u root -p < astronbak.sql
  1. DB#1 서버에서 server.cnf 환경설정 추가 [mysqld] 항목에 추가해야함
[root@DB#1 ~]# vi /etc/my.cnf.d/server.cnf 

 
[mysqld]
### replication
server_id=1
log-basename=master1
log_bin 
  1. MariaDB restart (DB#1)
[root@DB#1 ~]# systemctl restart mariadb
  1. DB#1 server mysql 접속 사용자 추가 (DB#2 에서 접근할 사용자 추가)
[root@DB#1 ~]# mysql -u root -p mysql
 
 
MariaDB [(none)]> create user 'replication_user'@'{SlaveDBIP}' identified by '#AstronAdmin1!'; 
Query OK, 0 rows affected (0.001 sec)
 
MariaDB [(none)]>  grant replication slave on *.* to replication_user;
Query OK, 0 rows affected (0.002 sec)

flush privileges;
  1. DB#1 데이터베이스 status값 확인
MariaDB [(none)]> show master status;
+-----------------------+----------+-----------------+-------------------+
| File                                | Position   | Binlog_Do_DB  | Binlog_Ignore_DB |
+-----------------------+----------+-----------------+-------------------+
| master1-bin.000002 |     5338   |                             |                                 |
+-----------------------+----------+-----------------+-------------------+
1 row in set (0.001 sec)
 
 
master1-bin.000002 값과 5338값을 기억
  1. DB#2 서버에서 server.cnf 내용 추가
[root@DB#2]# vi /etc/my.cnf.d/server.cnf
 
[mysqld]
server-id=2
log-bin
log-basename=master1
report-host=slave1
  1. MariaDB restart (DB#2)
[root@DB#2 ~]# systemctl restart mariadb
  1. DB#2 mysql 접속 후 server_id값 확인 후 master정보값 업데이트
[root@DB#2]# mysql -u root -p mysql
 
MariaDB [(none)]> SHOW VARIABLES LIKE 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id         |      2     |
+---------------+-------+
   
MariaDB [(none)]> change master to master_host='10.10.3.7', master_user='replication_user', master_password='#AstronAdmin1!', master_port=3306, master_log_file='master1-bin.000002', master_log_pos=5538, master_connect_retry=10;
Query OK, 0 rows affected (0.017 sec)
 
### slaver 시작
MariaDB [(none)]> start slave;
Query OK, 0 rows affected (0.001 sec)
  1. 상태값 확인
MariaDB [(none)]> SHOW SLAVE STATUS \G;
*************************** 1. row ***************************
                Slave_IO_State: Waiting for master to send event
                   Master_Host: 10.10.3.7
                   Master_User: replication_user
                   Master_Port: 3306
                 Connect_Retry: 10
               Master_Log_File: master1-bin.000001
           Read_Master_Log_Pos: 727828
                Relay_Log_File: master1-relay-bin.000002
                 Relay_Log_Pos: 4540
         Relay_Master_Log_File: master1-bin.000001
              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: 727828
               Relay_Log_Space: 4851
               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: 1
                Master_SSL_Crl:
            Master_SSL_Crlpath:
                    Using_Gtid: No
                   Gtid_IO_Pos:
       Replicate_Do_Domain_Ids:
   Replicate_Ignore_Domain_Ids:
                 Parallel_Mode: optimistic
                     SQL_Delay: 0
           SQL_Remaining_Delay: NULL
       Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
              Slave_DDL_Groups: 0
Slave_Non_Transactional_Groups: 0
    Slave_Transactional_Groups: 18
1 row in set (0.000 sec)

해당값에서 2개의 값이 모두 Yes로 표시되어야 한다.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes


설정 완료

그럼 실제 데이터베이스를 하나 만들어서 테이블을 만들고 데이터를 입력해서 replication 잘되는지 테스트 해보자

DB#1 데이터베이스 서버에서 작업

MariaDB [(none)]> create database sync_testdbs;
Query OK, 1 row affected (0.001 sec)

DB#2에서 확인해보니 sync_testdb가 생성 됐다.

MariaDB [(none)]> show databases;
+--------------------------+
| Database                          |
+--------------------------+
| astron                               |
| information_schema     |
| mysql                                |
| performance_schema   |
| sync_testdb                    |
| test                                   |
+--------------------------+
6 rows in set (0.001 sec)

오류 해결

DB#2서버에서 DB#1과의 sync가 끊어질 경우가 있다, 이러한 경우는 왜 발생하나면 DB#1과 DB#2간에 통신은 DB#2가 DB#1의 pos 값을 따라가는 형식으로 되어있다, DB#2에서 DB#1의 pos 값을 따라가지 못했을 경우 에러가 발생하는데 한번 에러가 발생하면 다음은 자동으로 연결하지 않는다, 하여 /etc/my.cnf.d/server.cnf 파일에 에러 발생 시 에러 코드를 넘어가는 형식으로 끊어짐 현상을 막으면서 안정적으로 운영이 가능하다, 단 데이터 정합성은 좀 떨어질 수 있다.

[mysqld]
slave-skip-errors=1062, 1032
skip-slave-start
이후 MariaDB 재 시작 후 DB에 접속하여 start slave; 명령어를 입력하면 된다.
profile
I live fullest

0개의 댓글