HAProxy를 사용하여 MySQL 로드 밸런싱 설정하는 방법

HAProxy를 사용하여 MySQL 로드 밸런싱 설정하는 방법

2022-06-01 last update

13 minutes reading Debian Server Optimization Ubuntu Scaling MySQL

서곡


HAProxy는 HTTP 및 TCP 서버의 로드 밸런싱을 위한 오픈 소스 소프트웨어입니다.previous article on HAProxy 에서 HTTP에 로드 밸런싱을 설정했습니다. 이 글에서도 MySQL에 로드 밸런싱을 설정합니다.모든 MySQL 서버는 모든 백엔드에 대한 읽기 및 쓰기와 관련된 로드 밸런싱을 수행하도록 구성해야 합니다.
본고는 다음과 같은 세 가지 액체를 사용할 것이다.
액적1-부하평형기
호스트 이름:haproxy
운영 체제: Ubuntu
개인 IP: 10.0.0.100
액적 2 - 노드 1
호스트 이름: mysql-1
운영 체제: Debian 7
개인 IP: 10.0.0.1
액적 2 - 노드 2
호스트 이름: mysql-2
운영 체제: Debian 7
개인 IP: 10.0.0.2
계속하기 전에 모든 MySQL 서버가 시작되고 실행되며 데이터베이스 쓰기가 올바르게 복사되었는지 확인하십시오.

ySQL 서버 준비


우리는 HAProxy를 위해 두 명의 추가 사용자를 만들어서 MySQL 서버를 준비해야 합니다.HAProxy는 첫 번째 사용자를 사용하여 서버의 상태를 확인합니다.
[email protected]# mysql -u root -p -e "INSERT INTO mysql.user (Host,User) values ('10.0.0.100','haproxy_check'); FLUSH PRIVILEGES;"
HAProxy에서 MySQL 클러스터에 액세스하려면 루트 권한이 있는 MySQL 사용자가 필요합니다.모든 서버의 기본 루트 사용자는 로컬에서만 로그인할 수 있습니다.루트 사용자에게 다른 권한을 부여함으로써 이 문제를 해결할 수 있지만, 루트 권한을 가진 단독 사용자가 있는 것이 가장 좋다.
[email protected]# mysql -u root -p -e "GRANT ALL PRIVILEGES ON *.* TO 'haproxy_root'@'10.0.0.100' IDENTIFIED BY 'password' WITH GRANT OPTION; FLUSH PRIVILEGES"
haproxy\u root와password를 자신의 보안 값으로 대체합니다.이 질의는 MySQL 호스트에서 수행되므로 다른 호스트로 복사됩니다.

ySQL 클라이언트 설치


연결성을 테스트하려면 HAProxy droplet에 MySQL 클라이언트를 설치해야 합니다.
[email protected]# apt-get install mysql-client
현재,haproxy\uroot 사용자로 호스트에서 조회를 시도합니다.
[email protected]# mysql -h 10.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"
이것은 MySQL 데이터베이스 목록을 표시해야 합니다.

HAProxy 설치


HAProxy 서버에 패키지를 설치합니다.
[email protected]# apt-get install haproxy
init 스크립트에서 HAProxy를 시작하도록 설정합니다.
[email protected]# sed -i "s/ENABLED=0/ENABLED=1/" /etc/default/haproxy
이 변경 사항이 올바르게 실행되었는지 확인하려면 매개 변수 없이 HAProxy의 init 스크립트를 실행하십시오.
[email protected]:~# service haproxy
Usage: /etc/init.d/haproxy {start|stop|reload|restart|status}

HAProxy 구성


원래 프로파일 이름 바꾸기
mv /etc/haproxy/haproxy.cfg{,.original}
새 작성 및 편집
nano /etc/haproxy/haproxy.cfg
첫 번째 블록은 글로벌 및 기본 구성 블록입니다.
global
    log 127.0.0.1 local0 notice
    user haproxy
    group haproxy

defaults
    log global
    retries 2
    timeout connect 3000
    timeout server 5000
    timeout client 5000
Master-Master replication 에서는 이러한 옵션에 대한 자세한 내용을 설명합니다.HAProxy가 로그 메시지를 127.0.1로 보낸다고 말했기 때문에, rsyslog를 설정해서 감청해야 합니다.HAProxy 구성 로그에 기록된 this article 에서도 설명합니다.
주 구성 섹션으로 이동합니다.
listen mysql-cluster
    bind 127.0.0.1:3306
    mode tcp
    option mysql-check user haproxy_check
    balance roundrobin
    server mysql-1 10.0.0.1:3306 check
    server mysql-2 10.0.0.2:3306 check
HTTP 로드 밸런싱과 달리 HAProxy는 MySQL의 특정한'모드'가 없기 때문에 tcp를 사용합니다.HAProxy를 수신 루프 주소만 (응용 프로그램이 같은 서버에 있다고 가정) 로 설정했지만, 응용 프로그램이 다른 마이크로 디렉터리에 있으면 0.0.0 또는 전용 IP 주소를 수신하도록 하십시오.
부하 균형의 통계 정보를 보기 위한 구성 블록이 필요합니다.이것은 완전히 선택할 수 있는 것이므로 통계 정보가 필요하지 않으면 생략할 수 있다.
listen 0.0.0.0:8080
    mode http
    stats enable
    stats uri /
    stats realm Strictly\ Private
    stats auth A_Username:YourPassword
    stats auth Another_User:passwd
"stats auth"의 사용자 이름과 비밀번호를 바꿉니다.이로써 HAProxy는 포트 8080에서 HTTP 요청을 정탐하고 HTTP 기본 인증을 사용하여 통계 정보를 보호합니다.따라서 액세스 가능
http://<Public IP of Load Balancer>:8080/
구성이 완료되면 HAProxy 서비스를 시작합니다.
service haproxy start
mysql 클라이언트를 사용하여 HAProxy를 질의합니다.
[email protected]# mysql -h 127.0.0.1 -u haproxy_root -p -e "SHOW DATABASES"
"-h"옵션은 루프백 IP 주소와 함께 나타나야 합니다.그것을 생략하거나 localhost를 사용하면 MySQL 클라이언트를 MySQL에 연결합니다.실패한 sock 파일입니다.

로드 밸런싱 및 페일오버 테스트


부하 균형이 정상인지 확인하려면 서버\uid 변수를 두 번 이상 조회하십시오.
[email protected]# mysql -h 127.0.0.1 -u haproxy_root -p -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
[email protected]# mysql -h 127.0.0.1 -u haproxy_root -p -e "show variables like 'server_id'"
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
이것은 권중이 같은 순환 부하 균형을 보여 줍니다. 현재 mysql-2의 권중을 변경하고 결과를 볼 것입니다.nano /etc/haproxy/haproxy.cfg
server mysql-2 10.0.0.2:3306 check weight 2
변경 사항을 적용하려면 다시 로드합니다.
service haproxy reload
server\u id를 여러 번 조회합니다.
[email protected]:~# for i in `seq 1 6`
do
mysql -h 127.0.0.1 -u haproxy_root -ppassword -e "show variables like 'server_id'"
done

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+
현재 부하 균형은 1:2의 비율로 작업하고 있으며, 3분의 1의 요청은 mysql-1에 들어가고, 3분의 2의 요청은 mysql-2에 들어갑니다.
서비스를 중지하여 MySQL 서버 실패
[email protected]# service mysql stop
인터페이스를 닫거나
[email protected]# ifconfig eth1 down
이제 결과를 보려면 변수 표시 질의를 시도합니다.다음 로그 항목은 HAProxy에서 장애가 감지된 시점과 방법을 나타냅니다.tail /var/log/haproxy/haproxy.log
Nov 15 00:08:51 localhost haproxy[1671]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 timeout, check duration: 2002ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.

페일오버 간격 단축


MySQL 서버가 다운될 때 HAProxy가 이 고장을 감지하고 그룹에서 삭제하는 데 시간이 좀 걸립니다.이 절에서, 우리는 이 시간을 어떻게 통제하는지 이해할 것이다.우선, 우리는 이 값을 어떻게 측정하는지 이해할 것이다.한 가지 방법은 the same article를 사용하여 MySQL 포트를 한동안 막은 다음 규칙을 삭제하고 로그를 확인하는 것입니다.
[email protected]:~# ifconfig eth1 down &&
date &&
sleep 20 &&
ifconfig eth1 up &&
date

Fri Nov 15 00:37:09 IST 2013
Fri Nov 15 00:37:29 IST 2013
포트 3306은 iptables 20초입니다. 로그 파일을 보십시오.
[email protected]:~# tail /var/log/haproxy.log
Nov 15 16:49:38 localhost haproxy[1275]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 15 16:49:56 localhost haproxy[1275]: Server mysql-cluster/mysql-1 is UP, reason: Layer7 check passed, code: 0, info: "5.5.31-0+wheezy1-log", check duration: 1ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
고장(16:49:38과 16:49:32 사이의 차이) 검출은 6초, 서버에 접근할 수 있는 검출은 4초(16:49:56과 16:49:52 사이의 차이)가 필요하다.이것은 서버 매개 변수rise,fall,inter에 의해 결정됩니다.
rise 매개 변수는 서버가 실행할 수 있음을 표시하기 위해 통과해야 하는 검사 수를 설정합니다.기본값은 2입니다.
fall 매개 변수는 서버가 통과해야 하는 검사 수를 설정해야 사망으로 선언할 수 있습니다.기본값은 3입니다.
inter 매개 변수는 이 검사 사이의 간격을 설정합니다.기본값은 2000ms입니다.
이 정보를 함께 놓으면 서버가 3회 연속 검사에 실패하고 2초 간격으로 실행해야 합니다. 이것은 사망한 것으로 간주됩니다.따라서 우리 위의 예시에서 다음과 같은 상황이 발생할 것이다.
16:49:32 - Port 3306 on mysql-1 was blocked
16:49:34 - Check - Failed - Failure No. 1
16:49:36 - Check - Failed - Failure No. 2
16:49:38 - Check - Failed - Failure No. 3 (server removed and event logged)
방화벽 규칙이 삭제되었을 때.
16:49:52 - Firewall rule removed port 3306 accessible
16:49:54 - Check - Passed - Success No. 1
16:49:56 - Check - Passed - Success No. 2 (server added to cluster and event logged)
다음 설정은 테스트 간격을 1초로 줄이고 추락 테스트 횟수를 줄인다.nano /etc/haproxy/haproxy.cfg
server mysql-1 10.0.0.1:3306 check fall 2 inter 1000
server mysql-2 10.0.0.2:3306 check fall 2 inter 1000
때때로 "테스트"패키지를 너무 많이 사용하고 싶지 않을 수도 있습니다 blocked. 특히 MySQL 서버가 많으면 그렇습니다.이런 상황에서fastinter와downinter 매개 변수는 매우 편리할 것이다.
FastCenter 매개변수는 서버가 위로 또는 아래로 변환될 때 검사 간격을 설정합니다.
downinter 매개 변수는 서버가 다운될 때의 테스트 간격을 설정합니다.
이런 해석은 사람을 곤혹스럽게 할 수도 있기 때문에 우리는 예시를 통해 그것을 이해할 것이다.nano /etc/haproxy/haproxy.cfg
server mysql-1 10.0.0.1:3306 check fastinter 1000
server mysql-2 10.0.0.2:3306 check fastinter 1000
"인터"파라미터를 지정하지 않았기 때문에 기본값은 2000ms입니다.이 구성을 사용하면 HAProxy를 다시 시작하고 다시 테스트합니다.
[email protected]:~# iptables -A INPUT -p tcp --dport 3306 -j REJECT &&
date &&
sleep 20 &&
iptables -D INPUT -p tcp --dport 3306 -j REJECT &&
date
Fri Nov 15 17:18:48 IST 2013
Fri Nov 15 17:19:08 IST 2013
HAProxy 로그 파일을 확인합니다.
[email protected]:~# tail /var/log/haproxy.log
Nov 15 17:18:52 localhost haproxy[1353]: Server mysql-cluster/mysql-1 is DOWN, reason: Layer4 connection problem, info: "Connection refused", check duration: 0ms. 1 active and 0 backup servers left. 0 sessions active, 0 requeued, 0 remaining in queue.
Nov 15 17:19:11 localhost haproxy[1353]: Server mysql-cluster/mysql-1 is UP, reason: Layer7 check passed, code: 0, info: "5.5.31-0+wheezy1-log", check duration: 1ms. 2 active and 0 backup servers online. 0 sessions requeued, 0 total in queue.
현재 장애 감지는 4초(이전 6초), 테스트 서버가 시작된 지 3초(이전 4초)입니다.막후에서 이런 일이 일어났다.
17:18:48 - Port 3306 blocked
17:18:50 - Check - Failed - Failure No. 1
17:18:51 - Check - Failed - Failure No. 2
17:18:52 - Check - Failed - Failure No. 3 (server removed and event logged)
포트가 잠금 해제되었을 때.
17:19:08 - Firewall rule removed
17:19:10 - Check - Passed - Success No. 1
17:19:11 - Check - Passed - Success No. 2 (server added to cluster and event logged)
우선 포트 차단 이벤트(17:18:48)와 첫 번째 검사(17:18:50) 사이의 간격을 주의하십시오. 이것은 2초입니다.그리고 1<->테스트2와 테스트2<->테스트3 사이의 간격을 주의하십시오. 1초("빠른 중심"간격)입니다.서버가 아래에서 위로 이동할 때 같은 간격을 알 수 있습니다.따라서 신속 센터는 이러한 검사 사이의 간격을 제어합니다.
그럼 다운인터가 뭐예요?서버가 정지되었다고 발표되었을 때, HAProxy는 2초마다 (또는inter에서 언급한 간격) 검사를 계속합니다.불필요한 네트워크 자원을 사용하고 있다고 생각되면 다운사이더를 5000으로 설정하면 HAProxy가 5초 안에 정지된 서버를 한 번만 검사할 수 있습니다.

중요했어


우리가 이전에 한 테스트는 이 패키지들을 거절했다. 이것은 HAProxy가 mysql-1에 SYN 패키지를 보내서 연결을 시작할 때 RST 패키지(SYN+ACK)를 받을 수 있다는 것을 의미한다.이것이 바로 로그 항목이'연결이 거부되었습니다'라고 언급한 이유입니다.이 경우 fall, inter, FastCenter 값만 장면에 들어갑니다.
반대로 HAProxy가 SYN을 보낸 후 아무런 메시지를 받지 못하면 연결 시간이 초과됩니다.이런 상황에서 상술한 매개 변수를 제외하고'시간 초과'지속 시간도 장면에 나타난다.이 가능하다, ~할 수 있다,...
  • iptables가 DROP
  • 로 설정
  • 전용 인터페이스 닫기
  • 전용 네트워크 인프라에 문제가 있음
  • 한층 더 읽다


    공식 문서 private network
    제출자: Jesin a