出会いに感謝

類は友を呼ぶとは言ったものだが、やはり部署が同じ人というのは興味も似てくる。 とはいっても、まさか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

まじか、これだけでいいのか。 この記事がすごくいい感じに論文をまとめてくれている。

データベースの種類

  1. RDBMS: mysql, postgresqlなど
  2. noSQL: cassandra, dynamodb
  3. newSQL: TiDB, cochroachDB

自分が過去に書いたデータベース関係の記事を見返したい

TiDBについて調べていた時期もありましたねー

流れ

  • まずは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ずつ書き込む。
まとめ
シャーディングは、データベース全体を複数のシャードに分割し、各シャードを異なるサーバに分散させることで、スケーラビリティとパフォーマンスを向上させる手法です。
ストライピングは、データを複数のストレージデバイスに均等に分割して並行して読み書きすることで、ストレージのパフォーマンスを向上させる手法です。

ストライピングとシャーティングの両方を使うことはできますか?