본문 바로가기
DB

MariaDB - Ubuntu 20.04(LTS) DB Replication -ec2 mmm(multi master manager) 서버 설정

by 오늘도 깨달았다 2022. 6. 28.
반응형

CentOS 7 예제들만 있어서 Ubuntu로 만들고 사용법을 정리해놓는다. 

 

 

VPC 172.31.0.0 /16

 

mmm 구조

본 글에서 구성한 Replication을 따라하기위해 필요한 서버

 

사설 ip : 본 글에서는 ec2의 네트워크 내부 ip라고 봐도 무방하다. (ifconfig 명령어로 eth0 의 inet을 확인하면 됨)

넷마스크에 대한 개념은 따로 설명하지 않겠다.

Max scale(mariadb의 mmm monitor)

사설 ip - 172.31.38.159

 

db1 - master

server-id 9

사설 ip -172.31.44.224

 

db2  - stand by master & slave

server-id 10 

사설 ip - 172.31.14.176

 

db3 - slave

server-id 8 

사설 ip - 172.31.42.164

 

 

마스터를 2개라고 표현한 이유는, 일반적인 Replication 구조에는 master가 하나 있고, 나머지 db들이 마스터를 복제하도록 설정하지만, 그렇게되면 master db의 fail over가 발생했을 때 제대로 복구할 수 없기 때문에 stand by master를 편의상 master2라고 불렀다.

 

 

본 글의 목적은 monitor가 Master db, slave db 를 체크하면서, master가 failover가 됐을 때 자동으로 복구하도록 하는걸 목표로 한다. 

 

 

 

1. MariaDB 설치

sudo apt update && sudo apt upgrade 

//mariadb repo setup
curl -LsS -O https://downloads.mariadb.com/MariaDB/mariadb_repo_setup


//원하는 버전 선택 가능 만약 이글을 따라하는거라면 해당 버전을 그대로 해도 된다.
sudo bash mariadb_repo_setup --mariadb-server-version=10.7.3



sudo apt update

// 내가 원하는 버전인 10.7.3이 잘 들어와 있나 확인한다.
apt policy mariadb-server

// 설치
sudo apt install mariadb-server mariadb-client -y


// 상태확인
service mariadb status;

 

2. Master DB 설정 (본 글에서는 db1, db2 서버에 설정을 진행해주면 된다.)

vi /etc/mysql/my.cnf

다른점은 server-id , log-basename이다.

중복되면 충돌이 일어날 수 있으니 꼭 다르게 설정해줘야한다. 

 

mysql에도 multi master replication이 있지만, mariadb와 설정이 다른 부분이 log-basename 이다. 

 

 

[mariadb] 블록은 없으면 추가해라

 

db1

[mariadb] 
log-bin 
server_id=9
log-basename=master1 
binlog-format=mixed

 

db2

[mariadb] 
log-bin 
server_id=10
log-basename=master2 
binlog-format=mixed

wq! 로 저장한다. 

 

 

3. Master,Slave DB 설정 (본 글에서는 db1, db2,db3 서버에 모두 설정을 진행해주면 된다.)

vi /etc/mysql/mariadb.conf.d/50-server.cnf

bind-address 127.0.0.1은 로컬에서만 mariadb에 접속할 수 있게 하겠다는 것이다. 0.0.0.0 으로 외부에서도 접속할 수 있게 풀어줘야한다.

#bind-address 127.0.0.1
bind-address 0.0.0.0

 

 

바꿔준 후 wq! 명령어로 저장

 

 

mariadb 다시 시작

 service mariadb restart

 

다음으로 mysql 사용자를 생성해야한다. 

 

**주의** 지금 이 글을 따라가고 있다면 root에 비밀번호가 설정이 되어있지 않을 것이다. mariadb에 그냥 접속할 수 있지만 추후에는 꼭 비밀번호를 설정하는게 좋다 

 

1. mariadb 접속

mariadb

 

2. 유저생성

replUser 에서 172.31.%.% 는 나의 VPC 의 기준이다. 만약 본인의 VPC가 192.168.0.0. / 16 이라면 192.168.%.% 으로 사설 ip가 바뀔 수 있는 부분을 % 로 접속할 수 있게 열어주는게 좋다.

> CREATE USER 'monitor_user'@'%' IDENTIFIED BY 'your_password';
> GRANT REPLICATION CLIENT on *.* to 'monitor_user'@'%';
> GRANT SUPER, RELOAD on *.* to 'monitor_user'@'%';
> create user 'replUser'@'172.31.%.%' identified by 'your_password';
> GRANT REPLICATION SLAVE, SLAVE MONITOR ON *.* TO 'replUser'@'172.31.%.%';
> flush privileges;

 

  • replUser : DB 간 replication용 계정

3. DB 복사 

db1 즉 마스터에 모든 테이블 내용과 데이터가 들어있다고 가정하고 해당 DB의 모든 데이터를 db2, db3으로 옮겨줘야한다.

 

*주의* 이 때 db에 write 작업 등 데이터를 변경하고 있으면 안된다. 

 

만약 작업중이라면 

mariadb 내부 쿼리 앞으로 > 로 되어 있으면 mariadb 내부 명령어이다.

> FLUSH TABLES WITH READ LOCK;

명령어로 데이터에 작업을 못하도록 잠궈주고 밑의 show master status 명령어까지 입력하고 새 콘솔 창을 열어야한다. (putty라면 해당 콘솔을 냅두고 새로운 콘솔을 열어줘라)

 

1) db1 일반 콘솔에서 덤프파일 생성

mysqldump -u root -p --all-databases > /tmp/database-backup.sql

 

덤프파일들을 db2, db3으로 복제

scp /tmp/database-backup.sql root@172.31.14.176:/tmp
scp /tmp/database-backup.sql root@172.31.37.2:/tmp

 

db2, db3 console 에서 받아온 데이터베이스을 이제 mariadb로 넣어야한다.

mariadb -u root -p < /tmp/database-backup.sql

**비밀번호가 없다면 그냥 엔터 치면 된다.

 

 

이제 db2, db3 mariadb로 접속해서 권한을 flush 해준다. 

> flush privileges;

 


4. Slave 설정

 

처음에 말한 multi master 설정을 위해 db1(master) 의 slave 설정은 db2로 설정해준다.

db2 와 db3은 db1이 현재 마스터이기 때문에 해당 마스터의 바이너리 로그 파일을 받아오도록 설정해준다.

 

db2 - Mariadb console 

> SHOW MASTER STATUS;

 

binary-log file이 생성되고 있으면 위와 같은 화면이 뜬다. 안뜨면 안된다.

db1 - Mariadb console 

CHANGE MASTER TO master_host='172.31.14.176',

master_port=3306,

master_user='replUser',

master_password='your_password',

master_log_file='mysql-bin.000012',

master_log_pos=57343;

master_host : 본인 db2의사설 ip ,

master_user : 위에서 생성한 유저

master_password : 위에서 설정한 비밀번호

master_log_file : db2에서 show master status; 를 했을 때 나오는 File 밑의 바이너리파일 이름

master_log_pos : db2의 Position 숫자 

 

db2, db3 - Mariadb console 

CHANGE MASTER TO master_host='172.31.44.224',

master_port=3306,

master_user='replUser',

master_password='your_password',

master_log_file='mysql-bin.000012',

master_log_pos=57343;

master_host : 본인 db1의사설 ip

master_user : 위에서 생성한 유저

master_password : 위에서 설정한 비밀번호

master_log_file : db1에서 show master status; 를 했을 때 나오는 File 밑의 바이너리파일 이름

master_log_pos : db1의 Position 숫자 

 

 


5. mariadb 모니터(Maxscale 2.5 v) 설치 (ubuntu 20.04 x86.64 기준)

 

OS나 CPU가 다를 경우 - 밑의 url에서 본인 서버에 맞는 버전 확인

https://mariadb.com/downloads/community/maxscale/  

 

 

1. 웹에서 deb 파일 다운로드

wget  https://dlm.mariadb.com/2242649/MaxScale/2.5.20/packages/ubuntu/focal/x86_64/maxscale-2.5.20-1.ubuntu.focal.x86_64.deb

 

2. 받아온 deb 파일 서버에 설치 

dpkg -i maxscale-2.5.20-1.ubuntu.focal.x86_64.deb

 

 

3. db 1 에 사용자 생성 (db 3개가 mastser slave  설정이 되어있다면 셋 다 유저가 들어감 )

CREATE USER 'maxscale'@'%' IDENTIFIED BY 'maxscale_pw';
GRANT SELECT ON mysql.user TO 'maxscale'@'%';
GRANT SELECT ON mysql.db TO 'maxscale'@'%';
GRANT SELECT ON mysql.tables_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.columns_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.procs_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.proxies_priv TO 'maxscale'@'%';
GRANT SELECT ON mysql.roles_mapping TO 'maxscale'@'%';
GRANT SHOW DATABASES, RELOAD,PROCESS, SUPER, EVENT  ON *.* TO 'maxscale'@'%';
flush privileges;

 

// api 서버에서 db 접속할 계정도 하나 생성

CREATE USER 'albuja'@'%' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'albuja'@'%';
flush privileges;

 

 

 

4. 모니터 설정

밑에 적혀있는 코드들을 제외하곤 모두 주석처리를 해야 에러가 안난다.

 

코드 설명

[Replication-Monitor]

servers : 밑에 적힌 [dbserver1], [dbserver2], [dbserver3] 을 모니터링 하겠다고 정의하는 설정 (밑의 []블록의 이름을 다르게하고 그 이름으로 설정해도 됨)

user : 위의 코드중 monitor_user의 유저이름

password : monitor_user의 비밀번호

 

 

[dbserver] - 1, 2, 3

address, port - 해당 db1,2,3 의 사설 ip 주소와 포트

 


[Splitter-Service]
servers - 위에 정의한 [] 블록에 있는 서버들 
user - 위에서 생성한 모니터링을 위한 계정의 유저이름

password- 해당 계정의 password 

** 나머지는 바꾸지 말자

 

 

[Splitter-Listener]

port - mariadb port번호 

** 나머지는 바꾸지 말자

 

 

vi /etc/maxscale.cnf 

[maxscale]
threads=auto
log_info=true

[dbserver1]
type=server
address=172.31.44.224
port=3306
protocol=MariaDBBackend

[dbserver2]
type=server
address=172.31.14.176
port=3306
protocol=MariaDBBackend

[dbserver3]
type=server
address=172.31.42.164
port=3306
protocol=MariaDBBackend

[MariaDB-Monitor]
type=monitor
module=mariadbmon
servers=dbserver1,dbserver2,dbserver3
user=monitor_user
password=your_password
replication_user=replUser
replication_password=your_password
monitor_interval=2000ms
auto_failover=true
auto_rejoin=true
enforce_simple_topology=true


[Splitter-Service]
type=service
router=readwritesplit
servers=dbserver1, dbserver2, dbserver3
user=maxscale
password=your_password
master_accept_reads=false
slave_selection_criteria=LEAST_CURRENT_OPERATIONS
max_slave_connections=3

[Splitter-Listener]
type=listener
service=Splitter-Service
protocol=MariaDBClient
port=3306
address=0.0.0.0

 

 

설정을 완료하였다면 wq! 명령어로 저장하고 나오자 

 

1. mariadb maxscale 시작 명령어

sudo systemctl start maxscale

** or sudo service maxscale start

 

2. splitter 서비스에 제대로 등록되어있는지 확인 명령어

sudo maxctrl list services

3. 서버가 잘 실행되고 있는지 확인하는 명령어

sudo maxctrl list servers

4. 다른 쪽에서 이 DB들에 접근할 때 사용하는 포트,호스트 출력

 sudo maxctrl list listeners Splitter-Service

5. 쿼리를 한 후 , 마스터가 읽기에도 참여하는지, 아니면 DML만 하는지 확인하는 명령어

maxctrl show service Splitter-Service

6. 설정한 서버들의 기본정보 표로 보는 것 

maxctrl show servers

 

결론적으로 sudo maxctrl list servers 를 쳤을 때 이런 상태가 나와야 설정이 잘 된 것이다. 

 

 

 


 

 

 

반응형

댓글