---
title: 【DeNATechCon2024】大規模配信サービスのコメントテーブルをシャーディングした話
tags: 
author: [DeNA_Tech](https://www.docswell.com/user/DeNA_Tech)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/GE5GY5QQE4.jpg?width=480
description: DeNA が提供するライブ配信アプリ『Pococha』は、50万以上の月間ユニークユーザーを抱える大規模アプリです。Pococha は配信者と視聴者の相互コミュニケーションを重要視しており、ピーク時にはコメント(ライブチャット)は毎時100万件以上にも上り、テーブルにかかる書き込み負荷が非常に高いです。しかしこのコメントテーブルは単一のメインデータベースに保存されていたので、アプリケーション全体へ悪影響を及ぼしていました。  本登壇では、技術基盤チームで業務を行っていた登壇者が最適な ID 形態を設計し、コメントテーブルをユーザごとのデータベースにシャーディングし、サービス全体の負荷を軽減させたことについてお話します。
published: February 29, 24
canonical: https://www.docswell.com/s/DeNA_Tech/ZGX76L-2024-02-29-091056
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/GE5GY5QQE4.jpg)

大規模配信サービスのコメントテーブルをシャーディングした話
© DeNA Co., Ltd.


# Page. 2

![Page Image](https://bcdn.docswell.com/page/972YGNPW7R.jpg)

⾃⼰紹介
nagataaaas
永⽥ ⼤和 (Nagata Yamato)
‧2022年に⾼専卒業‧新卒⼊社、研修後Pococha技術基盤チー
ムに配属
‧2023年7⽉にアジャイル開発チームに異動
‧好きな⾔語はPython(⽣まれたてのヒナが初めてみたモノを
親と思うアレ)
© DeNA Co., Ltd.
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/DJYGVP59JM.jpg)

やってきたこと
⾼専⼊学
フリーランスに
インターンシップ
@ DeNA
2018/08
2017/04
© DeNA Co., Ltd.
2022/10
2022/03
2019/08
インターンシップ
＠ LINE様
アジャイル開発
チームに異動
2022新卒エンジニア
としてPocochaに配属
2023/07
2022/07
⾼専卒業
社会の荒波に
揉まれ始める
本発表で話す
コメントテーブル
のシャーディング
施策を⾏う
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/V7NGM5NDE8.jpg)

⽬次
1. Pocochaについて
2. シャーディングの⽬的
3. 他テーブルからの参照‧リレーションの対応
4. シャーディングのためのID形態
5. ダウンタイムなしのマイグレーション⽅法
6. まとめ
© DeNA Co., Ltd.
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/YJ9WNYR8J3.jpg)

1.
Pocochaについて
「自分らしさ」を発揮し、スマホ一つで誰かにとって
特別な存在になれるライブコミュニケーションアプリ
© DeNA Co., Ltd.
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/GJ8NK6WZED.jpg)

1.
Pocochaについて
Pocochaは急⾓度のグロースを
経験している
●
コロナでの巣篭もり需要から、ライブスト
リーミングアプリ⾃体が全体的に伸びた
●
リリースから数百%単位でのグロースが続
き、アプリの規模に対して追いついていない
アーキテクチャになっている部分がある
●
特にチャット機能（コメント）を⽤いた
双⽅向コミュニケーションを主軸において
おり、コメント周りの負荷が甚⼤
© DeNA Co., Ltd.
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/LJLPZ9N1ER.jpg)

2.
シャーディングの⽬的
そもそもシャーディングって？
© DeNA Co., Ltd.
●
⽔平分割ともよばれる
●
単⼀のテーブル⾃体を複数のデータベースに分散させる
●
各シャードは同じテーブル構造だが、保存されているレコードが異なる
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/47M4VZX5EW.jpg)

2.
シャーディングの⽬的
��
© DeNA Co., Ltd.
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/P7RW26NZE9.jpg)

2.
シャーディングの⽬的
メインDB
comments
user_id
© DeNA Co., Ltd.
body
1
よ
2
はろー
1
こんちゃ
4
Python!
2
Dena?
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/PJXPDMN1EX.jpg)

2.
サブDB 1
メインDB
シャーディングの⽬的
サブDB 2
comments
user_id
© DeNA Co., Ltd.
body
1
よ
2
はろー
1
こんちゃ
4
Python!
2
Dena?
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/3JKDXGNM7D.jpg)

2.
サブDB 1
メインDB
サブDB 2
comments
comments
comments
user_id
© DeNA Co., Ltd.
シャーディングの⽬的
body
user_id
body
1
よ
2
はろー
1
こんちゃ
4
Python!
2
Dena?
user_id
body
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/LE3R5NV275.jpg)

2.
サブDB 1
メインDB
サブDB 2
comments
comments
comments
user_id
4
© DeNA Co., Ltd.
シャーディングの⽬的
body
Python!
user_id
body
user_id
body
1
よ
2
はろー
1
こんちゃ
2
Dena?
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/8EDYDW86EG.jpg)

2.
シャーディングの⽬的
メインDB
users
lives
shard_mapping
…
user2
user3
some_table
some_table
some_table
some_table2
some_table2
some_table2
…
…
…
© DeNA Co., Ltd.
user1
…
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/V7P6X9WZJ8.jpg)

2.
シャーディングの⽬的
シャーディングすると何が嬉しいの？
© DeNA Co., Ltd.
●
スケールが簡単にできる
●
DBが⼀つ落ちても他のシャードが⽣きていれば、サービス停⽌を回避
できる(場合がある)
●
擬似的に負荷を 1/(シャード数)に落とすことができる
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/2JV3LM8MEQ.jpg)

2.
シャーディングの⽬的
今回は...
書き込み負荷が⾼いコメントテーブルをシャーディング
することでサービス全体のパフォーマンスを向上させる！
のが⽬的
© DeNA Co., Ltd.
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/5EG3XG5X7L.jpg)

3.
他テーブルからの参照‧リレーションの対応
影響範囲の確認
1. 配信に対してコメントは紐づいている
2. ユーザの規約違反履歴の管理のために
ポリモーフィックで関連付けされている
© DeNA Co., Ltd.
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/4JQ58XZ57P.jpg)

3.
他テーブルからの参照‧リレーションの対応
規約違反履歴テーブルのポリモーフィズムは
メインDBにしか対応していないので
シャーディングに対応させる必要
© DeNA Co., Ltd.
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/K749263VE1.jpg)

3.
他テーブルからの参照‧リレーションの対応
カラム名
型
カラム名
型
id
bigint
id
bigint
review_target_id
bigint (NotNull)
review_target_id
bigint (Null)
review_target_type
text (NotNull)
review_target_type
text (Null)
user_shard_review_target_id
char (Null)
user_shard_review_target_type
text (Null)
ひと安⼼...
© DeNA Co., Ltd.
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/LJ1KMV147G.jpg)

3.
他テーブルからの参照‧リレーションの対応
ちょっとまって！
© DeNA Co., Ltd.
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/GJWD3L8Z72.jpg)

3.
他テーブルからの参照‧リレーションの対応
どのシャードかわからなくない？
© DeNA Co., Ltd.
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/4EZGVM8LJ3.jpg)

3.
他テーブルからの参照‧リレーションの対応
ちょっとまって！
© DeNA Co., Ltd.
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/Y76Y5NPMEV.jpg)

3.
他テーブルからの参照‧リレーションの対応
既存のコードからめちゃくちゃ変わっちゃわない？
© DeNA Co., Ltd.
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/G75GY5KQ74.jpg)

3.
他テーブルからの参照‧リレーションの対応
IDにシャード番号も⼊れちゃう...?
© DeNA Co., Ltd.
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/9J2YGNWWJR.jpg)

4.
シャーディングのためのID形態
まず型を決めよう！
© DeNA Co., Ltd.
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/DEYGVPL9EM.jpg)

4.
シャーディングのためのID形態
既存のPKたちは...
● CHAR (26)
● BIGINT (auto increment)
© DeNA Co., Ltd.
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/VJNGM54D78.jpg)

4.
シャーディングのためのID形態
BIGINTを使うとしたら...
AUTO INCREMENTをなくす
+
タイムスタンプ‧シャード情報を追加
+
インクリメント処理⼿動実装 or ランダム実装
© DeNA Co., Ltd.
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/YE9WNYQ8E3.jpg)

4.
シャーディングのためのID形態
BIGINTを使うとしたら...
●
インクリメント処理⼿動実装
→
●
書き込み時にテーブルを⼿動ロック＆insert完了まで離さない
ランダム実装
→
タイムスタンプ部を42bit‧shard部を8bitとすると、たかだ
か14bit 🙅
© DeNA Co., Ltd.
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/GE8NK6GZ7D.jpg)

4.
シャーディングのためのID形態
よし、ULIDベースだ！
© DeNA Co., Ltd.
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/LELPZ9G17R.jpg)

4.
シャーディングのためのID形態
ULIDとは...
48bitのタイムスタンプと、80bitのランダム
画像: ulid spec (https://github.com/ulid/spec)
© DeNA Co., Ltd.
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/4JM4VZQ57W.jpg)

4.
シャーディングのためのID形態
最終的な形態
48bitのタイムスタンプ、10bitのシャード、80bitのランダム
© DeNA Co., Ltd.
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/PJRW268Z79.jpg)

4.
シャーディングのためのID形態
全エンジニアのために...
make it a
metaclass
© DeNA Co., Ltd.
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/PEXPDM817X.jpg)

5.
ダウンタイムなしのマイグレーション⽅法
よし、マイグレーションだ！
© DeNA Co., Ltd.
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/3EKDXGKMJD.jpg)

5.
ダウンタイムなしのマイグレーション⽅法
引⽤：新卒1年⽬が100億レコード超のDBマイグレーションをした話【DeNA TechCon 2023】
© DeNA Co., Ltd.
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/L73R5NZ2J5.jpg)

5.
●
●
© DeNA Co., Ltd.
ダウンタイムなしのマイグレーション⽅法
v2_commentsテーブルを作成し、commentsと同様のデータをinsert
○ 新しいテーブルにデータを貯める時間
Read処理はcommentsテーブルで⾏い、v2_commentsでは⾏わない
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/87DYDWR67G.jpg)

5.
●
●
© DeNA Co., Ltd.
ダウンタイムなしのマイグレーション⽅法
全てのReadの向き先をv2_commentsに変更
○ commentsに処理が向いていないかを確かめる期間
念の為commentsテーブルにもデータは書き込む
35


# Page. 36

![Page Image](https://bcdn.docswell.com/page/VJP6X9MZE8.jpg)

5.
●
© DeNA Co., Ltd.
ダウンタイムなしのマイグレーション⽅法
commentsテーブルへのデータ書き込みを完全に止める
○ サービスに関するクエリは全てv2_commentsを⽤いる
36


# Page. 37

![Page Image](https://bcdn.docswell.com/page/2EV3LM9M7Q.jpg)

まとめ
● 負荷が⾼くて困っている時はシャーディングもあり
○ ⼯夫次第で、最⼩限の労⼒で⼤きな効果を発揮できる
● ダウンタイムなしでマイグレーションするには
○ 新しいシステムに徐々に移⾏していくと⼿戻りが少ない
● サービスの将来性のために
○ 特別すぎることはしない。でも、守りすぎてもいけない
○ 改修の影響範囲は少なめに
○ シンプルにとどめる
© DeNA Co., Ltd.
37


