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





Percona mysql 및 TokuDB 설치하기 0










기존 Mysql Innodb engine을 사용하다가 TokuDB Engine이 좋다기에, 마침 웹 리뉴얼을 하게 되어 TokuDB Engine 을 설치해 보았다.
일반 mysql-server 에 설치를 하자니, 방법이 없는건지.. 내가 못찾는건지 아무리 봐도 모르겠다..

그래서 Percona-mysql로 설치를 진행하였다. 
혹시 일반 mysql에 Toku Engine 설치하는 방법이 있다면 공유 부탁드리겠습니다... 


1. percona-mysql 설치

yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm

yum install -y http://repo.percona.com/centos/7/RPMS/x86_64/Percona-Server-selinux-56-5.6.42-rel84.2.el7.noarch.rpm

yum install -y Percona-Server-server-56

yum install -y Percona-Server-tokudb-56.x86_64


2. THP(Transparent huge page) 활성화 여부 확인

cat /sys/kernel/mm/transparent_hugepage/enabled


비활성화 일때

always madvise [never]


활성화 일때

[always] madvise never



3. THP 비활성화 ( vi /etc/rc.local) 아래 내용 추가

echo never > /sys/kernel/mm/transparent_hugepage/enabled

echo never > /sys/kernel/mm/transparent_hugepage/defrag


4. ToKuDB 스토리지 엔진 설치 및 활성화

ps_tokudb_admin --enable -uroot


5. my.cnf에 내용 추가 ( vi /etc/my.cnf)

[mysqld_safe]

malloc-lib=/usr/lib64/libjemalloc.so.1


6. mysql_log 폴더 생성 ( /etc/my.cnf  에 설정한 내용에 따라 경로는 달라짐)

mkdir -p /var/lib/mysql_log/

chown -R mysql:mysql /var/lib/mysql_log/


touch /var/log/mysqld_log

chown mysql: /var/log/mysqld_log


7. 서비스 시작

service mysql start


8. 엔진, 플러그인, tokudb 버전 확인

mysql -uroot

show engines;

show plguins;

select @@tokudb_version;







http -> https 로 리다이렉트 해제 [웹서버에서] 0


Web 서버에서 vhosts 와 ssl 설정을 한 이후 https 최초 접속 이후 http로 페이지를 들어가도 https로 자동 리다이렉트가 되었다.

실 운영 웹서버에서는 안그랬는데.. 테스트 서버에서는 왜그러지.. 실서버는 프록시가 있어서 그런가.. 일단 찾자..
문제점을 찾으려 설정을 이것저것 찾아봤는데도 잘 모르겠다. 
삽질을 하다가 브라우저 캐시를 지우고 http로 접속을 하니 http로 접속이 잘 된다..! 

브라우저 캐시 관련 설정을 이것저것 구글링 하다보니 HSTS 관련된 내용들이 많이 나왔다.


설정파일을 열어보니 Header always set Strict-Transport-Security "max-age=63072000" 로 설정이 되어있다..!
설정파일은 httpd.conf나 httpd-vhosts.conf 를 보면 될것같다..

아래와 같이 수정!
Header always set Strict-Transport-Security "max-age=0"

아파치를 재시작하고 http와 https로 연결을 체크해보니 리다이렉트가 안된다. 

삽질 끝에 해결!


HTML5 이미지태그 사용하기 0



<Marquee> loop 반복!
   스크롤 반복 횟수를 지정

(결과)


<basefont size="5" />

스크롤을 한번만 함.

 

스크롤을 두번함.

 

스크롤을 세번함.



이미지 태그 사용하기
ㅁ 이미지 연결하기
 <형식>
    <img src="경로명/파일명">
    <속성>
    1) src="경로명/파일명"

     - 절대경로 또는 상대경로로 사용 가능.

 src = "C:\pic/dog.jpg"   (절대경로(그림이 있는곳의 경로를 상세하게 적어주는것))

 src = "pic/dog.jpg"  (상대경로(html 파일이 저장되있는곳을 기준으로 간략하게 적어줄수있음))

 

2) align = top or middle or bottom (이미지 옆 텍스트 위치)

   -이미지 옆에 텍스트를 보여줄 때 이미지 오른쪽 상산, 중간, 하단에 보여줌

   align = "top", align = "middle", bottome은 디폴트.

 

 3) align = left or right (텍스트 옆 이미지 위치)

   align = left 지정하면 텍스트 왼쪽에 이미지 위치함

   align = right 지정하면 텍스트 오른쪽에 이미지 위치함

 

 4) border = 숫자(픽셀수)

   - 이미지의 테두리선을 픽셀수로 지정

 

 5) alt="이미지 파일 설명"

   - 커서를 이지미 위에 올리면 말풍선 형식으로 보여줌.

 

Ex)


(결과)



6) vspace="픽셀수", hspace="픽셀수"

  - 이미지와 텍스트 사이에 여백을 줌.

(예)

   <img src="이미지명" vspace=30 hspace=50>

    <br clear=:left" or "right">

   - 이미지와 텍스트를 출력하고 다음 문자를 출력시 앞의 텍스트에 이어서 출력.

     이것을 벗어나기 위해 <br>태그를 여러개 사용 할 수 있으나 <br clear="left> 하면

     한번에 이전 이미지나 객체에서 벗어날 수 있음.

 

(Ex)

(결과)


7) 이미지 크기 조절하는 width, height 속성 

 <형식>

 <img src="이미지 파일명" width="픽셀수" or "숫자%" height="픽셀수" or "숫자%">

(예)

 <img src="피카추.jpg" width=100 height=100>

<img src="피카추.jpg" width=70% height=70%> 원래이미지 크기에 비례해 축소됨.

<img src="피카추.jpg" width=300> width 속성만 지정시 세로 크기는 자동으로 조정되서 보여짐.

 

(Ex)


(결과)



HTML5 DL태그 사용하기(움직이게) 0







<link rel="stylesheet" href="" />

<DL> 태그 

   - Definition List의 약자로 용어에 대한 설명 등을 나열할 때 사용

     1) <DL>의 포함된 목록 태그로

       ① <LH> - List Head, 목록의 제목

       ② <DT> - Definition Title, 용어(제목)

       ③ <DD> - Definition Data, 용어의 설명

 

    - <LH>, <DT>, <DD>는 자동으로 줄 바꿈이 이루어진다.

 

Ex)

 <dl>

          <lh>목록의 제목

          <dt> 용어

          <dd>용어의 설명 

</dl>

 

(Ex)





























(Ex)
















움직이는 텍스트 만들기

  <MARQUEE> ~ </MARQUEE> 차양이라는 뜻 글자가 수평방향으로 움직인다.

  <marquee> 태그의 속성은 다음과 같다.

    1) bgcolor - 영역의 바탕색 "색명(bgcolor="#ff0000", bgcolor="yellow"

    2) width, height - 넓이ㅡ 높이 (width=100, heightt= 50%)

    3) hspace, vspace - 텍스트 바깥쪽 좌우상하 영역내의 여백 처리

      (hspace=20, vspace=10)

    4) behavior - 문자열의 흐름을 제어한다.

         (1) behavior="scroll" 기본값으로 한 방향으로 계속 문자열이 흘러감

         (2) behavior="slide" 스크롤하던 문자열이 한 쪽 끝에서 멈춤.

         (3) behavior="alternate" 문자열이 상하좌우로 왔다 갔다 반복함.

    5) direction - 문자열의 흘러가는 방향을 지정.

         (direction="left" or "right" or "up" or "down") 으로 사용가능.

    

(Ex)


























(결과)

 

텍스트의 위치는 top, middle, bottom으로 지정할 수 있음. 

 

텍스트 바깥의 상하 좌우 여백 보기!텍스트의 기본 흐름.텍스트가 좌우로 왔다 갔다 함.텍스트가 끝에가서 멈춤. (Ex2)































(결과)

 

텍스트 왼쪽으로 가게하기!

 

텍스트 오른쪽으로 가게하기!

 

텍스트 위쪽으로 가게하기!

 

텍스트 아래쪽으로 가게하기!


<marquee> 태그의 scrolldelay, scrollamount 속성

   - scrolldelay=숫자 : 숫자가 클수록 속도가 느려짐.

   - scrollamount=픽셀수 : 숫자가 클수록 속도가 빨라짐


































(결과)

<basefont size="6" />


scrolldelay 속성은 스크롤 지연 속도를 지정.

scrolldelay 속성은 값이 클수록 느림.

scrollamount 속성은 한번에 스크롤 되는 픽셀 수를 지정.


1 2 3 4 5 6 7 8 9 10 다음