Docker로 localhost에서 다구역 바퀴벌레 집단 시뮬레이션
27603 단어 testingdevopsdockercockroachdb
이 설명은 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
.설치 프로그램
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
그리고 우리는 각 노드를 지역 간 네트워크에 연결한다.이 네트워크는 새 NICeth1
및 eth2
에 연결됩니다.그리고 우리는 tc qdisc
를 사용하여 각 새 NIC에 임의의 지연을 추가합니다.같은 구역 내 노드 간의 연결은 구역 네트워크
eth0
를 통해 진행되고 서로 다른 구역 내 노드 간의 연결은 구역 간 네트워크eth1
와 eth2
를 통해 진행된다.주의: 크로스 구역 네트워크에 연결됨에 따라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
Reference
이 문제에 관하여(Docker로 localhost에서 다구역 바퀴벌레 집단 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 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.)