Docker로 localhost에서 다구역 바퀴벌레 집단 시뮬레이션

다음은 Docker를 사용하여 localhost에서 3개 구역에 걸쳐 9 노드CockroachDB 집단 배치를 시뮬레이션하는 설명입니다.이것은 테스트, 교육, 개발 업무에 특히 유용하다.
이 설명은 Windows에서 사용하고 Docker를 설치해야 함에도 불구하고 Linux나 macOS를 실행하고 있다고 가정합니다.
다음은 고층 구조도다.각 영역에 3개의 노드가 로드됩니다.
  • 구역us-west-2 적재 노드roach-seattle-1|2|3;
  • 구역us-east-1 적재 노드roach-newyork-1|2|3
  • 구역eu-west-1 적재 노드roach-london-1|2|3.
  • Cygwin

    설치 프로그램


    Docker 리소스


    Docker를 위해 클러스터와 그 위에서 실행되는 워크로드를 실행할 충분한 리소스를 설정하는 것이 중요합니다.사람마다 환경이 다르기 때문에 이것은 참고로 제공할 뿐이다.
    내 노트북에서 나는 Docker에 8개의 CPU와 24GB RAM을 할당했다.비슷한 개인 자료를 확보하기;기본 CPU 2개로는 클러스터를 완벽하게 실행할 수 없습니다.

    Dockerfile 파일


    공식 을 기반으로 사용자 정의 이미지를 만듭니다. 패키지 iproute-tc 를 추가해야 하기 때문입니다. 이것은 아날로그 집단 노드 사이의 지연에 필요한 것입니다.
    로컬은 Dockerfile 파일로 저장됩니다.
    FROM cockroachdb/cockroach:latest
    RUN echo -e "[BaseOS] \nname=CentOS-\$releasever - Base \nmirrorlist=http://mirrorlist.centos.org/?release=\$releasever&arch=\$basearch&repo=BaseOS&infra=\$infra\ngpgcheck=0\nenabled=1\n" > /etc/yum.repos.d/Centos8-Repo.repo
    RUN microdnf install -y iproute-tc && rm -rf /var/cache/yum
    
    태그 이름crdb을 사용하여 이미지를 구성합니다.
    docker build -t crdb .
    
    Docker에서 이미지를 사용할 수 있는지 확인
    $ docker images                                                                                                                                                                                    
    REPOSITORY                        TAG                 IMAGE ID            CREATED             SIZE
    crdb                              latest              636a1478ca1d        7 minutes ago       338MB
    cockroachdb/cockroach             latest              eb9d4ec20cc9        21 hours ago        327MB
    
    잘하다이미지 준비 완료

    바퀴벌레 클러스터 구축


    필요한 네트워크를 만듭니다.우리는 각 구역에 네트워크를 만들고 각 구역 간의 연결에 네트워크를 만듭니다.
    # region networks
    docker network create --driver=bridge --subnet=172.27.0.0/16 --ip-range=172.27.0.0/24 --gateway=172.27.0.1 us-west-2-net
    docker network create --driver=bridge --subnet=172.28.0.0/16 --ip-range=172.28.0.0/24 --gateway=172.28.0.1 us-east-1-net
    docker network create --driver=bridge --subnet=172.29.0.0/16 --ip-range=172.29.0.0/24 --gateway=172.29.0.1 eu-west-1-net
    
    # inter-regional networks
    docker network create --driver=bridge --subnet=172.30.0.0/16 --ip-range=172.30.0.0/24 --gateway=172.30.0.1 uswest-useast-net
    docker network create --driver=bridge --subnet=172.31.0.0/16 --ip-range=172.31.0.0/24 --gateway=172.31.0.1 useast-euwest-net
    docker network create --driver=bridge --subnet=172.32.0.0/16 --ip-range=172.32.0.0/24 --gateway=172.32.0.1 uswest-euwest-net
    
    각 노드는 자신의 지역 네트워크와 연결되어 있으며, 이 네트워크는 docker 실례 eth0 NIC에 연결됩니다.또한 --ip 로고를 사용하여 노드 IP 주소를 지정하고 --add-host 로고를 사용하여 해당 영역에 있는 모든 노드의 IP 주소를 지정합니다.이것은 docker 실례 /etc/hosts 파일에 항목을 만들 것입니다. 이 항목은 DNS에서 찾기보다 우선합니다.잠시 후에 우리는 왜 이것이 중요한지 똑똑히 알게 될 것이다.
    각 영역의 HAProxy에 대한 파일haproxy.cfg을 생성합니다.
    # us-east-1
    mkdir -p data/us-east-1
    cat - >data/us-east-1/haproxy.cfg <<EOF
    
    global
      maxconn 4096
    
    defaults
        mode                tcp
        # Timeout values should be configured for your specific use.
        # See: https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-timeout%20connect
        timeout connect     10s
        timeout client      10m
        timeout server      10m
        # TCP keep-alive on client side. Server already enables them.
        option              clitcpka
    
    listen psql
        bind :26257
        mode tcp
        balance roundrobin
        option httpchk GET /health?ready=1
        server cockroach1 roach-newyork-1:26257 check port 8080
        server cockroach2 roach-newyork-3:26257 check port 8080
        server cockroach3 roach-newyork-2:26257 check port 8080
    
    EOF
    
    # us-west-2
    mkdir data/us-west-2
    cat - >data/us-west-2/haproxy.cfg <<EOF
    
    global
      maxconn 4096
    
    defaults
        mode                tcp
        # Timeout values should be configured for your specific use.
        # See: https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-timeout%20connect
        timeout connect     10s
        timeout client      10m
        timeout server      10m
        # TCP keep-alive on client side. Server already enables them.
        option              clitcpka
    
    listen psql
        bind :26257
        mode tcp
        balance roundrobin
        option httpchk GET /health?ready=1
        server cockroach4 roach-seattle-1:26257 check port 8080
        server cockroach5 roach-seattle-2:26257 check port 8080
        server cockroach6 roach-seattle-3:26257 check port 8080
    
    EOF
    
    # eu-west-1
    mkdir data/eu-west-1
    cat - >data/eu-west-1/haproxy.cfg <<EOF
    
    global
      maxconn 4096
    
    defaults
        mode                tcp
        # Timeout values should be configured for your specific use.
        # See: https://cbonte.github.io/haproxy-dconv/1.8/configuration.html#4-timeout%20connect
        timeout connect     10s
        timeout client      10m
        timeout server      10m
        # TCP keep-alive on client side. Server already enables them.
        option              clitcpka
    
    listen psql
        bind :26257
        mode tcp
        balance roundrobin
        option httpchk GET /health?ready=1
        server cockroach7 roach-london-1:26257 check port 8080
        server cockroach8 roach-london-2:26257 check port 8080
        server cockroach9 roach-london-3:26257 check port 8080
    EOF
    
    docker 컨테이너 만들기
    # Seattle
    docker run -d --name=roach-seattle-1 --hostname=roach-seattle-1 --ip=172.27.0.11 --cap-add NET_ADMIN --net=us-west-2-net --add-host=roach-seattle-1:172.27.0.11 --add-host=roach-seattle-2:172.27.0.12 --add-host=roach-seattle-3:172.27.0.13 -p 8080:8080 -v "roach-seattle-1-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=us-west-2,zone=a
    docker run -d --name=roach-seattle-2 --hostname=roach-seattle-2 --ip=172.27.0.12 --cap-add NET_ADMIN --net=us-west-2-net --add-host=roach-seattle-1:172.27.0.11 --add-host=roach-seattle-2:172.27.0.12 --add-host=roach-seattle-3:172.27.0.13 -p 8081:8080 -v "roach-seattle-2-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=us-west-2,zone=b
    docker run -d --name=roach-seattle-3 --hostname=roach-seattle-3 --ip=172.27.0.13 --cap-add NET_ADMIN --net=us-west-2-net --add-host=roach-seattle-1:172.27.0.11 --add-host=roach-seattle-2:172.27.0.12 --add-host=roach-seattle-3:172.27.0.13 -p 8082:8080 -v "roach-seattle-3-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=us-west-2,zone=c
    # Seattle HAProxy
    docker run -d --name haproxy-seattle --ip=172.27.0.10 -p 26257:26257 --net=us-west-2-net -v `pwd`/data/us-west-2/:/usr/local/etc/haproxy:ro haproxy:1.7  
    
    # New York
    docker run -d --name=roach-newyork-1 --hostname=roach-newyork-1 --ip=172.28.0.11 --cap-add NET_ADMIN --net=us-east-1-net --add-host=roach-newyork-1:172.28.0.11 --add-host=roach-newyork-2:172.28.0.12 --add-host=roach-newyork-3:172.28.0.13 -p 8180:8080 -v "roach-newyork-1-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=us-east-1,zone=a
    docker run -d --name=roach-newyork-2 --hostname=roach-newyork-2 --ip=172.28.0.12 --cap-add NET_ADMIN --net=us-east-1-net --add-host=roach-newyork-1:172.28.0.11 --add-host=roach-newyork-2:172.28.0.12 --add-host=roach-newyork-3:172.28.0.13 -p 8181:8080 -v "roach-newyork-2-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=us-east-1,zone=b
    docker run -d --name=roach-newyork-3 --hostname=roach-newyork-3 --ip=172.28.0.13 --cap-add NET_ADMIN --net=us-east-1-net --add-host=roach-newyork-1:172.28.0.11 --add-host=roach-newyork-2:172.28.0.12 --add-host=roach-newyork-3:172.28.0.13 -p 8182:8080 -v "roach-newyork-3-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=us-east-1,zone=c
    # New York HAProxy
    docker run -d --name haproxy-newyork --ip=172.28.0.10 -p 26258:26257 --net=us-east-1-net -v `pwd`/data/us-east-1/:/usr/local/etc/haproxy:ro haproxy:1.7  
    
    # London
    docker run -d --name=roach-london-1 --hostname=roach-london-1 --ip=172.29.0.11 --cap-add NET_ADMIN --net=eu-west-1-net --add-host=roach-london-1:172.29.0.11 --add-host=roach-london-2:172.29.0.12 --add-host=roach-london-3:172.29.0.13 -p 8280:8080 -v "roach-london-1-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=eu-west-1,zone=a
    docker run -d --name=roach-london-2 --hostname=roach-london-2 --ip=172.29.0.12 --cap-add NET_ADMIN --net=eu-west-1-net --add-host=roach-london-1:172.29.0.11 --add-host=roach-london-2:172.29.0.12 --add-host=roach-london-3:172.29.0.13 -p 8281:8080 -v "roach-london-2-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=eu-west-1,zone=b
    docker run -d --name=roach-london-3 --hostname=roach-london-3 --ip=172.29.0.13 --cap-add NET_ADMIN --net=eu-west-1-net --add-host=roach-london-1:172.29.0.11 --add-host=roach-london-2:172.29.0.12 --add-host=roach-london-3:172.29.0.13 -p 8282:8080 -v "roach-london-3-data:/cockroach/cockroach-data" crdb start --insecure --join=roach-seattle-1,roach-newyork-1,roach-london-1 --locality=region=eu-west-1,zone=c
    # London HAProxy
    docker run -d --name haproxy-london --ip=172.29.0.10 -p 26259:26257 --net=eu-west-1-net -v `pwd`/data/eu-west-1/:/usr/local/etc/haproxy:ro haproxy:1.7  
    
    클러스터 초기화
    docker exec -it roach-newyork-1 ./cockroach init --insecure
    
    그리고 우리는 각 노드를 지역 간 네트워크에 연결한다.이 네트워크는 새 NICeth1eth2에 연결됩니다.그리고 우리는 tc qdisc 를 사용하여 각 새 NIC에 임의의 지연을 추가합니다.
    같은 구역 내 노드 간의 연결은 구역 네트워크eth0를 통해 진행되고 서로 다른 구역 내 노드 간의 연결은 구역 간 네트워크eth1eth2를 통해 진행된다.
    주의: 크로스 구역 네트워크에 연결됨에 따라docker 실례 내부 DNS는 때때로 교란될 수 있습니다. 예를 들어 호스트nslookup roach-seattle-1에서 보낸 roach-seattle-2는 지역 내 네트워크나 크로스 구역 네트워크에서 온 IP 주소로 해석됩니다.호스트 이름이 로케일 네트워크 IP로 확인되지 않으면 eth1 또는 eth2 를 통해 트래픽이 발생하여 로케일 연결이 매우 느려집니다.이 문제를 해결하기 위해 우리는 각 노드/etc/hosts 파일에 추가된 정적 IP 주소를 사용합니다.이로써 지역 내 호스트 이름이 지역 IP 주소로 해석되어 연결이 eth0 또는 eth1 이 아닌 eth2 을 통과하도록 합니다.
    # Seattle
    for j in 1 2 3
    do
        docker network connect uswest-useast-net roach-seattle-$j
        docker network connect uswest-euwest-net roach-seattle-$j
        docker exec roach-seattle-$j tc qdisc add dev eth1 root netem delay 30ms
        docker exec roach-seattle-$j tc qdisc add dev eth2 root netem delay 90ms
    done
    
    # New York
    for j in 1 2 3
    do
        docker network connect uswest-useast-net roach-newyork-$j
        docker network connect useast-euwest-net roach-newyork-$j
        docker exec roach-newyork-$j tc qdisc add dev eth1 root netem delay 32ms
        docker exec roach-newyork-$j tc qdisc add dev eth2 root netem delay 60ms
    done
    
    # London
    for j in 1 2 3
    do
        docker network connect useast-euwest-net roach-london-$j
        docker network connect uswest-euwest-net roach-london-$j
        docker exec roach-london-$j tc qdisc add dev eth1 root netem delay 62ms
        docker exec roach-london-$j tc qdisc add dev eth2 root netem delay 88ms
    done
    

    클러스터 구성


    아래 설명된 일부 기능(예: 지도 보기)을 잠그려면 기업 허가증이 필요합니다.라이센스 등록 절차를 건너뛰거나 배포에 성공할 수 있습니다.
    SQL 셸을 엽니다.request a Trial license에 내장된 SQL 클라이언트를 포함하거나 CockroachDB가 PostgreSQL wire 프로토콜에 부합하기 때문에 cockroachdb 클라이언트를 사용할 수 있습니다.
    # ----------------------------
    # ports mapping:
    # 26257: haproxy-seattle
    # 26258: haproxy-newyork
    # 26259: haproxy-london
    # ----------------------------
    
    # use cockroach sql, defaults to localhost:26257
    cockroach sql --insecure
    
    # or use the --url param for another host:
    cockroach sql --url "postgresql://localhost:26258/defaultdb?sslmode=disable"
    
    # or use psql
    psql -h localhost -p 26257 -U root defaultdb
    
    다음 SQL 문을 실행합니다.
    -- let the map know the location of the regions
    UPSERT into system.locations VALUES
            ('region', 'us-east-1', 37.478397, -76.453077),
            ('region', 'us-west-2', 43.804133, -120.554201),
            ('region', 'eu-west-1', 53.142367, -7.692054);
    
    SET CLUSTER SETTING cluster.organization = "Your Company Name";
    -- skip below if you don't have a Trial or Enterprise license
    SET CLUSTER SETTING enterprise.license = "xxxx-yyyy-zzzz";
    
    
    CockroachDB 관리 UI를 download the psql binary 에서 볼 수 있어야 합니다.매핑 및 지연 테이블을 확인합니다.
    http://localhost:8080

    축하합니다. 이제 다중 구역 배치를 모의하는 개발 작업을 시작할 준비가 되었습니다!

    공구서류



    CockroachDB Docs
    CockroachDB docker image
    Docker Network Overview
    HAProxy Docs

    HAProxy docker 이미지 정리하다


    컨테이너 중지 및 삭제, 데이터 볼륨 삭제, 브리지 삭제
    for i in seattle newyork london
    do
        for j in 1 2 3
        do
            docker stop roach-$i-$j
            docker rm roach-$i-$j
            docker volume rm roach-$i-$j-data
        done
    done
    docker network rm us-east-1-net us-west-2-net eu-west-1-net uswest-useast-net useast-euwest-net uswest-euwest-net
    

    좋은 웹페이지 즐겨찾기