DB를 안전하게 운영하기 위해서 이중화하여 페이백 처리가 가능하다, 다음 설정은 단방향 이중화 설정을 서술한다.
작업을 하기 위해서는 반드시 동일한 버전의 DB 서버가 필요하며 최소 각 각 1대씩 총 2대가 필요 하다.
이중화 작업
1. Database를 일치시키기 위해 DB#1 서버에서 db dump
[root@DB#1]# mariadb-dump -u root -p --all-databases > astronbak.sql
[root@DB#2 ]# mysql -u root -p < astronbak.sql
[root@DB#1 ~]# vi /etc/my.cnf.d/server.cnf
[mysqld]
### replication
server_id=1
log-basename=master1
log_bin
[root@DB#1 ~]# systemctl restart mariadb
[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;
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값을 기억
[root@DB#2]# vi /etc/my.cnf.d/server.cnf
[mysqld]
server-id=2
log-bin
log-basename=master1
report-host=slave1
[root@DB#2 ~]# systemctl restart mariadb
[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)
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; 명령어를 입력하면 된다.