잠시만 기다려 주세요

     '대한민국이 더이상 발전하지 못하는 것은 부패한 언론들의 쓰레기짓 때문이다.'
전체검색 :  
이번주 로또 및 연금번호 발생!!   |  HOME   |  여기는?   |  바다물때표   |  알림 (16)  |  여러가지 팁 (1056)  |  추천 및 재미 (152)  |  자료실 (22)  |  
시사, 이슈, 칼럼, 평론, 비평 (602)  |  끄적거림 (129)  |  문예 창작 (705)  |  바람 따라 (69)  |  시나리오 (760)  |  드라마 대본 (248)  |  
살인!


    mariadb, mysql

mariadb, mysql - 리플리케이션 Mysql Replication으로 Master DB와 Slave DB 설정하기
이 름 : 바다아이   |   조회수 : 9784         짧은 주소 : https://www.bada-ie.com/su/?81591782481
개인적으로 홈페이지를 운영하고 있거나 서버를 운영하고 있다면 백업은 필수적일 것이다.
물론 호스팅회사에서 기본 백업을 해주고는 있다고는 하지만 자체 백업의 중요성은 두말하면 잔소리일것이다.
 
물론 그전에도 홈페이지를 만들고 운영했었지만
지금도 운영하고 있는 제대로된 홈페이지 운영은 2001년도 부터였다.
그럭저럭 13년이 지났다.
 
시간이 지나고보니 남은게 홈페이지에 남아있는 데이터와 사진뿐이 아닐까 하는 생각이다.
그만큼 홈페이지 데이터가 내게는 소중하다.
두대의 서버를 운영하고 한대를 백업서버로 이용했었는데 비용부담때문에 해지하고 창고에 처박아 두었다가 
불현듯 백업을 해야할 것같아서 다시 서버를 만지작 거리고 있다.

각설하고
홈페이지 백업에서 사실 프로그램은 별로 중요하지 않다.
개인적으로 만들어서 개인적인 용도로만 이용하는 몇개의 모듈을 제외하고는 
공개소프트웨어들이라서 언제든지 최신 버전으로 다운받아서 설치하면 끝이다.
중요한 것은 DB와 첨부화일!!!!!!!!!!!
  
DB를 백업하는 가장 기본적인 손쉬운 방법은 
mysqldump로 받아서 SQL을 텍스트로 저장하는 방법이다.
그것도 스크립트 또는 배치화일을 만들어서 리눅스의 Cron과 윈도우즈의 작업스케쥴러를 이용하면 신경쓰지 않아도 저절로 저장된다.
하지만 이 경우 DB를 복구하는 동안은 홈페이지 운영이 불가능하다.
 
가장 좋은 방법은 Mysql의 Replication을 이용하는 방법이다.
벌써 수년전에 두대의 서버에 Replication을 설정하다가 실패했다.
어찌보면 당연한 이야기일지 모르지만 한쪽은 Mysql 5.X, 다른 한쪽 4.X였으니 각기 client 버전에 달라서 전혀 동작을 하지 못했다.
 
이번에는 각기 다른 서버(그중 하나는 최고급 호텔방인 IDC에 입주해있고 나머지 하나는 동네 싸구려 여인숙만도 못한 
우리집 창고에서 공유기를 넘어서 돌아가고 있다.)에 Mysql 5.X를 깔고 replication을 시도했다.
결과적으로 대성공... 만만세...
replication을 시도하고 몇년만에 만만세를 불러보는지 모르겠다.
 
이제 드디어 XE의 /files/config/db.config.php에 Mater와 Slave가 제 구실을 할 수 있게 되었다.

<?php if(!defined("__XE__")) exit();

$db_info = (object)array (
  'master_db' =>
  array (
    'db_type' => 'mysqli',
    'db_port' => '3306',
    'db_hostname' => '115.xxx.xxx.2xx',
    'db_userid' => 'db_user',
    'db_password' => 'db_pass',
    'db_database' => 'backupxe',
    'db_table_prefix' => 'xe_',
  ),
  'slave_db' =>
  array (
    0 =>
    array (
      'db_type' => 'mysqli',
      'db_port' => '3306',
      'db_hostname' => '127.0.0.1',
      'db_userid' => 'db_user',
      'db_password' => 'db_pass',
      'db_database' => 'backupxe',
      'db_table_prefix' => 'xe_',
    ),
  ),
  ...... 생략.........
  ),

같은 DB지만 각기 다른서버에서 돌아가고 있으니 마스터와 슬레이브의 IP주소만 다르고 나머지 설정은 동일하다....
생각같아서는 마스터 DB가 죽으면 자동으로 슬레이브에 접속하면 좋겠지만 그건 희망사항이고...
실제로는 master에는 insert/update/delete를, slave에서는 select만 해서 부하를 분산 시키는 방법이란다.
참고로 이사이트는 slave에서 돌아간다. 
 
각설하고...
당연히 IDC에 있는 메인서버가 Master
집안 창고있는 녀석이 Slave
먼저 master의 /etc/my.cnf를 수정한다.

server-id   = 1  //마스터지정
log-bin=mysql-bin 
binlog_do_db = test1         // 백업할 DB(전체DB를 리플리케이션하려멱 아예 삭제)
binlog_do_db = test2         // 여러 개의 DB일경우, 계속 추가

innodb_autoinc_lock_mode=1 //
auto_increment_increment=1  //
auto_increment_offset=1  //요거 세줄 없으면 XE DB에서 에러생긴다.

부분을 추가해준다.
그중 마지막 세줄때문에 몇시간 삽질했다. 
이제 마스터 DB를 재가동한다.
내경우는

Master# /etc/ini.d/mysqld restart

경우에 따라서는

Master#  service mysqld restat
해줘야하는 경우도 있다.
 
master에 백업 user 설정
slave에서 접속할 ID를 생성하고 권한을 설정해준다.
 
Matser mysql> use mysql;
Matser mysql> CREATE USER 'backup'@'%' IDENTIFIED BY '(비밀번호)'; // 요건 생략해도 되는 것같다.
Master mysql> GRANT REPLICATION SLAVE on *.* TO 'backup'@'%' IDENTIFIED BY '비밀번호';
 
이제 데이터를 복사해줘야한다.
즉 마스트에 있는 DB를 슬레이브의 DB에 이동해줘야한다.
이때 주의사항은 슬레이트에 동일한 이름의 데이터베이스가 있으면 몽땅 삭제된다...

Master mysql> FLUSH TABLES WITH READ LOCK;

뭐 그냥해도 큰 상관은 없지만 그사이에 입력된 DB는 슬레이브에 저장되지 않고 유실된다. 따라서 LOCK을 걸어주고 하자...
 
쉘로 빠져나와서 msql을 덤프 받는다.

Mater # mysqldump -u root -p [DB명] >BackupData.sql
특정 DB만 리플리케이션하는 경우
 
Master# mysqldump -u soonj -p --all-databases >BackupData.sql
몽땅 다 리플리케이션하는 경우 <--나는 이걸로 했다.
 
여기서 만들어진 BackupData.sql을 슬레이브로 가져간다.
 
마스터와 슬레이브의 DB를 동기화시켜주는 일단계는 기존의 디비를 똑같게 만들어주는 것이다.
따라서 마스터에서 덤프받은 SQL을 슬레이브에 입력해준다.
Slave# mysql -u root -p [DB명] < BackupData.sql
특정 DB만 리플리케이션하는 경우
Slave# mysql -u root -p  < BackupData.sql

몽땅 다 리플리케이션하는경우 
이제 슬레이브 설정을 해보자

제일먼저 /etc/my.cnf 수정이다.

server-id  = 2
master-host = xxx.xxx.xxx.xxx // master.server.ip.address 
master-port = 3306
master-user = backup     //아까 마스터에서 만든 backup_userid
master-password = 비밀번호 // backup_user의 비밀번호
replicate-do-db = test1        // 리플리케이션DB명(생략시엔 전체DB를 리플리케이션함)
replicate-do-db = test2        // 여러 개의 DB일경우, 계속 추가

slave-skip-errors = 1062   //요놈때문에 몇시간 삽질했다. 이거 없으면 에러난다...끙~~

이제 슬레이브도 재가동하자

Slave# /etc/ini.d/mysqld restart

경우에 따라서는

Slave# service mysqld restat
 
다시 마스터를 잠깐 살펴보자...
아직 LOCK상태에 있다.

Mater mysql> show master status;
+-------------------+-----------+-----------------+--------------------+
| File                      | Position    | Binlog_Do_DB  | Binlog_Ignore_DB |
+-------------------+-----------+-----------------+--------------------+
| mysql-bin.000002 | 44337251|                           |                                |
+-------------------+-----------+-----------------+--------------------+
1 row in set (0.00 sec)

 Mater mysql> UNLOCK TABLES;                           // DB Write 금지해제

저기에서 File과 Position이 중요!!!!!!하다.
 
다시 슬레이브로 가자!!!!!!!!!!!!

Slave mysql> CHANGE MASTER TO MASTER_HOST='xxx.xxx.xxx.xxx', MASTER_USER='backup', MASTER_PORT=3306, 
MASTER_PASSWORD=' 비밀번호', MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=44337251 

당연한 이야기지만

MASTER_HOST에는 마스터의 아이피주소를
MASTER_LOG_FILE에는 아까 "show master status;"에서 확인했던 File을
MASTER_LOG_POS에는 position을 입력해준다.

Slave mysql> START slave;

여기까지 설정 끝이다..

 
확인해보자

Master mysql>  SHOW MASTER STATUS\G;
*************************** 1. row ***************************
            File: mysql-bin.000002
        Position: 48832209
    Binlog_Do_DB:
Binlog_Ignore_DB:
1 row in set (0.00 sec)

ERROR:
No query specified

슬레이브도 확인....

Slave mysql> SHOW SLAVE STATUS\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 115.xxx.xxx.xxx
                  Master_User: backup
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 49095428
               Relay_Log_File: mysqld-relay-bin.000008
                Relay_Log_Pos: 46431147
        Relay_Master_Log_File: mysql-bin.000002
             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: 49095428
              Relay_Log_Space: 46431303
              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:
1 row in set (0.00 sec)

ERROR:
No query specified

더 확인해보고 싶으면
마스터에서 데이터를 입력해보자

Master mysql> use test;
Database changed

Master mysql> select * from documents;
+----+----------+-----------+---------------------+-----------------+
| id | group_id | group_id2 | date_added          | title           |
+----+----------+-----------+---------------------+-----------------+
|  7 |        0 |         0 | 0000-00-00 00:00:00 | test2           | 
+----+----------+-----------+---------------------+-----------------+
1 rows in set (0.00 sec)

Master mysql> insert into documents set title='test3';
Query OK, 1 row affected, 4 warnings (0.00 sec)

mysql> select * from documents;
+----+----------+-----------+---------------------+-----------------+
| id | group_id | group_id2 | date_added          | title           | 
+----+----------+-----------+---------------------+-----------------+
|  7 |        0 |         0 | 0000-00-00 00:00:00 | test2           | 
|  8 |        0 |         0 | 0000-00-00 00:00:00 | test3           | 
+----+----------+-----------+---------------------+-----------------+

2 rows in set (0.00 sec)

슬레이브에서 확인해보자

Slave mysql> use test;
Database changed

Slave mysql> select * from documents;
+----+----------+-----------+---------------------+-----------------+
| id | group_id | group_id2 | date_added          | title           |
+----+----------+-----------+---------------------+-----------------+
|  7 |        0 |         0 | 0000-00-00 00:00:00 | test2           | 
|  8 |        0 |         0 | 0000-00-00 00:00:00 | test3           | 
+----+----------+-----------+---------------------+-----------------+

2 rows in set (0.00 sec) 

 
잘 들어온다.
리플리케이션 이제 신경꺼도 된다.
그래도 가끔 로그화일은 들여다보자...
 

추1) 혹씨라도 연결이 잘 안되면다면 3306번 포트가 열려있는지 방화벽을 살펴보자

/etc/sysconfig/iptables에 다음줄을 넣고 restart 해주자...

-A RH-Firewall-1-INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT 
 

추2) 그래도 SQL 덤프 백업은 한다.

세상일이라는 것이 모르는 것이니까...

 
추3) 리눅스서버가 아닌 윈도우서버에서도 설정을 거의 비슷하다.

백업서버가 없다면 PC에 replication해도 될 것같다.  안해봤다. 그냥 문서만 봤다... 된다더라.... 


출처 : http://xe3rdparty.com/feedback/166664

| |





      1 page / 2 page
번 호 카테고리 제 목 이름 조회수
33 mariadb, mysql Mysql, mariadb The table '' is full 바다아이 1589
32 mariadb, mysql Mariadb MySQL , mysql mariadb ... , mariadb mysql ... , mariadb , mysql ... 바다아이 1797
31 mariadb, mysql MariaDB , ... 바다아이 1983
30 mariadb, mysql MYSQL Locked , , 바다아이 6112
29 mariadb, mysql MySQL - LOCK , MyISAM , , 바다아이 4870
28 mariadb, mysql mysql Index , 바다아이 7312
27 mariadb, mysql MySQL DB , 바다아이 12165
26 mariadb, mysql mysql, mariadb , , , , left, substring, right, concat 바다아이 10555
25 mariadb, mysql mysql, mariadb DISTINCT GROUP BY 바다아이 10723
24 mariadb, mysql mysql 5.x my.cnf 바다아이 9192
23 mariadb, mysql mysql lock , 바다아이 10025
22 mariadb, mysql , MySQL, mariadb , 바다아이 10230
21 mariadb, mysql mysql , , , unixtime 바다아이 13213
20 mariadb, mysql Mysql , Join (Left, Right, Outer, Inner Join) 바다아이 8808
19 mariadb, mysql mariadb, MySQL 17 바다아이 11077
18 mariadb, mysql mysql, mariadb 바다아이 9185
17 mariadb, mysql mysql .. time 바다아이 8727
16 mariadb, mysql Mysql(MariaDB) ? 바다아이 9725
15 mariadb, mysql [MySQL] ,insert 바다아이 9941
14 mariadb, mysql [MySQL] - SQL 바다아이 9453
13 mariadb, mysql MySQL JOIN UPDATE 바다아이 9080
12 mariadb, mysql mysql update 바다아이 9676
11 mariadb, mysql mysql storage engine myisam vs innodb 바다아이 9127
현재글 mariadb, mysql Mysql Replication Master DB Slave DB 바다아이 9785
9 mariadb, mysql Mysql 바다아이 8942
8 mariadb, mysql MySQL Partition , 바다아이 11428
7 mariadb, mysql MySQL Session() ( ) 바다아이 9545
6 mariadb, mysql mysql ... 바다아이 9000
5 mariadb, mysql UNION (Mysql table ) 바다아이 9168
4 mariadb, mysql mysql 바다아이 8822
| |









Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb ]
서버위치 : 오라클 클라우드 춘천  실행시간 : 0.06146
to webmaster... gogo sea. gogo sea.