본문 바로가기

기술자료/기술운영자료

HAProxy mysql 로드밸런싱 구성 테스트(2/2)

HAProxy는 mode 설정을 통해 http 관련 패킷이 아닌 다양한 tcp 패킷도 로드밸런싱 구성이 가능합니다.


이번 포스팅에서는 mysql 2대 구성으로 로드밸런싱 구성을 해보도록 하겠습니다.

(클러스터 구성이 아니오니 참고 바랍니다.)



1. 설정


HAProxy 192.168.2.4

DB1 192.168.2.203

DB2 192.168.2.204


global

 

 

        log 127.0.0.1   local0

 

 

        log 127.0.0.1   local1 notice

 

 

         maxconn 4096

 

 

        chroot /usr/share/haproxy

 

 

        user haproxy

 

 

        group haproxy

 

 

        daemon

 

 

 

defaults

 

 

        log     global

 

 

        option  dontlognull

 

 

        retries 3

 

 

        redispatch

 

 

        maxconn 2048

 

 

        contimeout      5000

 

 

        clitimeout      50000

 

 

        srvtimeout      50000

 

 

        stats   enable

 

 

        stats uri /haproxy_stats

 

 

        stats refresh 10s

 

 

 

listen  test-sql 0.0.0.0:3306

 

 

        mode tcp

 

 

        balance roundrobin

 

 

        option tcpka

 

 

        option mysql-check user haproxy

 

 

        server  sql1 192.168.2.203:3306 check port 3306 inter 2000 fall 3 rise 3

 

 

        server  sql2 192.168.2.204:3306 check port 3306 inter 2000 fall 3 rise 3

 

  

option mysql-check user haproxy 을 이용하면 mysql의 haproxy 계정을 통한 health check 가능 합니다.



이에 따라 두 대 모두 mysql에 haproxy 계정 생성이 필요


mysql) insert into user(Host,User,ssl_cipher,x509_issuer,x509_subject) values ('192.168.2.4','haproxy','','','');




2. 구성 확인


general_log_file이 hostname에 따라 생성된 다는 것에 착안하여 해당 값 조회하여 로드밸런싱 동작 여부 확인


#mysql -uroot -pxptmxm -h192.168.2.4 -e"show variables like 'general_log_file';"


 그림입니다.
원본 그림의 이름: mem00002274002d.tmp
원본 그림의 크기: 가로 740pixel, 세로 478pixel





그림입니다.
원본 그림의 이름: mem00002274002e.tmp
원본 그림의 크기: 가로 740pixel, 세로 64pixel 





- Query 테스트


php를 이용해 간단한 데이터 입력 테스트를 진행해 보았습니다.


DB서버를 직접 지정하는 대신 HAProxy IP를 설정하여 테스트 진행 하였습니다.

*로드밸런서 옵션은 라운드로빈


<?php

 

 

        @$conn=mysql_connect("192.168.2.4","haproxy","") or die ("DB Connection Fail.\n");

 

 

        mysql_select_db("haproxy", $conn);

 

 

                mysql_query("INSERT INTO test(id,name,content) VALUES('123','query_test','test')");

 

 

        mysql_close($conn);

 

 

?>

 

  


테스트 결과 각 DB 테이블에 순차적으로 데이터 입력 되는 것을 확인 가능 하였습니다.


그림입니다.
원본 그림의 이름: mem00002274002f.tmp
원본 그림의 크기: 가로 536pixel, 세로 303pixel 



그림입니다.
원본 그림의 이름: mem000022740030.tmp
원본 그림의 크기: 가로 569pixel, 세로 333pixel 





- 간단한 select 문을 통한 DB 데이터 호출 테스트


<?php

 

 

    $db = mysql_connect("192.168.2.4","haproxy","");

 

 

    mysql_select_db("webtest",$db);

 

 

    mysql_query("set names euckr");

 

 

    $query = "SELECT * FROM webtest";

 

 

    $result = mysql_query($query);

 

 

    echo "<table border = 1px>";

 

 

    while($arr = mysql_fetch_array($result)){

 

 

        echo ("<tr>");

 

 

        foreach($arr as $key =>$value){

 

 

            if(!(is_int($key)||$key == "password"||$value == NULL))

 

 

                echo ("<td> $value </td>");

 

 

        }

 

 

        echo ("</tr>");

 

 

    }

 

 

    echo "</table>"

 

 

?>

 

  


  각 DB에는 서로 다른 값을 입력하여 호출 시 확인 가능토록 하였습니다.


그림입니다.
원본 그림의 이름: mem000022740031.tmp
원본 그림의 크기: 가로 248pixel, 세로 112pixel

그림입니다.
원본 그림의 이름: mem000022740032.tmp
원본 그림의 크기: 가로 258pixel, 세로 119pixel 




  호출 결과 정상적으로 호출 되는 것 확인.

  그림입니다.
원본 그림의 이름: mem000022740033.tmp
원본 그림의 크기: 가로 423pixel, 세로 161pixel

  
그림입니다.
원본 그림의 이름: mem000022740034.tmp
원본 그림의 크기: 가로 420pixel, 세로 206pixel




3. failover Test

failover Test를 위해 DB1의 mysql 서비스를 중지.


웹콘솔에서 즉시 상태 확인이 가능 합니다.


그림입니다.
원본 그림의 이름: mem000022740035.tmp
원본 그림의 크기: 가로 610pixel, 세로 131pixel



DB1의 서비스 중지 후 haproxy IP 192.168.2.4에 호출 되는 모든 데이터는 DB2의 데이터만 출력 되는 것 확인.


서비스 감지 안되는 DB1로는 세션 분배가 되지 않는 것이 확인 됩니다.


그림입니다.
원본 그림의 이름: mem000022740036.tmp
원본 그림의 크기: 가로 618pixel, 세로 117pixel