# スケジューリング：プロセス

![`smart`](SchedulingProcessOverview_aa_002_20220509.png)

------------------------------------------------------------
分散型で高い可用性を持つデータベースストレージとして、以下の要件を満たす必要があります：
- 固定されたレプリカ数。
- レプリカは、異なるノードに分散する必要があります。
- 新しいノードを追加した後、レプリカを別のノードに移行できます。
- もしノードがオフラインになった場合、クラスタはデータレプリカを生き残っているノードのうちの1つに移行するようスケジュールすべきです。

また、以下のパフォーマンス要件を満たす必要があります：
- クラスタ全体にLeadersを均一に分布させるようにします。
- 各ノードのストレージ容量を一定に保ちます。
- ホットスポットの均一な分布を維持します。
- バランスの速度をコントロールして、オンラインサービスに影響を与えないようにします。
- ノードの状態を管理し、手動でオンライン/オフラインにするノードと、失敗したノードを自動的にオフラインにします。

そのためには、各ノードの状態やRaft Groupの情報、サービスアクセス操作の統計など、十分な情報を収集する必要があります。次に、いくつかのポリシーを設定する必要があります。この情報とスケジューリング戦略に基づいて、上記の要件をできるだけ満たすスケジューリングプランをPDが作成し、最後にスケジューリングプランを完了するための基本的な操作が必要となります。

TiKVはRegionの割り当てに責任を持たず、PDだけが完全な視点を持っているので、このタスクを完了するのはPDノードだけです。全体のプロセスは以下の通りです：
1. 情報を集めます。
2. スケジュールを作成します。
3. スケジュールを実行します。