Percona mysql Haproxy check 연동 0







Toku 엔진을 사용하려 퍼코나 mysql을 설치하고 haproxy에 연결하려고 하니 각 DB 서버에 Load balance는 정상적으로 작동을 하는데, db health check가 되지 않는다.
그래서 찾아보니 기존 mysql에서는 haproxy에서 DB 서버로 haproxy 계정으로 로그인하여 DB가 살아있는지 체크를 했었는데, percona mysql에서는 xinetd 에 mysqlchk 서비스를 추가하여 9200번 포트를 통해 DB서버로 통신하고, DB서버에서 mysqlchk 스크립트를 통해 체크를 수행하는것 같다.
아래는 테스트 진행 내용을 정리해 보았다.

구성 환경
각 OS : Centos 7.7
DB 서버 3대 : Percona mysql 8.0 설치.
Haproxy 서버 2대 : Haproxy 2.1 설치

1. 아래 Haproxy 사이트에서 Haproxy 설치파일 Download


2. Haproxy 서버에 업로드 후 설치 진행
1) 압축 해제
gzip -cdf haproxy-2.1.2.tar.gz | tar xvf -
cd haproxy-2.1.2

2) haproxy 설치
make TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_CRYPT_H=1 USE_LIBCRYPT=1
make install

3) haproxy 구성파일 복사
mkdir -p /etc/haproxy

mkdir -p /var/lib/haproxy

touch /var/lib/haproxy/stats

ln -s /usr/local/sbin/haproxy /usr/sbin/haproxy

cp examples/haproxy.init /etc/init.d/haproxy

chmod 755 /etc/init.d/haproxy

systemctl daemon-reload

chkconfig haproxy on

useradd -r haproxy


4) haproxy db 설정 세팅 (vi /etc/haproxy/haproxy.cfg)
global
    log 127.0.0.1 local2
    chroot /var/lib/haproxy
    pidfile /var/run/haproxy.pid
    maxconn 8192
    user haproxy
    group haproxy
    daemon
    stats socket /var/lib/haproxy/stats

defaults
    option tcplog
    option dontlognull
    option redispatch
    option forwardfor
    retries 3
    timeout queue 1m
    timeout connect 10s
    timeout client 1m
    timeout server 1m
    timeout check 10s
    maxconn 8192

listen stats
    bind *:9000
    mode http
    stats enable
    stats realm Haproxy\ Statistics
    stats uri /haproxy
    stats refresh 2s

listen mysql-cluster
    bind 0.0.0.0:3306
    mode tcp
    balance roundrobin
    option tcp-check
    log global

    default-server port 9200 inter 2s downinter 5s rise 3 fall 2 slowstart 60s maxconn 8192 weight 100
    server db1 IP:3306 check
    server db2 IP:3306 check
    server db3 IP:3306 check

5) Haproxy 리스타트
systemctl restart haproxy


3. DB 서버에 Xinetd 서비스 수동 추가

vi /etc/xinetd.d/mysqlchk

service mysqlchk
{
        flags           = REUSE
        socket_type     = stream
        port            = 9200
        wait            = no
        user            = nobody
        server          = /usr/local/bin/mysqlchk.sh
        log_on_failure  += USERID
        disable         = no
        per_source      = UNLIMITED
}

4. mysqlchk.sh 스크립트 생성 (서버 환경에 맞게 아래 변수 수정 필요)
vi /etc/xinetd.d/mysqlchk

#!/bin/bash
#
# This script checks if a mysql server is healthy running on localhost. It will
# return:
# "HTTP/1.x 200 OK\r" (if mysql is running smoothly)
# - OR -
# "HTTP/1.x 500 Internal Server Error\r" (else)
#
# The purpose of this script is make haproxy capable of monitoring mysql properly
#

MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_USERNAME="haproxy"
MYSQL_PASSWORD=""
MYSQL_OPTS="-N -q -A"
TMP_FILE="/dev/shm/mysqlchk.$$.out"
ERR_FILE="/dev/shm/mysqlchk.$$.err"
FORCE_FAIL="/dev/shm/proxyoff"
MYSQL_BIN="/usr/bin/mysql"
CHECK_QUERY="show global status where variable_name='wsrep_local_state'"
preflight_check()
{
    for I in "$TMP_FILE" "$ERR_FILE"; do
        if [ -f "$I" ]; then
            if [ ! -w $I ]; then
                echo -e "HTTP/1.1 503 Service Unavailable\r\n"
                echo -e "Content-Type: Content-Type: text/plain\r\n"
                echo -e "\r\n"
                echo -e "Cannot write to $I\r\n"
                echo -e "\r\n"
                exit 1
            fi
        fi
    done
}
return_ok()
{
    echo -e "HTTP/1.1 200 OK\r\n"
    echo -e "Content-Type: text/html\r\n"
    echo -e "Content-Length: 43\r\n"
    echo -e "\r\n"
    echo -e "<html><body>MySQL is running.</body></html>\r\n"
    echo -e "\r\n"
    rm $ERR_FILE $TMP_FILE
    exit 0
}
return_fail()
{
    echo -e "HTTP/1.1 503 Service Unavailable\r\n"
    echo -e "Content-Type: text/html\r\n"
    echo -e "Content-Length: 42\r\n"
    echo -e "\r\n"
    echo -e "<html><body>MySQL is *down*.</body></html>\r\n"
    sed -e 's/\n$/\r\n/' $ERR_FILE
    echo -e "\r\n"
    rm $ERR_FILE $TMP_FILE
    exit 1
}
preflight_check
if [ -f "$FORCE_FAIL" ]; then
        echo "$FORCE_FAIL found" > $ERR_FILE
        return_fail;
fi
$MYSQL_BIN $MYSQL_OPTS --host=$MYSQL_HOST --port=$MYSQL_PORT --user=$MYSQL_USERNAME "$CHECK_QUERY" > $TMP_FILE 2> $ERR_FILE
if [ $? -ne 0 ]; then
        return_fail;
fi
status=`cat  $TMP_FILE | awk '{print $2;}'`

if [ $status -ne 4 ]; then
   return_fail;
fi

return_ok;

5. /etc/services 에 9200 포트 추가
vi /etc/services

기존 9200 포트 주석처리 후 아래 내용 추가
mysqlchk 9200/TCP


6. mysqlchk.sh 퍼미션 변경 및 xinetd 재시작
chmod 600 /usr/local/bin/mysql.sh
systemctl restart xinetd

7. DB에 haproxy 계정 생성
insert into user(host,user) values('127.0.0.1','haproxy');
flush privileges;

8. 확인
netstat -na | grep 9200 
tcp6       0      0 :::9200                 :::*                    LISTEN

http://proxyip:9000/haproxy





덧글

댓글 입력 영역