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
680
大量データをRedisに入れる際の 容量問題にどう対処したか
Templiver
January 31, 2023
Tweet
Share
More Decks by Templiver
See All by Templiver
クリーンアーキテクチャの NodeJSによる実装例
terashin
0
1.2k
Other Decks in Programming
See All in Programming
Site Reliability Engineering for GMO
pyama86
7
980
Behind VS Code Extensions for JavaScript / TypeScript Linnting and Formatting
unvalley
4
310
Folding Cheat Sheet #2
philipschwarz
PRO
0
110
Java 22 Overview
kishida
1
170
Javaエンジニアのための Nodejs/Nuxt3入門
hidekatsu_izuno
0
280
educure_カリキュラム生操作マニュアル.pdf
linew_official
0
500
From Spring Boot 2 to Spring Boot 3 with Java 22 and Jakarta EE
ivargrimstad
0
940
PHP8.3の機能を振り返る / Review of PHP 8.3 features
seike460
PRO
1
110
Zero Waste, Radical Magic, and Italian Graft – Quarkus Efficiency Secrets
hollycummins
0
220
StoreKit2によるiOSのアプリ内課金のリニューアル
kangnux
0
100
Semantic search with Django and pgvector
pauloxnet
0
240
TYPO3 v13 – The road to LTS: What's new and new APIs
luisasofie_xoxo
0
180
Featured
See All Featured
A Modern Web Designer's Workflow
chriscoyier
688
190k
Bootstrapping a Software Product
garrettdimon
PRO
301
110k
Fashionably flexible responsive web design (full day workshop)
malarkey
397
65k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
15
1.4k
How GitHub Uses GitHub to Build GitHub
holman
468
290k
StorybookのUI Testing Handbookを読んだ
zakiyama
11
4.6k
Designing the Hi-DPI Web
ddemaree
276
33k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
220
21k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
60
14k
The Cult of Friendly URLs
andyhume
74
5.7k
Agile that works and the tools we love
rasmusluckow
324
20k
Side Projects
sachag
451
41k
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分 ただし、キャッシュへの挿入のみ