成熟したデータベース アーキテクチャは、最初から高可用性、高スケーラビリティなどの機能を備えて設計されているわけではなく、ユーザー数が増えるにつれてインフラストラクチャが徐々に改善されていきます。この記事では主に、MySQL データベースの開発サイクルで直面する問題と最適化ソリューションについて説明します。フロントエンド アプリケーションは別として、大きく次の 5 つの段階に分けることができます。 フェーズ 1: データベース テーブルの設計 プロジェクトが承認されると、開発部門は製品部門のニーズに応じてプロジェクトを開発します。 フェーズ2: データベースの展開 運用エンジニアが参加してプロジェクトを開始する時が来ました。 フェーズ3: データベースパフォーマンスの最適化 MySQL を通常の X86 サーバーにデプロイした場合、最適化を行わない場合、MySQL は理論上約 1500 QPS を処理できます。最適化後は、約 2000 QPS まで増加する可能性があります。そうでない場合、同時接続数が約 1,500 に達すると、データベース処理のパフォーマンスの応答が遅くなる可能性があり、ハードウェア リソースが比較的豊富です。この時点で、パフォーマンスの最適化の問題を考慮する必要があります。では、データベースのパフォーマンスを最大化するにはどうすればよいでしょうか?主にハードウェア構成、データベース構成、アーキテクチャに焦点を当てており、具体的には次のように分類されます。 3.1 ハードウェア構成 条件が許せば、SAS 機械式ハード ドライブの代わりに SSD ソリッド ステート ドライブを使用し、RAID レベルを RAID1 や RAID5 よりも読み取りおよび書き込みパフォーマンスが優れている RAID1+0 に調整する必要があります。結局のところ、データベースへの負荷は主にディスク I/O から生じます。 3.2 データベース構成の最適化 MySQL で最も広く使用されているストレージ エンジンは 2 つあります。1 つは MyISAM で、トランザクション処理をサポートせず、読み取りパフォーマンスが速く、テーブル レベルのロックを使用します。もう 1 つは、トランザクション処理 (ACID プロパティ) をサポートし、大規模なデータ処理と行レベルのロック用に設計された InnoDB です。 最大接続数 = 151 # 同時に最大接続数を処理します。最大接続数は接続上限数の80%程度に設定することを推奨します。sort_buffer_size = 2M # 並べ替えクエリを実行する際のバッファサイズは、order by と group by のみで機能しますが、16M に増やすことを推奨します。 オープンファイル制限 = 1024 # 開いているファイルの数を制限します。show global status like 'open_files' で表示される値が open_files_limit 値以上である場合、プログラムはデータベースに接続できなくなるか、フリーズします。 MyISAM パラメータのデフォルト値: キーバッファサイズ = 16M # インデックスバッファサイズは、通常、物理メモリの30~40%に設定されます 読み取りバッファサイズ = 128K # 読み取り操作バッファサイズ。16Mまたは32Mに設定することを推奨します。 クエリキャッシュタイプ = オン # クエリキャッシュ機能を有効にする query_cache_limit = 1M # クエリキャッシュの制限。結果データがキャッシュプールを上書きするのを防ぐため、1M 未満のクエリ結果のみがキャッシュされます。query_cache_size = 16M # SELECT クエリの結果をキャッシュするために使用されるバッファ サイズを確認します。次に同じ SELECT クエリを実行すると、結果はキャッシュ プールから直接返されます。この値は倍数で増やすことができます。 InnoDB パラメータのデフォルト値: innodb_buffer_pool_size = 128M # インデックスとデータバッファのサイズは、物理メモリの約 70% に設定することをお勧めします innodb_buffer_pool_instances = 1 # バッファプールインスタンスの数。4または8に設定することを推奨します innodb_flush_log_at_trx_commit = 1 # キー パラメータ。0 は、ログが約 1 秒ごとにディスクに書き込まれ、同期されることを意味します。データベース障害が発生すると、約 1 秒分のトランザクション データが失われます。 1. 各 SQL ステートメントが実行されると、ログに書き込まれ、ディスクに同期されます。これにより、I/O オーバーヘッドが大きくなります。SQL ステートメントを実行した後、ログの読み取りと書き込みが完了するまで待機する必要があり、非効率的です。 2 は、ログがシステム キャッシュにのみ書き込まれ、1 秒ごとにディスクに同期されることを意味します。これは非常に効率的です。サーバーに障害が発生すると、トランザクション データは失われます。データセキュリティに対する要件がそれほど高くない場合は、設定 2 をお勧めします。パフォーマンスが高く、変更後の効果は明らかです。 innodb_file_per_table = オフ # テーブルスペースを共有するかどうか。バージョン 5.7 以降のデフォルト設定は ON です。共有テーブルスペース内の idbdata ファイルは大きくなり続け、I/O パフォーマンスに一定の影響を与えます。独立テーブルスペース モードを有効にすることをお勧めします。各テーブルのインデックスとデータは独自の独立したテーブルスペースに保存されるため、単一のテーブルを異なるデータベース間で移動できます。 innodb_log_buffer_size = 8M # ログ バッファ サイズ。ログは最大で 1 秒に 1 回更新されるため、通常は 16 MB を超える必要はありません。 3.3 システムカーネルパラメータの最適化 ほとんどの MySQL サーバーは Linux システムに導入されているため、オペレーティング システムの一部のパラメータも MySQL のパフォーマンスに影響します。以下は、Linux カーネル パラメータの適切な最適化です。 ネット.ipv4.tcp_fin_timeout = 30 #TIME_WAIT タイムアウト、デフォルトは60秒 ネット.ipv4.tcp_tw_reuse = 1 # 1 は再利用を有効にすることを意味し、TIME_WAIT ソケットを新しい TCP 接続に再利用できるようにします。0 は無効にすることを意味します。net.ipv4.tcp_tw_recycle = 1 # 1 は TIME_WAIT ソケットの高速リサイクルを有効にすることを意味し、0 は無効にすることを意味します net.ipv4.tcp_max_tw_buckets = 4096 # システムは TIME_WAIT ソケットの最大数を維持します。この数を超えると、システムはランダムに TIME_WAIT をクリアし、警告メッセージを出力します。net.ipv4.tcp_max_syn_backlog = 4096 # SYN キューの最大長を入力します。キューの長さを増やすと、より多くの待機接続に対応できます。Linux システムでは、プロセスによって開かれたファイル ハンドルの数がシステムのデフォルト値の 1024 を超えると、「開いているファイルが多すぎます」というメッセージが表示されるため、開いているファイル ハンドルの制限を調整する必要があります。 永続的にするには再起動してください: # vi /etc/security/limits.conf * ソフトノーファイル 65535 * ハードnofile 65535 現在のユーザーに対して即時有効: # ulimit -SHn 65535 フェーズ4: データベースアーキテクチャの拡張 ビジネス量が増大するにつれて、単一のデータベース サーバーのパフォーマンスではビジネス ニーズを満たせなくなり、サーバー拡張アーキテクチャの追加を検討する時期になります。主なアイデアは、単一のデータベースの負荷を分解し、ディスク I/O パフォーマンスを突破し、ホット データをキャッシュに保存し、ディスク I/O アクセスの頻度を減らすことです。 4.1 キャッシュを増やす ホット データをメモリにキャッシュするために、データベースにキャッシュ システムを追加します。要求されたデータがキャッシュ内にある場合、MySQL は要求されなくなり、データベースの負荷が軽減されます。キャッシュ実装には、ローカル キャッシュと分散キャッシュの 2 種類があります。ローカル キャッシュは、ローカル サーバーのメモリまたはファイルにデータをキャッシュします。分散キャッシュは大量のデータをキャッシュでき、スケーラビリティに優れています。主流の分散キャッシュ システムは、memcached と redis です。memcached はパフォーマンスが安定しており、データはメモリにキャッシュされ、速度が非常に高速です。理論上の QPS は約 80,000 に達します。データの永続性が必要な場合は、Redis を選択してください。パフォーマンスは memcached よりも劣りません。 4.2 マスタースレーブレプリケーションと読み取り書き込み分離 実稼働環境では、ビジネス システムは通常、読み取りが多く、書き込みが少ないため、マスター スレーブ アーキテクチャを導入できます。マスター データベースは書き込み操作を担当し、デュアル マシンのホット スタンバイを実行し、複数のスレーブ データベースは負荷分散を実行し、読み取り操作を担当します。主流のロードバランサー: LVS、HAProxy、Nginx。 4.3 データベースシャーディング データベース シャーディングとは、データベース内の関連テーブルを、Web、BBS、ブログ、その他のデータベースなど、業務に応じて異なるデータベースに分割することです。業務量が多い場合は、分離されたデータベースをマスター/スレーブ レプリケーション アーキテクチャとして使用して、単一のデータベースへの過度の負荷をさらに回避できます。 4.4 サブテーブル データ量が劇的に増加しています。データベースのテーブルには数百万のデータがあり、クエリと挿入に時間がかかりすぎます。単一のテーブルの負荷をどう解決すればよいでしょうか?単一のテーブルにかかる負荷を軽減し、処理効率を向上させるには、このテーブルを複数の小さなテーブルに分割することを検討する必要があります。この方法は、テーブル シャーディングと呼ばれます。 4.5 パーティション分割 パーティショニングとは、テーブル構造内のフィールド (範囲、リスト、ハッシュなど) に応じて、テーブルのデータを複数のブロックに分割することです。これらのブロックは、1 つのディスク上にあっても、異なるディスク上にあってもかまいません。パーティショニング後も、表面上はテーブルのままですが、データは複数の場所にハッシュされます。このようにして、複数のハードディスクが異なる要求を同時に処理できるため、ディスク I/O の読み取りおよび書き込みパフォーマンスが向上します。 フェーズ5: データベースのメンテナンス データベースのメンテナンスは、システムの監視、パフォーマンス分析、パフォーマンスのチューニング、データベースのバックアップとリカバリなどの主要なタスクを含む、データベース エンジニアまたは運用保守エンジニアの仕事です。 5.1 パフォーマンスステータスの主要指標 技術用語: QPS (1 秒あたりのクエリ数) と TPS (1 秒あたりのトランザクション数)
計算方法は、質問に基づいてQPSを計算することです。 mysql> 'Questions' のようなグローバル ステータスを表示します。 mysql> 「Uptime」のようなグローバルステータスを表示します。 QPS = 質問数 / 稼働時間 Com_commit と Com_rollback に基づいて TPS を計算します。 mysql> 'Com_commit' のようなグローバル ステータスを表示します。 mysql> 'Com_rollback' のようなグローバル ステータスを表示します。 mysql> 「Uptime」のようなグローバルステータスを表示します。 TPS = (Com_commit + Com_rollback) / 稼働時間 別の計算方法: Com_select、Com_insert、Com_delete、Com_update に基づいて QPS を計算します。 mysql> グローバル ステータスを表示します。Variable_name in('com_select','com_insert','com_delete','com_update'); 1 秒待ってから再度実行し、間隔の差を取得します。QPS は、2 回目の各変数の値から 1 回目の対応する変数の値を引いた値です。 TPS計算方法: mysql> グローバル ステータスを表示します。Variable_name in('com_insert','com_delete','com_update'); TPS を計算するときは、クエリ操作をカウントせず、挿入、削除、更新の 4 つの値のみを計算すれば済みます。 ネットユーザーがこれら 2 つの計算方法をテストした結果、データベースに MyISAM テーブルが多数ある場合は、Questions 計算を使用する方が正確であるという結論に達しました。データベース内に InnoDB テーブルが多数ある場合は、計算に Com_* を使用する方が正確です。 5.2 スロークエリログを有効にする MySQL では、遅いクエリ ログを有効にして、どの SQL ステートメントが遅いかを分析できます。動的な有効化がサポートされています。 mysql> グローバルスロークエリログをオンに設定 # スロークエリログを有効にするmysql> set global slow_query_log_file='/var/log/mysql/mysql-slow.log'; # スロークエリログファイルの場所を指定しますmysql> set global log_queries_not_using_indexes=on; # インデックスを使用しないクエリを記録しますmysql> set global long_query_time=1; # 処理時間が 1 秒を超える遅いクエリのみを記録します。遅いクエリのログを分析するには、MySQL に付属の mysqldumpslow ツールを使用できます。分析されるログは比較的単純です。 mysqldumpslow -t 3 /var/log/mysql/mysql-slow.log # 最も遅い 3 つのクエリを表示するには、包括的なログ分析機能を備え、スロー ログ、バイナリ ログ、および一般ログを分析できる Percona の pt-query-digest ツールを使用することもできます。 スロークエリログを分析します: pt-query-digest /var/log/mysql/mysql-slow.log binlog ログを分析する: mysqlbinlog mysql-bin.000001 >mysql-bin.000001.sql pt-クエリダイジェスト --type=binlog mysql-bin.000001.sql 一般ログを分析する: pt-query-digest --type=genlog localhost.log 5.3 データベースのバックアップ データベースのバックアップは最も基本的なタスクであり、最も重要なタスクです。そうしないと、結果は深刻になります。高頻度のバックアップ戦略では、安定した高速なツールを選択することが重要です。データベースのサイズが 2G 未満の場合は、公式の論理バックアップ ツール mysqldump を使用することをお勧めします。サイズが 2G を超える場合は、Percona の物理バックアップ ツール xtrabackup を使用することをお勧めします。そうしないと、速度が非常に遅くなります。どちらのツールも、ビジネスの読み取りおよび書き込み操作に影響を与えることなく、InnoDB ストレージ エンジンでのホット スタンバイをサポートします。 5.4 データベースの修復 MySQL サーバーの電源が突然切れたり、異常終了したりすることがあり、その結果テーブルが破損し、テーブル データを読み取れなくなることがあります。この時点で、MySQL に付属する 2 つのツール、myisamchk と mysqlcheck を使用して修復できます。前者は MyISAM テーブルを修復してデータベースを停止することしかできませんが、後者は MyISAM テーブルと InnoDB テーブルの両方をオンラインで修復できます。 myisamchk 共通パラメータ: -f --force 強制修復、古い一時ファイルを上書きします。通常は使用されません -r --recover リカバリ モード -q --quik クイック リカバリ -a --analyze テーブルを分析 -o --safe-recover 古いリカバリ モード。-r で修復できない場合は、このパラメータを試すことができます -F --fast 正常に閉じられていないテーブルのみをチェックします 例: myisamchk -r -q *.MYI mysqlcheck の共通パラメータ: -a --all-databases すべてのデータベースをチェック -r --repair テーブルを修復 -c --check テーブルをチェック(デフォルトオプション) -a --analyze テーブルを分析 -o --optize テーブルを最適化 -q --quik 最速チェックまたはテーブルを修復 -F --fast 正常に閉じられていないテーブルのみをチェック 例:mysqlcheck -r -q -uroot -p123456 weibo 5.5 MySQLサーバーのパフォーマンス分析 集中: KB_read/s、KB_wrtn/s 1 秒あたりに読み書きされるデータの量。主に、ディスクの 1 秒あたりの最大読み取りおよび書き込み速度に基づいて評価されます。 r/s、w/s: 1 秒あたりの読み取りおよび書き込み要求の数は、IOPS (1 秒あたりの入出力) として理解でき、ディスク パフォーマンスを測定するための主な指標の 1 つです。 まとめ リレーショナル データベースは、元々の設計上の制限により、大規模なデータ処理には対応できません。そのため、NoSQL(非リレーショナル データベース)が普及しました。NoSQL は本質的に魅力的で、分散性、高性能、高信頼性などの特徴を備えています。リレーショナル データベースの特定の固有の欠陥を補い、非構造化データの保存に非常に適しています。主流の NoSQL データベースには、MongoDB、HBase、Cassandra などがあります。 データベースレベルでの最適化効果の向上は、それほど顕著ではありません。主にビジネスシナリオに応じて適切なデータベースを選択することが必要です。 これで、MySQL データベースの最適化手法を簡単に理解するこの記事は終わりです。より関連性の高い MySQL データベースの最適化手法については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
>>: VMware 仮想マシンの 3 つの接続方法の例の分析
GitHub が提供するコード ホスティング サービスと同様に、Docker Hub はイメージ ホ...
注: Web 開発では、フォームに autocomplete="off" を追加...
この記事では、Xshell と関連する構成の一般的な問題について説明します。この記事の構成は、主に ...
序文場合によっては、次の図のような浮動効果の要件が必要になります。 成し遂げる標準的な通常の状況では...
サーバーの負荷を軽減するために、ユーザーが入力するときにフロントエンドページで簡単な検証を実行する必...
Docker は、開発者やシステム管理者がアプリケーションを軽量コンテナとして構築およびパッケージ化...
現在、Docker には中国向けの公式ミラーがあります。詳細については、https://www.do...
ステップ1: MySQL YUMソースを取得するMySQLの公式サイトにアクセスして、RPMパッケー...
問題を見つける今日はTomcatのソースコードを勉強するつもりなので、公式サイトからTomcatのソ...
Web デザインと開発は大変な作業なので、少数の人だけを対象に設計しないでください。これは外国人が...
目次1. 実装2. 問題点3. より良い実装方法があるかどうか検討する要約する背景は日付のタイトルで...
kubectl の紹介kubectl は、k8s クラスターを操作するためのコマンドライン ツールで...
ページ: ベース: <テンプレート> <div class="タブコンテ...
複数の Docker コンテナがデプロイされたサーバーがあり、各 Docker コンテナが stde...
入力タグタイプがファイルで、タグ内にaccpet="image/*"属性が設定さ...