DockerによるLocalhost上の多領域CockroachDBクラスタのシミュレーション
27831 ワード
次の9ノードの展開をシミュレートする手順ですCockroachDB Dockerを使用してローカルホスト上の3つの領域間のクラスタ.これは特に、テスト、トレーニング、開発作業に便利です.
あなたがWindowsまたはMacOSを実行していると仮定しますCygwin , Dockerをインストールします.
以下はハイレベルアーキテクチャ図です.それぞれの領域は3ノードをホストします: 地域 地域 地域
クラスタを実行するのに十分なリソースでDockerを設定することが重要です.皆さんの環境は異なりますので、参考にしてください.
私のラップトップでは、8個のCPUと24 GBのRAMをDockerに割り当てました.あなたが同じようなプロファイルを持っていることを確認しますデフォルトの2 CPUは、クラスタを完璧に実行するのに十分ではありません.
カスタムイメージを公式に基づいて作成するCockroachDB image パッケージを追加する必要があるので
ファイル' Dockerfile 'としてローカルに保存します.
必要なネットワークを作成します.私たちは、それぞれの地域の1ネットワークを作成し、それぞれの地域間接続のための1ネットワーク.
クリエイト
同じ地域のノード間の接続性は、地域ネットワークを通過する
注意: Internet Networkへの接続では、Dockerインスタンス内部DNSが時々スクランブルされます.
あなたは、マップビューのように、以下の機能のいくつかのロックを解除するエンタープライズライセンスが必要になります.あなたはrequest a Trial license あるいは、ライセンス登録ステップをスキップするだけです.
SQLシェルを開きます.あなたはdownload the
おめでとう、あなたは今、シミュレートされた複数地域展開に関するあなたのdev仕事を始める準備ができています!
CockroachDB Docs
CockroachDB docker image
Docker Network Overview
HAProxy Docs
HAProxy docker image
コンテナの停止と削除、データボリュームの削除、ネットワークブリッジの削除
あなたが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
Reference
この問題について(DockerによるLocalhost上の多領域CockroachDBクラスタのシミュレーション), 我々は、より多くの情報をここで見つけました https://dev.to/cockroachlabs/simulating-a-multi-region-cockroachdb-cluster-on-localhost-with-docker-59f6テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol