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.4k
大量データを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
CSS Linter の現在地 2025年のベストプラクティスを探る
ryo_manba
6
1.9k
iOSDC.pdf
chronos2500
1
390
Design Foundational Data Engineering Observability
sucitw
3
210
print("Hello, World")
eddie
2
540
HTMLの品質ってなんだっけ? “HTMLクライテリア”の設計と実践
unachang113
4
3k
Putting The Genie in the Bottle - A Crash Course on running LLMs on Android
iurysza
0
150
個人開発で徳島大学生60%以上の心を掴んだアプリ、そして手放した話
akidon0000
1
180
半自動E2Eで手っ取り早くリグレッションテストを効率化しよう
beryu
4
710
Swift Updates - Learn Languages 2025
koher
2
530
スケールする組織の実現に向けた インナーソース育成術 - ISGT2025
teamlab
PRO
3
190
検索機能リプレイスを4ヶ月→2ヶ月に! AI Agentで実現した2倍速リプレイス
fuuki12
3
560
AIと私たちの学習の変化を考える - Claude Codeの学習モードを例に
azukiazusa1
11
4.7k
Featured
See All Featured
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.1k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Large-scale JavaScript Application Architecture
addyosmani
513
110k
Typedesign – Prime Four
hannesfritz
42
2.8k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.2k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
Learning to Love Humans: Emotional Interface Design
aarron
274
40k
GitHub's CSS Performance
jonrohan
1032
460k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
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分 ただし、キャッシュへの挿入のみ