技術共有

mysql の高同時実行設計

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

mysql の高同時実行設計

1. 導入計画

https://blog.csdn.net/weixin_37519752/article/details/138728036

オプション 1: 二重所有者

画像.png
1. 利点
書き込みのスケーラビリティ: 両方のノードが書き込み操作を処理できるため、書き込み操作のスケーラビリティが向上します。
高可用性: いずれかのノードに障害が発生した場合でも、他のノードは書き込み操作を含むサービスを提供し続けることができます。
フェイルオーバー: 両方のノードがアクティブであるため、複雑なフェイルオーバー メカニズムは必要ありません。
2. デメリット
データの一貫性: データの一貫性を維持するには、複雑な競合検出および解決メカニズムが必要です。
ネットワーク要件: ノード間のリアルタイム同期はネットワークの品質に左右されるため、ネットワークの安定性と遅延については高い要件があります。
追加のオーバーヘッド: リアルタイム同期によって発生する追加のネットワークおよびディスク I/O オーバーヘッド。
3. 適用可能なシナリオ
分散アプリケーション: 地理的に異なる場所での書き込み機能を必要とするアプリケーション。
高書き込み負荷: パフォーマンスを向上させるために書き込み負荷を分散する必要があるシナリオ。
リアルタイム データ要件: 複数のノード上のデータのリアルタイム同期を必要とするアプリケーション。

オプション 2: マスター/スレーブ レプリケーション

1 つのマスターと 1 つのスレーブ、または mysql5.7 以降でサポートされる 1 つのマスターと複数のスレーブ

画像.png
1. 利点
データの冗長性: データのホット バックアップを提供し、データ損失のリスクを軽減します。
パフォーマンスの向上: 1 つのマスターと複数のスレーブ、異なるユーザーが異なるデータベースから読み取ることで、パフォーマンスが向上します。
スケーラビリティ: トラフィックが増加した場合、システムの使用状況に影響を与えることなく、スレーブ サーバーを簡単に追加できます。
負荷分散: 1 つのマスターと複数のスレーブは、ホストのタスクを共有して負荷分散を実行することと同等です。
2. デメリット
データの遅延: レプリケーションは非同期であるため、データ レプリケーションの遅延が発生するリスクがあります。
複雑さの増大: システムが複雑になると、より多くのメンテナンスと管理が必要になります。
追加のリソース消費: スレーブ サーバーを展開するには、追加のハードウェア リソースが必要です。
書き込みパフォーマンスへの影響: すべての書き込み操作はマスター サーバー上で実行されるため、パフォーマンスのボトルネックになる可能性があります。
3. 適用可能なシナリオ
読み取りと書き込みの分離: 書き込み操作よりも読み取り操作がはるかに多いシナリオに適しています。
データ バックアップ: データの損失を防ぐためのデータのリアルタイム バックアップに使用されます。
高可用性要件: サービスの継続性を確保する必要がある重要なアプリケーション

2.mysqlパフォーマンスの最適化

1. インデックスを使用する
インデックスは、テーブル内のデータを効率的にクエリするための鍵となります。MySQL では、B ツリー インデックスまたはハッシュ インデックスを使用してクエリ操作を高速化できます。
例:

CREATE INDEX index_name ON table_name (column1, column2, ...);
  • 1

2. クエリステートメントを最適化する
クエリを最適化すると、MySQL のパフォーマンスが向上します。適切なクエリ ステートメント、インデックス、キャッシュ メカニズムによってクエリの実行時間を短縮でき、テーブル全体のスキャンや不必要なデータ操作を回避できます。
例:

# 通过使用索引和合适的查询语句
SELECT * FROM table_name WHERE column1 = "value" AND column2 = "value";

# 避免使用通配符查询,可以使用索引来加速查询
SELECT * FROM table_name WHERE column1 LIKE "value%";

# 避免在查询条件中使用函数,函数会导致索引失效
SELECT * FROM table_name WHERE DATE(column1) > "2021-01-01";
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

3. キャッシュの最適化
MySQL のキャッシュ メカニズムにより、クエリのパフォーマンスが向上します。クエリ キャッシュとシステム キャッシュを適切に設定すると、ディスク IO 操作が削減され、クエリの実行が高速化されます。MySQL のクエリ キャッシュ、InnoDB のバッファ プールなどを使用します。

# 启用查询缓存
query_cache_type = 1
query_cache_size = 64M
  • 1
  • 2
  • 3

4. パーティションテーブル
データの量が非常に大きい場合は、クエリのパフォーマンスを向上させるためにパーティションとテーブルの使用を検討できます。パーティショニングでは、データをより小さな論理部分に分割し、それぞれを独立してクエリおよび保守できるようにします。テーブル分割とは、大きなテーブルを複数の小さなテーブルに分割し、それぞれの小さなテーブルにデータの一部を格納することです。

# 分区
CREATE TABLE table_name (
    ...
)
PARTITION BY RANGE (column_name) (
    PARTITION p1 VALUES LESS THAN (value1),
    PARTITION p2 VALUES LESS THAN (value2),
    ...
)

# 分表
CREATE TABLE table_name (
    ...
)
PARTITION BY HASH (column_name) PARTITIONS 4;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

5.パラメータチューニング
https://blog.51cto.com/u_12196/6967500
https://blog.51cto.com/u_13259/6936668
6. 接続プールの管理
接続プーリングは、データベース接続を管理するためのテクノロジであり、接続の作成および破棄にかかるコストを効果的に削減できます。同時実行性の高い環境では、接続プールは事前に一定数の接続を作成し、それらを接続プールに保存できます。新しいリクエストが受信されると、毎回接続を再作成する必要がなく、接続プールから接続を取得できます。これにより、同時処理能力が大幅に向上します。
7. ハードウェアの最適化:
高速CPU、大容量メモリ、高速ディスクなどの高性能ハードウェアデバイスを使用し、データベース処理能力を向上させます。