Varnish Cache로 캐시가 있는 지도 서버를 만들어 봤습니다.

이 글은 MIERUNE Advent Calendar 2020의 18일째 기사다.

개시하다


길거리 지도를 개방한 온라인 회의State of the Map Japan 2020에서 Georepublic의 송택 씨의 발표를 보았습니다. Open Street Map으로 국내를 대상으로 하는 지도 발표 서버의 캐시 서버로Varnish Cache를 사용하는 것을 알았습니다. 저도 만져보고 싶습니다.다음은 그 총결산이다.

하고 싶은 거.


지도는 백엔드에서 OpenMapTiles를 사용하여 발송됩니다.
Varnish Cache에서 타일의 이미지 (raster) 데이터를 캐시하고 싶기 때문에, 프론트 데스크톱에서 Nginx를 설정합니다. 이미지 (raster) 에 대한 요청이라면 캐시 서버에 요청을 건너뛰십시오.vector에 대한 요청이라면 OpenMapTiles에 직접 요청을 보냅니다.
User --- Nginx(80) --- (raster)  varnish(6081) ---- OpenMapTiles(8080)
                    |
                    ---(vector)-------------------- OpenMapTiles(8080)

컨디션

Platform: GCP Compute Engine
マシンタイプ: n2-standard-4(vCPU x 4、メモリ 16 GB)
イメージ: ubuntu-minimal-1804-bionic-v20200131 (Ubuntu v.18)
ディスクサイズ: 110 GB (HHD)

절차.


Docker, docker-compose의 Install


참고여기 기사..
curl https://get.docker.com | sh
usermod -aG docker $USER
systemctl start docker
systemctl enable docker

# docker-compose latest: 1.27.4 
curl -L https://github.com/docker/compose/releases/download/1.27.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

# confirm docker, docker-compose
docker -v
# result like: Docker version 19.03.8, build afacb8b7f0
docker-compose -v
# result like: docker-compose version 1.27.4, build 8d51620a

OpenMapTiles 설치 및 Tile 만들기


OpenMapTiles는 지도의 타일로 만들어져 편지를 배달할 수 있는 편리한 도구로 이번에는 이것을 사용한다.
git clone https://github.com/openmaptiles/openmaptiles.git
cd openmaptiles

# ZoomレベルをMin0, Max15にしたかったので.envを編集
vi .env
# modify MIN_ZOOM, MAX_ZOOM as
# MIN_ZOOM=0
# MAX_ZOOM=15

# 以下のコマンドでTileデータが作成されるが、作成に6時間~12時間程度かかるので
# セッションが切れても困らないようにScreen等張っておく
# こちらが終わると、data配下にjapan.mbtilesが作成され、それがタイル本体になる
./quickstart.sh japan

# quickstart.sh が終わり次第、以下コマンドでタイルサーバの起動が可能
make start-tileserver
이렇게 하면 http://idaddress:808080/Tile 서버에 접근할 수 있습니다

Varnish Cache의 설치 & 설정


참조정식 절차로 진행
sudo apt install curl gnupg apt-transport-https
curl -sL https://packagecloud.io/varnishcache/varnish60lts/gpgkey | sudo apt-key add -
# aptレポジトリ追加
sudo add-apt-repository 'deb https://packagecloud.io/varnishcache/varnish60lts/ubuntu/ bionic main'

sudo apt update
sudo apt install varnish

# バージョン確認
varnishd -V
# varnishd (varnish-6.0.4 revision 14d4eee6f0afc3020a044341235f54f3bd1449f1)
# Copyright (c) 2006 Verdens Gang AS
# Copyright (c) 2006-2019 Varnish Software AS

설정(시작) 파일은/etc/system/multi-user입니다.target.wants/varnish.서비스니까 봐봐.
[Unit]
Description=Varnish Cache, a high-performance HTTP accelerator
After=network-online.target nss-lookup.target

[Service]
Type=forking
KillMode=process

# Maximum number of open files (for ulimit -n)
LimitNOFILE=131072

# Locked shared memory - should suffice to lock the shared memory log
# (varnishd -l argument)
# Default log size is 80MB vsl + 1M vsm + header -> 82MB
# unit is bytes
LimitMEMLOCK=85983232

# Enable this to avoid "fork failed" on reload.
TasksMax=infinity

# Maximum size of the corefile.
LimitCORE=infinity

ExecStart=/usr/sbin/varnishd \
          -a :6081 \
          -T localhost:6082 \
          -p feature=+http2 \
          -f /etc/varnish/default.vcl \
          -s malloc,256m
ExecReload=/usr/sbin/varnishreload

[Install]
WantedBy=multi-user.target
ExecStart 매개변수를 사용하여 시작 설정을 시작할 수 있습니다.
-a에서는 Varnish Listen의 포트를 설정할 수 있지만 이번에는 이동 Cache의 포트에 특별히 얽매이지 않아 기본 6081호로 진행됩니다.
다음은 - f가 설정한/etc/varnis/default입니다.vcl 확인해 보세요.
vcl 4.0;

# Default backend definition. Set this to point to your content server.
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv {
    # Happens before we check if we have this in cache already.
    #
    # Typically you clean up the request here, removing cookies you don't need,
    # rewriting the request, etc.
}

sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.
}

sub vcl_deliver {
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    #
    # You can do accounting or modifying the final object here.
}
백엔드 default에서 캐시를 지정하는 원본 백엔드 서버입니다.
이번 백엔드 OpenMap Tiles의 서버는localhost:8080에서 시작되었기 때문에 이 설정에 따라 문제가 없을 것입니다.
그럼 시동 걸어볼게요.
# サービスファイルを反映するには systemctl daemon-reload が必要
systemctl daemon-reload
systemctl start varnish
systemctl status varnish

시스템ctl status varnish에 있습니다.서비스에 설정된 인자가 시작되었는지 확인하십시오

Nginx 설치 및 설정


참조여기.에 Nginx 설치
설정이지만 이번에는 캐시 격자 (그림) 만 생각하고 있습니다. 따라서 다음은/etc/nginx/conf.d/default입니다.conf를 편집하고 Nginx를 다시 시작합니다.
nginx의 설정은 아래 사이트를 참고하였다.
OpenMacTiles/Tileserver-GL/Maputnik 기반의 Macbox Vector Tile OSS 설치 환경 요약
Nginx는 80번 포트Listen에 있습니다. 요청이 png 이미지라면Varnish Cache가 이동하는 6081번 포트에 요청을 보내고, 그렇지 않으면 OpenMapTiles가 이동하는 8080번 포트에 직접 요청을 보냅니다.
server {
    listen       80;
    server_name  localhost;

  location / {
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:8080;
  }

  location ~ ^/.*\.png {
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:6081;
  }
}
Nginx를 다시 시작해서 http:///idaddress/TileServerGL 화면으로 나오면 완전 OK입니다.

부하 테스트


모처럼 Cache 서버를 만들어 특정 이미지가 얼마나 앞당겨졌는지 부하 테스트를 해보자.
이번에는 아파치 벤치를 통해 자신이 소유한 컴퓨터가 클라우드에 구축된 이 같은 환경에 대한 부하 테스트를 실시했다.
(ip 주소는 [ip-address]로 대체)

Varnish

# 同時接続数100で1000回アクセス
$ ab -c 100 -n 1000 http://[ip-address]/styles/klokantech-basic/6/55/27.png
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking [ip-address] (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.18.0
Server Hostname:        [ip-address]
Server Port:            80

Document Path:          /styles/klokantech-basic/6/55/27.png
Document Length:        1680 bytes

Concurrency Level:      100
Time taken for tests:   10.359 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      2033545 bytes
HTML transferred:       1680000 bytes
Requests per second:    96.54 [#/sec] (mean)
Time per request:       1035.882 [ms] (mean)
Time per request:       10.359 [ms] (mean, across all concurrent requests)
Transfer rate:          191.71 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       68  266 195.1    215    1243
Processing:    68  358 500.1    202    4735
Waiting:       68  325 444.8    201    4735
Total:        185  624 557.2    428    4979

Percentage of the requests served within a certain time (ms)
  50%    428
  66%    472
  75%    510
  80%    615
  90%   1471
  95%   1817
  98%   2135
  99%   2948
 100%   4979 (longest request)

Varnish가 없어요.

$ ab -c 100 -n 1000 http://[ip-address]/styles/klokantech-basic/6/55/27.png
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking [ip-address] (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        nginx/1.18.0
Server Hostname:        [ip-address]
Server Port:            80

Document Path:          /styles/klokantech-basic/6/55/27.png
Document Length:        1680 bytes

Concurrency Level:      100
Time taken for tests:   12.373 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      1945000 bytes
HTML transferred:       1680000 bytes
Requests per second:    80.82 [#/sec] (mean)
Time per request:       1237.316 [ms] (mean)
Time per request:       12.373 [ms] (mean, across all concurrent requests)
Transfer rate:          153.51 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       55  263 245.8    194    1311
Processing:    83  748 1214.8    227    7220
Waiting:       83  714 1194.4    225    5502
Total:        180 1011 1243.8    446    7352

Percentage of the requests served within a certain time (ms)
  50%    446
  66%    529
  75%   1213
  80%   1357
  90%   3132
  95%   4073
  98%   4969
  99%   5269
 100%   7352 (longest request)

단일 이미지에 대한 액세스를 통해 원래 액세스의 약 67% 통신 시간에 액세스할 수 있음

총결산


이상은 대체로 절차서이지만Varnish Cache로 캐시를 하면서 지도를 보낼 수 있습니다.백엔드 +nginx에 앱을 내놓는 것도 좋지만 캐시까지 넣으면 좋을 것 같아요.여러분도 꼭 해보세요.

좋은 웹페이지 즐겨찾기