CentOS 7 예제들만 있어서 Ubuntu로 만들고 사용법을 정리해놓는다.
VPC 172.31.0.0 /16
본 글에서 구성한 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 를 쳤을 때 이런 상태가 나와야 설정이 잘 된 것이다.
'DB' 카테고리의 다른 글
Scylladb 설치 - Ubuntu 20.04 (0) | 2023.01.01 |
---|---|
채팅 영구저장 - RDB vs NoSQL (0) | 2022.12.29 |
Ubuntu 20.04 - Redis 설치 (0) | 2022.08.23 |
Mariadb-15.1 user의 host 변경 - ALTER TABLE error (0) | 2022.06.26 |
nodejs - socket.io & mysql 끔찍한 에러 Error: read ECONNRESET at TCP.onStreamRead (node:internal/stream_base_commons:217:20) (0) | 2022.06.21 |
댓글