시스템 환경 (Master / Slave)
OS : Ubuntu 20.10 x64
mysql : 5.7.33
IP : Master(167.179.93.128), Slave(167.179.71.47)
MySQL Replication Master 설정
my.cnf수정
root@masterDB:~# sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
마스터서버 설정에서 제일 중요한 부분 server-id는
server-id = 1
log-bin=mysql-bin
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 0.0.0.0
#서버 식별자(유니크)
server-id = 1
#로그파일명
log-bin=mysql-bin
#로그파일크기
max_binlog_size = 100M
#로그보존주기
expire_logs_days = 7
#리플리케이션DB명(생략시엔 전체DB)
binlog_do_db = master
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
마스터 서버를 재시작한다.
root@masterDB:~# sudo systemctl restart mysql
masterDB에 접속해 테이블을 생성한다. 이 테이블을 이용해 데이터가 동기화되는지 확인한다.
root@masterDB:~# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.33-log MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> CREATE TABLE user_tb (uid INT PRIMARY KEY AUTO_INCREMENT, user_name VARCHAR(32) NOT NULL) ENGINE=INNODB; DESCRIBE user_tb;
Query OK, 0 rows affected (0.00 sec)
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| uid | int(11) | NO | PRI | NULL | auto_increment |
| user_name | varchar(32) | NO | | NULL | |
+-----------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
mysql>
작업 중 테이블에 락을 걸어 테이터 변경이 이루어지지 않도록 설정한다.
mysql> FLUSH TABLES WITH READ LOCK;
Query OK, 0 rows affected (0.00 sec)
mysql>
masterDB가 마스터로 설정되어 정보를 리셋한다.
mysql> reset master;
Query OK, 0 rows affected (0.01 sec)
mysql>
masterDB의 상태 정보를 확인한다.
여기서 중요한 것은 File :mysql-bin.000004, Position : 555를 기억해둔다. 이 정보를 slaveDB에 설정하기 위해서다.
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000004 | 555 | master | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
mysql>
또 다른 masterDB의 상태 정보를 확인.
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000005
Position: 555
Binlog_Do_DB: master
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
동기화할 DB를 덤프(백업) 파일로 출력한다.
mysqldump -u [사용자 아이디] -p -B [동기화 대상 DB] > [덤프 파일명]
root@masterDB:~# mysqldump -u root -p -B master > dump_data.sql
Enter password:
root@masterDB:~# ls
down dump_data.sql snap
root@masterDB:~#
생성된 덤프 파일이다. cat 명령어로 정보를 확인할 수 있다.
root@masterDB:~# cat dump_data.sql
-- MySQL dump 10.13 Distrib 5.7.33, for Linux (x86_64)
--
-- Host: localhost Database: master
-- ------------------------------------------------------
-- Server version 5.7.33-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Current Database: `master`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `master` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */;
USE `master`;
--
-- Table structure for table `user_tb`
--
DROP TABLE IF EXISTS `user_tb`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user_tb` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`user_name` varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `user_tb`
--
LOCK TABLES `user_tb` WRITE;
/*!40000 ALTER TABLE `user_tb` DISABLE KEYS */;
/*!40000 ALTER TABLE `user_tb` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2021-03-21 14:11:02
root@masterDB:~#
MySQL Replication Slave 설정
my.cnf수정
root@slaveDB:~# sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
이 파일에서 중요한 부분은 역시 server-id는
server-id = 2
log-bin=mysql-bin
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
bind-address = 0.0.0.0
server-id=2
log-bin=mysql-bin
파일을 수정하였다면 mysql 서버를 재시작해준다.
root@slaveDB:~# sudo systemctl restart mysql
masterDB에서 덤프 파일 가져와 slaveDB서버에 업로드 후 복구해준다.
root@slaveDB:~# ls
down dump_data.sql snap
root@slaveDB:~# mysql -u root -p < dump_data.sql
Enter password:
root@slaveDB:~#
slaveDB의 mysql서버에 접속해 masterDB에서 가져온 덤프 파일이 적용되었는지 확인한다.
master 데이터베이스가 추가된 것을 확인할 수 있다.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| master |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
이제 본격적으로 slave를 설정을 시작한다. slave 서버를 멈추고 리셋을 해준다.
mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> reset slave;
Query OK, 0 rows affected (0.00 sec)
mysql>
slave에서 마스터를 연결하도록 서버 정보, 계정 정보, 로그파일 정보를 설정한다.
기본적으로 masterDB의 mysql 사용자 정보와 외부에서 접속 가능하도록 포트:3306이 열려있어야 한다.
master상태 정보에서 취득한 정보.
-> MASTER_LOG_FILE='mysql-bin.000004',
-> MASTER_LOG_POS=555;
이 부분은 masterDB의 로그파일과 위치정보이며 이 정보를 mysql 서버가 재시작할 때마다 변경되므로 주의 하길 바란다.
결결이 되지 않는다면 이 부분에서 서로 정보가 다르기 때문에 접속되지 않는 경우가 많다.
mysql> CHANGE MASTER TO
-> MASTER_HOST='167.179.93.128',
-> MASTER_USER='tokyoaj',
-> MASTER_PASSWORD='P@ssw0rd',
-> MASTER_LOG_FILE='mysql-bin.000004',
-> MASTER_LOG_POS=555;
Query OK, 0 rows affected, 2 warnings (0.02 sec)
mysql> start slave;
Query OK, 0 rows affected (0.00 sec)
masterDB서버로 접속한다. 먼저 마스터 테이블에 락을 풀어준다.
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)
자 이제까지 설정은 거의 완료되었다. 이제 서버를 재시작을 해주면 된다.
주의!!! 서버 시작은 마스터가 우선적으로 시작이 되어야 한다.
masterDB의 mysql 정지.
root@masterDB:~# sudo systemctl stop mysql;
root@masterDB:~#
slaveDB의 mysql 정지.
root@slaveDB:~# sudo systemctl stop mysql
root@slaveDB:~#
masterDB의 mysql 시작.
root@masterDB:~# sudo systemctl start mysql;
root@masterDB:~#
slaveDB의 mysql 시작.
root@slaveDB:~# sudo systemctl start mysql
root@slaveDB:~#
master와 slave 상태 정보를 확인한다.
mysql> show master status\G
*************************** 1. row ***************************
File: mysql-bin.000004
Position: 555
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
mysql>
아래와 같이 정보를 확인한다면 두 개의 서버는 이제 동기화 설정이 완료되었다.
Slave_IO_State: Waiting for master to send event
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 167.179.93.128
Master_User: tokyoaj
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 555
Relay_Log_File: slaveDB-relay-bin.000002
Relay_Log_Pos: 721
Relay_Master_Log_File: mysql-bin.000004
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: 555
Relay_Log_Space: 930
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_UUID: 5bc4ce2f-8a22-11eb-a47c-5600034284bf
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
mysql>
master에서 데이터를 1개 입력을 한다. 이 정보가 slave에서 확인되면 모든 작업은 완료가 된 것이다.
mysql> select * from user_tb;
Empty set (0.00 sec)
mysql> insert into user_tb values(1, 'USER_TXT');
Query OK, 1 row affected (0.00 sec)
mysql> select * from user_tb;
+-----+-----------+
| uid | user_name |
+-----+-----------+
| 1 | USER_TXT |
+-----+-----------+
1 row in set (0.00 sec)
mysql>
slave에서 데이터 확인.
mysql> use master
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from user_tb;
+-----+-----------+
| uid | user_name |
+-----+-----------+
| 1 | USER_TXT |
+-----+-----------+
1 row in set (0.00 sec)
mysql>
'Server > Ubuntu' 카테고리의 다른 글
[Ubuntu] Apache2 가상 호스트(서브도메인) 생성 스크립트. (0) | 2023.02.08 |
---|---|
[Ubuntu] 사용자 생성 / ssh접속권한 / ftp권한부여 스크립트 (0) | 2023.02.08 |
Ubuntu 20 + Apache2 + Tomcat + JAVA11 설정 (0) | 2023.02.08 |
MySQL 5.7.33 계정생성 / 스키마생성 (0) | 2021.03.23 |
Ubuntu 20.10 x64 + MySQL 5.7.33 외부접속 설정 (0) | 2021.03.23 |