pwd / touch / mv / mkdir / rm -rf / cd / ls / vi
ps -ef / netstat -anlp / systemctl / yum
...
CREATE / ALTER / DROP / TRUNCATE
SELECT / INSERT / UPDATE / DELETE
GRANT / REVOKE / COMMIT / ROLLBACK
가상머신 리눅스 2대 준비 (linux1, linux2)
linux1 (master) / linux2 (slave) 설정
110.110.xxx.xx2 (master)에
110.110.xxx.xx3 (slave)를 위한 계정 생성 및 권한 부여 (ltw2)
linux2 (master) / linux1 (slave) 설정
110.110.xxx.xx3 (master)에
110.110.xxx.xx2 (slave)를 위한 계정 생성 및 권한 부여 (ltw2)
110.110.xxx.xx2 (slave)에 master 설정 추가
이제 양쪽에서 CRUD DATABASE를 해도 동기화 Okay!!
-> 양쪽에서 데이터 동기화가 되고 있는 것.
cf.)
이제 A 서버, B 서버 둘 다 사용 가능.
하나 남은 리눅스 서버르 부하 분산 진행할 것.
yum install haproxy // h proxy라고 부른다.
우리는 DB의 부하 분산을 하려고 하는 거지만 대부분의 것들의 부하 분산 가능
vi /etc/haproxy/haproxy.cfg
#default 아래 (line 63) 다 지우고 위 내용 추가
systemctl restart haproxy
CREATE USER 'haproxy'@'%';
CREATE USER 'haproxy2'@'110.110.xxx.xx1';
listen mysqld-ha
bind :3306
## haproxy가 3306 port를 사용하겠다.
## haproxy의 3306 port로 오면 2개의 서버 중 한 대로 보내주겠다.
mode tcp
## tcp로만 보내겠다. (but, 동작은 4 layer처럼 할 것)
balance roundrobin
## 순서대로 하나씩 보내주겠다.
option mysql-check user haproxy
server mysqld1 110.110.xxx.xx2:3306 check
server mysqld2 110.110.xxx.xx3:3306 check
## haproxy라는 사용자로 check하겠다.
## DB 서버에 haproxy라는 사용자를 만들어야 한다.
## 양방향으로 되어 있으니까 아무 곳이나 만들면 된다.
## 접속할 수만 있고 비밀번호도 필요 없다.
그럼 이제 haproxy를 이용해서 부하 분산을 할 수 있다. cf.)setsebool -P haproxy_connect_any = 1
위 코드 실행하니까 정상 실행!!setenforce 0
알고 보니 위 방화벽 푸는 옵션과 같은 명령어인데 방화벽 끄는 걸 깜빡했나보다..http://110.110.xxx.xx1:9000/haproxy_stats
MYSQL Workbench에서 DB 접속되는지 확인.
최종 확인 완료.
## 1. haproxy 설치 및 설정
yum install haproxy
vi /etc/haproxy/haproxy.cfg
## 63번 줄 아래로 모두 삭제 후 아래 내용 추가
listen stats ## haproxy 모니터링 페이지 설정
bind :9000 ## 웹 브라웆를 이용해서 9000번 포트로 접속하면
stats enable ## haproxy 모니터링 페이지로 접속됨
stats realm Haproxy\Statistics ## http://[서버IP]:9000/haproxy_stats
stats uri /haproxy_stats
## 서비스 재시작
systemctl restart haproxy
## test
## 1) haproxy 모니터링 페이지에서 확인
http://[프록시 서버 IP]:9000/haproxy_stats 접속했을 때 웹 페이지가 나와야 함.
## 2. MYSQL 서버 추가
## 1) MYSQL 서버에 계정 추가
## haproxy라는 이름의 계정 추가
CREATE USER 'haproxy'@'[리눅스3 PC IP]';
## 2) haproxy 설정
vi /etc/haproxy/haproxy.cfg
## 마지막 줄에 추가
listen mysqld-ha
bind :3306
mode tcp
balance roundrobin
option mysql-check user haproxy
server mysqld1 110.110.xxx.xx2:3306 check
server mysqld2 110.110.xxx.xx3:3306 check
## 3. DB 서버 부하 분산 확인
## 1) DB 서버에 접속할 수 있는 사용자 생성
CREATE USER 'test'@'%' IDENTIFIED BY 'xxxxxxxx';
## 2) workbench에서 접속 테스ㅡ
hostname : [haproxy]가 설치된 pc의 IP]
usernME : [위에서 생성한 계정]
## 접속 후
SHOW variables LIKE '%server_id%';
## 새로 접속할 때마다 server_id가 바뀌어야 정상!!
cf.)
SQL은 대부분 다 비슷한데
빠르게 처리하는 것 보다 우리는 안전하게 처리하는 것이 더 중요함.
[참고]
https://needjarvis.tistory.com/45
https://velog.io/@gillog/DBInnoDB-VS-MyISAM
Active할 DB 서버 선택
yum install -y keepalived
특별한 설정을 하지 않아도 keepalived가 다 해준다.
## Active
## 1) keepalived 설치 및 설정
yum install -y keepalived
vi /etc/keepalived/keepalived.conf
## 14번 line 주석 처리
## 18번 line 밑으로 전부 삭제 ( 100dd -> 커서 아래 100줄 삭제)
vrrp_script_chk_mysql {
script "pidof mysqld"
interval 2 # every 2 seconds
weight 2
}
vrrp_instance VI_1 {
interface ens160
state Active
virtual_router_id 123 ## Stanby랑 맞춰줘야 하는 값
unicast_src_ip 110.110.xxx.xx2 ## Active IP
unicast_peer {
110.110.xxx.xx3 ## Stanby IP
}
priority 102 ## Stanby보다 Active가 높아야 함.
track_script {
chk_mysql
}
virtual_ipaddress {
110.110.xxx.xxx/24 dev ens160
## 내가 설정한 가상 IP 주소
## 이 주소로 xx2, xx3 오가면서 실행
}
}
systemctl restart keepalived
## Standy
## keepalived 설치 및 설정
yum install -y keepalived
vi /etc/keepalived/keepalived.conf
vrrp_script chk_mysql {
script "pidof mysqld"
interval 2 # every 2 seconds
weight 2
}
vrrp_instance VI_1 {
interface ens160
state BACKUP
virtual_router_id 123 # Standby랑 맞춰줘야 하는 값
unicast_src_ip 110.110.xxx.xx3 # Standby IP
unicast_peer {
110.110.xxx.xx2 # Active IP
}
priority 101 # Standby보다 Active가 높아야 하는 값
track_script {
chk_mysql
}
virtual_ipaddress {
110.110.xxx.xxx/24 dev ens33
}
}
systemctl restart keepalived
## DB 서버 Failover 테스트
## 1) workbench에서 접속 테스트
## hostname : 110.110.xxx.xxx // [keepalived에서 virtual ip]
## username : haproxy // [생성한 계정]
## 접속 후
show variables LIKE '%server_id%';
## 실행해서 server-id를 확인,
## Active 서버를 끄고 수 초 후 다시 접속
centOS_server2(110.110.xxx.xx2),
centOS_server3(110.110.xxx.xx3)의 DB 서버가 모두 켜져있을 때만 아래 화면이 나옴.
Active-Stanby에서 우선 순위가 높은 centOS_server2(110.110.xxx.xx2)에서 실행되는 것을 확인할 수 있다.
centOS_server2(110.110.xxx.xx2)의 mysqld가 stop했을 때 아래 화면
(Active-Stanby에서 Active의 mysqld가 꺼졌을 때)
centOS_server2(110.110.xxx.xx2)의 mysqld를 start하니
1번 서버 (centOS_server2)로 접속 id가 다시 변경된 것을 확인할 수 있다.
(Active-Stanby에서 우선 순위가 높은 Active의 mysqld가 다시 켜졌을 때)
Active-Active와 Active-Stanby의 차이점은
Active-Stanby는 keepalived
가 Active가 죽고 Stanby가 Active가 되면
바로 접속이 가능하다
(IP 주소를 받아서 Active가 될 때 그 사이에 접속한 사람은 불가)
그리고 Active가 죽고 Stanby에 IP가 할당되면 바로 실행된다.
그리고 다시 죽었던 Active가 Active가 되면 Stanby에 할당된 IP는 keepalived가 없애고 다시 Active에 IP를 할당한다.
안녕하세요! 혹시 참여하고 계신 프로그램에 관심이 있는데 메일로 질문 가능할까요..?