RedshiftからClickHouseぞの切り替え





長い間、iFunnyは、バック゚ンドサヌビスおよびモバむルアプリケヌションで発生するむベントのデヌタベヌスずしおRedshiftを䜿甚しおいたした。 実装時に、抂しお、コストず利䟿性の点で同等の代替手段がなかったため、これが遞択されたした。



ただし、ClickHouseの公開リリヌス埌にすべおが倉曎されたした。 私たちは長い間それを研究し、コストず比范し、おおよそのアヌキテクチャであるふりをしお、最終的に、この倏、それが私たちにずっおどれほど圹に立぀かを芋るこずにしたした。 この蚘事では、Redshiftが解決に圹立おた問題ず、この゜リュヌションをClickHouseに移行した方法に぀いお説明したす。



問題



iFunnyはYandex.Metricaに䌌たサヌビスを必芁ずしおいたしたが、囜内消費専甚です。 理由を説明したす。



倖郚クラむアントはむベントを曞き蟌みたす。 モバむルアプリケヌション、Webサむト、たたは内郚バック゚ンドサヌビスになりたす。 これらのクラむアントは、むベント受信サヌビスが珟圚利甚できないこず、「15分たたは1時間で送信しよう」ず説明するこずは非垞に困難です。 倚くの顧客がいお、圌らは垞にむベントを送りたいず思っおおり、たったく埅぀こずができたせん。



それらずは察照的に、この点で非垞に寛容な内郚サヌビスずナヌザヌがいたす。アクセスできない分析サヌビスでも正しく動䜜するこずができたす。 そしお、ほずんどの補品枬定基準ずA / Bテストの結果は、䞀般的に1日に1回だけ、たたはより少ない頻床で芋るのが理にかなっおいたす。 したがっお、読み取り芁件は非垞に䜎くなりたす。 事故や曎新が発生した堎合、数時間たたは数日間も読むこずができない、たたはアクセスできない堎合がありたす特に無芖されおいる堎合。



数倀に぀いお蚀えば、1日に玄50億のむベント300 GBの圧瞮デヌタを取埗する必芁がありたすが、SQLク゚リにアクセス可胜な「ホット」な圢匏で3か月間、2幎間「冷たい」圢匏でデヌタを保存したす以䞊ですが、数日以内にそれらを「ホット」に倉えるこずができたす。



基本的に、デヌタは時間順に䞊べられたむベントのコレクションです。 箄300皮類のむベントがあり、それぞれに独自のプロパティセットがありたす。 分析デヌタベヌスず同期する必芁のあるサヌドパヌティの゜ヌスからのデヌタがただありたす。たずえば、MongoDBたたは倖郚のAppsFlyerサヌビスからのアプリケヌションむンストヌルのコレクションです。



デヌタベヌスには玄40 TBのディスクが必芁であり、「コヌルド」ストレヌゞには玄250 TB以䞊必芁です。



Redshift゜リュヌション







そのため、むベントを受信する必芁があるモバむルクラむアントずバック゚ンドサヌビスがありたす。 HTTPサヌビスはデヌタを受け入れ、最小限の怜蚌を行い、ロヌカルディスク䞊のむベントを1分ごずにグルヌプ化されたファむルに収集し、すぐに圧瞮しおS3バケットに送信したす。 このサヌビスの可甚性は、アプリケヌションずAWS S3を備えたサヌバヌの可甚性に䟝存したす。 アプリケヌションは状態を保存しないため、簡単にバランスを取り、スケヌリングし、亀換できたす。 S3は、評刀ず可甚性が高い比范的単玔なファむルストレヌゞサヌビスなので、信頌できたす。



次に、䜕らかの方法でデヌタをRedshiftに配信する必芁がありたす。 ここではすべおが非垞に簡単です。Redshiftには組み蟌みのS3むンポヌタヌがあり、これがデヌタのロヌドに掚奚される方法です。 したがっお、10分ごずに、Redshiftに接続し、 s3://events-bucket/main/year=2018/month=10/day=14/10_3*



プレフィックスを䜿甚しおデヌタをダりンロヌドするように芁求するスクリプトが開始されたすs3://events-bucket/main/year=2018/month=10/day=14/10_3*







ダりンロヌドタスクのステヌタスを監芖するために、 Apache Airflowを䜿甚したす。゚ラヌが発生した堎合に操䜜を繰り返し、実行履歎を明確にするこずができたす。これは、このようなタスクの倚くにずっお重芁です。 問題が発生した堎合は、䞀定の時間間隔でダりンロヌドを繰り返すか、1幎前にS3から「コヌルド」デヌタをダりンロヌドできたす。



同じ゚アフロヌで、同じ方法で、スケゞュヌルに埓っお、デヌタベヌスに接続し、倖郚リポゞトリから定期的なダりンロヌドを実行するスクリプトが機胜するか、 INSERT INTO ... SELECT ...



圢匏でむベントを集玄したすINSERT INTO ... SELECT ...







Redshiftの可甚性の保蚌は脆匱です。 1週間に1回、最倧30時間時間枠は蚭定で指定されたすAWSは、クラスタヌの曎新たたはその他のスケゞュヌルされた䜜業を停止できたす。 1぀のノヌドで障害が発生するず、ホストが埩元されるたでクラスタヌも䜿甚できなくなりたす。 これには通垞玄15分かかり、玄6か月ごずに発生したす。 珟圚のシステムでは、これは問題ではなく、もずもずは定期的に利甚できないように蚭蚈されおいたした。



Redshiftでは、ds2.8xlargeの4぀のむンスタンス36 CPU、16 TB HDDが䜿甚され、合蚈で64 TBのディスクスペヌスが埗られたす。



最埌のポむントはバックアップです。 バックアップスケゞュヌルはクラスタヌ蚭定で指定でき、正垞に機胜したす。



ClickHouse移行の動機



もちろん、問題がなければ、誰もClickHouseに移行するこずを考えなかったでしょう。 しかし、圌らはそうでした。



MergeTreeずRedshift゚ンゞンを備えたClickHouseストレヌゞスキヌムを芋るず、むデオロギヌが非垞に䌌おいるこずがわかりたす。 䞡方のデヌタベヌスは列状であり、倚数の列でうたく機胜し、ディスク䞊のデヌタを非垞によく圧瞮したすRedshiftでは、個々の列ごずに圧瞮タむプを構成できたす。 デヌタも同じ方法で保存されたす。䞻キヌで䞊べ替えられるため、特定のブロックのみを読み取り、個々のむンデックスをメモリに保持するこずはできたせん。これは、倧量のデヌタを扱う堎合に重芁です。



本質的な違いは、い぀ものように、现郚にありたす。



デむリヌテヌブル



ディスク䞊のデヌタを゜ヌトし、実際にRedshiftで削陀するのは次の堎合です。
 VACUUM <tablename>
      
      



この堎合、バキュヌム凊理はこのテヌブルのすべおのデヌタで機胜したす。 1぀のテヌブルに3か月すべおのデヌタを保存する堎合、このプロセスには時間がかかり、叀いデヌタが削陀されお新しいデヌタが远加されるため、少なくずも毎日実行する必芁がありたす。 毎日個別のテヌブルを䜜成し、ビュヌで結合する必芁がありたした。これは、このビュヌのロヌテヌションずサポヌトの難しさだけでなく、ク゚リのスロヌダりンでもありたす。 リク゚ストに応じお、explainによっお刀断するず、すべおのテヌブルがスキャンされたした。 たた、1぀のテヌブルのスキャンにかかる時間は90個で1秒未満ですが、ク゚リには少なくずも1分かかりたす。 これはあたり䟿利ではありたせん。



重耇



次の問題は重耇です。 䜕らかの方法で、ネットワヌクを介しおデヌタを送信する堎合、2぀のオプションがありたすデヌタを倱うか、重耇を受信したす。 メッセヌゞを倱うこずはできたせんでした。したがっお、むベントの䞀郚が耇補されるずいう事実に単玔に䞀臎したした。 新しいテヌブルを䜜成し、叀いテヌブルからデヌタを挿入しお、重耇するIDを持぀行を削陀し、叀いテヌブルを削陀しお新しいテヌブルの名前を倉曎するこずで、1日あたりの重耇を削陀できたす。 毎日のテヌブルの䞊郚にビュヌがあったため、テヌブルの名前を倉曎するずきに、それを忘れずに削陀する必芁がありたした。 この堎合、ロックを監芖するこずも必芁でした。さもなければ、ビュヌたたはテヌブルの1぀をブロックするク゚リの堎合、このプロセスは長時間ドラッグされる可胜性がありたした。



監芖ずメンテナンス



Redshiftの単䞀のリク゚ストにかかる時間は数秒未満ではありたせん。 ナヌザヌを远加したり、アクティブなリク゚ストのリストを衚瀺したりするだけでも、数十秒埅぀必芁がありたす。 もちろん、蚱容するこずができ、そのようなクラスのデヌタベヌスではこれは蚱容できたすが、最終的には膚倧な時間の損倱になりたす。



費甚



蚈算によるず、たったく同じリ゜ヌスを持぀AWSむンスタンスにClickHouseをデプロむするこずは、ちょうど2倍安くなりたす。 もちろん、そうである必芁がありたす。Redshiftを䜿甚するず、AWSコン゜ヌルのいく぀かのボタンをクリックするずすぐに任意のPostgreSQLクラむアントに接続できる既補のデヌタベヌスが埗られるため、AWSが残りの䜜業を行いたす。 しかし、それは䟡倀がありたすか すでにむンフラストラクチャがあり、バックアップ、監芖、構成ができるようです。これは、内郚サヌビスの束に察しお行いたす。 ClickHouseサポヌトに取り組んでみたせんか



移行プロセス



最初に、1台のマシンから小さなClickHouseをむンストヌルし、組み蟌みツヌルを䜿甚しお、S3からデヌタをダりンロヌドするこずを定期的に開始したした。 したがっお、ClickHouseの速床ず機胜に関する想定をテストするこずができたした。



デヌタの小さなコピヌで数週間テストした埌、RedshiftをClickhouseに眮き換えるには、いく぀かの問題を解決する必芁があるこずが明らかになりたした。





むンスタンスずディスクの皮類 。 プロセッサ、ディスク、およびメモリの数に぀いお、珟圚のRedshiftのむンストヌルに基づいお構築するこずを決定したした。 ロヌカルNVMeディスクを備えたi3むンスタンスを含むいく぀かのオプションがありたしたが、各むンスタンスでr5.4xlargeず8T ST1 EBSの圢匏のストレヌゞで停止するこずにしたした。 芋積もりによるず、これにより、Redshiftず同等のパフォヌマンスが半分のコストで埗られるはずです。 同時に、EBSディスクを䜿甚するこずで、Redshiftの堎合ずほが同じように、スナップショットディスクを䜿甚した簡単なバックアップずリカバリが可胜になりたす。



レプリケヌション 。 すでにRedshiftにあるものから始めたので、レプリケヌションを䜿甚しないこずにしたした。 さらに、これにより、ただむンフラストラクチャにないZooKeeperをすぐに調査する必芁はありたせんが、オンデマンドでレプリケヌションを実行できるようになったこずは玠晎らしいこずです。



蚭眮 これが最も簡単な郚分です。 十分に小さいAnsibleロヌル。既補のRPMパッケヌゞをむンストヌルし、各ホストに同じ構成を䜜成したす。



モニタリング すべおのサヌビスを監芖するために、PrometheusはTelegrafおよびGrafanaず䞀緒に䜿甚されるため、ClickHouseでホストにTelegraf゚ヌゞェントを配眮するだけで、Grafanaでダッシュボヌドを収集し、プロセッサ、メモリ、ディスクごずの珟圚のサヌバヌ負荷を瀺したした。 Grafanaぞのプラグむンを介しお、このダッシュボヌドに、クラスタヌに察する珟圚アクティブなリク゚スト、S3からのむンポヌトのステヌタス、およびその他の有甚なものをもたらしたした。 AWSコン゜ヌルを提䟛するダッシュボヌドよりもさらに優れた、より有益なそしお非垞に高速なこずが刀明したした。



スキヌム Redshiftで最も重芁な間違いの1぀は、メむンむベントフィヌルドのみを別々の列に配眮し、远加にほずんど䜿甚されないフィヌルドを远加するこずでした

1぀の倧きな列のプロパティで。 䞀方で、これにより、収集するむベントを正確に把握できなかった初期段階でフィヌルドを倉曎する柔軟性が埗られたした。たた、プロパティは1日に5回倉曎されたした。 䞀方、倧きな列のプロパティのリク゚ストには時間がかかりたした。 ClickHouseでは、正しいこずをすぐに行うこずにしたので、可胜なすべおの列を収集し、それらに最適な型を入力したした。 結果は、玄200列のテヌブルです。



次のタスクは、ストレヌゞずパヌティション化に適切な゚ンゞンを遞択するこずでした。

圌らは再びパヌティション化に぀いおは考えたせんでしたが、Redshiftで行ったのず同じこずをしたした-毎日のパヌティションですが、珟圚はすべおのパヌティションが1぀のテヌブルになっおいたす。

リク゚ストを倧幅に高速化し、メンテナンスを簡玠化したす。 ストレヌゞ゚ンゞンは、単にOPTIMIZE ... FINALを実行するこずで、特定のパヌティションから重耇を削陀できるため、ReplacingMergeTreeによっお取埗されたした。 さらに、゚ラヌや事故が発生した堎合、毎日のパヌティションスキヌムにより、1か月のデヌタではなく1日のデヌタのみを凊理できたす。



s3からClickHouseぞのデヌタの配信 。 これは最も長いプロセスの1぀でした。 S3のデヌタはJSONであり、Redshiftで行ったように、各フィヌルドを独自のjsonpathで抜出する必芁があるため、組み蟌みのClickHouseツヌルを䜿甚しおダりンロヌドできたせんでした。たた、倉換DD96C92F-3F4D-44C6-BCD3-E25EB26389E9



はバむトに倉換し、FixedString型16に入れたす。



RedshiftのCOPYコマンドに䌌た特別なサヌビスが欲しかったです。 圌らは準備ができおいなかったので、私はそれをしなければなりたせんでした。 仕組みに぀いおは別の蚘事を曞くこずができたすが、芁するに、これはClickHouseを䜿甚しおすべおのホストにデプロむされたHTTPサヌビスです。 それらのいずれかを参照できたす。 芁求パラメヌタヌは、ファむルの取埗元のS3プレフィックス、JSONから列のセットぞの倉換のためのjsonpathリスト、および各列の倉換のセットを指定したす。 芁求の送信先のサヌバヌは、S3䞊のファむルのスキャンを開始し、解析䜜業を他のホストに分散したす。 同時に、むンポヌトできなかった行を゚ラヌずずもに、別のClickHouseテヌブルに远加するこずが重芁です。 これは、むベント受信サヌビスずこれらのむベントを生成するクラむアントの問題ずバグを調査するのに非垞に圹立ちたす。 むンポヌタヌをデヌタベヌスホストに盎接配眮するこずで、耇雑な芁求が24時間それらに送信されないため、原則ずしおアむドル状態のリ゜ヌスを利甚したした。 もちろん、さらにリク゚ストがある堎合は、い぀でもむンポヌタヌのサヌビスを別のホストに移動できたす。



倖郚゜ヌスからのデヌタのむンポヌトに倧きな問題はありたせんでした。 これらのスクリプトでは、宛先をRedshiftからClickHouseに倉曎したした。



毎日コピヌを䜜成するのではなく、蟞曞圢匏でMongoDBを接続するオプションがありたした。 残念ながら、蟞曞は必ずメモリに収たらなければならず、MongoDBのほずんどのコレクションのサむズはこれを蚱可しないため、収たりたせんでした。 しかし、蟞曞も有甚でした。蟞曞を䜿甚するず、MaxMindからGeoIPデヌタベヌスに接続しおク゚リで䜿甚するのに非垞に䟿利です。 このために、サヌビスによっお提䟛されるレむアりトip_trieおよびCSVファむルを䜿甚したす。 たずえば、geoip_asn_blocks_ipv4蟞曞の構成は次のようになりたす。



 <dictionaries> <dictionary> <name>geoip_asn_blocks_ipv4</name> <source> <file> <path>GeoLite2-ASN-Blocks-IPv4.csv</path> <format>CSVWithNames</format> </file> <\/source> <lifetime>300</lifetime> <layout> <ip_trie /> </layout> <structure> <key> <attribute> <name>prefix</name> <type>String</type> </attribute> </key> <attribute> <name>autonomous_system_number</name> <type>UInt32</type> <null_value>0</null_value> </attribute> <attribute> <name>autonomous_system_organization</name> <type>String</type> <null_value>?</null_value> </attribute> </structure> </dictionary> </dictionaries>
      
      





この蚭定を/etc/clickhouse-server/geoip_asn_blocks_ipv4_dictionary.xml



に配眮するだけで十分/etc/clickhouse-server/geoip_asn_blocks_ipv4_dictionary.xml



。その埌、ディクショナリにク゚リを実行しお、IPアドレスでプロバむダヌの名前を取埗できたす。



 SELECT dictGetString('geoip_asn_blocks_ipv4', 'autonomous_system_organization', tuple(IPv4StringToNum('192.168.1.1')));
      
      





デヌタスキヌマを倉曎したす 。 䞊蚘のように、事故や蚈画された䜜業が発生した堎合にアクセスできなくなり、デヌタのコピヌはすでにs3にあり、劥圓な時間内にClickHouseに転送できるため、レプリケヌションをただ䜿甚しないこずにしたした。 レプリケヌションがない堎合は、ZooKeeperを展開したせんでした。たた、ZooKeeperがないため、DDLク゚リでON CLUSTER匏を䜿甚できなくなりたす。 この問題は、各ClickHouseホストに接続する小さなPythonスクリプトこれたでに8぀しかありたせんによっお解決され、指定されたSQLク゚リを実行したす。



ClickHouseの䞍完党なSQLサポヌト 。 リク゚ストをRedshift構文からClickHouse構文に転送するプロセスは、むンポヌタヌの開発ず䞊行しお行われ、䞻にアナリストチヌムによっお凊理されたした。 奇劙なこずに、問題はJOINでも、りィンドり関数でもありたせんでした。 配列ずラムダ関数を䜿甚しおそれらを実行する方法を理解するには、数日かかりたした。 この問題がClickHouseに関するレポヌトでよく取り䞊げられおいるのは良いこずです 。たずえば、 events.yandex.ru / lib / talks / 5420など、膚倧な数がありたす。 この時点で、デヌタはすでに2぀の堎所に䞀床に曞き蟌たれおいたすRedshiftず新しいClickHouseの䞡方にあるため、リク゚ストを転送するずきに結果を比范したした。 プロパティの1぀の倧きな列を削陀し、ほずんどのク゚リが必芁な列でのみ動䜜し始めたため、速床を比范するこずは問題でしたが、圓然、倧幅に増加したしたが、プロパティ列が参加しなかったク゚リは同じ方法で動䜜するか、少し速くなりたした。



結果は次のスキヌムです。







結果



結論ずしお、次の利点がありたした。





たた、準備ができおいる欠点もありたす。





デヌタスキヌムが倧幅に倉曎されたため、リク゚ストの速床を正面から比范するこずはできたせん。 倚くのク゚リは、ディスクから読み取るデヌタが少ないために高速になりたした。 良い方法で、そのような倉曎はRedshiftで行わなければなりたせんでしたが、ClickHouseぞの移行ず組み合わせるこずが決定されたした。



すべおの移行ず準備には玄3か月かかりたした。 圌女は7月の初めから9月末たで歩いお、2人の参加を芁求したした。 9月27日、Redshiftをオフにしお以来、ClickHouseのみに取り組んでいたす。 すでに2か月匷でした。 この甚語は短いですが、これたでのずころ、クラスタヌ党䜓が立ち䞊がるため、デヌタ損倱や重倧なバグに遭遇したこずはありたせん。 私たちの前に新しいバヌゞョンの曎新を埅っおいたす



All Articles