出会いに感謝
類は友を呼ぶとは言ったものだが、やはり部署が同じ人というのは興味も似てくる。 とはいっても、まさかTiDBやcockroachDBのコントリビュータとお友達になれるとは思わないわけで。
尊敬しかない。自分はあきらめてしまった道を一人で突き進んでいったのだろう。 自分の弱さがふがいない。せっかく先陣を切ってくれた先人がいるのだから、これは後に続こうと思える。 ロールモデルがあると自分も頑張ろうと思えるわけで。こんなところで師匠に出会えるとは、、、最高すぎる。 ということで、もう一度、分散システムに挑んでみようと思う。
とりあえず今日話したことをメモ
今のデータベース、MySQLとかはレプリケーションという技術を使って、一つのデータベースのテーブルを複数のノードにレプリケーションしている。レプリケーションされたデータが存在するノードが読み取り専用になる。マスターと呼ばれるノードは一台で、書き込みはここにだけ行われる。 しかし、これでは書き込み速度がスケールしないという問題点が生じる。そこで、noSQLというやつが出てきたんだよね。しかし、noSQLは整合性を保つのが難しいという課題があったんだよね。 そこで出てきたのがnewSQLというやつだね。tidb等。これを使うとwriteを容易にスケールすることができる。という話だ。 ほほう。なるほど。 ちなみに、俺が大好きなandrew pavloがこんな論文を出している andrew pavlo
これによるとnewSQLの必要十分条件は、
NewSQL system’s implementation has to use (1) a lock-free concurrency control scheme and (2) a shared-nothing distributed architecture
まじか、これだけでいいのか。 この記事がすごくいい感じに論文をまとめてくれている。
データベースの種類
- RDBMS: mysql, postgresqlなど
- noSQL: cassandra, dynamodb
- newSQL: TiDB, cochroachDB
自分が過去に書いたデータベース関係の記事を見返したい
流れ
- まずはraftについてちゃんと理解するのが大事だと思う。実は完全に理解したとはいいがたい。
- 分散データベースを作るならまずは分散してないデータベースを作れないといけない。ということで、CMUのbustubの講義は受けなおした方がいい。
- 分散システムを理化するためにデータ志向アプリケーションを読もう。頼んだ。
- いきなりだが、TiDBを読み込もう。cochroachDBでもいいと思う。この時にdesign Docsを読むのがいいらしい。
その他の疑問
シャーティングという技術がある。 これは、データを複数のノードに分散して格納することで、検索速度を上げる方法。 RAID0(ストライピング)とはまた別なのね?
シャーディング(Sharding)
目的:データを分割して、複数のデータベースサーバに分散させ、スケーラビリティを向上させることです。
特徴:
データベース全体を論理的に分割し、それぞれの部分を「シャード」と呼ばれる個別のデータベースに保存します。
各シャードは独立したデータベースとして動作し、特定のデータサブセットを保持します。
シャードは水平分割とも呼ばれ、特定のキー(例:ユーザーID、地域、日時など)に基づいてデータを分割します。
データの分割によって、単一のデータベースサーバにかかる負荷を分散させ、スケーラビリティとパフォーマンスを向上させます。
例:
ユーザーIDに基づいて、ユーザーデータをシャードA、シャードB、シャードCに分割する。
ストライピング(Striping)
目的:データを分散してストレージパフォーマンスを向上させることです。主にデータの読み書き速度を向上させるために使用されます。
特徴:
単一のファイルやデータセットを複数のストレージデバイスに均等に分割して保存します。
各ストライプは連続したデータブロックを含み、ストライプ単位で並行して読み書きが行われます。
RAID(Redundant Array of Independent Disks)のコンセプトの一つであり、特にRAID 0が代表的です。
ストライピングは、ディスクI/O性能を向上させるために使用されますが、冗長性やフェールオーバーの機能はありません(特にRAID 0では)。
例:
1GBのファイルを4つのディスクに分割し、各ディスクに256MBずつ書き込む。
まとめ
シャーディングは、データベース全体を複数のシャードに分割し、各シャードを異なるサーバに分散させることで、スケーラビリティとパフォーマンスを向上させる手法です。
ストライピングは、データを複数のストレージデバイスに均等に分割して並行して読み書きすることで、ストレージのパフォーマンスを向上させる手法です。