見出し画像

第5章 レプリケーション

要約

レプリケーションは、ネットワークで接続された複数のマシンに同じデータを保持する方法で、障害への耐性や処理能力向上に活用されます。
シングルリーダー、マルチリーダー、リーダーレスの3つのアプローチがあります。
また、同期と非同期のレプリケーションも存在し、同期は一貫性を保障しますが、非同期は処理速度向上をもたらします。問題としては、レプリケーションラグや書き込みの衝突が挙げられ、ケースバイケースで最適な構成を選択する必要があります。

シングルリーダーは広く使われ、マルチリーダーとリーダーレスは耐障害性に優れるが一貫性が低いという特徴があります。
同期はデータ一貫性がありながらも障害時に問題が生じやすい一方、非同期は高速だがデータ損失のリスクがあります。

前の章

前の章である第4章 エンコーディングと進化はこちらです。

レプリケーションとは

レプリケーションとは、ネットワークで接続された複数のマシンに同じデータのコピーを保持していくことです。
一部のマシン(ノードとも言う)に障害があってもシステムが動作し続けるようにしたり、スループットを高めるために処理するマシン数をスケールアウトさせたりするために使います。

3つのレプリケーション

シングルリーダー

シングルリーダーは、一般的なレプリケーションの方法になります。
1つのマシンがリーダーとして、読み書き、すべてのクエリを受け付けます。その他のフォロワーレプリカが読み取りのみを行います。フォロワーはリーダーと同じ中身になるようにレプリケーションを行うような構成をしています。

Amazon RDS リードレプリカ(AWSより)

マルチリーダー

マルチリーダーは、その名の通りリーダーが複数になります。
このメリットは複数のノートで書き込みが受け付けられるようになることです。こうすることでシングルリーダーの問題であるすべての書き込みをそのリーダーに送らなければならないという欠点を補うことができます。

この構成では、各リーダーは同時に他のリーダーのフォロワーとして振る舞います。

What is Multi-Leader Data Replication Strategy?(mediumより)

リーダーレスレプリケーション

リーダーレスレプリケーションとは、リーダーという概念を捨てて、どのレプリカも直接クライアントからの書き込みを受け付けるようにしているものになります。
このメリットはフェールオーバーがないため、 書き込みを平行に受け付けることができます。
リーダーレスの実装の中には、クライアントが書き込みを直接複数のレプリカに送信するものもあれば、ノートがクライアントの代わりに送信を行うものもあります。書き込みの順序を強制しないという特徴もあります。

Leaderless Replication(Arpit’s Newsletterより)

レプリケーションの機能

同期と非同期のレプリケーション

同期というのは、リーダーはフォロワーが書き込みを受け付けたのを確認し、書き込みの内容が他のクライアントに見えるようになった後にユーザに対して成功を返すことを言います。

同期型の利点としては、フォロワーが持っているデータが最新であり、リーダーとの一貫性が保障されることになります。
ただし、デメリットとして、同期型のフォロワーが反応を返さなかった場合、書き込みができなくなってしまうことです。

Different ways to replicate the data across the database clusterより)

非同期は、クライアントから受け付けたのをまず返して、その後フォロワーに対して書き込みを行います。

メリットとしては、すべてのフォロワーに遅延が生じていても、リーダーが書き込みの処理を継続できるポイントです。
デメリットとしてはクライアントに成功が返された場合であっても、書き込みの永続性が保証されません。

Different ways to replicate the data across the database clusterより)

レプリケーションで発生する問題

レプリケーションラグ

スケーラビリティを考慮された非同期のレプリケーションではラグが発生しがちです。このラグというのはフォロワーが複数いた場合、リーダーから書き込みを受け付ける順番で差分が出るというものです。このラグが大きくなればなるほど参照するたびに結果が変わってしまうという可能性が発生します。

例えば、システムが容量の限界近くで運用されている場合は、書き込み処理に時間がかかってしまう可能性があります。その場合、フォロワー1では書き込みが完了しておりフォロワー2で完了してないケースがあるとします。フォロワー2を参照すると書き込みが完了していないのでデータがないということになります。

Single Leader Replication, image(Database Replication Explainedより)

書き込みの衝突の処理

マルチリーダーレプリケーションでは書き込みが衝突し得ることがあります。
例えば、2人のユーザが同時にあるページの編集をしているとします。ユーザ1はタイトルをAからBへユーザーはタイトルをAからCに変更します。
各自のローカルのリーダーには問題なく適用されますが、この変更が非同期にレプリケーションされたときに衝突が発生します。マルチリーダー構成ではどちらの書き込みも成功し、衝突は後のどこかの時点でしか検出されません。

A write conflict caused by two leaders concurrently updating the same record.(Handling Write Conflictsより)

どのレプリケーションが良いか?

ケースによってどの構成を取るかを決める

3つのレプリケーションについて述べましたが、それぞれメリットとデメリットがあります。
シングルリーダーは非常に理解しやすく、衝突解決を気にする必要がないことから、一般的に広く使われています。
対して、マルチリーダーとリーダーレスのレプリケーションは濃度の障害やネットワークの障害 レイテンシーのスパイクがあっても問題にならないことが多いです。しかし、一貫性について弱い保証しか無いというデメリットもあります。

同期か、非同期か

また、リプリケーションは同期、非同期を選択できます。どちらにするのかは、障害があったときのシステムの振る舞いに依存します。

非同期のレプリケーションは、システムがスムーズに動作しているときは、高速に動作するというメリットがあります。
ただし、レプリケーションのラグが大きくなってきたり、サーバーに障害が生じたときにデータを失う可能性があります。

まとめ

以上、レプリケーションについて解説しました。

レプリケーションには3つの種類があり、また同期するか非同期にするかを選択することができます。これらはメリット、デメリットがあり、企業のシステムや要件によって決めていく必要があります。

レプリケーションは複数のマシンにわたるデータの分散配置について、様々な方法を取り上げながら見てきました。
次の6章ではまた別の方法であるパーティション分割について述べていきます。

レプリケーションについて特に重要な点を解説しました。ただし、非常に量が多いため解説していない部分が多々あります。詳細は本書を手にとってみて下さい。


いいなと思ったら応援しよう!

zono
よろしければ応援お願いします! いただいたチップはデータエンジニアとしての活動費や勉強代、教育に使わせていただきます!