DB 이중화에 대해 다뤄보겠습니다.
실제로 서비스를 할때 꼭 필요한 작업중 하나라고 생각됩니다.
출처 : 데이터로 고객을 움직이는 팀이 되어가는 여정
이렇게만 이용하여 서비스를 진행하는 경우도 있다.
운영을 하다보면 예상치못한 이슈로 서버가 다운되는 문제가 발생할 수 있다.
실제로 이런 이유뿐만아니라 이슈들로 인하여 db를 MASTER와 SLAVE와 같이 백업서버를 구축하여 이중화가 필수로 필요하다.
GCP VM을 이용하여 실습을 해보았다.
오리건은 인스턴스 할당이 다 끝나서 아이오와로 설정하게 되었다.
micro 서버로 2개 생성해주었다.
https://cloud.google.com/free/docs/free-cloud-features?hl=ko 참고하면 좋을듯 하다.
먼저 설치를 진행해본다.
sudo apt-get update
sudo apt-get install mysql-server
mysql -u root -p
바로 mysql을 실행하려고 하였지만 우분투에서는 비밀번호가 자동 생성...
다음 글을 참고하여 수정하면 좋을 듯하다.
https://www.bddungsblog.com/2022/11/ubuntu-mysql-resolving-mysql-password.html
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by '123';
exit
sudo mysql_secure_installation
change에서만 n
이후 mysql -u root -p 로 접속해본다.
create user 'test'@'%' identified by '123';
grant all privileges on *.* to 'test'@'%';
flush privileges
유저를 생성하고 권한을 부여하며, 적용하는 과정이다.
master로 사용할 서버 설정이다.
여기에서
server-id = 1
log-bin = mysql-bin
만 추가해주었는데
위에 bind관련 옵션에서 127.0.0.1로 로컬만 선택되어있는 부분을 수정해주어야했다.
만약 고정된 ip라면 slave ip를 입력하면 될것 같고 아니면 0.0.0.0으로 전체 허용을 해주면 된다.
지금 과정은 실제 서비스에서 사용하는 것이 아닌 테스트용이기때문에 0.0.0.0으로 설정해주었다.
systemctl restart mysqld
: mysql 재시작
show master status
: 실행 상태를 본다.
여기서 file과 position을 slave 설정에 사용할 것이다.
change master to
master_host='{master 서버 ip 주소}', # master서버 ip 주소
master_user='test3', #master mysql 계정
master_password='123', # master mysql 계정 비밀번호
master_log_file='mysql-bin.000001', # 바이너리 로그 파일
master_log_pos=1495; # position번호
master status에서 본 log file명과 log pos를 입력해준다.
이후 start replica;
서버 복제를 시작한다.
mysql> show slave status;
+----------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------+-----------------------------+------------------+-------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+
| Slave_IO_State | Master_Host | Master_User | Master_Port | Connect_Retry | Master_Log_File | Read_Master_Log_Pos | Relay_Log_File | Relay_Log_Pos | Relay_Master_Log_File | Slave_IO_Running | Slave_SQL_Running | Replicate_Do_DB | Replicate_Ignore_DB | Replicate_Do_Table | Replicate_Ignore_Table | Replicate_Wild_Do_Table | Replicate_Wild_Ignore_Table | Last_Errno | Last_Error | Skip_Counter | Exec_Master_Log_Pos | Relay_Log_Space | Until_Condition | Until_Log_File | Until_Log_Pos | Master_SSL_Allowed | Master_SSL_CA_File | Master_SSL_CA_Path | Master_SSL_Cert | Master_SSL_Cipher | Master_SSL_Key | Seconds_Behind_Master | Master_SSL_Verify_Server_Cert | Last_IO_Errno | Last_IO_Error | Last_SQL_Errno | Last_SQL_Error | Replicate_Ignore_Server_Ids | Master_Server_Id | Master_UUID | Master_Info_File | SQL_Delay | SQL_Remaining_Delay | Slave_SQL_Running_State | Master_Retry_Count | Master_Bind | Last_IO_Error_Timestamp | Last_SQL_Error_Timestamp | Master_SSL_Crl | Master_SSL_Crlpath | Retrieved_Gtid_Set | Executed_Gtid_Set | Auto_Position | Replicate_Rewrite_DB | Channel_Name | Master_TLS_Version | Master_public_key_path | Get_master_public_key | Network_Namespace |
+----------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------+-----------------------------+------------------+-------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+
| Connecting to source | 34.123.98.147 | test3 | 3306 | 60 | mysql-bin.000001 | 1495 | instance-3-relay-bin.000001 | 4 | mysql-bin.000001 | Connecting | Yes | | | | | | | 0 | | 0 | 1495 | 157 | None | | 0 | No | | | | | | NULL | No | 2003 | Error connecting to source 'test3@34.123.98.147:3306'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Can't connect to MySQL server on '34.123.98.147:3306' (111) | 0 | | | 0 | | mysql.slave_master_info | 0 | NULL | Replica has read all relay log; waiting for more updates | 86400 | | 230920 01:53:17 | | | | | | 0 | | | | | 0 | |
+----------------------+---------------+-------------+-------------+---------------+------------------+---------------------+-----------------------------+---------------+-----------------------+------------------+-------------------+-----------------+---------------------+--------------------+------------------------+-------------------------+-----------------------------+------------+------------+--------------+---------------------+-----------------+-----------------+----------------+---------------+--------------------+--------------------+--------------------+-----------------+-------------------+----------------+-----------------------+-------------------------------+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------+-----------------------------+------------------+-------------+-------------------------+-----------+---------------------+----------------------------------------------------------+--------------------+-------------+-------------------------+--------------------------+----------------+--------------------+--------------------+-------------------+---------------+----------------------+--------------+--------------------+------------------------+-----------------------+-------------------+
1 row in set, 1 warning (0.05 sec)
slave vm에서 잘 접속되는 것을 확인하엿다.
create database testdb3;
USE testdb3;
CREATE TABLE t_user (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(30));
insert into t_user values(1,'a');
master mysql에서 데이터를 생성해주었고
그대로 slave에서 데이터를 조회해본 결과 잘 들어온 것을 확인할 수 있었다.
- 실 서비스에서 필수로 필요한 과정을 진행해볼 수 있었다.
- 역시 서버 설정과 권한을 잘 설정해줘야하고, 뭐가 잘못됐는지 찾아내는데는 시간이 많이 소요된다.
참고 : https://velog.io/@nbac406/SQL-DB-Replication-%EC%9D%B4%EC%A4%91%ED%99%94
다음과 같은 사양의 서버 두대를 이용해서 실습을 진행해본다.
이 정도의 사양을 사용한다고? 싶겠지만 kict에서 할당받은 세금으로 돌아가는 서버기에 최대한 다 사용해본다.
(저장소 용량은 안타깝다..)
1. 설치
- 먼저 해당서버는 sudo 권한을 설정하기가 복잡하기때문에 처음부터 루트로 접속해줬다.
yum에서 mysql-server를 찾을 수 없다해서 dnf로 다운받고 그랬다.
https://dev.mysql.com/get/mysql80-community-release-el7-10.noarch.rpm
dnf install https://dev.mysql.com/get/mysql80-community-release-el7-10.noarch.rpm
yum install -y mysql-server
- yum update
- yum install dnf
- sudo yum -y install http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm
- sudo dnf install mysql-community-server
- sudo systemctl start mysqld
- sudo systemctl enable mysqld
생각을 해보니 포트설정이 안된다. 그렇다는 것은 가져올수가 없는 것이다.
업데이트만 해주다가 그래도 문제를 발견했다.