19년도 1월에 작성했던 글
MySQL Replication
우선, MySQL Replication란?
한 DB 서버의 데이터를 다른 DB 서버들에 복제하는 기술이다.
또한, 복제라는 말과 같이, 디스크를 독립적으로 분리하여 데이터를 유지한다.
이말은 즉, 데이터를 이중화 한다는 것이고 Mysql이 아닌 Oracle에서는 RAC라는 기술이 있는데 RAC는 공유 스토리지를 두고 DB를 이중화하는 개념이 있다. 비교를 하면 서로 장단점이 있다고 한다.
MySQL Replication 복제의 대상이 되는 DB 서버를 보통 master 서버라 하고, 데이터가 복제된 DB 서버를 slave 서버라 부른다.
master 서버는 쓰기 연산을 담당하고, slave 서버는 읽기 연산을 담당한다. 따라서 slave 서버를 여러 대 돌린다면 읽기 연산을 분산시켜 서버의 부하를 상당히 줄일 수 있다.
꾀나 괜찮은 기술이라고 할 수 있다.
개발 중에 있던 서버가 있으므로 Master 서버를 두고, Slave 서버를 VM으로 제작하였다.
현재는 Master서버 하나로 읽기쓰기를 작업하고 있지만 데이터가 많아진다면 충분히 활용할 가치가 있는 기술이라고 생각한다.
Master Server는 Ubuntu 16.04 Server 버전이 설치되어 있으며 Mysql 5.7버전 사용 중이다.
Slave Server로는 CentOS 7 버전과 Mysql 5.7버전으로 구축하였다.
MySQL Replication 복제 방법,
MySQL Replication은 로그 기반으로 비동기적으로 데이터를 복제한다.
Master Server에서 데이터 변경이 생기면 Binary Log에 기록하는데 Statement, Row, Mixed 3가지 방식이 있다.
Statement-based Type
MySQL 3.23 이후로 도입된 방식
실행된 SQL을 그대로 Binary Log에 기록
Binary Log 사이즈는 작으나, SQL 에 따라 결과가 달라질 수 있음
(Time Function, UUID, User Defined Function)
Row-based Type
MySQL 5.1부터 도입된 방식
변경된 행을 BASE64로 Encoding하여 Binary Log에 기록
특정 SQL이 변경하는 행 수가 많은 경우 Binary Log 사이즈가 비약적으로 커질 수 있음
Mixed Type (Statement + Row)
기본적으로 Statement-Based Type으로 기록되나, 경우에 따라 Row-base Type으로 Binary Log에 기록
MySQL Replication 구성
my.cnf 설정
[Master Server]
해당 경로에서
server-id = 1 #Slave Server와 중복되서는 아니된다.
log_bin = /var/log/mysql/mysql-bin.log #데이터 변경이 일어나면 필요한 로그
mysql-bin.00000x 형태의 파일로 저장되게 된다.
[Slave Server]
server-id = 2 #Master Server와 중복되서는 아니된다.
my.cnf를 설정 후 Mysql 재시작.
2. Replication 권한 추가
Replication을 수행할 싱규 계정을 생성
*.*은 DB.Table이고 %는 모든 ip 허용 권한을 준 observerb계정 생성
잘 생성 되어있다.
3. DB dump / 적용
Replication을 수행 전 Master Server와 Slave Server가 동일한 상태로 만들어 줘야 하므로 Master DB를 dump를 떠서 Slave DB에 씌우는 작업을 해야함.
dump전 사용자들이 DB 데이터를 추가하거나 변경을 할 수 있으므로 변경 되지 않게 조치.
[Master Server]
변경을 방지한 후 마지막 수정이 되었던 바이너리 로그와 Position정보를 확인
Slave에서 사용해야 하므로 별도로 기록해두고 다시 서버를 사용할 사용자들을 위해 lock을 푼다.
dump 뜬 것을 Slave Server로 넘겨 준다.
[Slave Server]
받아온 dump파일 적용
Slave에서 Master와 동일하도록 만든다.
dump가 잘되어 Master Slave에서 생성한 계정 확인 가능
4. Master 지정과 Replication 시작
[Slave Server]
>CHANGE MASTER TO #Master, Slave 연결 통신을 위해 파라미터를 변경
>master_host = 'Master IP',
>master_user = 'observerb',
>master_password = ' PW ',
>master_log_file = 'mysql-bin.000001',
>master_log_pos = 154; #Master Server에서 확인했던 Position정보
>START SLAVE; #Replication 시작
[Master Server]
확인.
[Slave Server]
뭔가 확인해보니
이상하다....
Slave_IO_Running,
Slave_SQL_Running
NO!!!!!!!!!!!!!!?!?!
연결에 문제가 생겼다
여전히 되지 않는다...
에러 로그까지 확인 하며
장시간의 삽질과 수차례 반복을 걸친다...
에러로그를 보다가 계정 아이디, 비번이 틀렸다고도 하여 계정도 새로 만들기를 반복한다..
하다 보니 과정에서 Warning을 확인 하였고 Master Server에 Replication계정 접속이 안되는걸 다시 확인한다...
원인은?!
[Master Server]
Master Server의 my.cnf내용 중 1라인이다.
bind-address = 127.0.0.1 로컬 접속이 아니면 안된다..
더럽고 추악한 녀석... # 추가로 주석처리...
이상 없이 잘 되어 있다는 걸 확인 할 수 있다....
[Master Server] [Slave Server]
깔끔하게 잘된다.
깔끔하게 해도 떴다...
'DevOps > DB' 카테고리의 다른 글
Mysql SQL명령문(DDL/DML/DCL) (0) | 2021.12.21 |
---|