Keepalived+HAProxy 는 MySQL 의 높 은 부하 균형 설정 을 실현 합 니 다.

15365 단어 MySQL부하 균형
Keepalived
생산 환경 에서 my sql luster 를 사 용 했 기 때문에 높 은 부하 균형 을 실현 해 야 합 니 다.keepalived+haproxy 를 제공 합 니 다.
      keepalived 의 주요 기능 은 실제 기계 의 고장 격 리 및 부하 이퀄 라이저 간 의 실패 전환 을 실현 하 는 것 입 니 다.3,4,5 층 에서 교환 할 수 있 습 니 다.VRRPv 2(Virtual Router Redundancy Protocol)stack 을 통 해 이 루어 집 니 다.
      Layer 3:Keepalived 는 서버 그룹 에 있 는 서버 에 정기 적 으로 보 냅 니 다.ICMP 패 킷(우리 가 평소에 사용 하 는 Ping 프로그램)을 보 냅 니 다.만약 에 특정한 서비스의 IP 주소 가 활성화 되 지 않 은 것 을 발견 하면 Keepalived 는 이 서버 가 효력 을 잃 었 다 고 보고 하고 서버 그룹 에서 제거 합 니 다.이런 상황 의 전형 적 인 예 는 한 서버 가 불법 으로 꺼 진 것 입 니 다.Layer 3 방식 은 서버 의 IP 주소 가 서버 작업 의 정상 여 부 를 기준 으로 하 는 것 입 니 다.
     Layer 4:주로 TCP 포트 의 상태 로 서버 작업 의 정상 여 부 를 결정 합 니 다.웹 서버 의 서비스 포트 는 일반적으로 80 입 니 다.Keepalived 가 80 포트 가 시작 되 지 않 은 것 을 감지 하면 Keepalived 는 이 서버 를 서버 그룹 에서 제거 합 니 다.
     Layer 5:네트워크 에서 차지 하 는 대역 폭 도 좀 커 야 합 니 다.Keepalived 는 사용자 설정 에 따라 서버 프로그램 이 제대로 작 동 하 는 지 확인 하고 사용자 설정 과 일치 하지 않 으 면 Keepalived 는 서버 그룹 에서 서버 를 제거 합 니 다.
Software Design
2016228164756604.jpg (597×381)
keepalived 가 시작 되면 하나의 프로 세 스 가 있 습 니 다.

8352 ?    Ss   0:00 /usr/sbin/keepalived
8353 ?    S   0:00 \_ /usr/sbin/keepalived
8356 ?    S   0:01 \_ /usr/sbin/keepalived
부모 프로 세 스:메모리 관리,하위 프로 세 스 관리 등
하위 프로 세 스:VRRP 하위 프로 세 스
하위 프로 세 스:Healthchecking 하위 프로 세 스
실례
mysql luster 2 대 10.1.6203 master  10.1.6.205 backup
vip 10.1.6.173
목적 방문 10.1.6173 3366 포트 는 각각 haproxy 를 통 해 10.16.203 3306 과 10.16.205 3306 으로 전달 되 었 다.
my sql luster 는 이전 블 로 그 를 참조 하여 2 대의 컴퓨터 에 keepalived 를 설치 합 니 다.

[email protected]:~# apt-get install keepalived
[email protected]:~# cat /etc/keepalived/keepalived.conf 
vrrp_script chk_haproxy {
    script "killall -0 haproxy"  # verify the pid existance
    interval 2          # check every 2 seconds
    weight -2          # add 2 points of prio if OK
}
 
vrrp_instance VI_1 {
    interface eth1        # interface to monitor
    state MASTER         
    virtual_router_id 51     # Assign one ID for this route
    priority 101         # 101 on master, 100 on backup
    nopreempt
    debug
 
    virtual_ipaddress {
        10.1.6.173
    }
 
    track_script {    #       
        chk_haproxy
    }
 
    notify_master /etc/keepalived/scripts/start_haproxy.sh #      master   ,      
    notify_fault /etc/keepalived/scripts/stop_keepalived.sh #        
    notify_stop  /etc/keepalived/scripts/stop_haproxy.sh #keepalived       notify_stop      }
VRRPD 설정 은 세 가지 종 류 를 포함 합 니 다.
  • VRRP 동기 화 그룹(synchronization group)
  • VRRP 인 스 턴 스(VRRP 인 스 턴 스)
  • VRRP 스 크 립 트
  • VRRP 인 스 턴 스,VRRP 스 크 립 트 를 사 용 했 습 니 다.
    설정 옵션 주의:
    stat:intance(Initial)의 초기 상 태 를 지정 합 니 다.설정 한 후에 이 서버 의 초기 상 태 는 여기 서 지정 한 것 입 니 다.그러나 여기 서 지정 한 것 은 아 닙 니 다.경선 을 통 해 우선 순 위 를 확인 해 야 합 니 다.여기 서 master 로 설정 되 어 있 지만 그의 우선 순위 가 다른 것 보다 못 하면 이 채널 은 통 보 를 보 낼 때 자신의 우선 순 위 를 보 냅 니 다.다른 한 대 는 우선 순위 가 자신의 것 보다 높 지 않다 는 것 을 발견 하면 그 는 다시 master 로 선점 할 것 이다.
  • interface:인 스 턴 스 바 인 딩 된 네트워크 카드 입 니 다.가상 IP 를 설정 할 때 기 존 네트워크 카드 에 추가 해 야 하기 때 문 입 니 다
  • priority 101:이 노드 의 우선 순 위 를 설정 하고 우선 순 위 는 master
  • 입 니 다.
  • debug:debug 레벨
  • nopreempt:선점 하지 않 기
  • 로 설정
    
    vrrp_script chk_haproxy {
        script "killall -0 haproxy"  # verify the pid existance
        interval 2          # check every 2 seconds       
        weight -2          # add 2 points of prio if OK             :2     +2;-2      -2
    }
    
    
    그리고 인 스 턴 스(vrrpinstance)에서 인용 합 니 다.스 크 립 트 의 함수 참조 와 비슷 합 니 다.먼저 정의 한 다음 함수 이름 을 참조 합 니 다.
    
        track_script {
            chk_haproxy
        }
    
    메모:VRRP 스 크 립 트(vrrpscript)와 VRRP 인 스 턴 스(vrrpinstance)같은 단계 에 속 함
    
    [email protected]:scripts# cat start_haproxy.sh 
    #!/bin/bash
     
    sleep 5
    get=`ip addr |grep 10.1.6.173 |wc -l`
    echo $get >> /etc/keepalived/scripts/start_ha.log
     
    if [ $get -eq 1 ]
    then
        echo "`date +%c` success to get vip" >> /etc/keepalived/scripts/start_ha.log
        /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
    else
        echo "`date +%c` can not get vip" >> /etc/keepalived/scripts/start_ha.log
    fi
    [email protected]:scripts# cat stop_keepalived.sh 
    #!/bin/bash
     
    pid=`pidof keepalived`
    if [ $pid == "" ]
    then
      echo "`date +%c` no keepalived process id" >> /etc/keepalived/scripts/stop_keep.log
    else
      echo "`date +%c` will stop keepalived " >> /etc/keepalived/scripts/stop_keep.log
      /etc/init.d/keepalived stop
    fi
     
    /etc/init.d/keepalived stop
     
    [email protected]:scripts# cat stop_haproxy.sh 
    #!/bin/bash
     
    pid=`pidof haproxy`
    echo "`date +%c` stop haproxy" >> /etc/keepalived/scripts/stop_ha.log
    kill -9 $pid
    
    동 리 배치 10.1.6205
    
    [email protected]:~# cat /etc/keepalived/keepalived.conf 
    vrrp_script chk_haproxy {
      script "killall -0 haproxy"  # verify the pid existance
      interval 2          # check every 2 seconds
      weight 2           # add 2 points of prio if OK
    }
     
    vrrp_instance VI_1 {
      interface eth1        # interface to monitor
      state BACKUP
      virtual_router_id 51     # Assign one ID for this route
      priority 100         # 101 on master, 100 on backup
      virtual_ipaddress {
        10.1.6.173
      }
     
      track_script {
        chk_haproxy
      }
     
    notify_master /etc/keepalived/scripts/start_haproxy.sh
    notify_fault /etc/keepalived/scripts/stop_keepalived.sh
    notify_stop /etc/keepalived/scripts/stop_haproxy.sh
     
    }
    
     HAProxy
    다음은 Haproxy 를 소개 하 겠 습 니 다.
           HAProxy 는 TCP(4 층)와 HTTP(7 층)를 기반 으로 하 는 프 록 시 입 니 다.부하 이퀄 라이저 로 도 사용 할 수 있 습 니 다.수만 개의 병렬 연결 을 지원 할 수 있 습 니 다.또한 서버 가 네트워크 에 노출 되 지 않도록 보호 하고 포트 를 통 해 매 핑 할 수 있 습 니 다.서버 상 태 를 자체 적 으로 감시 하 는 페이지 도 있 습 니 다.
          haproxy 설치
    
    wget -O/tmp/haproxy-1.4.22.tar.gz http://haproxy.1wt.eu/download/1.4/src/haproxy-1.4.22.tar.gz
    tar xvfz /tmp/haproxy-1.4.22.tar.gz -C /tmp/
    cd /tmp/haproxy-1.4.22
    make TARGET=linux26
    make install
    
          haproxy 는 모든 my sql luster 서버 에 대해 건강 검 사 를 해 야 합 니 다.
    1.호스트 2 대 에 각각 haproxy.cfg 설정
    
    [email protected]:scripts# cat /etc/haproxy/haproxy.cfg 
    global
        maxconn 51200 #        
        #uid 99
        #gid 99
        daemon    #       haproxy
        #quiet
        nbproc 1   #    (            ) 
        pidfile /etc/haproxy/haproxy.pid #haproxy pid    ,                  
     
    defaults
        mode tcp      #       (#7  http;4 tcp ) 
        option redispatch  #serverId         ,              
        option abortonclose #           ,                  
        timeout connect 5000s  #    
        timeout client 50000s #     
        timeout server 50000s  #     
        log 127.0.0.1 local0  #      
        balance roundrobin  #          ,     
     
    listen proxy
        bind 10.1.6.173:3366  #     
        mode tcp        #http 7   
        option httpchk    #       
        server db1 10.1.6.203:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3   #     ,check inter 12000        rise 3 3          , fall 3 3           ,weight     
        server db2 10.1.6.205:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
     
    listen haproxy_stats
        mode http
        bind 10.1.6.173:8888
        option httplog
        stats refresh 5s  
        stats uri /status #      URL,    HAProxy          ,    200,     503 
        stats realm Haproxy Manager
        stats auth admin:p@a1SZs24 #    
    
    [email protected]:~$ cat /etc/haproxy/haproxy.cfg 
    global
        maxconn 51200
        #uid 99
        #gid 99
        daemon
        #quiet
        nbproc 1
        pidfile /etc/haproxy/haproxy.pid
     
    defaults
        mode tcp
        option redispatch  
        option abortonclose
        timeout connect 5000s
        timeout client 50000s
        timeout server 50000s
        log 127.0.0.1 local0
        balance roundrobin 
     
    listen proxy
        bind 10.1.6.173:3366
        mode tcp
        option httpchk
        server db1 10.1.6.203:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
        server db2 10.1.6.205:3306 weight 1 check port 9222 inter 12000 rise 3 fall 3
     
    listen haproxy_stats
        mode http
        bind 10.1.6.173:8888
        option httplog
        stats refresh 5s  
        stats uri /status 
        stats realm Haproxy Manager
        stats auth admin:p@a1SZs24
    
    
    2.xinetd 설치
    
    [email protected]:~# apt-get install xinetd
    
    3.노드 마다 xinetd 서비스 스 크 립 트 와 my sqlchk 포트 번 호 를 추가 합 니 다.
    
    [email protected]:~# vim /etc/xinetd.d/mysqlchk 
    # default: on
    # description: mysqlchk
    service mysqlchk         #   servive  
    {
        flags      = REUSE
        socket_type   = stream
        port      = 9222
        wait      = no
        user      = nobody
        server     = /opt/mysqlchk 
        log_on_failure += USERID
        disable     = no
        per_source   = UNLIMITED
        bind      = 10.1.6.173
    }
     
    [email protected]:~# vim /etc/services 
    mysqlchk    9222/tcp            # mysqlchk
    
    4.mysqlchk 모니터링 서비스 스 크 립 트 작성
    
    [email protected]:~# ls -l /opt/mysqlchk 
    -rwxr--r-- 1 nobody root 1994 2013-09-17 11:27 /opt/mysqlchk
    [email protected]:~# cat /opt/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="localhost"
    MYSQL_SOCKET="/var/run/mysqld/mysqld.sock"
    MYSQL_USERNAME="mysqlchkusr"   #        mysql   
    MYSQL_PASSWORD="secret"
    MYSQL_OPTS="-N -q -A"
    TMP_FILE="/dev/shm/mysqlchk.$$.out"
    ERR_FILE="/dev/shm/mysqlchk.$$.err"
    FORCE_FAIL="/dev/shm/proxyoff"
    MYSQL_BIN="/opt/mysqlcluster/mysql-cluster-gpl-7.2.6-linux2.6-x86_64/bin/mysql"
    CHECK_QUERY="select 1"
     
    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
    " echo -e "Content-Type: Content-Type: text/plain\r
    " echo -e "\r
    " echo -e "Cannot write to $I\r
    " echo -e "\r
    " exit 1 fi fi done } return_ok() { echo -e "HTTP/1.1 200 OK\r
    " echo -e "Content-Type: text/html\r
    " echo -e "Content-Length: 43\r
    " echo -e "\r
    " echo -e "<html><body>MySQL is running.</body></html>\r
    " echo -e "\r
    " rm $ERR_FILE $TMP_FILE exit 0 } return_fail() { echo -e "HTTP/1.1 503 Service Unavailable\r
    " echo -e "Content-Type: text/html\r
    " echo -e "Content-Length: 42\r
    " echo -e "\r
    " echo -e "<html><body>MySQL is *down*.</body></html>\r
    " sed -e 's/
    $/\r
    /' $ERR_FILE echo -e "\r
    " 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 --socket=$MYSQL_SOCKET --user=$MYSQL_USERNAME --password=$MYSQL_PASSWORD -e "$CHECK_QUERY" > $TMP_FILE 2> $ERR_FILE if [ $? -ne 0 ]; then return_fail; fi return_ok;
    테스트
    2 개 노드 keepalived 오픈(메 인 노드 는 VIP 획득,haproxy 자동 당 김),xinetd
    
    [email protected]:~# ip add
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
      link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
      inet 127.0.0.1/8 scope host lo
    2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
      link/ether 00:26:b9:36:0f:81 brd ff:ff:ff:ff:ff:ff
      inet 211.151.105.186/26 brd 211.151.105.191 scope global eth0
    3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
      link/ether 00:26:b9:36:0f:83 brd ff:ff:ff:ff:ff:ff
      inet 10.1.6.203/24 brd 10.1.6.255 scope global eth1
      inet 10.1.6.173/32 scope global eth1
    4: eth2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
      link/ether 00:26:b9:36:0f:85 brd ff:ff:ff:ff:ff:ff
    5: eth3: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN qlen 1000
      link/ether 00:26:b9:36:0f:87 brd ff:ff:ff:ff:ff:ff
    [email protected]:~# netstat -tunlp | grep ha
    tcp    0   0 10.1.6.173:3366   0.0.0.0:*        LISTEN   1042/haproxy  
    tcp    0   0 10.1.6.203:8888   0.0.0.0:*        LISTEN   1042/haproxy  
    udp    0   0 0.0.0.0:56562      0.0.0.0:*              1042/haproxy  
    [email protected]:~# netstat -tunlp | grep xine
    tcp    0   0 10.1.6.203:9222   0.0.0.0:*        LISTEN   30897/xinetd  
    [email protected]:~# ps -ef | grep haproxy
    root   1042   1 0 Sep17 ?    00:00:00 /usr/local/sbin/haproxy -f /etc/haproxy/haproxy.cfg
    
    
    테스트:
    vip 10.1.6173 3366 을 통 해 cluster 데이터 베 이 스 를 방문 합 니 다(계 정 dave 권한 에 ip 10.1.6203,10.16.205,10.1.6173 을 추가 해 야 합 니 다)
    
    [email protected]:mgm# mysql -udave -p -h 10.1.6.173 -P 3366
    Enter password: 
    Welcome to the MySQL monitor. Commands end with ; or \g.
    Your MySQL connection id is 1344316
    Server version: 5.5.22-ndb-7.2.6-gpl-log MySQL Cluster Community Server (GPL)
     
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
     
    mysql> show databases;
    +--------------------+
    | Database      |
    +--------------------+
    | information_schema | 
    | dave       | 
    | test        | 
    +--------------------+
    3 rows in set (0.01 sec)
     
    mysql>
    
    keepalive,haproxy,데이터 베 이 스 를 수 동 으로 끊 습 니 다.vip 10.1.6173 은 자동 으로 10.16.205 로 떠 내 려 가 VIP 의 방문 에 영향 을 주지 않 습 니 다.
    vip,haproxy 를 통 해 각 노드 상 태 를 확인 합 니 다.
    http://10.1.6.173:8888/status
    2016228164844383.jpg (1158×481)

    좋은 웹페이지 즐겨찾기