DockerによるLocalhost上の多領域CockroachDBクラスタのシミュレーション


次の9ノードの展開をシミュレートする手順ですCockroachDB Dockerを使用してローカルホスト上の3つの領域間のクラスタ.これは特に、テスト、トレーニング、開発作業に便利です.
あなたがWindowsまたはMacOSを実行していると仮定しますCygwin , Dockerをインストールします.
以下はハイレベルアーキテクチャ図です.それぞれの領域は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 .

  • セットアップ


    Docker資源


    クラスタを実行するのに十分なリソースでDockerを設定することが重要です.皆さんの環境は異なりますので、参考にしてください.
    私のラップトップでは、8個のCPUと24 GBのRAMをDockerに割り当てました.あなたが同じようなプロファイルを持っていることを確認しますデフォルトの2 CPUは、クラスタを完璧に実行するのに十分ではありません.

    Dockerfile


    カスタムイメージを公式に基づいて作成するCockroachDB image パッケージを追加する必要があるので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
    
    グッドジョブ!イメージが整った

    クラスターを作る


    必要なネットワークを作成します.私たちは、それぞれの地域の1ネットワークを作成し、それぞれの地域間接続のための1ネットワーク.
    # 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
    
    各々のノードはそれ自身の領域ネットワークに関連していますeth0 NICまた、ノードIPアドレスを指定します--ip を使用して、その領域のすべてのノードのフラグとIPアドレス--add-host フラグ.これはDockerインスタンス内のエントリを作成します/etc/hosts DNSルックアップを優先したファイルです.これがなぜ重要であるかは、後で明らかになります.
    クリエイト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
    
    次に、各ノードをインターローカルネットワークに接続する.これらのネットワークは新しいNICに接続するでしょう.eth1 and eth2 . では、tc qdisc それぞれの新しいNICに任意のレイテンシを加える.
    同じ地域のノード間の接続性は、地域ネットワークを通過するeth0 , 地域間ネットワークを介した異なる地域のノード間の接続性eth1 and eth2 .
    注意: Internet Networkへの接続では、Dockerインスタンス内部DNSが時々スクランブルされます.nslookup roach-seattle-1 ホストからroach-seattle-2 IN領域のネットワークからの、または、地域間ネットワークからのIPアドレスのどちらかに解決します.ホスト名がIN領域ネットワークIPに解決しないならば、トラフィックは終わりますeth1 or eth2 レイテンシが適用され、領域の接続性が非常に遅くなります.そのような問題を解決するために、私たちは、各ノード/etc/hosts ファイル.これは、領域hostnameが領域IPアドレスに解決するのを確実にしますeth0 の代わりにeth1 or 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
    

    クラスタ構成


    あなたは、マップビューのように、以下の機能のいくつかのロックを解除するエンタープライズライセンスが必要になります.あなたはrequest a Trial license あるいは、ライセンス登録ステップをスキップするだけです.
    SQLシェルを開きます.あなたはdownload the cockroachdb binary これは、SQLクライアントに組み込まれているか、またはPostgreSQLのワイヤプロトコルとCockRoachDBのコンプライアンスのおかげで、使用することができますpsql クライアント.
    # ----------------------------
    # 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";
    
    
    この時点で、あなたはKockRachDB管理者UIを見ることができるはずですhttp://localhost:8080 . マップと待ち時間テーブルをチェックします.


    おめでとう、あなたは今、シミュレートされた複数地域展開に関するあなたのdev仕事を始める準備ができています!

    参考文献


    CockroachDB Docs
    CockroachDB docker image
    Docker Network Overview
    HAProxy Docs
    HAProxy docker image

    クリーンアップ


    コンテナの停止と削除、データボリュームの削除、ネットワークブリッジの削除
    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