# TiDB クラスタの全体的なアーキテクチャ

+ 複数のコンポーネントで構成され、各モジュールはお互いに通信して完全な`TiDB`システムを構成します
+ Raftアルゴリズムに基づく状態を持たないフロントエンドと状態を持つバックエンドです
+ `MySQL` に対応しています
+ 各クラスタレイヤーにおける水平スケーラビリティです

![`smart`](./student-guide/diagram/TiDBClusterArchitectureDetail_aa_001_20221005.png)

------------------------------------------------------------------------------
TiDBサーバー：SQLレイヤーはMySQLプロトコルの接続エンドポイントを公開し、クライアントからの接続を受け入れ、SQL解析および最適化を実行し、最終的に分散実行計画を生成する責任があります。 TiDBレイヤー自体はステートレスです。実際には、複数のTiDBインスタンスを起動し、（LVS、HAProxy、F5などの）負荷分散コンポーネントを介して統一されたアクセスアドレスが提供され、クライアント接続は複数のTiDBインスタンスに均等に分散され、負荷分散が実現されます。 TiDBサーバー自体はデータを保存せず、SQLを解析して実際のデータ読み取り要求を基礎となるストレージノードであるTiKV（またはTiFlash）に転送するだけです。

PD（プレイスメントドライバ）サーバー：TiDBクラスタ全体のメタデータ管理モジュールであり、各TiKVノードのリアルタイムデータ分布とクラスタ全体のトポロジーを格納し、TiDBダッシュボード管理インターフェイスを提供し、分散トランザクションの割り当てトランザクションIDをサポートします。PDはメタデータだけでなく、TiKVノードがリアルタイムで報告するデータ分布状態に基づいて特定のTiKVノードにデータスケジューリングコマンドを発行することもでき、クラスタ全体の「脳」と言えます。さらに、PD自体は少なくとも3つのノードで構成され、高可用性の機能を持っています。PDノードを奇数で展開することを推奨します。

ストレージサーバー：
  - TiKV Server（ストレージサーバー）：データの保存を担当しています。外部では、TiKVはトランザクションを提供する分散キーバリューストレージエンジンであり、データを保存する基本単位はリージョンです。各リージョンは、キー範囲（開始キーから終了キーまでの左側が閉じていて右側が開いた範囲）でデータの保存を担当し、各TiKVノードは複数のリージョンを担当します。 TiKVのAPIは、KVキーバリューペアレベルで分散トランザクションをネイティブにサポートしています。デフォルトでは、SI（スナップショットア分離）の分離レベルが提供されますが、これはTiDBがSQLレベルで分散トランザクションをサポートするための核心です。 TiDBのSQLレイヤーがSQLを解析した後、SQLの実行計画がTiKV APIの実際の呼び出しに変換されます。したがって、データはTiKVに保存されます。さらに、TiKVのデータは、自動的に複数のレプリカ（デフォルトでは3つのレプリカ）を維持するため、高可用性と自動フェイルオーバーを自然にサポートしています。
  - TiFlash: TiFlashは、特別なストレージノードの一種です。通常のTiKVノードとは異なり、TiFlash内には列指向形式でデータが格納され、主な機能は分析型シナリオを加速することです。

TiDB サーバー上の負荷に応じて、SQL レイヤーをスケールインまたはスケールアウトすることができます。

ストレージレイヤーは独立してスケーリングでき、TiKVまたはTiFlashサーバーの負荷に応じてスケールインまたはスケーリングアウトができます。
