Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
大量データをRedisに入れる際の 容量問題にどう対処したか
Search
Templiver
January 31, 2023
Programming
0
1.5k
大量データをRedisに入れる際の 容量問題にどう対処したか
Templiver
January 31, 2023
Tweet
Share
More Decks by Templiver
See All by Templiver
クリーンアーキテクチャの NodeJSによる実装例
terashin
0
1.4k
Other Decks in Programming
See All in Programming
生成AIを活用したソフトウェア開発ライフサイクル変革の現在値
hiroyukimori
PRO
0
110
日本だけで解禁されているアプリ起動の方法
ryunakayama
0
280
AgentCoreとHuman in the Loop
har1101
5
250
CSC307 Lecture 10
javiergs
PRO
1
660
AIエージェントのキホンから学ぶ「エージェンティックコーディング」実践入門
masahiro_nishimi
6
690
Best-Practices-for-Cortex-Analyst-and-AI-Agent
ryotaroikeda
1
110
Automatic Grammar Agreementと Markdown Extended Attributes について
kishikawakatsumi
0
200
Package Management Learnings from Homebrew
mikemcquaid
0
230
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.9k
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.4k
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
620
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
1k
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
0
3.4k
Test your architecture with Archunit
thirion
1
2.2k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.3k
A designer walks into a library…
pauljervisheath
210
24k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
110
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
1.8k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
The World Runs on Bad Software
bkeepers
PRO
72
12k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
440
Transcript
大量データをRedisに入れる際の 容量問題にどう対処したか
どういうことを話すか? • 背景 • Redisの容量問題にどう対処したか • Redisクラスターを使う注意点 • AWS Elasticacheの設定をどうするか
• パフォーマンスチューニング
背景 DPAフィードデータを入れる際に、 Redisの容量問題に遭遇した
DPAとは? ECサイトなどの閲覧履歴元に広告を配信する仕組み
DPAフィードデータとは? DPAフィードデータ Redis 閲覧履歴 配信システム zero
どうやってDPAフィードデータを入れている? ... ... ... RDS Elasticache 在庫あり 在庫なし 全部 保存
削除 保存 前日 今日 差分 差分 1. 差分の作成 2. 差分の取り込み
どんな問題が発生していた? cache.r6g.12xlarge Elasticache(Redis) 3億件 90% cache.r6g.16xlarge Elasticache(Redis) 3億件 最大 yahooなど
どう対応したか?
どんな解決策があった? Re Re Re Re Re Re Re Re Re
プロキシ ノードの対応関係を 定期的にロード Redisクラスター Proxy
なぜRedisクラスターへ移行することにしたの? コスト面、運用面でのコストが 最も低いため
AWSで使うには? Elasticache(Redis)で クラスターモードを有効にする
どういう設定にする? シャード数をどうするか? • 制限に気をつける ◦ 上限は、90 例: レプリカ2、プライマリ1構成であれば30ノード。 ◦ redis5.0.3以上の場合、500まで緩和可能
ノードタイプ をどうするか? • クラスターの各ノードタイプ は全て同じ コスト面から少しずつ増やしたいなら小さいものを選ぶ。
RedisとRedisクラスターの違いとは? • マルチ操作がスロット単位でしか行えない • リダイレクトが発生する • ライブラリがサポートしていない可能性
どんな対応をしたの? Re Redis Redisクラスター Re Re Re MSET SET リダイレクト
何か問題は発生した?
問題1: go-redisのSETパフォーマンス 4時間で40万件ほどしかデータが入らなかった 全データ(約3億件)入れるのに4ヶ月ほどかかりそう。。 40万件 4時間後 Redisクラスター Redisクラスター
問題1: go-redisのSETパフォーマンス 参考: https://blog.yuuk.io/entry/2020/goredis-performance-degradation 【原因】 古いgo-redisでRedis6にPipelineを使うと パースエラーのせいでCOMMANDコマンドの結果を キャッシュできない。 【対応】 go-redisのバージョンをv8以上にした。
問題1: go-redisのSETパフォーマンス 100倍高速になった これでも既存MGETの10倍遅い。 全データ入れるのに9日ほどかかる。。
問題1: go-redisのSETパフォーマンス シェルスクリプトで実行すると 高速化する話を聞き、書き直した
問題1: go-redisのSETパフォーマンス ... 各直列の10000 コマンド SET SET SET ... 1000件同時実行
Redis クラスター
問題2: 圧縮したバイト配列をそのまま流せない 圧縮したバイト配列をそれぞれファイルに入れて、 次のように実行する必要があった redis-cli -x set key <compressed.txt
問題2: 圧縮したバイト配列をそのまま流せない 500万レコード入れるのに、 500万ファイル作成するのは現実的ではなさそう。。
圧縮はせず、 JSONフィールド名の短縮を行なった 問題2: 圧縮したバイト配列をそのまま流せない
問題3: 260万件ほど書き込むとそれ以降進まなくなった Redis クラスター ... 大量のTIME_WAIT サーバー TIME_WAITコネクションが溜まりポートが枯渇してしまった
問題3: 260万件ほど書き込むとそれ以降進まなくなった TIME_WAITコネクションを再利用できるよう カーネルパラメータ を変更した net.ipv4.tcp_tw_reuse = 1 参考: https://blog.spacemarket.com/code/aws-batch-%E3%81%A7%E3%82%AB%E3%83%BC%E3%83%8D%E3%83%AB-%E3%83%91
%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF-%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3 %82%B0/
問題3: 260万件ほど書き込むとそれ以降進まなくなった 1000万件入れるのにかかる時間が、 60分 -> 5分と12倍高速になった ※ redisのコマンド実行部分だけでの比較
問題4: 1コマンドごとの結果をファイルに書き出していたら遅い 【対応】 コマンドを実行する大元のスクリプトの実行結果を ファイルに書き出してエラーチェックするようにした 【結果】 1000万件処理する場合、 バッチの実行時間が43分 -> 39分になった。
問題5: 値をダブルクオートしていると遅い 【対応】 値を囲むのを、 ダブルクオートからシングルクオートに変更した。 【結果】 1000万件処理する場合、 バッチの実行時間が39分 -> 17分と半分以下になった。
問題6: Operation timed outが発生する 【対応】 Redisコマンドの同時実行数を1000 -> 500に変更。 【結果】 Operation
timed outは発生しなくなった。 時々発生する。
問題7: jedisのGETパフォーマンス 【200件取得のパフォーマンス比較】 既存のMGET: 5.157 ms RedisクラスターのGET: 24.835
ms 5倍ほど遅い。。
問題7: jedisのGETパフォーマンス Re Re Re GET リダイレクト Re Re Re
MGET jedis lettuce
問題7: jedisのGETパフォーマンス 【200件取得のパフォーマンス比較】 既存のMGET: 5.157 ms RedisクラスターのGET(lettuce): 5.386
ms RedisクラスターのGET(jedis): 24.835 ms 既存とほぼ同じくらいになった jedisと比較して5倍高速に。
結果 【バッチの実行時間】 1000万件入れるのに30分 ただし、キャッシュへの挿入のみ