Webマップタイルの複製について

Slippy Mapテクノロジーを使用してWebマップの作業を整理するには、タイルを所定のマップコンテキストで事前にレンダリング(生成)できるタイルストレージを整理するか、一連のサービスを使用してオンデマンドでタイルを生成するか、最初の2つのアプローチから何らかの共生を行う必要があります。
最初のアプローチには欠点があります-タイルには大量のストレージが必要です。 そのため、 OpenstreetMapによると 2011年3月の時点で、タイルには54 TBのストレージスペースが必要でした。 2015年6月の現在のデータの計算によると、この数字はスケール0〜17のタイルを保存するためにすでに約100 TB(これは単なる推定値であり、実際の実験を敢行しませんでした)です。 このような見積もりの​​「ゲイン」は、過去にOpenStreetMapデータが大幅に補充され、2011年3月に空だったエリアが詳細になったためです。 また、PNG形式(2011年3月 OpenStreetMapの633バイトに対する平均タイルサイズは4.63KB)の非最適な圧縮(OpenStreetMapと比較して私の場合)を取り除くことも不可能です。 。 いずれにせよ、タイルストレージには非常に多くのスペースが必要ですが、すべてのサーバーが余裕があるわけではありません。 ブロックファイルシステムの場合、状況が悪化するのは、小さなサイズのタイルがブロック全体を消費するためです(103バイトのタイルはブロック全体、たとえば4KBを占めることができます)。これにより、ハードディスクの物理スペースが非効率的に使用されます。 1つのディレクトリ内に多数のタイル(大規模なマップ用)がある場合、ファイルシステムが許可するよりも多くの必要な数のファイルまたはディレクトリを保存できないという問題が依然として存在する可能性があります。 しかし、これらすべてにより、このキャンペーンは、タイルを返すためのリクエストを実行するための快適な時間を提供します。
2番目のアプローチは、タイルサーバーの容量を要求しませんが、要求されたクライアントサービスにタイルを確実に生成して提供するいくつかのサービス(PostgreSQL、Postgis、HStore、mapnik、renderd、mod_tile、apache)の組織とサポートを必要とします。 また、タイルキャッシュを定期的にクリーンアップする必要があります。 言い換えれば、タイルサーバーのハードディスクの小容量に対する支払いは、アーキテクチャの複雑さと、特定の各タイルの返却要求を完了するのにかかる時間です(私の計算によれば、1クライアントのみで最大500ミリ秒です。

この出版物では、タイルサーバーのアーキテクチャについては触れません。 最終的に、サーバーのハードウェアから始めて、独自のWebマップサービスをどのように構築するかはユーザー次第です。 この記事では、タイルストレージのいくつかの機能に注意を払い、Webマップサービスを最適に構築できることを知りたいと思います。
ところで、私は混合アプローチに基づいてWebマップサービスを構築することにしました。 実際、私のWebサービスからのユーザーリクエストの地理は非常に明確に定義されています。 つまり ユーザーが要求するマップコンテキストを事前に知っているため、このマップコンテキストでタイルを再レンダリングできます。 私の場合、必要なタイルの量は3〜17のスケールで511GBでした。 同時に、スケール3..13では、以前に知っていたマップコンテキストから開始せずにすべてのタイルを生成しました。 生成されたタイルの数と体積に関する統計情報をマップスケール別に示します。
スケール生成された合計タイルスケールの合計タイル(4 ^ズーム)タイルの総数の%でシェアする生成されたタイルの量スケールの合計タイル合計タイルの%で共有
36464100130万130万100
4256256100430万430万100
51,0241,02410015M15M100
64,0964,0961005,000万5,000万100
716 38416 3841001億7600万1億7600万100
865,53665,536100651M651M100
9262 144262 1441001.7G1.7G100
101,048,5761,048,5761006.1G6.1G100
114 194 3044 194 30410018G18G100
1216 777 21616 777 21610069g69g100
136710886467108864100272g272g100
14279 938268 435 4560.103.2G1.1T0.29
151 897 5621,073,741,8240.1815G4.35T0.34
165 574 9384,294,967,2960.1334G17.4T0.19
1718 605 785171798691840.1194g69.6T0.13
合計115 842 6623665038759250.51511G92.8T0.51

タイルの過剰な複製


(途方もない能力に加えて)Webマップを開発するときに最初に気づいたのは、非常に頻繁に画像が繰り返されることです。 たとえば、海では、隣接する2つのタイルは同じように青く見えます。 ただし、視覚的に同じタイルとバイナリの同一タイルは2つの異なるものです。
仮説をテストして、2つの隣接するタイルのMD5チェックサムを比較したところ、同じであることが判明しました。
root@map:~# md5sum 10/0/0.png a99c2d4593978bea709f6161a8e95c03 10/0/0.png root@map:~# md5sum 10/0/1.png a99c2d4593978bea709f6161a8e95c03 10/0/1.png 

これは、すべてのタイルがMD5チェックサムで一意であることを意味しますか? もちろん違います!

衝突のようなものがあります。 つまり 2つの視覚的(バイナリを含む)異なるタイルは、同じチェックサムを持つことができます。 任意のサイズのファイルには小さいものの、このようなリスクがあります。 原則として、Webカードは絶対的な正確さを必要としないリソースであるため(銀行取引や外国為替相場などとは異なり)、タイルの衝突の可能性が低いことは正当化できる許容可能なリスクであると想定しています...
そして、実際には、いくつかのハッシュ関数で同一のタイルがあることを知ることは重要ですか? おそらくすでに推測したでしょう。 1つのファイルとすべての重複のマッピングを保存できる場合(たとえば、通常のシンボリックリンクを使用して)、複数の同一のタイルを保存し、それらにハードディスクを占有するのはなぜですか?
したがって、タイルの衝突の可能性が低いことは許容できるリスクであり、タイルストレージの容量に対する要件の減少を正当化します。 しかし、重複をすべて削除することでどれだけのメリットが得られますか? 私の推定によると、タイルの最大70%が複製されます。 さらに、スケールが大きいほど、この数字は大きくなります。
ハッシュ関数によるタイルの重複の除去を推測したのは私が最初ではなかったことに注意する必要があります。 そのため、 スプートニクチームはこのニュアンスを使用して、タイルキャッシュを最適に編成しました。 また、一般的なMBtiles形式では、タイルの重複排除の問題が解決されます。
以下の表と図では、見つかったタイルの重複(MD5上)の統計を示しています。
スケール総遺伝子。 タイル総テイク。 タイルコリチ。 倍のシェア。 タイル遺伝子の量。 タイルシンボリックリンクを作成した後のタイルの量ボリューム。 倍のシェア。 タイル
36400130万130万0
4256103.91430万420万0.92
51,024807.811460万14.3M2.13
64,09665909/164,970万47.1M5.18
716 3844 05824.77175.4M1億5960万9.04
865,53623 03135.14650.3M560.3M13.83
9262 144184 66870.451710M989M42.18
101,048,576767 43173.196.1G3.1G48.22
114 194 3043,553,10084.6718G4.4G75.41
1216 777 21614 797 68088.1869g12.4G82.01
136710886460 945 75090.82271.1G38.7g85.74
14279 93847 30716.93.2G185M5.71
151 897 537514 00509/2714.2G12.3G13.78
165 574 9381 934 55334.7033.8g26.4G21.86
1718 605 7858 312 46644.6893.8G62G33.82
トータル編集115 842 66291 084 80078.63511G164G07/32


次のことに留意する必要があります。

ブロックファイルシステムの問題について一言


遅かれ早かれ、ファイルシステムの選択の問題に直面するでしょう。 最初に、システムにすでにあるファイルシステムを使用します。 しかし、大量のデータに遭遇したり、タイルの過剰な複製に遭遇したり、並列リクエスト中に長いファイルシステムの応答で問題が発生したり、これらのディスクに障害が発生するリスクがある場合は、おそらくタイルキャッシュを配置する方法について考えるでしょう。
原則として、タイルはサイズが小さいため、 ブロックファイルシステムでのディスクスペースの非効率的な使用につながります 。また、多数のタイルはすべての空きiノードを使い果たす可能性が非常に高くなります。 ブロックサイズを小さなサイズに縮小すると、次のように最大ストレージ容量に影響します 通常、ファイルシステムはiノードの最大数によって制限されます。 重複するタイルをシンボリックリンクに置き換えても、タイルストレージに必要な容量を大幅に削減することはできません。 部分的に、ブロックの非充填の問題は、メタテーリングメカニズムの助けを借りて解決できます-いくつかのタイル(通常8x8または16x16)が特別なヘッダーを持つ単一のファイルに保存され、どのバイトに必要なタイルが含まれているかがわかります。 しかし、残念ながらメタタイルはタイルを重複排除するための労力をゼロに減らします。 2つの同一のメタタイル(集合N x Nタイル)を満たす可能性が大幅に低下し、メタファイルのヘッダー形式(8 x 8タイルのメタファイルを含む最初の532バイト)にはメタファイルのアドレスの書き込みが含まれます。 それにもかかわらず、今日では、メタタイリングを使用することで、隣接するタイルへのリクエストを「予測」できるため、タイルサーバーの応答時間を短縮できます。
いずれにせよ、タイルストレージの場合、いくつかの条件を満たしている必要があります。

上記の要件を最もよく満たすファイルシステムはZFSです。 このファイルシステムには固定ブロックサイズがなく、ブロックレベルでのファイルの重複が排除され、頻繁に使用されるファイルのメモリにキャッシュが実装されます。 同時に、Linuxオペレーティングシステムの組み込みサポートがなく(GPLライセンスとCDDLライセンスの非互換性のため)、プロセッサとRAMの負荷が増加します(従来のExtFS、XFSなどと比較して)。これは、物理的なフルコントロールの結果です。および論理キャリア。
BtrFSファイルシステムはLinuxにやさしく、重複排除(オフライン)をサポートしていますが、実稼働システムでは非常に未加工です。
タイルの重複を排除し、ディスク領域を可能な限り効率的に使用する他のソリューションがあります。 それらのほとんどすべてが、仮想ファイルシステムを作成し、それに接続して、この仮想ファイルシステムにアクセスし、その場でファイルを重複排除し、キャッシュに入れたり、キャッシュからファイルを送信したりすることができます。
たとえば、UKSM、LessFS、NetApp、およびその他の多くは、サービスレベルでデータ重複排除を実装しています。 しかし、実稼働環境では、特に高負荷のWebサービスでは、大量のサービスに大きな問題が伴います。 したがって、本番用のタイルキャッシュアーキテクチャの選択は、耐障害性が高く、管理が容易でなければなりません。
有名なスプートニク (言及された開発者に許されます-このプロジェクトは、私のWebマップサービスを構築することに基づいて私にとってポジティブな例になりました)は、独自の重複排除アルゴリズムを実装します。これは、タイルの重複排除を可能にする特定のハッシュ関数タイルは柔軟なCouchBaseに保存されます。
また、制作に自信を持っていた手段と似たようなものを構築しようとしました。 この場合、私の選択はRedisにかかっていました。 私の経験では、タイルをRedisのメモリに配置すると、ファイルシステムに配置する場合と比べて、占有メモリ量を30%削減できることが示されています。 なぜRedisを使用すると思いますか? 結局のところ、彼はRAMに住んでいますか?
この選択にはいくつかの理由があります。 まず第一に、信頼性。 実稼働中の1年間で、Redisは非常に信頼性が高く高速なツールとしての地位を確立しています。 第二に、理論的には、メモリからの応答はファイルシステムからの応答よりも高速です。 第三に、サーバーのRAMのコストは比較的低くなり、ハードドライブの信頼性はそれほど高くなく、近年改善されています。 つまり ハードディスクを使用したサーバーの集中的な作業(タイルのアップロード時に発生する)により、サーバーの障害のリスクが大幅に増加します。 さらに、私の組織には、それぞれが515GBのRAMを備えた約100台のサーバーがありますが(小さなハードドライブを使用)、メモリにタイルを効率的に配置できます(zxyが正しくプロキシされている場合->特定のサーバー)。 いずれにしても、私の選択はRedisにかかった。 尊敬される読者には押し付けません。 独自のWebマップサービスのアーキテクチャを独自に決定できます。
この記事には、Webマップサービスの文書化されていないニュアンスについて話すという1つの目的しかありませんでした。 無駄な研究作業ではなく、できれば私の研究を犠牲にして時間とお金を節約してください!


Source: https://habr.com/ru/post/J265807/


All Articles