DBのレプリケーションとシャーディングについて雑に書く
どうもnasaです。 本日、データベース実践入門という本を読んでいて、DBのスケールアウトに関する話が面白かったので、自分なりにメモしようと思い書いています。
スケールアウト
一旦スケールアウトもメモメモしていく
自分のWEBアプリでは経験ないけど、単一DBサーバーでは性能限界が来てしまうらしい。
そこで、スループット向上の方法としてスケールアウトがある。
スケールアウトはサーバーマシンを複数用いてアプリケーションからの負荷を分散する方法。
実際に処理能力がスケールするかは処理の内容やアーキテクチャによる。とのこと
レプリケーション
レプリケーションは、スケールアウトの代表的なアーキテクチャ。
DBサーバーに含まれるデータを他のDBサーバーへ複製する技術。
複製のもとになるDBをマスタ、複製先をスレーブと呼ぶ。
DBへの更新処理はマスタへ行い、それをスレーブに反映する。そして、参照系の処理はスレーブへ行うことで参照系の負荷を分散している。 (トランザクション内での必要な参照はマスタに対して行う必要あり。)
シャーディング
シャーディングは行ごとにデータの格納先DBを変更するアーキテクチャ。
僕のイメージではパーティショニングをほぼ一緒。 DBが別々だけど、
例が正しいかわからんけど、user_idの1~100はシャード1へ、101~200はシャード2へ、、、みたいな感じ。
どのシャードにデータを格納するべきか?というロジックがアプリケーション側に必要になるので、少しアプリケーションが複雑になる。
アプリケーションを複雑にしてでも、更新系処理の性能を上げたい!天元突破したい!というときにはシャーディングがおすすめらしい。
参照系もスケールさせたいときは、レプリケーションと組み合わせるのがいいよ。
感想
「サーバーサイドエンジニア見習いです!」みたいなことを言っておきながら、ここらへんの話も知らず、恥ずかしいです。
ことしはサーバー/インフラを支える仕組みを学ぶ一年にしたいな〜と思いました。
でも、ここらへんのことって、実践する機会が少なくない? 個人規模ではあまり必要なさそうだし、インターンの分際にはやらしてもらえなさそうだし。
どうするのが良いのですかね?