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
三者三様 宣言的UI
kkagurazaka
0
290
SwiftDataを使って10万件のデータを読み書きする
akidon0000
0
250
Cursorハンズオン実践!
eltociear
2
1.2k
外接に惑わされない自システムの処理時間SLIをOpenTelemetryで実現した話
kotaro7750
0
120
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
600
NIKKEI Tech Talk#38
cipepser
0
320
Towards Transactional Buffering of CDC Events @ Flink Forward 2025 Barcelona Spain
hpgrahsl
0
120
社会人になっても趣味開発を続けたい! / traPavilion
mazrean
1
110
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
390
Devvox Belgium - Agentic AI Patterns
kdubois
1
150
Swift Concurrency 年表クイズ
omochi
2
140
理論と実務のギャップを超える
eycjur
0
200
Featured
See All Featured
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
Gamification - CAS2011
davidbonilla
81
5.5k
Agile that works and the tools we love
rasmusluckow
331
21k
GraphQLとの向き合い方2022年版
quramy
49
14k
A better future with KSS
kneath
239
18k
Embracing the Ebb and Flow
colly
88
4.9k
What's in a price? How to price your products and services
michaelherold
246
12k
Optimizing for Happiness
mojombo
379
70k
4 Signs Your Business is Dying
shpigford
186
22k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
10
900
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.1k
The Power of CSS Pseudo Elements
geoffreycrofte
80
6k
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分 ただし、キャッシュへの挿入のみ