HAProxy를 사용하는 공통 AB 테스트 기반에 대한 도전

6351 단어 AB 테스트haproxy
이 글은 Speee Advent Calendar 2016 12일째 되는 글이다.
전날 기사는요.
@suemocre:dash 권한 관리 및 활용 사례 - Qita
네.
저는 졸업생 엔지니어@_miyachik입니다.이번에(프론트 데스크의 변경이라면) 엔지니어의 작업 시간이 필요 없고, 응용 프로그램의 개발 언어를 묻지 않고 통용되는 AB 테스트 기초를 말한다.
전제 조건
이번 AB 테스트의 기본은
  • 분기가 분리된 상태에서 AB 테스트를 단독으로 진행할 수 있음(master에 통합할 필요가 없음)
  • 프론트 데스크의 경미한 수정은 엔지니어에게 엔지니어의 작업 시간을 분배하지 않는다
  • API 측 등 백엔드의 논리에 대해 AB테스트
  • 도 가능
  • 개발 언어에 구애받지 않고 AB 테스트 디스크 가져오기
  • 실현할 수 있다.우선 최상층의 분류에 대해 이야기하고 싶습니다.
    *단지 일어서는 실례의 IP가 모르는 자동 비례가 아직 다 대응되지 않았습니다
    해본 일
  • HAProxy의 AB 테스트 분배 및 재추첨 방지
  • Rails 응용 프로그램에서 HAProxy 설정 파일을 동적으로 출력하여 응용 프로그램과 HAproxy 설정을 다시 읽는 작업을 만듭니다
  • AB 테스트 서버와 백엔드 분리
  • AB 테스트 브랜치를 AB 테스트 서버로 추출
  • 생성된 HAProxy 설정 다시 읽기
  • 전치 마비 시간은 0
  • HAProxy 정보
    HAProxy 프록시 서버이며 소프트웨어 로드 밸런서입니다.
    HAProxy는 무엇입니까? 아무것도 아닙니다. 공식 문서 에 쓰여 있습니다.
    문서에서 보듯이 HAProxy는 부하 균형기로서 HAProxy 자체가 쿠키를 발행할 수 있는 기능을 가지고 있다.그리고 쿠키 설치 여부도 판단할 수 있다.
    또한 HAProxy를 단독으로 사용하여 AB 테스트 분배와 관련된 기능을 실현할 수 있기 때문에 Front/backend의 응용 프로그램 종류에 제한이 없다.
    인프라 구성도
    대략적인 구성은 다음과 같다.모든 사이드의 서버 대수는 HAProxy의backend 정의를 통해 진행할 수 있습니다.

    AB 테스트 모드를 반영하는 지점은 ab*사이드에 대해서만 테스트를 진행하고 결과가 좋지 않을 경우 머무르지 않고 다음 AB 테스트를 계속할 수 있다.
    HAProxy 기반 AB 테스트 할당
    할당은 HAProxy의 ACL 및 backend의 복수 정의에 따라 수행됩니다.
    ACL(Access Control List)
    공식 문서
    HAProxy의 ACL은 매우 유연한 접근을 할당할 수 있습니다.
    다음과 같이 쿠키를 판단하고 할당하는 백엔드를 변경할 수 있습니다.
    haproxy.cfg
        acl normal hdr_sub(cookie) ab-test-pattern=0
        acl ab-test-pattern hdr_sub(cookie) ab-test-pattern=1
        use_backend normal_side if normal
        use_backend ab_side if ab-test-pattern
        default_backend first_side
    
    ab-test-pattern 같은 쿠키가 존재하지 않는 경우(처음 방문했을 때) first사이드에 할당, 쿠키가 존재, 값이 1이면 abside, 0이면 normal사이드에게 할당할 수 있습니다.
    백엔드 정의
    backend의 정의는 다음과 같습니다. 처음 방문할 때 쿠키를 삽입하고, 가중 분배는 weight로 진행됩니다.이렇게 되면 weight에 따라 AB 테스트 서버에 할당된 사용자가 증거로 쿠키의 값 1을 기록합니다.
    다음 예는 normal:AB=75:25입니다.normal의 확립 = 호스트 이름 끝에서 0까지의 구축 총체.따라서 설정을 제시할 때normal을side의 weight는 설정이 필요합니다(normal_sideのホスト数)/(設定したいnormal側のweight).
    디자인된 응용의 지점이 다르기 때문에 응용 분야 abside 측면 또는 normal사이드 측 방문인지 판단할 필요는 없지만, 사고를 방지할 때는 쿠키 값을 참조해 사용자가 어느 쪽으로 뽑혔는지 판단할 수 있다.
    처음 방문할 때 쿠키를 설정하지 않았습니다. X-HOST-NAME을 사용하고 헤더에서 호스트 이름 ab를 참조합니다.side 또는 normal사이드인지 사이드인지 판단할 수 있어요.
    haproxy.cfg
    backend first_side
        mode http
        cookie ab-test-pattern insert nocache
        balance roundrobin
        http-send-name-header X-HOST-NAME
    
        server web1-0 127.0.0.1:80 weight 25% check cookie 0 inter 1000 fall 2
        server web2-0 127.0.0.2:80 weight 25% check cookie 0 inter 1000 fall 2
        server web3-0 127.0.0.3:80 weight 25% check cookie 0 inter 1000 fall 2
        server web4-1 127.0.0.4:80 weight 25% check cookie 1 inter 1000 fall 2
    
    그다음에 노말-사이드는 노멀 쪽 호스트만 선언하면 노멀만 가요.
    하지만 ab사이드에 노멀 측 호스트가 포함된다고 선언하지 않으면 AB 테스트 서버(이번 경우 웹4-1)가 떨어지면 해당 호스트를 찾을 수 없어 접근할 수 없기 때문에 주의해야 한다.(check cookie를 진행하는 경우에도 호스트가 드랍할 때 할당하지 않고 다른 서버에 할당)
    다음은 실제 출력된 파일입니다.부하 등 상황에 신경을 쓰신다면 맥스콘 등의 설정을 적당히 보충해 주십시오.지점명은 ab-test-pattern의 구상이다.
    normal_side의 IP 등은 Rails의 config 파일에 정렬되어 있습니다.
    haproxy.cfg
    global
        log         127.0.0.1 local2 info
        chroot      /var/lib/haproxy
        pidfile     /var/run/haproxy.pid
        maxconn     10000
        user        haproxy
        group       haproxy
        daemon
    defaults
        log     global
        timeout connect 60s
        timeout server 1m
        timeout client 1m
        timeout check  5s
    
    # web
    listen frontside
        maxconn 4000
        fullconn 4000
        bind 0.0.0.0:80
        mode http
        acl normal hdr_sub(cookie) ab-test-pattern=0
        acl ab-test-pattern hdr_sub(cookie) ab-test-pattern=1
        use_backend normal_side if normal
        use_backend ab_side if ab-test-pattern
        default_backend first_side
    
    backend first_side
        mode http
        cookie ab-test-pattern insert nocache
        balance roundrobin
        http-send-name-header X-HOST-NAME
    
        server web1-0 127.0.0.1:80 weight 25% check cookie 0 inter 1000 fall 2
        server web2-0 127.0.0.2:80 weight  25% check cookie 0 inter 1000 fall 2
        server web3-0 127.0.0.3:80 weight  25% check cookie 0 inter 1000 fall 2
        server web4-1 127.0.0.4:80 weight  25% check cookie 1 inter 1000 fall 2
    
    backend normal_side
        mode http
        balance roundrobin
    
        server web1-0 127.0.0.1:80 check inter 1000 fall 2
        server web2-0 127.0.0.2:80 check inter 1000 fall 2
        server web3-0 127.0.0.3:80 check inter 1000 fall 2
    
    backend ab_side
        mode http
        cookie ab-test-pattern insert nocache
        balance roundrobin
    
        server web1-0 127.0.0.1:80 check cookie 0 inter 1000 fall 2
        server web2-0 127.0.0.2:80 check cookie 0 inter 1000 fall 2
        server web3-0 127.0.0.3:80 check cookie 0 inter 1000 fall 2
        server web4-1 127.0.0.4:80 check cookie 1 inter 1000 fall 2
    
    HAProxy의 설정 변경과 응용 프로그램의 디버깅을 진행하는 작업은 이번에는 연쇄반응 Jinkins의 Job을 통해 이루어졌다.
    준비된 잡.
  • HAProxy ab사이드에서 분리된 config 리디렉션
  • 지정된 브랜치 블록 분리
  • 생성된 HAProxy의 config 파일 다시 읽기
  • 네.HAProxy는 graceful restart를 사용할 수 있기 때문에 depro에 긍정적인 영향을 미치지 않습니다.
    현재 제작된 HAProxy의 config만 출력하는 프로그램을 공개할 예정입니다. 잠시만 기다리세요

    좋은 웹페이지 즐겨찾기